示例#1
0
def test_employee_cannot_give_and_update_feedback_to_valid_nominee_if_outside_entry_subperiod(
        app_with_nominees_inside_approval_subperiod):  # noqa: E501
    """GIVEN I am logged in
    AND I have previously given feedback on a employee
    WHEN I update that feedback by *employee id and feedback id* via post
    THEN it is successful

    Require both parameters to be sure that we are updating the right feedback
    item
    """
    app = successfully_login(app_with_nominees_inside_approval_subperiod,
                             TEST_EMPLOYEE_USERNAME)
    csrf_token = app.cookies[ANGULAR_2_XSRF_TOKEN_COOKIE_NAME]

    response = app.get(NOMINATED_USER_FEEDBACK_ENDPOINT, expect_errors=True)
    assert response.status_code == 404

    payload = [{
        "questionId": 1,
        "answer": "foo"
    }, {
        "questionId": 2,
        "answer": "bar"
    }]
    response = app.put_json(
        NOMINATED_USER_FEEDBACK_ENDPOINT,
        {"form": payload},
        headers={ANGULAR_2_XSRF_TOKEN_HEADER_NAME: csrf_token},
        expect_errors=True,
    )
    assert response.status_code == 404
示例#2
0
def test_employee_can_get_correct_nomination_status_when_outside_enrollment_period(
        ldap_mocked_app_with_users, is_enrolled, body):  # noqa: E501
    dbsession = get_dbsession(ldap_mocked_app_with_users)

    with transaction.manager:
        period = Period(
            name=TEST_PERIOD_NAME,
            enrollment_start_utc=days_from_utcnow(-2),
            entry_start_utc=days_from_utcnow(-1),
            approval_start_utc=days_from_utcnow(2),
            approval_end_utc=days_from_utcnow(3),
        )
        dbsession.add(period)
        if is_enrolled:
            nominee = Nominee(username=TEST_EMPLOYEE_USERNAME, period=period)
            dbsession.add(nominee)

    app = successfully_login(ldap_mocked_app_with_users,
                             TEST_EMPLOYEE_USERNAME)
    csrf_token = app.cookies[ANGULAR_2_XSRF_TOKEN_COOKIE_NAME]
    response = app.get("/api/v1/self-nominate",
                       headers={ANGULAR_2_XSRF_TOKEN_HEADER_NAME: csrf_token})
    assert response.json_body["heading"] == ENROLLMENT_INACTIVE_TEMPLATE[
        "heading"].format(period_name=TEST_PERIOD_NAME)
    assert response.json_body["body"] == body
    assert (response.json_body["buttonText"] ==
            ENROLLMENT_INACTIVE_TEMPLATE["buttonText"])
    assert (response.json_body["buttonLink"] ==
            ENROLLMENT_INACTIVE_TEMPLATE["buttonLink"])
    assert (response.json_body["canNominate"] ==
            ENROLLMENT_INACTIVE_TEMPLATE["canNominate"])
示例#3
0
def test_employee_cannot_update_feedback_form_with_unauthorized_answer_ids_to_valid_nominate_while_inside_entry_subperiod(
    app_with_nominees_and_existing_feedback_form_inside_entry_subperiod
):  # noqa: E501
    app = successfully_login(
        app_with_nominees_and_existing_feedback_form_inside_entry_subperiod,  # noqa: E501
        TEST_EMPLOYEE_USERNAME,
    )
    csrf_token = app.cookies[ANGULAR_2_XSRF_TOKEN_COOKIE_NAME]

    unauthorized_answer_id = TEST_FORM_2_ANSWER_1_ID
    invalid_form = [
        {
            "questionId": QUESTION_IDS_AND_TEMPLATES[0][0],
            "answerId": unauthorized_answer_id,
            "answer": "Second answer 1",
        },
        {
            "questionId": QUESTION_IDS_AND_TEMPLATES[1][0],
            "answerId": TEST_FORM_1_ANSWER_2_ID,
            "answer": "Second answer 2",
        },
        {
            "questionId": QUESTION_IDS_AND_TEMPLATES[2][0],
            "answerId": TEST_FORM_1_ANSWER_3_ID,
            "answer": "Second answer 3",
        },
    ]
    response = app.put_json(
        NOMINATED_USER_FEEDBACK_ENDPOINT,
        {"form": invalid_form},
        headers={ANGULAR_2_XSRF_TOKEN_HEADER_NAME: csrf_token},
        expect_errors=True,
    )
    assert response.status_code == 400
示例#4
0
def test_employee_can_get_blank_feedback_form_to_valid_nominee_while_inside_entry_subperiod(
        app_with_nominees_inside_entry_subperiod):  # noqa: E501
    app = successfully_login(app_with_nominees_inside_entry_subperiod,
                             TEST_EMPLOYEE_USERNAME)

    response = app.get(NOMINATED_USER_FEEDBACK_ENDPOINT)
    form = response.json_body.get("form")
    end_date = form["endDate"]
    # note in entry subperiod for `generate_period_dates` hence 1 day offset
    man_location = TEST_LDAP_FULL_DETAILS[TEST_EMPLOYEE_USERNAME][
        LDAP_LOCATION_ATTR]
    assert end_date == datetimeformat(TEST_UTCNOW + timedelta(days=1),
                                      User(location=man_location))
    items = form["items"]
    assert isinstance(items, list)
    employee = form["employee"]
    assert employee["displayName"] == NOMINATED_DISPLAY_NAME
    assert employee["position"] == NOMINATED_POSITION

    expected_questions = []
    for _, template, caption in QUESTION_IDS_AND_TEMPLATES:
        expected_questions.append([
            template.format(period_name=TEST_PERIOD_NAME,
                            display_name=NOMINATED_DISPLAY_NAME),
            caption,
        ])

    for generated, expected in zip(items, expected_questions):
        assert generated["questionId"]
        assert generated["question"] == expected[0]
        assert generated["answerId"] is None
        assert generated["answer"] == ""
        assert generated["caption"] == expected[1]
示例#5
0
def test_employee_cannot_put_summary(ldap_mocked_app_with_users):
    app = successfully_login(ldap_mocked_app_with_users,
                             TEST_EMPLOYEE_USERNAME)
    csrf_token = app.cookies[ANGULAR_2_XSRF_TOKEN_COOKIE_NAME]
    dbsession = get_dbsession(app)
    add_test_data_for_stats(dbsession)
    endpoint = "/api/v1/summarise/%s/" % TEST_EMPLOYEE_USERNAME

    answers = [
        {
            "questionId": QUESTION_IDS_AND_TEMPLATES[0][0],
            "answer": fake.sentence(nb_words=4),
        },
        {
            "questionId": QUESTION_IDS_AND_TEMPLATES[1][0],
            "answer": fake.sentence(nb_words=4),
        },
        {
            "questionId": QUESTION_IDS_AND_TEMPLATES[2][0],
            "answer": fake.sentence(nb_words=4),
        },
    ]

    resp = app.put_json(
        endpoint,
        {"form": answers},
        headers={ANGULAR_2_XSRF_TOKEN_HEADER_NAME: csrf_token},
        expect_errors=True,
    )

    # doesn't pass through ACL filter as fails at check related to direct
    # reports
    assert resp.status_code == 404
示例#6
0
def test_employee_cannot_give_and_update_feedback_on_invalid_nominee(
        app_with_nominees_inside_entry_subperiod):  # noqa: E501
    app = successfully_login(app_with_nominees_inside_entry_subperiod,
                             TEST_EMPLOYEE_USERNAME)
    csrf_token = app.cookies[ANGULAR_2_XSRF_TOKEN_COOKIE_NAME]

    response = app.get(UNNOMINATED_USER_FEEDBACK_ENDPOINT, expect_errors=True)
    assert response.status_code == 404

    payload = [
        {
            "questionId": 1,
            "answer": "foo"
        },
        {
            "questionId": 2,
            "answer": "bar"
        },
        {
            "questionId": 3,
            "answer": "baz"
        },
    ]
    response = app.put_json(
        UNNOMINATED_USER_FEEDBACK_ENDPOINT,
        {"form": payload},
        headers={ANGULAR_2_XSRF_TOKEN_HEADER_NAME: csrf_token},
        expect_errors=True,
    )
    assert response.status_code == 404
示例#7
0
def test_employee_cannot_get_summary(ldap_mocked_app_with_users):
    app = successfully_login(ldap_mocked_app_with_users,
                             TEST_EMPLOYEE_2_USERNAME)
    dbsession = get_dbsession(app)
    add_test_data_for_stats(dbsession)
    resp = app.get("/api/v1/summarise/%s/" % TEST_EMPLOYEE_USERNAME,
                   expect_errors=True)
    assert resp.status_code == 404
示例#8
0
def test_talent_manager_can_get_history_for_anyone(
        ldap_mocked_app_with_users):  # noqa: E501
    app = successfully_login(ldap_mocked_app_with_users,
                             TEST_TALENT_MANAGER_USERNAME)
    dbsession = get_dbsession(app)
    add_test_data_for_stats(dbsession)
    resp = app.get("/api/v1/feedback-history/%s/" % TEST_EMPLOYEE_2_USERNAME)
    assert resp.status_code == 200
示例#9
0
def test_employee_cannot_get_company_feedback_stats_csv(
    app_with_nominees_inside_entry_subperiod
):  # noqa: E501
    app = successfully_login(
        app_with_nominees_inside_entry_subperiod, TEST_EMPLOYEE_USERNAME
    )
    response = app.get("/api/v1/company-feedback-stats.csv", expect_errors=True)
    assert response.status_code == 403
示例#10
0
def test_manager_cannot_get_raw_feedback_csv(
    app_with_nominees_inside_entry_subperiod
):  # noqa: E501
    app = successfully_login(
        app_with_nominees_inside_entry_subperiod, TEST_MANAGER_USERNAME
    )
    response = app.get("/api/v1/company-raw-feedback.csv", expect_errors=True)
    assert response.status_code == 403
示例#11
0
def test_external_cannot_get_company_feedback_stats(
    app_with_nominees_inside_entry_subperiod
):  # noqa: E501
    app = successfully_login(
        app_with_nominees_inside_entry_subperiod, TEST_COMPANY_COLLEAGUE_USERNAME
    )
    response = app.get("/api/v1/company-stats", expect_errors=True)
    assert response.status_code == 403
示例#12
0
def test_manager_can_get_own_team_feedback_stats_during_approval_period(
        ldap_mocked_app_with_users):  # noqa: E501
    app = successfully_login(ldap_mocked_app_with_users, TEST_MANAGER_USERNAME)
    dbsession = get_dbsession(app)
    add_test_data_for_stats(dbsession)
    _add_extra_periods(dbsession)
    response = app.get("/api/v1/team-stats")
    expected = ADD_TEST_DATA_FOR_STATS_EXPECTED_STATE
    assert response.json_body == expected
示例#13
0
def test_talent_manager_can_get_company_feedback_stats_csv(
    ldap_mocked_app_with_users
):  # noqa: E501
    app = successfully_login(ldap_mocked_app_with_users, TEST_TALENT_MANAGER_USERNAME)
    dbsession = get_dbsession(app)
    add_test_data_for_stats(dbsession)
    response = app.get("/api/v1/company-feedback-stats.csv")
    assert response.content_type == "text/csv"
    assert response.body == open(TEST_CSV_FILEPATH, "rb").read()
示例#14
0
def test_employee_cannot_get_others_history(
        ldap_mocked_app_with_users):  # noqa: E501
    app = successfully_login(ldap_mocked_app_with_users,
                             TEST_EMPLOYEE_USERNAME)
    dbsession = get_dbsession(app)
    add_test_data_for_stats(dbsession)
    resp = app.get("/api/v1/feedback-history/%s/" % TEST_EMPLOYEE_2_USERNAME,
                   expect_errors=True)
    assert resp.status_code == 403
示例#15
0
def test_manager_cannot_get_history_for_non_direct_report(
        ldap_mocked_app_with_users):  # noqa: E501
    app = successfully_login(ldap_mocked_app_with_users,
                             TEST_OTHER_MANAGER_USERNAME)
    dbsession = get_dbsession(app)
    add_test_data_for_stats(dbsession)
    resp = app.get("/api/v1/feedback-history/%s/" % TEST_EMPLOYEE_2_USERNAME,
                   expect_errors=True)
    assert resp.status_code == 403
示例#16
0
def test_talent_manager_can_get_company_raw_feedback(
    ldap_mocked_app_with_users
):  # noqa: E501
    app = successfully_login(ldap_mocked_app_with_users, TEST_TALENT_MANAGER_USERNAME)
    dbsession = get_dbsession(app)
    add_test_data_for_stats(dbsession)
    with transaction.manager:
        form = FeedbackForm(
            to_username=TEST_EMPLOYEE_3_USERNAME,
            from_username=TEST_TALENT_MANAGER_USERNAME,
            period_id=TEST_PREVIOUS_PERIOD_ID,
            is_summary=True,
        )
        answers = [
            FeedbackAnswer(question_id=QUESTION_IDS_AND_TEMPLATES[0][0], content="Foo"),
            FeedbackAnswer(question_id=QUESTION_IDS_AND_TEMPLATES[1][0], content="Bar"),
            FeedbackAnswer(question_id=QUESTION_IDS_AND_TEMPLATES[2][0], content="Tom"),
        ]
        form.answers = answers
        dbsession.add(form)
    response = app.get("/api/v1/company-raw-feedback.csv")
    assert response.content_type == "text/csv"
    num_q = 3
    nominee_1_answers = (
        (7 * num_q) + (3 * num_q) + (2 * num_q) + (TEST_NUM_FORMS_RECEIVED * num_q)
    )
    nominee_2_answers = 2 * num_q
    nominee_3_answers = (3 * num_q) + (8 * num_q) + (10 * num_q) + (2 * num_q)
    summary_answers = 3 * len(TEST_STATS_NOMINATED_USERS)
    num_expected = (
        nominee_1_answers + nominee_2_answers + nominee_3_answers + summary_answers
    )
    # remove csv header and trailing newline
    body = response.body.decode()
    num_generated = len(body.split("\n")) - 2
    assert num_expected == num_generated
    assert body.count(",True,") == summary_answers
    assert (
        body.count(
            "to_username,from_username,is_summary,name," "question_template,content"
        )
        == 1
    )
    raw_answer_row = (
        "{to_username},{from_username},True,{period_name},"
        "{template},{answer}"
        "".format(
            to_username=TEST_EMPLOYEE_3_USERNAME,
            from_username=TEST_TALENT_MANAGER_USERNAME,
            period_name=TEST_PREVIOUS_PERIOD_NAME,
            template=QUESTION_IDS_AND_TEMPLATES[1][1],
            answer="Bar",
        )
    )
    assert body.count(raw_answer_row) == 1
示例#17
0
def test_manager_can_summarise_for_nominated_but_no_received_feedback(
        ldap_mocked_app_with_users):  # noqa: E501
    app = successfully_login(ldap_mocked_app_with_users, TEST_MANAGER_USERNAME)
    dbsession = get_dbsession(app)
    add_test_data_for_stats(dbsession)
    with transaction.manager:
        forms = (dbsession.query(FeedbackForm).filter(
            FeedbackForm.to_username == TEST_EMPLOYEE_2_USERNAME).all())
        for form in forms:
            dbsession.delete(form)
    app.get("/api/v1/summarise/%s/" % TEST_EMPLOYEE_2_USERNAME)
示例#18
0
def test_manager_can_get_own_team_feedback_stats_outside_approval_period(
        ldap_mocked_app_with_users):  # noqa: E501
    app = successfully_login(ldap_mocked_app_with_users, TEST_MANAGER_USERNAME)
    dbsession = get_dbsession(app)
    add_test_data_for_stats(dbsession,
                            current_subperiod=Period.ENTRY_SUBPERIOD)
    _add_extra_periods(dbsession)
    response = app.get("/api/v1/team-stats")
    expected = ADD_TEST_DATA_FOR_STATS_EXPECTED_STATE
    for row in expected["stats"]["values"]:
        row[-1]["buttonText"] = "Not in approval or review period"
        row[-1]["enable"] = False
        row[-1]["hasExistingSummary"] = False
    assert response.json_body == expected
示例#19
0
def test_manager_can_get_history_for_direct_report(
        ldap_mocked_app_with_users):  # noqa: E501
    app = successfully_login(ldap_mocked_app_with_users, TEST_MANAGER_USERNAME)
    dbsession = get_dbsession(app)
    add_test_data_for_stats(dbsession)
    add_previous_test_summary(dbsession)
    add_extra_feedback_histories(dbsession, num=10)

    resp = app.get("/api/v1/feedback-history/%s/" % TEST_EMPLOYEE_2_USERNAME)
    assert len(
        resp.json_body["feedback"]["items"]) == MANAGER_VIEW_HISTORY_LIMIT
    items_payload = deepcopy(resp.json_body)
    items_payload["feedback"]["items"] = items_payload["feedback"]["items"][:2]
    assert EMPLOYEE_2_EXPECTED_HISTORY_HEAD == items_payload
示例#20
0
def test_employee_can_view_feedback_received_for_all_periods(
        ldap_mocked_app_with_users):  # noqa: E501
    app = successfully_login(ldap_mocked_app_with_users,
                             TEST_EMPLOYEE_2_USERNAME)
    dbsession = get_dbsession(app)
    add_test_data_for_stats(dbsession)
    add_previous_test_summary(dbsession)
    add_extra_feedback_histories(dbsession, num=10)

    resp = app.get("/api/v1/feedback-about-me")
    assert len(resp.json_body["feedback"]["items"]) == 12

    items_payload = deepcopy(resp.json_body)
    items_payload["feedback"]["items"] = items_payload["feedback"]["items"][:2]
    assert EMPLOYEE_2_EXPECTED_HISTORY_HEAD == items_payload
示例#21
0
def test_talent_manager_can_mass_email(ldap_mocked_app_with_users, template_key):
    with patch("smtplib.SMTP"), patch(
        "socket.gethostname"
    ) as gethostname_mock, patch("getpass.getuser") as getuser_mock:
        gethostname_mock.return_value = TEST_PRODUCTION_HOSTNAME
        getuser_mock.return_value = TEST_PRODUCTION_USER
        app = successfully_login(ldap_mocked_app_with_users, TEST_TALENT_MANAGER_USERNAME)
        dbsession = get_dbsession(app)
        template_id = add_test_template(dbsession)
        add_test_period_with_template(dbsession, Period.ENTRY_SUBPERIOD, template_id)
        csrf_token = app.cookies[ANGULAR_2_XSRF_TOKEN_COOKIE_NAME]
        response = app.post_json(
            "/api/v1/send-email", {"templateKey": template_key}, headers={ANGULAR_2_XSRF_TOKEN_HEADER_NAME: csrf_token},
        )
        assert response.json_body["success"]
示例#22
0
def test_employee_cannot_list_nominees_outside_entry_subperiod(
        app_with_nominees_inside_approval_subperiod):  # noqa: E501
    app = successfully_login(app_with_nominees_inside_approval_subperiod,
                             TEST_EMPLOYEE_USERNAME)

    response = app.get("/api/v1/nominees")
    assert response.json_body["heading"] == ENTRY_ENDED_TEMPLATE[
        "heading"].format(period_name=TEST_PERIOD_NAME)
    assert response.json_body["body"] == ENTRY_ENDED_TEMPLATE["body"].format(
        period_name=TEST_PERIOD_NAME)
    assert response.json_body["buttonText"] == ENTRY_ENDED_TEMPLATE[
        "buttonText"]
    assert response.json_body["buttonLink"] == ENTRY_ENDED_TEMPLATE[
        "buttonLink"]
    assert response.json_body["canNominate"] == ENTRY_ENDED_TEMPLATE[
        "canNominate"]
示例#23
0
def test_employee_can_self_nominate_under_valid_conditions(
        app_in_enrollment_subperiod):  # noqa: E501
    app = successfully_login(app_in_enrollment_subperiod,
                             TEST_EMPLOYEE_USERNAME)
    csrf_token = app.cookies[ANGULAR_2_XSRF_TOKEN_COOKIE_NAME]
    response = app.post("/api/v1/self-nominate",
                        headers={ANGULAR_2_XSRF_TOKEN_HEADER_NAME: csrf_token})
    assert response.json_body["heading"] == ENROLLMENT_SUCCESS_TEMPLATE[
        "heading"].format(period_name=TEST_PERIOD_NAME)
    assert response.json_body["body"] == ENROLLMENT_SUCCESS_TEMPLATE[
        "body"].format(period_name=TEST_PERIOD_NAME)
    assert response.json_body["buttonText"] == ENROLLMENT_SUCCESS_TEMPLATE[
        "buttonText"]
    assert response.json_body["buttonLink"] == ENROLLMENT_SUCCESS_TEMPLATE[
        "buttonLink"]
    assert (response.json_body["canNominate"] ==
            ENROLLMENT_SUCCESS_TEMPLATE["canNominate"])
示例#24
0
def test_manager_cannot_summarise_during_illegal_subperiod(
        ldap_mocked_app_with_users, subperiod):  # noqa: E501
    app = successfully_login(ldap_mocked_app_with_users, TEST_MANAGER_USERNAME)
    csrf_token = app.cookies[ANGULAR_2_XSRF_TOKEN_COOKIE_NAME]
    dbsession = get_dbsession(app)
    add_test_data_for_stats(dbsession, current_subperiod=subperiod)
    endpoint = "/api/v1/summarise/%s/" % TEST_EMPLOYEE_USERNAME
    response = app.get(endpoint, expect_errors=True)
    assert response.status_code == 404
    response = app.put_json(
        endpoint,
        {"form": []},
        headers={ANGULAR_2_XSRF_TOKEN_HEADER_NAME: csrf_token},
        expect_errors=True,
    )
    # 404 as opposed to 400
    assert response.status_code == 404
示例#25
0
def test_external_can_list_nominee_inviters_inside_entry_subperiod(
    app_with_nominees_and_existing_feedback_form_inside_entry_subperiod
):  # noqa: E501
    app = successfully_login(
        app_with_nominees_and_existing_feedback_form_inside_entry_subperiod,  # noqa: E501
        TEST_COMPANY_COLLEAGUE_USERNAME,
    )
    response = app.get("/api/v1/nominees")
    assert response.status_code == 200
    assert TEST_PERIOD_NAME == response.json_body["period"]
    assert response.json_body["nominees"] == []

    dbsession = get_dbsession(app)
    # add irrevelant external invite for previous period
    add_test_period_with_template(
        dbsession,
        Period.ENTRY_SUBPERIOD,
        1,
        period_id=TEST_PREVIOUS_PERIOD_ID,
        period_name=TEST_PREVIOUS_PERIOD_NAME,
        offset_from_utc_now_days=-100,
    )

    with transaction.manager:
        invite = ExternalInvite(
            to_username=TEST_COMPANY_COLLEAGUE_USERNAME,
            from_username=TEST_EMPLOYEE_USERNAME,
            period_id=TEST_PERIOD_ID,
        )
        dbsession.add(invite)

        prev_invite = ExternalInvite(
            to_username=TEST_COMPANY_COLLEAGUE_USERNAME,
            from_username=TEST_MANAGER_USERNAME,
            period_id=TEST_PREVIOUS_PERIOD_ID,
        )
        dbsession.add(prev_invite)

    response = app.get("/api/v1/nominees")
    assert 200 == response.status_code
    assert TEST_PERIOD_NAME == response.json_body["period"]
    assert 1 == len(response.json_body["nominees"])
    assert TEST_EMPLOYEE_USERNAME == response.json_body["nominees"][0][
        "username"]
    assert not response.json_body["nominees"][0]["hasExistingFeedback"]
示例#26
0
def test_employee_can_list_nominees_inside_entry_subperiod_2(
        ldap_mocked_app_with_users):  # noqa: E501
    """A particular DB state that caused failure in the past but
    is not working"""
    app = successfully_login(ldap_mocked_app_with_users,
                             TEST_EMPLOYEE_USERNAME)
    dbsession = get_dbsession(app)
    add_test_data_for_stats(dbsession, Period.ENTRY_SUBPERIOD)

    response = app.get("/api/v1/nominees")
    assert response.status_code == 200
    assert TEST_PERIOD_NAME == response.json_body["period"]
    # logged in user should not see their own name in nomination list
    nominees = [("bboggs", True), ("llovelace", False)]
    expected = []
    for un, has_manager_in_database in nominees:
        data = TEST_LDAP_FULL_DETAILS[un]
        un_name = data[TEST_USERNAME_KEY]
        # if they are not in the User database, then they don't exist so
        # can't put up a display name
        if has_manager_in_database:
            manager = TEST_LDAP_FULL_DETAILS.get(data[MANAGER_KEY])
            manager_display_name = " ".join(
                [manager["givenName"], manager["sn"]])
        else:
            manager_display_name = "-"
        expected.append({
            "username":
            un_name,
            "displayName":
            data["givenName"] + " " + data["sn"],
            "position":
            data["title"],
            "managerDisplayName":
            manager_display_name,
            "department":
            data["department"],
            "hasExistingFeedback":
            True if un_name == EXISTING_FEEDBACK_FORM_USERNAME else False,
        })

    sorted_response = sorted(response.json_body["nominees"],
                             key=lambda x: x["displayName"])
    assert len(expected) == len(sorted_response)
    assert expected == sorted_response
示例#27
0
def test_talent_manager_can_correct_summarised_feedback_from_another_manager(
    ldap_mocked_app_with_users
):  # noqa: E501
    app = successfully_login(ldap_mocked_app_with_users, TEST_TALENT_MANAGER_USERNAME)
    dbsession = get_dbsession(app)
    add_test_data_for_stats(dbsession, current_subperiod=Period.REVIEW_SUBPERIOD)
    response = app.get("/api/v1/summarise/%s/" % TEST_EMPLOYEE_2_USERNAME)
    items = response.json_body["summary"]["items"]
    expected = [
        {"questionId": QUESTION_IDS_AND_TEMPLATES[0][0], "answer": TEST_SUMMARY_1},
        {"questionId": QUESTION_IDS_AND_TEMPLATES[1][0], "answer": TEST_SUMMARY_2},
        {"questionId": QUESTION_IDS_AND_TEMPLATES[2][0], "answer": TEST_SUMMARY_3},
    ]
    generated = sorted(items, key=lambda k: k["questionId"])

    for exp, gen in zip(expected, generated):
        assert exp["questionId"] == gen["questionId"]
        assert exp["answer"] == gen["answer"]
示例#28
0
def test_employee_can_give_valid_feedback_form_to_valid_nominate_while_inside_entry_subperiod(
        app_with_nominees_inside_entry_subperiod):  # noqa: E501
    app = successfully_login(app_with_nominees_inside_entry_subperiod,
                             TEST_EMPLOYEE_USERNAME)
    csrf_token = app.cookies[ANGULAR_2_XSRF_TOKEN_COOKIE_NAME]
    expected_questions = []
    for _, template, caption in QUESTION_IDS_AND_TEMPLATES:
        expected_questions.append(
            template.format(period_name=TEST_PERIOD_NAME,
                            display_name=NOMINATED_DISPLAY_NAME))

    expected_answers = [
        {
            "questionId": QUESTION_IDS_AND_TEMPLATES[0][0],
            "answer": "First answer 1"
        },
        {
            "questionId": QUESTION_IDS_AND_TEMPLATES[1][0],
            "answer": "First answer 2 ₯"
        },
        {
            "questionId": QUESTION_IDS_AND_TEMPLATES[2][0],
            "answer": "First answer 3"
        },
    ]

    log.info("should be creating new form")
    app.put_json(
        NOMINATED_USER_FEEDBACK_ENDPOINT,
        {"form": expected_answers},
        headers={ANGULAR_2_XSRF_TOKEN_HEADER_NAME: csrf_token},
    )

    log.info("should be fetching newly created form from server")
    response = app.get(NOMINATED_USER_FEEDBACK_ENDPOINT)
    items = response.json_body["form"]["items"]

    for generated, expected_q, expected_a in zip(items, expected_questions,
                                                 expected_answers):
        assert generated["questionId"] == expected_a["questionId"]
        assert generated["question"] == expected_q
        assert isinstance(generated["answerId"], int)
        assert generated["answer"] == expected_a["answer"]
示例#29
0
def test_manager_can_only_view_summary_during_review(
        ldap_mocked_app_with_users):  # noqa: E501
    app = successfully_login(ldap_mocked_app_with_users, TEST_MANAGER_USERNAME)
    csrf_token = app.cookies[ANGULAR_2_XSRF_TOKEN_COOKIE_NAME]
    dbsession = get_dbsession(app)
    add_test_data_for_stats(dbsession,
                            current_subperiod=Period.REVIEW_SUBPERIOD)
    endpoint = "/api/v1/summarise/%s/" % TEST_EMPLOYEE_USERNAME
    response = app.get(endpoint)
    assert response.json_body["summary"]["readOnly"]

    response = app.put_json(
        endpoint,
        {"form": []},
        headers={ANGULAR_2_XSRF_TOKEN_HEADER_NAME: csrf_token},
        expect_errors=True,
    )
    # 404 as opposed to 400
    assert response.status_code == 404
示例#30
0
def test_employee_cannot_self_nominate_if_already_nominated(
        app_in_enrollment_subperiod):  # noqa: E501
    dbsession = get_dbsession(app_in_enrollment_subperiod)

    with transaction.manager:
        period = dbsession.query(Period).first()
        nominee = Nominee(period=period, username=TEST_EMPLOYEE_USERNAME)
        dbsession.add(nominee)

    app = successfully_login(app_in_enrollment_subperiod,
                             TEST_EMPLOYEE_USERNAME)
    csrf_token = app.cookies[ANGULAR_2_XSRF_TOKEN_COOKIE_NAME]
    response = app.post(
        "/api/v1/self-nominate",
        headers={ANGULAR_2_XSRF_TOKEN_HEADER_NAME: csrf_token},
        expect_errors=True,
    )
    assert response.status_code == 400
    assert "You are already enrolled" in response.json_body["message"]