Skip to content

Commit 166e101

Browse files
tests
1 parent 812f13f commit 166e101

17 files changed

Lines changed: 192 additions & 46 deletions

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,6 @@ dist
3232
/specification/api/components/security/security.yml
3333
/specification/api/components/parameters/authorization/authorization.yml
3434
/scripts/JWT/*.pem
35-
35+
/tests/e2e-tests/test-report.xml
3636
# ignore PACTS
3737
.pacts

Makefile

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,33 @@ ${VERBOSE}.SILENT: \
115115
config \
116116
dependencies \
117117
deploy \
118+
119+
#####################
120+
# E2E Test commands #
121+
#####################
122+
123+
TEST_CMD := APIGEE_ACCESS_TOKEN="$(APIGEE_ACCESS_TOKEN)" \
124+
PYTHONPATH=. poetry run pytest --disable-warnings -vv \
125+
--color=yes \
126+
-n 4 \
127+
--api-name=nhs-notify-supplier \
128+
--proxy-name="$(PROXY_NAME)" \
129+
-s \
130+
--reruns 5 \
131+
--reruns-delay 5 \
132+
--only-rerun 'AssertionError: Unexpected 429' \
133+
--only-rerun 'AssertionError: Unexpected 504' \
134+
--only-rerun 'AssertionError: Unexpected 502' \
135+
--junitxml=test-report.xml
136+
137+
138+
.internal-dev-test:
139+
@cd tests/e2e-tests && \
140+
$(TEST_CMD) \
141+
api \
142+
-m devtest
143+
144+
.integration-test:
145+
$(TEST_CMD) \
146+
tests/api \
147+
-m inttest

pytest.ini

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
[pytest]
22
pythonpath =
3-
tests/e2e-tests
4-
python_files = *_tests.py test-*.py
3+
tests/e2e-tests/api
4+
python_files = *_tests.py test_*.py
55
addopts = --strict-markers
66
markers =
77
smoketest: suitable to run against all environments even production
88
mtlstest: suitable to run against periodically against environments
99
sandboxtest: suitable to run against sandbox environment
10-
devtest: suitable to run against dev like environments
11-
devtestonly: suitable to run against internal-dev only
12-
devperftest: rate limiting tests suitable to run against dev like environments
10+
devtest: suitable to run against internal-dev environments
1311
inttest: suitable to run against integration environment
1412
prodtest: suitable to run against production environment
1513
uattest: suitable to run against uat environment

tests/.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,3 @@ __pycache__/
1515
*/__pycache__/
1616
**/__pycache__/
1717
*.pyc
18-
tests/e2e-tests/lib/internal-dev-test-1.pem
Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,34 @@
11
import requests
22
import pytest
3-
from lib.constants import METHODS, VALID_ENDPOINTS
3+
from lib.constants import METHODS, VALID_ENDPOINT_LETTERS
44
from lib.fixtures import *
5+
from lib.errorhandler import ErrorHandler
56

67
@pytest.mark.test
78
@pytest.mark.devtest
89
@pytest.mark.inttest
910
@pytest.mark.prodtest
1011
@pytest.mark.parametrize("method", METHODS)
11-
@pytest.mark.parametrize("endpoints", VALID_ENDPOINTS)
12+
@pytest.mark.parametrize("endpoints", VALID_ENDPOINT_LETTERS)
1213
def test_401_invalid(url, method, endpoints):
1314

1415
resp = getattr(requests, method)(f"{url}{endpoints}", headers={
1516
"Authorization": "invalid",
1617
})
1718

18-
assert(resp.status_code == 401)
19+
ErrorHandler.handle_retry(resp)
20+
assert resp.status_code == 401, f"Response: {resp.status_code}: {resp.text}"
1921

2022
@pytest.mark.test
2123
@pytest.mark.nhsd_apim_authorization({"access": "application", "level": "level0"})
2224
@pytest.mark.parametrize("method", METHODS)
23-
@pytest.mark.parametrize("endpoints", VALID_ENDPOINTS)
25+
@pytest.mark.parametrize("endpoints", VALID_ENDPOINT_LETTERS)
2426
def test_401_invalid_level(nhsd_apim_proxy_url, nhsd_apim_auth_headers, method, endpoints):
2527
print(nhsd_apim_proxy_url)
2628

2729
resp = getattr(requests, method)(f"{nhsd_apim_proxy_url}{endpoints}", headers={
2830
**nhsd_apim_auth_headers
2931
})
3032

31-
print("Status:", resp.status_code)
32-
33-
assert(resp.status_code == 401)
33+
ErrorHandler.handle_retry(resp)
34+
assert resp.status_code == 401, f"Response: {resp.status_code}: {resp.text}"

tests/e2e-tests/api/data/test-get-letter_data.py renamed to tests/e2e-tests/api/data/test_get_letter_data.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from lib.fixtures import * # NOSONAR
55
from lib.constants import LETTERS_ENDPOINT
66
from lib.generators import Generators
7+
from lib.errorhandler import ErrorHandler
78

89
@pytest.mark.test
910
@pytest.mark.devtest
@@ -18,7 +19,8 @@ def test_200_get_letter_status(url, bearer_token):
1819
letter_id = get_letter_id.json().get("data")[0].get("id")
1920
get_letter_data = requests.get(f"{url}/{LETTERS_ENDPOINT}/{letter_id}/data", headers=headers)
2021

21-
assert get_letter_data.status_code == 200
22+
ErrorHandler.handle_retry(get_letter_data)
23+
assert get_letter_data.status_code == 200, f"Response: {get_letter_data.status_code}: {get_letter_data.text}"
2224
assert get_letter_data.headers.get("Content-Type") == "application/pdf"
2325

2426

@@ -31,6 +33,7 @@ def test_404_letter_does_not_exist(url, bearer_token):
3133
headers = Generators.generate_valid_headers(bearer_token.value)
3234
get_message_response = requests.get(f"{url}/{LETTERS_ENDPOINT}/xx", headers=headers)
3335

36+
ErrorHandler.handle_retry(get_message_response)
3437
assert get_message_response.status_code == 404
3538
assert get_message_response.json().get("errors")[0].get("detail") == "No resource found with that ID"
3639

@@ -44,6 +47,7 @@ def test_404_letter_does_not_exist(url, bearer_token):
4447
headers = Generators.generate_valid_headers(bearer_token.value)
4548
get_message_response = requests.get(f"{url}/{LETTERS_ENDPOINT}/{letter_id}/data", headers=headers)
4649

50+
ErrorHandler.handle_retry(get_message_response)
4751
assert get_message_response.status_code == 404
4852
assert get_message_response.json().get("errors")[0].get("detail") == "No resource found with that ID"
4953

@@ -57,4 +61,5 @@ def test_500_letter_does_not_exist(url, bearer_token):
5761
headers = Generators.generate_valid_headers(bearer_token.value)
5862
get_message_response = requests.get(f"{url}/{LETTERS_ENDPOINT}/{letter_id}/data", headers=headers)
5963

64+
ErrorHandler.handle_retry(get_message_response)
6065
assert get_message_response.status_code == 500
File renamed without changes.

tests/e2e-tests/api/letters/test-get-letter-status.py renamed to tests/e2e-tests/api/letters/test_get_letter_status.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from lib.fixtures import * # NOSONAR
44
from lib.constants import LETTERS_ENDPOINT
55
from lib.generators import Generators
6+
from lib.errorhandler import ErrorHandler
67

78
@pytest.mark.test
89
@pytest.mark.devtest
@@ -17,7 +18,8 @@ def test_200_get_letter_status(url, bearer_token):
1718
letter_id = get_letters.json().get("data")[0].get("id")
1819
get_message_response = requests.get(f"{url}/{LETTERS_ENDPOINT}/{letter_id}", headers=headers)
1920

20-
assert get_message_response.status_code == 200
21+
ErrorHandler.handle_retry(get_message_response)
22+
assert get_message_response.status_code == 200, f"Response: {get_message_response.status_code}: {get_message_response.text}"
2123

2224

2325
@pytest.mark.test
@@ -29,5 +31,6 @@ def test_404_letter_does_not_exist(url, bearer_token):
2931
headers = Generators.generate_valid_headers(bearer_token.value)
3032
get_message_response = requests.get(f"{url}/{LETTERS_ENDPOINT}/xx", headers=headers)
3133

32-
assert get_message_response.status_code == 404
34+
ErrorHandler.handle_retry(get_message_response)
35+
assert get_message_response.status_code == 404, f"Response: {get_message_response.status_code}: {get_message_response.text}"
3336
assert get_message_response.json().get("errors")[0].get("detail") == "No resource found with that ID"

tests/e2e-tests/api/letters/test-get-list-of-letters.py renamed to tests/e2e-tests/api/letters/test_get_list_of_letters.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from lib.fixtures import * # NOSONAR
44
from lib.constants import LETTERS_ENDPOINT
55
from lib.generators import Generators
6+
from lib.errorhandler import ErrorHandler
67

78
@pytest.mark.test
89
@pytest.mark.devtest
@@ -12,7 +13,8 @@ def test_200_get_letters(url, bearer_token):
1213

1314
headers = Generators.generate_valid_headers(bearer_token.value)
1415

15-
get_message_response = requests.get(f"{url}/letters?limit=1", headers=headers)
16+
get_message_response = requests.get(f"{url}/{LETTERS_ENDPOINT}?limit=1", headers=headers)
1617

17-
assert get_message_response.status_code == 200
18+
ErrorHandler.handle_retry(get_message_response)
19+
assert get_message_response.status_code == 200, f"Response: {get_message_response.status_code}: {get_message_response.text}"
1820
assert get_message_response.json().get("data")[0].get("attributes").get("status") == "PENDING"

tests/e2e-tests/api/letters/test-multiple-letter-status.py renamed to tests/e2e-tests/api/letters/test_multiple_letter_status.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from lib.fixtures import * # NOSONAR
66
from lib.constants import LETTERS_ENDPOINT
77
from lib.generators import Generators
8+
from lib.errorhandler import ErrorHandler
89

910
@pytest.mark.test
1011
@pytest.mark.devtest
@@ -29,7 +30,8 @@ def test_202_with_valid_headers(url, bearer_token):
2930
json=data,
3031
)
3132

32-
assert update_letter_status.status_code == 202
33+
ErrorHandler.handle_retry(update_letter_status)
34+
assert update_letter_status.status_code == 202, f"Response: {update_letter_status.status_code}: {update_letter_status.text}"
3335

3436
@pytest.mark.test
3537
@pytest.mark.devtest
@@ -38,7 +40,7 @@ def test_202_with_valid_headers(url, bearer_token):
3840
def test_400_duplicates_in_request_body(url, bearer_token):
3941

4042
headers = Generators.generate_valid_headers(bearer_token.value)
41-
get_letter_id = requests.get(f"{url}/{LETTERS_ENDPOINT}?limit=3", headers=headers)
43+
get_letter_id = requests.get(f"{url}/{LETTERS_ENDPOINT}?limit=2", headers=headers)
4244

4345
ids = [item.get("id") for item in get_letter_id.json().get("data", [])]
4446

@@ -53,7 +55,8 @@ def test_400_duplicates_in_request_body(url, bearer_token):
5355
json=data,
5456
)
5557

56-
assert update_letter_status.status_code == 400
58+
ErrorHandler.handle_retry(update_letter_status)
59+
assert update_letter_status.status_code == 400, f"Response: {update_letter_status.status_code}: {update_letter_status.text}"
5760
assert update_letter_status.json().get("errors")[0].get("detail") == "The request cannot include multiple letter objects with the same id"
5861

5962
@pytest.mark.test
@@ -78,5 +81,6 @@ def test_400_invalid_status_in_request_body(url, bearer_token):
7881
json=data,
7982
)
8083

81-
assert update_letter_status.status_code == 400
84+
ErrorHandler.handle_retry(update_letter_status)
85+
assert update_letter_status.status_code == 400, f"Response: {update_letter_status.status_code}: {update_letter_status.text}"
8286
assert update_letter_status.json().get("errors")[0].get("detail") == "The request body is invalid"

0 commit comments

Comments
 (0)