diff --git a/azure/templates/ers-integration-tests.yml b/azure/templates/ers-integration-tests.yml index a2b2c34fa..5fcfa32dd 100644 --- a/azure/templates/ers-integration-tests.yml +++ b/azure/templates/ers-integration-tests.yml @@ -8,7 +8,7 @@ steps: export OAUTH_BASE_URI="https://$(ENVIRONMENT).api.service.nhs.uk" export JWT_PRIVATE_KEY_ABSOLUTE_PATH="$(Pipeline.Workspace)/secrets/$(JWT_TESTING_PRIVATE_KEY)" - poetry run pytest -v tests/integration --junitxml=tests/ers-test-integration-report.xml + poetry run pytest -v tests/integration --junitxml=tests/ers-test-integration-report.xml --api-name=e-referrals-service-api --proxy-name=$(FULLY_QUALIFIED_SERVICE_NAME) displayName: Run eRS integration tests workingDirectory: "$(Pipeline.Workspace)/s/$(SERVICE_NAME)/$(SERVICE_ARTIFACT_NAME)" - task: PublishTestResults@2 diff --git a/manifest_template.yml b/manifest_template.yml index fa233f0bb..d911b007a 100644 --- a/manifest_template.yml +++ b/manifest_template.yml @@ -79,7 +79,7 @@ ACCESS_MODES: - name: healthcare-worker nameSuffix: -healthcare-worker displayName: Healthcare Worker - scopes: ['urn:nhsd:apim:user-nhs-id:aal3:e-referrals-service-api'] + scopes: ['urn:nhsd:apim:user-nhs-id:aal3:e-referrals-service-api', 'urn:nhsd:apim:user-nhs-cis2:aal3:e-referrals-service-api'] requireCallbackUrl: true description: User restricted diff --git a/proxies/live/apiproxy/policies/OAuthV2.VerifyAccessToken.xml b/proxies/live/apiproxy/policies/OAuthV2.VerifyAccessToken.xml index bfe7f192c..c2db2a7f4 100644 --- a/proxies/live/apiproxy/policies/OAuthV2.VerifyAccessToken.xml +++ b/proxies/live/apiproxy/policies/OAuthV2.VerifyAccessToken.xml @@ -1,4 +1,4 @@ - VerifyAccessToken - urn:nhsd:apim:app:level3:e-referrals-service-api urn:nhsd:apim:user-nhs-id:aal3:e-referrals-service-api + VerifyAccessToken + urn:nhsd:apim:app:level3:e-referrals-service-api urn:nhsd:apim:user-nhs-id:aal3:e-referrals-service-api urn:nhsd:apim:user-nhs-cis2:aal3:e-referrals-service-api diff --git a/pyproject.toml b/pyproject.toml index 46d2cb1e2..fd8a16cbc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,4 +45,4 @@ pytest-nhsd-apim = "^3.4.2" [tool.poetry.scripts] [tool.pytest.ini_options] -markers = ["smoke_test", "integration_test", "sandbox"] +markers = ["smoke_test", "integration_test", "sandbox", "authentication_type"] diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/asserts.py b/tests/asserts.py index 48bc53b68..3609e055d 100644 --- a/tests/asserts.py +++ b/tests/asserts.py @@ -2,7 +2,7 @@ from typing import Dict, Iterable from pytest_check import check from requests import Response -from data import RenamedHeader +from .data import RenamedHeader # Headers which are expected for all requests _generic_headers = { diff --git a/tests/conftest.py b/tests/conftest.py index c1900ba51..c35f12de8 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,8 +1,9 @@ -import os import pytest import pytest_asyncio +import warnings from uuid import uuid4 +from .utils import get_env from pytest_nhsd_apim.identity_service import ( AuthorizationCodeConfig, @@ -18,18 +19,12 @@ ) -from data import Actor +from .data import Actor -def get_env(variable_name: str) -> str: - """Returns an environment variable""" - try: - var = os.environ[variable_name] - if not var: - raise RuntimeError(f"Variable is null, Check {variable_name}.") - return var - except KeyError: - raise RuntimeError(f"Variable is not set, Check {variable_name}.") +def _create_apigee_client(): + config = ApigeeNonProdCredentials() + return ApigeeClient(config=config) @pytest.fixture(scope="session") @@ -102,7 +97,6 @@ def app_restricted_user_id(is_mocked_environment): @pytest.fixture( - scope="session", params=["PROVIDER_AUTHORISED_APPLICATION", "REFERRER_AUTHORISED_APPLICATION"], ) def app_restricted_business_function(request): @@ -111,8 +105,7 @@ def app_restricted_business_function(request): @pytest.fixture() def client(): - config = ApigeeNonProdCredentials() - return ApigeeClient(config=config) + return _create_apigee_client() @pytest_asyncio.fixture @@ -304,3 +297,82 @@ def app_restricted_access_code( token_response = authenticator.get_token() assert "access_token" in token_response return token_response["access_token"] + + +@pytest.fixture +def _pre_authentication( + _create_test_app, + request, + asid, + app_restricted_ods_code, + app_restricted_user_id, + app_restricted_business_function, +): + """ + Fixture adding custom attributes to the application created by the pytest_nhsd_apim module's fixtures. This is required as custom attributes are not publically exposed by the module itself. + """ + + warnings.warn("Pre authentication fixture:") + + created_app = _create_test_app + if not created_app: + raise ValueError("No app has been initialised.") + + warnings.warn(f"created app={created_app}") + + api = DeveloperAppsAPI(client=_create_apigee_client()) + + marker = request.node.get_closest_marker("authentication_type") + if not marker: + raise ValueError( + "No pytest.mark.authentication_type included with request. Have you used the user_restricted_access or app_restricted_access decorators?" + ) + + # Update the attributes of the created application to add in the ASID attribute. + additional_attributes = [{"name": "asid", "value": asid}] + + if marker.args and marker.args[0]: + type = marker.args[0] + elif marker.kwargs and marker.kwargs["type"]: + type = marker.kwargs["type"] + else: + raise ValueError("No type provided with pytest.mark.authentication_type marker") + + if type == "app-restricted": + additional_attributes = additional_attributes + [ + {"name": "app-restricted-ods-code", "value": app_restricted_ods_code}, + {"name": "app-restricted-user-id", "value": app_restricted_user_id}, + { + "name": "app-restricted-business-function", + "value": app_restricted_business_function, + }, + ] + + original_attributes = created_app["attributes"] + modified_attributes = original_attributes + additional_attributes + created_app["attributes"] = modified_attributes + + warnings.warn(f"updated app={created_app}") + + yield api.put_app_by_name( + email="apm-testing-internal-dev@nhs.net", + app_name=created_app["name"], + body=created_app, + ) + + # Reset the app back to its original attributes so it can be updated by a subsequent test + created_app["attributes"] = original_attributes + api.put_app_by_name( + email="apm-testing-internal-dev@nhs.net", + app_name=created_app["name"], + body=created_app, + ) + + +@pytest.fixture +def _nhsd_apim_auth_token_data(_pre_authentication, _nhsd_apim_auth_token_data): + """ + Override of the pytest_nhsd_apim _nhsd_apim_auth_token_data fixture to invoke _pre_authenication before being executed. + """ + + return _nhsd_apim_auth_token_data diff --git a/tests/decorators.py b/tests/decorators.py new file mode 100644 index 000000000..a138f2b05 --- /dev/null +++ b/tests/decorators.py @@ -0,0 +1,86 @@ +import pytest + +from functools import wraps +from typing import Callable +from asyncio import iscoroutinefunction + +from .data import Actor +from .utils import get_env + + +def _calculate_default_user() -> Actor: + return ( + Actor.RC_DEV + if get_env("ENVIRONMENT") == "internal-dev" + and "ft" in get_env("SERVICE_BASE_PATH") + else Actor.RC + ) + + +_DEFAULT_USER: Actor = _calculate_default_user() + + +def user_restricated_access(function: Callable = None, user: Actor = _DEFAULT_USER): + """ + Decorator indicating that a given function should be authenticated with User Restricted access with a supplied user. + This will lead to a fixture named 'nhsd_apim_auth_headers' being provided to the function as a dictionary, including the headers required to authenticate as the supplied user. + + :param user: An Actor indicating the user to authenticate as. If no user is provided _DEFAULT_USER will be used instead. + """ + + def decorator(func): + auth_args = { + "access": "healthcare_worker", + "level": "aal3", + "login_form": {"username": user.user_id}, + # Force a token to always be created to ensure no app details are cached + "force_new_token": True, + } + + @pytest.mark.authentication_type("user-restricted") + @pytest.mark.nhsd_apim_authorization(auth_args) + @wraps(func) + async def async_wrapper(*args, **kwargs): + return await func(*args, **kwargs) + + @pytest.mark.authentication_type("user-restricted") + @pytest.mark.nhsd_apim_authorization(auth_args) + @wraps(func) + def wrapper(*args, **kwargs): + return func(*args, **kwargs) + + # if the decorated function is async, return an async function, else return a synchronous version. + return async_wrapper if iscoroutinefunction(func) else wrapper + + # If a function is provided the decorator is being called without any parameters and we need to call our decorator supplying this as the function. + # Otherwise the decorator is being called with arguments and can be returned directly. + return decorator(function) if function else decorator + + +def app_restricted_access(func): + """ + Decorator indicating that the given function should be authenticated with Application Restricted access with a list of set types. + This will lead to a fixture named 'nhsd_apim_auth_headers' being provided to the function as a dictionary, including the headers required to authenticate as the default application. + """ + + auth_args = { + "access": "application", + "level": "level3", + # Force a token to always be created to ensure no app details are cached + "force_new_token": True, + } + + @pytest.mark.authentication_type("app-restricted") + @pytest.mark.nhsd_apim_authorization(auth_args) + @wraps(func) + async def async_wrapper(*args, **kwargs): + return await func(*args, **kwargs) + + @pytest.mark.authentication_type("app-restricted") + @pytest.mark.nhsd_apim_authorization(auth_args) + @wraps(func) + def wrapper(*args, **kwargs): + return func(*args, **kwargs) + + # if the decorated function is async, return an async function as a decorator, otherwise use a synchronous decorator. + return async_wrapper if iscoroutinefunction(func) else wrapper diff --git a/tests/integration/test_app_restricted.py b/tests/integration/test_app_restricted.py index 620aaecdb..7913dafad 100644 --- a/tests/integration/test_app_restricted.py +++ b/tests/integration/test_app_restricted.py @@ -1,8 +1,9 @@ import pytest import requests from requests import Response -from data import RenamedHeader -from asserts import assert_ok_response, assert_error_response +from tests.data import RenamedHeader +from tests.asserts import assert_ok_response, assert_error_response +from tests.decorators import app_restricted_access _HEADER_AUTHORIZATION = "Authorization" _HEADER_ECHO = "echo" # enable echo target @@ -86,21 +87,24 @@ def test_authorised_application_header_rejected( assert_error_response(response, _EXPECTED_CORRELATION_ID, 403) + @app_restricted_access def test_headers_on_echo_target( self, - app_restricted_access_code, + nhsd_apim_auth_headers, service_url, asid, app_restricted_ods_code, app_restricted_user_id, app_restricted_business_function, ): - client_request_headers = { - _HEADER_ECHO: "", # enable echo target - _HEADER_AUTHORIZATION: "Bearer " + app_restricted_access_code, - RenamedHeader.CORRELATION_ID.original: _EXPECTED_CORRELATION_ID, - _HEADER_REQUEST_ID: "DUMMY", # this must be less than 10 characters - } + client_request_headers = dict( + nhsd_apim_auth_headers, + **{ + _HEADER_ECHO: "", # enable echo target + RenamedHeader.CORRELATION_ID.original: _EXPECTED_CORRELATION_ID, + _HEADER_REQUEST_ID: "DUMMY", # this must be less than 10 characters + }, + ) # Make the API call response = requests.get(service_url, headers=client_request_headers) diff --git a/tests/integration/test_headers.py b/tests/integration/test_headers.py index b68985327..c468786e0 100644 --- a/tests/integration/test_headers.py +++ b/tests/integration/test_headers.py @@ -1,8 +1,9 @@ import pytest import requests from requests import Response -from data import RenamedHeader -from asserts import assert_ok_response +from tests.data import RenamedHeader +from tests.asserts import assert_ok_response +from tests.decorators import user_restricated_access _HEADER_AUTHORIZATION = "Authorization" _HEADER_ECHO = "echo" # enable echo target @@ -31,24 +32,27 @@ @pytest.mark.integration_test class TestHeaders: + @pytest.mark.asyncio + @user_restricated_access async def test_headers_on_echo_target( - self, authenticate_user, service_url, referring_clinician, asid + self, nhsd_apim_auth_headers, service_url, referring_clinician, asid ): - access_code = await authenticate_user(referring_clinician) - client_request_headers = { - _HEADER_ECHO: "", # enable echo target - _HEADER_AUTHORIZATION: "Bearer " + access_code, - _HEADER_REQUEST_ID: "DUMMY-VALUE", - RenamedHeader.REFERRAL_ID.original: _EXPECTED_REFERRAL_ID, - RenamedHeader.CORRELATION_ID.original: _EXPECTED_CORRELATION_ID, - RenamedHeader.BUSINESS_FUNCTION.original: referring_clinician.business_function, - RenamedHeader.ODS_CODE.original: referring_clinician.org_code, - RenamedHeader.FILENAME.original: _EXPECTED_FILENAME, - RenamedHeader.COMM_RULE_ORG.original: _EXPECTED_COMM_RULE_ORG, - RenamedHeader.OBO_USER_ID.original: _EXPECTED_OBO_USER_ID, - } + client_request_headers = dict( + nhsd_apim_auth_headers, + **{ + _HEADER_ECHO: "", # enable echo target + _HEADER_REQUEST_ID: "DUMMY-VALUE", + RenamedHeader.REFERRAL_ID.original: _EXPECTED_REFERRAL_ID, + RenamedHeader.CORRELATION_ID.original: _EXPECTED_CORRELATION_ID, + RenamedHeader.BUSINESS_FUNCTION.original: referring_clinician.business_function, + RenamedHeader.ODS_CODE.original: referring_clinician.org_code, + RenamedHeader.FILENAME.original: _EXPECTED_FILENAME, + RenamedHeader.COMM_RULE_ORG.original: _EXPECTED_COMM_RULE_ORG, + RenamedHeader.OBO_USER_ID.original: _EXPECTED_OBO_USER_ID, + }, + ) # Make the API call response = requests.get(service_url, headers=client_request_headers) diff --git a/tests/sandbox/SandboxTest.py b/tests/sandbox/SandboxTest.py index 861082945..846a39cb3 100644 --- a/tests/sandbox/SandboxTest.py +++ b/tests/sandbox/SandboxTest.py @@ -5,10 +5,10 @@ from pytest_check import check import pytest -import asserts +from tests import asserts -from data import Actor, RenamedHeader -from utils import HttpMethod +from tests.data import Actor, RenamedHeader +from .utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/__init__.py b/tests/sandbox/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/sandbox/conftest.py b/tests/sandbox/conftest.py index 48dc42854..cae6aedb6 100644 --- a/tests/sandbox/conftest.py +++ b/tests/sandbox/conftest.py @@ -1,13 +1,11 @@ -import os - import pytest import json import requests from typing import Dict, Callable -from data import Actor, RenamedHeader -from utils import HttpMethod +from tests.data import Actor, RenamedHeader +from .utils import HttpMethod @pytest.fixture(scope="session") diff --git a/tests/sandbox/r4/test_a030_retrieve_eRS_business_functions.py b/tests/sandbox/r4/test_a030_retrieve_eRS_business_functions.py index 2e5aadaa9..7f1fb812a 100644 --- a/tests/sandbox/r4/test_a030_retrieve_eRS_business_functions.py +++ b/tests/sandbox/r4/test_a030_retrieve_eRS_business_functions.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/r4/test_a033_retrieve_healthcare_service.py b/tests/sandbox/r4/test_a033_retrieve_healthcare_service.py index 21309f771..b0071d736 100644 --- a/tests/sandbox/r4/test_a033_retrieve_healthcare_service.py +++ b/tests/sandbox/r4/test_a033_retrieve_healthcare_service.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.sandbox.utils import HttpMethod +from tests.data import Actor @pytest.mark.sandbox diff --git a/tests/sandbox/r4/test_a035_search_for_healthcare_services.py b/tests/sandbox/r4/test_a035_search_for_healthcare_services.py index 8f69518cc..f28d3cd5f 100644 --- a/tests/sandbox/r4/test_a035_search_for_healthcare_services.py +++ b/tests/sandbox/r4/test_a035_search_for_healthcare_services.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/r4/test_a037_retrieve_healthcare_service_version.py b/tests/sandbox/r4/test_a037_retrieve_healthcare_service_version.py index d1898ea51..cd48f0c43 100644 --- a/tests/sandbox/r4/test_a037_retrieve_healthcare_service_version.py +++ b/tests/sandbox/r4/test_a037_retrieve_healthcare_service_version.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/r4/test_a040_retrieve_practioner_info.py b/tests/sandbox/r4/test_a040_retrieve_practioner_info.py index bea1f8cbf..fa6efdbd4 100644 --- a/tests/sandbox/r4/test_a040_retrieve_practioner_info.py +++ b/tests/sandbox/r4/test_a040_retrieve_practioner_info.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox @@ -36,10 +35,13 @@ def allowed_business_functions(self) -> Iterable[str]: @pytest.fixture def call_endpoint( - self, call_endpoint_url_with_query: Callable[[Actor, Dict[str, str]], Response], + self, + call_endpoint_url_with_query: Callable[[Actor, Dict[str, str]], Response], ) -> Callable[[Actor], Response]: return lambda actor, headers={}: call_endpoint_url_with_query( - actor, {"_query": "onBehalfOf"}, headers, + actor, + {"_query": "onBehalfOf"}, + headers, ) @pytest.mark.parametrize("actor", authorised_actor_data) @@ -57,4 +59,6 @@ def test_success( asserts.assert_status_code(200, actual_response.status_code) asserts.assert_response(expected_response, actual_response) - asserts.assert_json_response_headers(actual_response,) + asserts.assert_json_response_headers( + actual_response, + ) diff --git a/tests/sandbox/r4/test_a041_search_for_service_requests.py b/tests/sandbox/r4/test_a041_search_for_service_requests.py index c94a82c93..f4d9f4e7b 100644 --- a/tests/sandbox/r4/test_a041_search_for_service_requests.py +++ b/tests/sandbox/r4/test_a041_search_for_service_requests.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a004_get_codesystem.py b/tests/sandbox/stu3/test_a004_get_codesystem.py index 0fefedc09..4adeed00e 100644 --- a/tests/sandbox/stu3/test_a004_get_codesystem.py +++ b/tests/sandbox/stu3/test_a004_get_codesystem.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a005_get_referral_request.py b/tests/sandbox/stu3/test_a005_get_referral_request.py index deb42b311..992d6c452 100644 --- a/tests/sandbox/stu3/test_a005_get_referral_request.py +++ b/tests/sandbox/stu3/test_a005_get_referral_request.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a005_get_referral_request_versioned.py b/tests/sandbox/stu3/test_a005_get_referral_request_versioned.py index b4dc7dbd7..8f08566d3 100644 --- a/tests/sandbox/stu3/test_a005_get_referral_request_versioned.py +++ b/tests/sandbox/stu3/test_a005_get_referral_request_versioned.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a006_get_attachment.py b/tests/sandbox/stu3/test_a006_get_attachment.py index 7d765804b..21157482c 100644 --- a/tests/sandbox/stu3/test_a006_get_attachment.py +++ b/tests/sandbox/stu3/test_a006_get_attachment.py @@ -1,15 +1,12 @@ -import sys -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from pytest_check import check -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a007_retrieve_clinical_information.py b/tests/sandbox/stu3/test_a007_retrieve_clinical_information.py index 870a9362e..bb4ceae6b 100644 --- a/tests/sandbox/stu3/test_a007_retrieve_clinical_information.py +++ b/tests/sandbox/stu3/test_a007_retrieve_clinical_information.py @@ -1,15 +1,12 @@ -import sys -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from pytest_check import check -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a008_get_referral_worklist.py b/tests/sandbox/stu3/test_a008_get_referral_worklist.py index 36507c493..88c550cdf 100644 --- a/tests/sandbox/stu3/test_a008_get_referral_worklist.py +++ b/tests/sandbox/stu3/test_a008_get_referral_worklist.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a010_patient_service_search.py b/tests/sandbox/stu3/test_a010_patient_service_search.py index c9cfb861b..548b432cd 100644 --- a/tests/sandbox/stu3/test_a010_patient_service_search.py +++ b/tests/sandbox/stu3/test_a010_patient_service_search.py @@ -1,11 +1,11 @@ from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod from requests import Response diff --git a/tests/sandbox/stu3/test_a011_create_referral.py b/tests/sandbox/stu3/test_a011_create_referral.py index 3012ded45..8ce988b59 100644 --- a/tests/sandbox/stu3/test_a011_create_referral.py +++ b/tests/sandbox/stu3/test_a011_create_referral.py @@ -1,11 +1,11 @@ from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod from requests import Response diff --git a/tests/sandbox/stu3/test_a012_maintain_referral_letter.py b/tests/sandbox/stu3/test_a012_maintain_referral_letter.py index 29df4a32e..9779483db 100644 --- a/tests/sandbox/stu3/test_a012_maintain_referral_letter.py +++ b/tests/sandbox/stu3/test_a012_maintain_referral_letter.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a013_accept_referral.py b/tests/sandbox/stu3/test_a013_accept_referral.py index 040090568..ded2fb539 100644 --- a/tests/sandbox/stu3/test_a013_accept_referral.py +++ b/tests/sandbox/stu3/test_a013_accept_referral.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox @@ -29,7 +28,8 @@ def allowed_business_functions(self) -> Iterable[str]: @pytest.fixture def call_endpoint( - self, send_rest_request: Callable[[HttpMethod, str, Actor], Response], + self, + send_rest_request: Callable[[HttpMethod, str, Actor], Response], ) -> Callable[[Actor], Response]: return lambda actor, headers={}: send_rest_request( HttpMethod.POST, @@ -55,5 +55,8 @@ def test_success( ) asserts.assert_json_response_headers( - actual_response, additional={"etag": 'W/"9"',}, + actual_response, + additional={ + "etag": 'W/"9"', + }, ) diff --git a/tests/sandbox/stu3/test_a014_reject_referral.py b/tests/sandbox/stu3/test_a014_reject_referral.py index 37223009b..3ac67280b 100644 --- a/tests/sandbox/stu3/test_a014_reject_referral.py +++ b/tests/sandbox/stu3/test_a014_reject_referral.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox @@ -53,7 +52,9 @@ def call_endpoint( ], ) -> Callable[[Actor], Response]: return lambda actor, headers={}: call_endpoint_url_with_request( - actor, "stu3/rejectReferral/requests/BasicExampleIbs.json", headers, + actor, + "stu3/rejectReferral/requests/BasicExampleIbs.json", + headers, ) @pytest.mark.parametrize("actor", authorised_actor_data) @@ -75,5 +76,8 @@ def test_success( asserts.assert_response(expected_response, actual_response) asserts.assert_json_response_headers( - actual_response, additional={"etag": 'W/"10"',}, + actual_response, + additional={ + "etag": 'W/"10"', + }, ) diff --git a/tests/sandbox/stu3/test_a015_get_appointment_slots.py b/tests/sandbox/stu3/test_a015_get_appointment_slots.py index cc318c095..2fbb24d19 100644 --- a/tests/sandbox/stu3/test_a015_get_appointment_slots.py +++ b/tests/sandbox/stu3/test_a015_get_appointment_slots.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a016_book_or_defer_appointment.py b/tests/sandbox/stu3/test_a016_book_or_defer_appointment.py index d9148de72..b1837484a 100644 --- a/tests/sandbox/stu3/test_a016_book_or_defer_appointment.py +++ b/tests/sandbox/stu3/test_a016_book_or_defer_appointment.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a019_generate_patient_letter.py b/tests/sandbox/stu3/test_a019_generate_patient_letter.py index 1e779beaf..47fe81aaa 100644 --- a/tests/sandbox/stu3/test_a019_generate_patient_letter.py +++ b/tests/sandbox/stu3/test_a019_generate_patient_letter.py @@ -1,15 +1,12 @@ -import sys -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from pytest_check import check -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a020_upload_attachment.py b/tests/sandbox/stu3/test_a020_upload_attachment.py index c8247cecc..a62769731 100644 --- a/tests/sandbox/stu3/test_a020_upload_attachment.py +++ b/tests/sandbox/stu3/test_a020_upload_attachment.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor, RenamedHeader -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor, RenamedHeader +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a021_create_referral_send_for_triage.py b/tests/sandbox/stu3/test_a021_create_referral_send_for_triage.py index abfda5eb1..276c985cd 100644 --- a/tests/sandbox/stu3/test_a021_create_referral_send_for_triage.py +++ b/tests/sandbox/stu3/test_a021_create_referral_send_for_triage.py @@ -1,11 +1,11 @@ from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod from requests import Response diff --git a/tests/sandbox/stu3/test_a022_cancel_appointment_action_later.py b/tests/sandbox/stu3/test_a022_cancel_appointment_action_later.py index e45158934..45f65da8a 100644 --- a/tests/sandbox/stu3/test_a022_cancel_appointment_action_later.py +++ b/tests/sandbox/stu3/test_a022_cancel_appointment_action_later.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox @@ -84,5 +83,8 @@ def test_success( asserts.assert_response(expected_response, actual_response) asserts.assert_json_response_headers( - actual_response, additional={"etag": 'W/"11"',}, + actual_response, + additional={ + "etag": 'W/"11"', + }, ) diff --git a/tests/sandbox/stu3/test_a023_get_advice_worklist.py b/tests/sandbox/stu3/test_a023_get_advice_worklist.py index 42b74974d..4a6d81595 100644 --- a/tests/sandbox/stu3/test_a023_get_advice_worklist.py +++ b/tests/sandbox/stu3/test_a023_get_advice_worklist.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a024_get_advice_and_guidance_request.py b/tests/sandbox/stu3/test_a024_get_advice_and_guidance_request.py index e729a498d..d0b06e06e 100644 --- a/tests/sandbox/stu3/test_a024_get_advice_and_guidance_request.py +++ b/tests/sandbox/stu3/test_a024_get_advice_and_guidance_request.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a024_get_advice_and_guidance_request_versioned.py b/tests/sandbox/stu3/test_a024_get_advice_and_guidance_request_versioned.py index 6c3287fbe..5b1f07f5e 100644 --- a/tests/sandbox/stu3/test_a024_get_advice_and_guidance_request_versioned.py +++ b/tests/sandbox/stu3/test_a024_get_advice_and_guidance_request_versioned.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a025_get_advice_and_guidance_conversation.py b/tests/sandbox/stu3/test_a025_get_advice_and_guidance_conversation.py index 0d45b6971..625e22b37 100644 --- a/tests/sandbox/stu3/test_a025_get_advice_and_guidance_conversation.py +++ b/tests/sandbox/stu3/test_a025_get_advice_and_guidance_conversation.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a026_send_advice_and_guidance.py b/tests/sandbox/stu3/test_a026_send_advice_and_guidance.py index 6cade57b1..4e0acc5d4 100644 --- a/tests/sandbox/stu3/test_a026_send_advice_and_guidance.py +++ b/tests/sandbox/stu3/test_a026_send_advice_and_guidance.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a027_convert_advice_and_guidance.py b/tests/sandbox/stu3/test_a027_convert_advice_and_guidance.py index d05c96881..f106715d1 100644 --- a/tests/sandbox/stu3/test_a027_convert_advice_and_guidance.py +++ b/tests/sandbox/stu3/test_a027_convert_advice_and_guidance.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a028_record_triage_outcome.py b/tests/sandbox/stu3/test_a028_record_triage_outcome.py index e4aa2c93c..006e861cf 100644 --- a/tests/sandbox/stu3/test_a028_record_triage_outcome.py +++ b/tests/sandbox/stu3/test_a028_record_triage_outcome.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox @@ -81,5 +80,8 @@ def test_success( asserts.assert_response(expected_response, actual_response) asserts.assert_json_response_headers( - actual_response, additional={"etag": 'W/"10"',}, + actual_response, + additional={ + "etag": 'W/"10"', + }, ) diff --git a/tests/sandbox/stu3/test_a029_available_actions_for_user.py b/tests/sandbox/stu3/test_a029_available_actions_for_user.py index 021e9d485..877c7b43c 100644 --- a/tests/sandbox/stu3/test_a029_available_actions_for_user.py +++ b/tests/sandbox/stu3/test_a029_available_actions_for_user.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a031_change_shortlist.py b/tests/sandbox/stu3/test_a031_change_shortlist.py index d08734b8f..9f42cb9d9 100644 --- a/tests/sandbox/stu3/test_a031_change_shortlist.py +++ b/tests/sandbox/stu3/test_a031_change_shortlist.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a032_change_shortlist_send_for_triage.py b/tests/sandbox/stu3/test_a032_change_shortlist_send_for_triage.py index f0b5e940d..5d171b099 100644 --- a/tests/sandbox/stu3/test_a032_change_shortlist_send_for_triage.py +++ b/tests/sandbox/stu3/test_a032_change_shortlist_send_for_triage.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a034_update_appointment.py b/tests/sandbox/stu3/test_a034_update_appointment.py index aeb244076..86da5f8a7 100644 --- a/tests/sandbox/stu3/test_a034_update_appointment.py +++ b/tests/sandbox/stu3/test_a034_update_appointment.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a036_cancel_referral.py b/tests/sandbox/stu3/test_a036_cancel_referral.py index 8e06be17d..7e02f7104 100644 --- a/tests/sandbox/stu3/test_a036_cancel_referral.py +++ b/tests/sandbox/stu3/test_a036_cancel_referral.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a038_get_appointment.py b/tests/sandbox/stu3/test_a038_get_appointment.py index f6bb41892..b92797a44 100644 --- a/tests/sandbox/stu3/test_a038_get_appointment.py +++ b/tests/sandbox/stu3/test_a038_get_appointment.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a038_get_appointment_versioned.py b/tests/sandbox/stu3/test_a038_get_appointment_versioned.py index f9db2c21e..197551617 100644 --- a/tests/sandbox/stu3/test_a038_get_appointment_versioned.py +++ b/tests/sandbox/stu3/test_a038_get_appointment_versioned.py @@ -1,13 +1,12 @@ -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a043_retrieve_advice_and_guidance_overview.py b/tests/sandbox/stu3/test_a043_retrieve_advice_and_guidance_overview.py index d3d44b5e1..0d9c08582 100644 --- a/tests/sandbox/stu3/test_a043_retrieve_advice_and_guidance_overview.py +++ b/tests/sandbox/stu3/test_a043_retrieve_advice_and_guidance_overview.py @@ -1,15 +1,12 @@ -import sys -from typing import Callable, Dict, Iterable, List -from urllib import response +from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from pytest_check import check -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod @pytest.mark.sandbox diff --git a/tests/sandbox/stu3/test_a044_create_advice_and_guidance_request.py b/tests/sandbox/stu3/test_a044_create_advice_and_guidance_request.py index 9e7a05b73..3198e5d70 100644 --- a/tests/sandbox/stu3/test_a044_create_advice_and_guidance_request.py +++ b/tests/sandbox/stu3/test_a044_create_advice_and_guidance_request.py @@ -1,13 +1,13 @@ from typing import Callable, Dict, Iterable import pytest -import asserts +from tests import asserts from requests import Response -from SandboxTest import SandboxTest -from data import Actor -from utils import HttpMethod +from tests.sandbox.SandboxTest import SandboxTest +from tests.data import Actor +from tests.sandbox.utils import HttpMethod authorised_actor_data = [Actor.RC, Actor.RC_DEV, Actor.RC_INSUFFICIENT_IAL, Actor.RCA] diff --git a/tests/utils.py b/tests/utils.py new file mode 100644 index 000000000..41c388a10 --- /dev/null +++ b/tests/utils.py @@ -0,0 +1,12 @@ +import os + + +def get_env(variable_name: str) -> str: + """Returns an environment variable""" + try: + var = os.environ[variable_name] + if not var: + raise RuntimeError(f"Variable is null, Check {variable_name}.") + return var + except KeyError: + raise RuntimeError(f"Variable is not set, Check {variable_name}.")