Skip to content

Commit

Permalink
Merge pull request #37 from ACWIC/implement_api_level_tests
Browse files Browse the repository at this point in the history
Implement API level tests
  • Loading branch information
BarisSari committed Nov 13, 2020
2 parents 483a9e4 + 985c5a6 commit c272108
Show file tree
Hide file tree
Showing 5 changed files with 209 additions and 21 deletions.
1 change: 1 addition & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
[run]
include = app/*
branch = True
omit = app/main.py

[html]
directory = test-reports/cov/
Expand Down
36 changes: 15 additions & 21 deletions app/api/enrolments.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

from app.repositories.s3_enrolment_repo import S3EnrolmentRepo
from app.requests.enrolment_requests import NewEnrolmentRequest
from app.use_cases.create_enrolment import CreateNewEnrolment
from app.use_cases.get_callback import GetCallback
from app.use_cases.get_callbacks_list import GetCallbacksList
from app.use_cases.get_enrolment import GetEnrolmentByID
from app.use_cases.get_enrolment_status import GetEnrolmentStatus
from app.use_cases import create_enrolment as ce
from app.use_cases import get_callback as gc
from app.use_cases import get_callbacks_list as gcl
from app.use_cases import get_enrolment as ge
from app.use_cases import get_enrolment_status as ges

router = APIRouter()
enrolment_repo = S3EnrolmentRepo()
Expand All @@ -24,23 +24,20 @@ def create_enrolment(inputs: NewEnrolmentRequest):
and prepare to receive callbacks from the training provider
about this enrolment.
"""
use_case = CreateNewEnrolment(enrolment_repo=enrolment_repo)
use_case = ce.CreateNewEnrolment(enrolment_repo=enrolment_repo)
response = use_case.execute(inputs)
if bool(response) is False: # If request failed
raise HTTPException(status_code=response.type.value, detail=response.message)
return response
return response.build()


@router.get("/enrolments/{enrolment_id}")
def get_enrolment(enrolment_id: str):
"""
Return contents of enrolment
"""
use_case = GetEnrolmentByID(enrolment_repo=enrolment_repo)
use_case = ge.GetEnrolmentByID(enrolment_repo=enrolment_repo)
response = use_case.execute(enrolment_id)
if bool(response) is False: # If request failed
raise HTTPException(status_code=response.type.value, detail=response.message)
return response
return response.build()


@router.get("/enrolments/{enrolment_id}/status")
Expand All @@ -53,34 +50,31 @@ def get_enrolment_status(enrolment_id: str):
that relate to state changes.
* use these message-types to calculate the current state
"""
use_case = GetEnrolmentStatus(enrolment_repo=enrolment_repo)
use_case = ges.GetEnrolmentStatus(enrolment_repo=enrolment_repo)
response = use_case.execute(enrolment_id)
if bool(response) is False: # If request failed
raise HTTPException(status_code=response.type.value, detail=response.message)
return response
return response.build()


@router.get("/enrolments/{enrolment_id}/journal")
def get_callbacks_list_for_enrolment(
enrolment_id: str,
):
"""
Return the callbacks list
"""
use_case = GetCallbacksList(enrolment_repo=enrolment_repo)
use_case = gcl.GetCallbacksList(enrolment_repo=enrolment_repo)
response = use_case.execute(enrolment_id)
if bool(response) is False: # If request failed
raise HTTPException(status_code=response.type.value, detail=response.message)
return response
return response.build()


@router.get("/enrolments/{enrolment_id}/journal/{callback_id}")
def get_callback_for_enrolment(enrolment_id: str, callback_id):
"""
Returns callback details for an callback of an enrolment
"""
use_case = GetCallback(enrolment_repo=enrolment_repo)
use_case = gc.GetCallback(enrolment_repo=enrolment_repo)
response = use_case.execute(enrolment_id, callback_id)
if bool(response) is False: # If request failed
raise HTTPException(status_code=response.type.value, detail=response.message)
return response
return response.build()
1 change: 1 addition & 0 deletions requirements/uvicorn.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ pytest
pytest-cov
pytest-sugar
pytest-flake8
requests

# debugging
ipython
175 changes: 175 additions & 0 deletions tests/api/test_enrolments.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
from unittest import mock

from fastapi.testclient import TestClient

from app.domain.entities.enrolment import Enrolment
from app.main import app
from app.responses import FailureType, ResponseFailure, ResponseSuccess, SuccessType
from tests.test_data.data_provider import DataProvider

test_data = DataProvider()
client = TestClient(app)


@mock.patch("app.use_cases.create_enrolment.CreateNewEnrolment")
def test_create_enrolment_success_created(use_case):
code = SuccessType.CREATED
message = "The enrolment has been created."
use_case().execute.return_value = ResponseSuccess(
value=test_data.sample_enrolment,
type=code,
message=message,
)

data = test_data.sample_enrolment_request
response = client.post("/enrolments", data=data.json())
json_result = response.json()
enrolment = Enrolment(**json_result.get("value"))

use_case().execute.assert_called_with(data)
assert response.status_code == SuccessType.CREATED.value
assert enrolment == test_data.sample_enrolment
assert json_result.get("message") == message


@mock.patch("app.use_cases.create_enrolment.CreateNewEnrolment")
def test_create_enrolment_failure(use_case):
message = "Error"
use_case().execute.return_value = ResponseFailure.build_from_resource_error(
message=message,
)

data = test_data.sample_enrolment_request
response = client.post("/enrolments", data=data.json())

assert response.status_code == FailureType.RESOURCE_ERROR.value
assert response.json() == {"detail": "RESOURCE_ERROR: " + message}


@mock.patch("app.use_cases.get_enrolment.GetEnrolmentByID")
def test_get_enrolment_by_id_success(use_case):
message = "The enrolment has been fetched from the server."
use_case().execute.return_value = ResponseSuccess(
value=test_data.sample_enrolment,
message=message,
)

data = test_data.enrolment_id
response = client.get(f"/enrolments/{test_data.enrolment_id}")
json_result = response.json()
enrolment = Enrolment(**json_result.get("value"))

use_case().execute.assert_called_with(data)
assert response.status_code == SuccessType.SUCCESS.value
assert enrolment == test_data.sample_enrolment
assert json_result.get("message") == message


@mock.patch("app.use_cases.get_enrolment.GetEnrolmentByID")
def test_get_enrolment_by_id_failure(use_case):
message = "Error"
use_case().execute.return_value = ResponseFailure.build_from_resource_error(
message=message,
)

response = client.get(f"/enrolments/{test_data.enrolment_id}")

assert response.status_code == FailureType.RESOURCE_ERROR.value
assert response.json() == {"detail": "RESOURCE_ERROR: " + message}


@mock.patch("app.use_cases.get_enrolment_status.GetEnrolmentStatus")
def test_get_enrolment_status_success(use_case):
message = "The Enrolment status has been fetched from the server."
use_case().execute.return_value = ResponseSuccess(
value=test_data.sample_enrolment,
message=message,
)

data = test_data.enrolment_id
response = client.get(f"/enrolments/{test_data.enrolment_id}/status")
json_result = response.json()
enrolment = Enrolment(**json_result.get("value"))

use_case().execute.assert_called_with(data)
assert response.status_code == SuccessType.SUCCESS.value
assert enrolment == test_data.sample_enrolment
assert json_result.get("message") == message


@mock.patch("app.use_cases.get_enrolment_status.GetEnrolmentStatus")
def test_get_enrolment_status_failure(use_case):
message = "Error"
use_case().execute.return_value = ResponseFailure.build_from_resource_error(
message=message,
)

response = client.get(f"/enrolments/{test_data.enrolment_id}/status")

assert response.status_code == FailureType.RESOURCE_ERROR.value
assert response.json() == {"detail": "RESOURCE_ERROR: " + message}


@mock.patch("app.use_cases.get_callbacks_list.GetCallbacksList")
def test_get_callbacks_list_for_enrolment_success(use_case):
message = "The Callbacks list has been fetched from the server."
use_case().execute.return_value = ResponseSuccess(
value=test_data.callbacks_list1,
message=message,
)

data = test_data.enrolment_id
response = client.get(f"/enrolments/{test_data.enrolment_id}/journal")
json_result = response.json()

use_case().execute.assert_called_with(data)
assert response.status_code == SuccessType.SUCCESS.value
assert json_result.get("value") == test_data.callbacks_list1_json
assert json_result.get("message") == message


@mock.patch("app.use_cases.get_callbacks_list.GetCallbacksList")
def test_get_callbacks_list_for_enrolment_failure(use_case):
message = "Error"
use_case().execute.return_value = ResponseFailure.build_from_resource_error(
message=message,
)

response = client.get(f"/enrolments/{test_data.enrolment_id}/journal")

assert response.status_code == FailureType.RESOURCE_ERROR.value
assert response.json() == {"detail": "RESOURCE_ERROR: " + message}


@mock.patch("app.use_cases.get_callback.GetCallback")
def test_get_callback_for_enrolment_success(use_case):
message = "The callback has been fetched from the server."
use_case().execute.return_value = ResponseSuccess(
value=test_data.callbacks_list1,
message=message,
)

response = client.get(
f"/enrolments/{test_data.enrolment_id}/journal/{test_data.callback_id}"
)
json_result = response.json()

use_case().execute.assert_called_with(test_data.enrolment_id, test_data.callback_id)
assert response.status_code == SuccessType.SUCCESS.value
assert json_result.get("value") == test_data.callbacks_list1_json
assert json_result.get("message") == message


@mock.patch("app.use_cases.get_callback.GetCallback")
def test_get_callback_for_enrolment_failure(use_case):
message = "Error"
use_case().execute.return_value = ResponseFailure.build_from_resource_error(
message=message,
)

response = client.get(
f"/enrolments/{test_data.enrolment_id}/journal/{test_data.callback_id}"
)

assert response.status_code == FailureType.RESOURCE_ERROR.value
assert response.json() == {"detail": "RESOURCE_ERROR: " + message}
17 changes: 17 additions & 0 deletions tests/test_data/data_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from app.domain.entities.callback import Callback
from app.domain.entities.enrolment import Enrolment
from app.requests.enrolment_requests import NewEnrolmentRequest
from app.utils.random import Random


Expand Down Expand Up @@ -50,6 +51,18 @@ class DataProvider:
{"callback_id": callback_id, "received": received1},
]
}
callbacks_list1_json = {
"callbacks_list": [
{
"callback_id": callback_id,
"received": received.strftime("%Y-%m-%dT%H:%M:%S.%f"),
},
{
"callback_id": callback_id,
"received": received1.strftime("%Y-%m-%dT%H:%M:%S.%f"),
},
]
}

def __init__(self):
self.sample_enrolment = Enrolment(
Expand Down Expand Up @@ -90,3 +103,7 @@ def __init__(self):
received=self.received,
payload={},
)

self.sample_enrolment_request = NewEnrolmentRequest(
internal_reference=self.internal_reference
)

0 comments on commit c272108

Please sign in to comment.