Skip to content

Instantly share code, notes, and snippets.

@default-work
Created July 14, 2021 17:05
Show Gist options
  • Save default-work/3678fb46b97a471cbc243b068534175f to your computer and use it in GitHub Desktop.
Save default-work/3678fb46b97a471cbc243b068534175f to your computer and use it in GitHub Desktop.

Revisions

  1. Artur Mustafin created this gist Jul 14, 2021.
    187 changes: 187 additions & 0 deletions employee_endpoints_test.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,187 @@
    import os
    import json
    import pytest
    from http import HTTPStatus
    from unittest.mock import patch, Mock
    from flask import Response, url_for
    from app.api.core.entities.employee import Employee, EmployeeJobAllocation
    from app.api.core.entities.department import Department
    from app.api.core.entities.facility import Facility
    from test.api.oauth.oauth_required_test import MOCK_GOOD_TOKEN, MOCK_BAD_TOKEN, TOKEN_DATE_TIME, PUBLIC_KEYS
    from copy import deepcopy

    TEST_ENTITY_EMPLOYEES = [Employee(11111, 12345, "cmei", "firstname", "lastname")]
    TEST_INVALID_ENTITY_EMPLOYEES = [None]

    TEST_ENTITY_JOB_ALLOCATIONS = [
    EmployeeJobAllocation(
    Department(1, "Test Department 1", "Test_dept"),
    Facility(1, "Test Facility", "Test_Faci_Code", "Test_H_Code"), True),
    EmployeeJobAllocation(
    Department(1, "my test", "Test_dept"),
    Facility(1, "Test Facility", "Test_Faci_Code", "Test_H_Code"), False),
    EmployeeJobAllocation(
    Department(1, "Test Department 1", "Test_dept"),
    Facility(1, "Test Facility", "Test_Faci_Code", "Test_H_Code"), False)]

    @pytest.mark.freeze_time(TOKEN_DATE_TIME)
    def test_GetEmployeesFacilityByEmpId_success(client, mocker):
    get_employee_mock = mocker.patch('app.api.core.repository.employee_repository.EmployeeSqlRepostory.get_employee_by_id')
    get_employee_mock.return_value = TEST_ENTITY_EMPLOYEES[0]

    get_allocations_mock = mocker.patch('app.api.core.repository.employee_repository.EmployeeSqlRepostory.get_employee_allocations_by_Id')
    get_allocations_mock.return_value = TEST_ENTITY_JOB_ALLOCATIONS

    response = client.get('/employee-service/employees/11111/facilities', headers={'Authorization': MOCK_GOOD_TOKEN})

    assert HTTPStatus.OK == response.status_code
    assert response.data is not None

    #evaluate return object
    jsonobject = json.loads(response.data)
    assert len(jsonobject) == 3
    assert jsonobject[0].get('facility_id') == 1

    @pytest.mark.freeze_time(TOKEN_DATE_TIME)
    def test_GetEmployeesFacilityByEmpId_success(client, mocker):
    get_employee_mock = mocker.patch('app.api.core.repository.employee_repository.EmployeeSqlRepostory.get_employee_by_id')
    get_employee_mock.return_value = TEST_ENTITY_EMPLOYEES[0]

    get_allocations_mock = mocker.patch('app.api.core.repository.employee_repository.EmployeeSqlRepostory.get_employee_allocations_by_Id')
    get_allocations_mock.return_value = TEST_ENTITY_JOB_ALLOCATIONS

    response = client.get('/employee-service/employees/sss/facilities', headers={'Authorization': MOCK_GOOD_TOKEN})

    assert HTTPStatus.UNPROCESSABLE_ENTITY == response.status_code
    assert response.data is not None

    #evaluate return object
    jsonobject = json.loads(response.data)
    assert len(jsonobject) == 1
    assert jsonobject.get('message').get('message') == "Invalid employee Id format"

    @pytest.mark.freeze_time(TOKEN_DATE_TIME)
    def test_GetEmployeesFacilityByEmpId_404(client, mocker):
    get_employee_mock = mocker.patch('app.api.core.services.employee_service.EmployeeService.get_employee_by_id')
    get_employee_mock.return_value = None

    get_allocations_mock = mocker.patch('app.api.core.services.employee_service.EmployeeService.get_employee_allocations_by_employee_id')
    get_allocations_mock.return_value = []

    response = client.get('/employee-service/employees/00000/facilities', headers={'Authorization': MOCK_GOOD_TOKEN})

    assert HTTPStatus.NOT_FOUND == response.status_code

    @pytest.mark.freeze_time(TOKEN_DATE_TIME)
    def test_GivenUsernameQueryEmployeesFacility_success(client, mocker):
    get_employee_svr_mock = mocker.patch("app.api.core.services.employee_service.EmployeeService.get_employee_by_username")
    get_employee_svr_mock.return_value = TEST_ENTITY_EMPLOYEES
    get_allocations_svr_mock = mocker.patch('app.api.core.services.employee_service.EmployeeService.get_employee_allocations_by_username')
    get_allocations_svr_mock.return_value = TEST_ENTITY_JOB_ALLOCATIONS

    response = client.get("/employee-service/employees/search-facilities?username=test", headers={'Authorization': MOCK_GOOD_TOKEN})

    assert HTTPStatus.OK == response.status_code
    assert response.data is not None

    #evaluate return object
    jsonobject = json.loads(response.data)
    assert len(jsonobject) == 3

    @pytest.mark.freeze_time(TOKEN_DATE_TIME)
    def test_GivenUsernameQueryEmployeesFacility_fail(client, mocker):
    get_employee_svr_mock = mocker.patch("app.api.core.services.employee_service.EmployeeService.get_employee_by_username")
    get_employee_svr_mock.return_value = TEST_INVALID_ENTITY_EMPLOYEES[0]
    get_allocations_svr_mock = mocker.patch('app.api.core.services.employee_service.EmployeeService.get_employee_allocations_by_username')
    get_allocations_svr_mock.return_value = TEST_ENTITY_JOB_ALLOCATIONS

    response = client.get("/employee-service/employees/search-facilities?username=sss", headers={'Authorization': MOCK_GOOD_TOKEN})


    assert HTTPStatus.NOT_FOUND == response.status_code

    #evaluate return object
    jsonobject = json.loads(response.data)
    assert len(jsonobject) == 1
    assert jsonobject.get('message') == 'No active employee found with the username provided. You have requested this URI [/employee-service/employees/search-facilities] but did you mean /employee-service/employees/search-facilities or /employee-service/employees/<emp_id>/facilities or /employee-service/employees/byusername ?'

    @pytest.mark.freeze_time(TOKEN_DATE_TIME)
    def test_GivenUserIdQueryEmployeesFacility_fail_404(client, mocker):
    get_employee_svr_mock = mocker.patch("app.api.core.services.employee_service.EmployeeService.get_employee_by_username")
    get_employee_svr_mock.return_value = TEST_INVALID_ENTITY_EMPLOYEES[0]
    get_allocations_svr_mock = mocker.patch('app.api.core.services.employee_service.EmployeeService.get_employee_allocations_by_username')
    get_allocations_svr_mock.return_value = TEST_ENTITY_JOB_ALLOCATIONS

    response = client.get("/employee-service/employees/dora?username=0", headers={'Authorization': MOCK_GOOD_TOKEN})


    assert HTTPStatus.NOT_FOUND == response.status_code

    #evaluate return object
    assert response.data == b'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n<title>404 Not Found</title>\n<h1>Not Found</h1>\n<p>The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.</p>\n'

    @pytest.mark.freeze_time(TOKEN_DATE_TIME)
    def test_GivenUserIdQueryEmployeesFacility_fail_id_0(client, mocker):
    get_employee_svr_mock = mocker.patch("app.api.core.services.employee_service.EmployeeService.get_employee_by_username")
    get_employee_svr_mock.return_value = TEST_INVALID_ENTITY_EMPLOYEES[0]
    get_allocations_svr_mock = mocker.patch('app.api.core.services.employee_service.EmployeeService.get_employee_allocations_by_username')
    get_allocations_svr_mock.return_value = TEST_ENTITY_JOB_ALLOCATIONS

    response = client.get("/employee-service/employees/0", headers={'Authorization': MOCK_GOOD_TOKEN})


    assert HTTPStatus.UNPROCESSABLE_ENTITY == response.status_code
    jsonobject = json.loads(response.data)
    assert len(jsonobject) == 1
    assert jsonobject.get("message").get("message") == 'Invalid employee id format. It must be positive integer and great that 0'

    @pytest.mark.freeze_time(TOKEN_DATE_TIME)
    def test_GivenUserIdQueryEmployeesFacility_fail_no_id(client, mocker):
    get_employee_svr_mock = mocker.patch("app.api.core.services.employee_service.EmployeeService.get_employee_by_id")
    get_employee_svr_mock.side_effect = ValueError()
    get_allocations_svr_mock = mocker.patch('app.api.core.services.employee_service.EmployeeService.get_employee_allocations_by_username')
    get_allocations_svr_mock.return_value = TEST_ENTITY_JOB_ALLOCATIONS

    response = client.get("/employee-service/employees/1", headers={'Authorization': MOCK_GOOD_TOKEN})

    assert HTTPStatus.UNPROCESSABLE_ENTITY == response.status_code
    jsonobject = json.loads(response.data)
    assert len(jsonobject) == 1
    assert jsonobject.get("message").get("message") == 'Invalid employee id format. It must be number only'

    @pytest.mark.freeze_time(TOKEN_DATE_TIME)
    def test_GivenUsernameQueryEmployeesFacility_by_department_success(client, mocker):
    get_employee_svr_mock = mocker.patch("app.api.core.services.employee_service.EmployeeService.get_employee_by_username")
    get_employee_svr_mock.return_value = TEST_ENTITY_EMPLOYEES
    # get_allocations_svr_mock = mocker.patch('app.api.core.services.employee_service.EmployeeService.get_employee_allocations_by_username')
    # get_allocations_svr_mock.return_value = TEST_ENTITY_JOB_ALLOCATIONS
    get_allocations_svr_mock = mocker.patch('app.api.core.services.employee_service.EmployeeService.get_employee_allocations_by_dept')
    get_allocations_svr_mock.return_value = TEST_ENTITY_JOB_ALLOCATIONS

    response = client.get("/employee-service/employees/search-facilities?username=test&department=Test Department 1", headers={'Authorization': MOCK_GOOD_TOKEN})

    assert HTTPStatus.OK == response.status_code
    assert response.data is not None

    #evaluate return object
    jsonobject = json.loads(response.data)
    assert len(jsonobject) == 3
    assert jsonobject[0].get('department_name') == "Test Department 1"

    @pytest.mark.freeze_time(TOKEN_DATE_TIME)
    def test_GivenUsernameQueryEmployeesFacility_by_department_missing_arguments(client, mocker):
    get_employee_svr_mock = mocker.patch("app.api.core.services.employee_service.EmployeeService.get_employee_by_username")
    get_employee_svr_mock.return_value = TEST_ENTITY_EMPLOYEES
    # get_allocations_svr_mock = mocker.patch('app.api.core.services.employee_service.EmployeeService.get_employee_allocations_by_username')
    # get_allocations_svr_mock.return_value = TEST_ENTITY_JOB_ALLOCATIONS
    get_allocations_svr_mock = mocker.patch('app.api.core.services.employee_service.EmployeeService.get_employee_allocations_by_dept')
    get_allocations_svr_mock.return_value = TEST_ENTITY_JOB_ALLOCATIONS

    response = client.get("/employee-service/employees/byusername", headers={'Authorization': MOCK_GOOD_TOKEN})

    assert HTTPStatus.BAD_REQUEST == response.status_code
    assert response.data is not None

    jsonobject = json.loads(response.data)
    assert len(jsonobject) == 1
    assert jsonobject.get("message") == 'Missing username token in the query string'