Skip to content

Commit b6267a5

Browse files
tests
1 parent 95b7053 commit b6267a5

12 files changed

Lines changed: 505 additions & 37 deletions

tests/e2e-tests/api/authentication/test-403-errors.py

Whitespace-only changes.
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import uuid
2+
import requests
3+
import pytest
4+
from lib.fixtures import * # NOSONAR
5+
from lib.constants import LETTERS_ENDPOINT
6+
from lib.generators import Generators
7+
8+
@pytest.mark.test
9+
@pytest.mark.devtest
10+
@pytest.mark.inttest
11+
@pytest.mark.prodtest
12+
13+
def test_200_get_letter_status(url, bearer_token):
14+
15+
headers = Generators.generate_valid_headers(bearer_token.value)
16+
get_letter_id = requests.get(f"{url}/{LETTERS_ENDPOINT}/", headers=headers)
17+
18+
letter_id = get_letter_id.json().get("data")[0].get("id")
19+
get_letter_data = requests.get(f"{url}/{LETTERS_ENDPOINT}/{letter_id}/data", headers=headers)
20+
21+
assert get_letter_data.status_code == 200
22+
assert get_letter_data.headers.get("Content-Type") == "application/pdf"
23+
24+
25+
@pytest.mark.test
26+
@pytest.mark.devtest
27+
@pytest.mark.inttest
28+
@pytest.mark.prodtest
29+
def test_404_letter_does_not_exist(url, bearer_token):
30+
31+
headers = Generators.generate_valid_headers(bearer_token.value)
32+
get_message_response = requests.get(f"{url}/{LETTERS_ENDPOINT}/xx", headers=headers)
33+
34+
assert get_message_response.status_code == 404
35+
assert get_message_response.json().get("errors")[0].get("detail") == "No resource found with that ID"
36+
37+
@pytest.mark.test
38+
@pytest.mark.devtest
39+
@pytest.mark.inttest
40+
@pytest.mark.prodtest
41+
def test_404_letter_does_not_exist(url, bearer_token):
42+
43+
letter_id = uuid.uuid4().hex
44+
headers = Generators.generate_valid_headers(bearer_token.value)
45+
get_message_response = requests.get(f"{url}/{LETTERS_ENDPOINT}/{letter_id}/data", headers=headers)
46+
47+
assert get_message_response.status_code == 404
48+
assert get_message_response.json().get("errors")[0].get("detail") == "No resource found with that ID"
49+
50+
@pytest.mark.test
51+
@pytest.mark.devtest
52+
@pytest.mark.inttest
53+
@pytest.mark.prodtest
54+
def test_500_letter_does_not_exist(url, bearer_token):
55+
56+
letter_id = "00000000-0000-0000-0000-000000000000"
57+
headers = Generators.generate_valid_headers(bearer_token.value)
58+
get_message_response = requests.get(f"{url}/{LETTERS_ENDPOINT}/{letter_id}/data", headers=headers)
59+
60+
assert get_message_response.status_code == 500
Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
21
import pytest
32
import requests
3+
from os import getenv
44

55
def _get(url, headers=None, timeout=10):
66
return requests.get(url, headers=headers or {}, timeout=timeout)
@@ -11,29 +11,33 @@ def test_ping(nhsd_apim_proxy_url):
1111
assert resp.status_code == 200
1212

1313
@pytest.mark.smoketest
14+
@pytest.mark.sandboxtest
15+
@pytest.mark.devtest
16+
def test_status(nhsd_apim_proxy_url, status_endpoint_auth_headers):
17+
resp = requests.get(
18+
f"{nhsd_apim_proxy_url}/_status", headers=status_endpoint_auth_headers
19+
)
20+
21+
assert resp.status_code == 200
22+
23+
@pytest.mark.smoketest
24+
@pytest.mark.sandboxtest
25+
@pytest.mark.devtest
1426
def test_401_status_without_api_key(nhsd_apim_proxy_url):
1527
resp = requests.get(
1628
f"{nhsd_apim_proxy_url}/_status"
1729
)
1830
assert resp.status_code == 401
1931

20-
@pytest.mark.smoketest
21-
@pytest.mark.nhsd_apim_authorization(access="application", level="level3")
22-
def test_invalid_jwt_rejected(nhsd_apim_proxy_url, nhsd_apim_auth_headers):
23-
"""
24-
Best-effort: if gateway validates JWTs, an invalid token should be rejected.
25-
If JWT not used in this env, test is skipped.
26-
"""
27-
headers = {
28-
**nhsd_apim_auth_headers,
29-
"x-request-id": "123456"
30-
}
31-
32-
# If no Authorization configured in project headers, skip
33-
if "Authorization" not in headers:
34-
pytest.skip("JWT auth not configured for this environment")
3532

36-
bad_headers = dict(headers)
37-
bad_headers["Authorization"] = "Bearer invalid.invalid.invalid"
38-
status = _get(f"{nhsd_apim_proxy_url}/_status", headers=bad_headers).status_code
39-
assert status in (401, 403), "Expected gateway to reject invalid JWT"
33+
# @pytest.mark.smoketest
34+
# @pytest.mark.nhsd_apim_authorization(access="application", level="level3")
35+
# def test_invalid_jwt_rejected(nhsd_apim_proxy_url, nhsd_apim_auth_headers):
36+
# """
37+
# Best-effort: if gateway validates JWTs, an invalid token should be rejected.
38+
# If JWT not used in this env, test is skipped.
39+
# """
40+
# headers = {
41+
# **nhsd_apim_auth_headers,
42+
# "x-request-id": "123456"
43+
# }
Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,44 @@
1+
from re import M
12
import requests
23
import pytest
34
from lib.fixtures import * # NOSONAR
4-
from lib.constants import DEFAULT_CONTENT_TYPE, VALID_ENDPOINTS
5+
from lib.constants import VALID_ENDPOINT_LETTERS, MI_ENDPOINT
6+
from lib.generators import Generators
57

68
METHODS = ["get", "post"]
7-
REQUEST_ID = [None, "88b10816-5d45-4992-bed0-ea685aaa0e1f"]
89

910

1011
@pytest.mark.test
1112
@pytest.mark.devtest
1213
@pytest.mark.inttest
1314
@pytest.mark.prodtest
14-
@pytest.mark.parametrize("request_id", REQUEST_ID)
1515
@pytest.mark.parametrize("method", METHODS)
16-
@pytest.mark.parametrize("endpoints", VALID_ENDPOINTS)
17-
def test_406(
16+
@pytest.mark.parametrize("endpoints", VALID_ENDPOINT_LETTERS)
17+
def test_header_letters_endpoint(
1818
url,
19-
accept_header_name,
20-
accept_header_value,
21-
correlation_id,
2219
method,
23-
endpoints
20+
endpoints,
21+
bearer_token
2422
):
2523
resp = getattr(requests, method)(f"{url}/{endpoints}", headers={
26-
"Authorization": "Bearer BdXxzeUkIu7F3Fu91Hsa4URYORMa",
27-
accept_header_name: accept_header_value,
28-
"X-Correlation-Id": request_id
24+
"Authorization": bearer_token.value,
25+
"X-Request-ID": None
26+
})
27+
28+
assert resp.status_code == 500
29+
30+
31+
@pytest.mark.test
32+
@pytest.mark.devtest
33+
@pytest.mark.inttest
34+
@pytest.mark.prodtest
35+
def test_header_mi_endpoint(
36+
url,
37+
bearer_token
38+
):
39+
resp = getattr(requests, "post")(f"{url}/{MI_ENDPOINT}", headers={
40+
"Authorization": bearer_token.value,
41+
"X-Request-ID": ""
2942
})
3043

3144
assert resp.status_code == 500

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,12 @@
1212
def test_200_get_letter_status(url, bearer_token):
1313

1414
headers = Generators.generate_valid_headers(bearer_token.value)
15-
get_messages = requests.get(f"{url}/{LETTERS_ENDPOINT}/", headers=headers)
15+
get_letters = requests.get(f"{url}/{LETTERS_ENDPOINT}/", headers=headers)
1616

17-
letter_id = get_messages.json().get("data")[0].get("id")
17+
letter_id = get_letters.json().get("data")[0].get("id")
1818
get_message_response = requests.get(f"{url}/{LETTERS_ENDPOINT}/{letter_id}", headers=headers)
1919

2020
assert get_message_response.status_code == 200
21-
print(get_message_response.json().get("data").get("id"))
2221

2322

2423
@pytest.mark.test
File renamed without changes.
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
from re import L
2+
import time
3+
import requests
4+
import pytest
5+
from lib.fixtures import * # NOSONAR
6+
from lib.constants import LETTERS_ENDPOINT
7+
from lib.generators import Generators
8+
9+
@pytest.mark.test
10+
@pytest.mark.devtest
11+
@pytest.mark.inttest
12+
@pytest.mark.prodtest
13+
14+
def test_202_with_valid_headers(url, bearer_token):
15+
16+
headers = Generators.generate_valid_headers(bearer_token.value)
17+
get_letter_id = requests.get(f"{url}/{LETTERS_ENDPOINT}?limit=2", headers=headers)
18+
19+
ids = [item.get("id") for item in get_letter_id.json().get("data", [])]
20+
21+
if ids:
22+
data = Generators.generate_multiple_valid_request(ids)
23+
else:
24+
raise ValueError("No letter IDs returned from API")
25+
26+
update_letter_status = requests.post(
27+
f"{url}/{LETTERS_ENDPOINT}",
28+
headers=headers,
29+
json=data,
30+
)
31+
32+
assert update_letter_status.status_code == 202
33+
34+
@pytest.mark.test
35+
@pytest.mark.devtest
36+
@pytest.mark.inttest
37+
@pytest.mark.prodtest
38+
def test_400_duplicates_in_request_body(url, bearer_token):
39+
40+
headers = Generators.generate_valid_headers(bearer_token.value)
41+
get_letter_id = requests.get(f"{url}/{LETTERS_ENDPOINT}?limit=3", headers=headers)
42+
43+
ids = [item.get("id") for item in get_letter_id.json().get("data", [])]
44+
45+
if ids:
46+
data = Generators.generate_duplicate_request(ids)
47+
else:
48+
raise ValueError("No letter IDs returned from API")
49+
50+
update_letter_status = requests.post(
51+
f"{url}/{LETTERS_ENDPOINT}",
52+
headers=headers,
53+
json=data,
54+
)
55+
56+
assert update_letter_status.status_code == 400
57+
assert update_letter_status.json().get("errors")[0].get("detail") == "The request cannot include multiple letter objects with the same id"
58+
59+
@pytest.mark.test
60+
@pytest.mark.devtest
61+
@pytest.mark.inttest
62+
@pytest.mark.prodtest
63+
def test_400_invalid_status_in_request_body(url, bearer_token):
64+
65+
headers = Generators.generate_valid_headers(bearer_token.value)
66+
get_letter_id = requests.get(f"{url}/{LETTERS_ENDPOINT}?limit=3", headers=headers)
67+
68+
ids = [item.get("id") for item in get_letter_id.json().get("data", [])]
69+
70+
if ids:
71+
data = Generators.generate_invalid_status_request(ids)
72+
else:
73+
raise ValueError("No letter IDs returned from API")
74+
75+
update_letter_status = requests.post(
76+
f"{url}/{LETTERS_ENDPOINT}",
77+
headers=headers,
78+
json=data,
79+
)
80+
81+
assert update_letter_status.status_code == 400
82+
assert update_letter_status.json().get("errors")[0].get("detail") == "The request body is invalid"
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
from re import L
2+
import time
3+
import requests
4+
import pytest
5+
from lib.fixtures import * # NOSONAR
6+
from lib.constants import LETTERS_ENDPOINT
7+
from lib.generators import Generators
8+
9+
@pytest.mark.test
10+
@pytest.mark.devtest
11+
@pytest.mark.inttest
12+
@pytest.mark.prodtest
13+
14+
def test_202_with_valid_headers(url, bearer_token):
15+
16+
headers = Generators.generate_valid_headers(bearer_token.value)
17+
get_letter_id = requests.get(f"{url}/{LETTERS_ENDPOINT}?limit=1", headers=headers)
18+
19+
letter_id = get_letter_id.json().get("data")[0].get("id")
20+
21+
data = Generators.generate_valid_message_body("ACCEPTED", letter_id)
22+
update_letter_status = requests.patch(
23+
f"{url}/{LETTERS_ENDPOINT}/{letter_id}",
24+
headers=headers,
25+
json=data,
26+
)
27+
28+
assert update_letter_status.status_code == 202
29+
30+
def test_202_with_rejected_status(url, bearer_token):
31+
32+
headers = Generators.generate_valid_headers(bearer_token.value)
33+
get_letter_id = requests.get(f"{url}/{LETTERS_ENDPOINT}?limit=1", headers=headers)
34+
35+
letter_id = get_letter_id.json().get("data")[0].get("id")
36+
37+
data = Generators.generate_valid_message_rejected("REJECTED", letter_id)
38+
update_letter_status = requests.patch(
39+
f"{url}/{LETTERS_ENDPOINT}/{letter_id}",
40+
headers=headers,
41+
json=data,
42+
)
43+
44+
assert update_letter_status.status_code == 202
45+
46+
@pytest.mark.test
47+
@pytest.mark.devtest
48+
@pytest.mark.inttest
49+
@pytest.mark.prodtest
50+
51+
def test_400_with_invalid_status(url, bearer_token):
52+
53+
headers = Generators.generate_valid_headers(bearer_token.value)
54+
get_letter_id = requests.get(f"{url}/{LETTERS_ENDPOINT}?limit=1", headers=headers)
55+
56+
letter_id = get_letter_id.json().get("data")[0].get("id")
57+
58+
data = Generators.generate_valid_message_body("", letter_id)
59+
update_letter_status = requests.patch(
60+
f"{url}/{LETTERS_ENDPOINT}/{letter_id}",
61+
headers=headers,
62+
json=data,
63+
)
64+
65+
assert update_letter_status.status_code == 400
66+
67+
@pytest.mark.test
68+
@pytest.mark.devtest
69+
@pytest.mark.inttest
70+
@pytest.mark.prodtest
71+
72+
def test_400_id_mismatch_with_request(url, bearer_token):
73+
74+
headers = Generators.generate_valid_headers(bearer_token.value)
75+
get_letter_id = requests.get(f"{url}/{LETTERS_ENDPOINT}?limit=1", headers=headers)
76+
77+
letter_id = get_letter_id.json().get("data")[0].get("id")
78+
79+
data = Generators.generate_valid_message_body("ACCEPTED", "letter1")
80+
update_letter_status = requests.patch(
81+
f"{url}/{LETTERS_ENDPOINT}/{letter_id}",
82+
headers=headers,
83+
json=data,
84+
)
85+
86+
assert update_letter_status.status_code == 400
87+
assert update_letter_status.json().get("errors")[0].get("detail") == "The letter ID in the request body does not match the letter ID path parameter"

0 commit comments

Comments
 (0)