Skip to content

Commit 49705d3

Browse files
committed
Merge branch 'feature/PI-574-better_smoke_tests' into release/2024-10-29
2 parents 75eb205 + 65524dc commit 49705d3

File tree

2 files changed

+176
-36
lines changed

2 files changed

+176
-36
lines changed

β€Žsrc/api/tests/smoke_tests/test_smoke.pyβ€Ž

Lines changed: 116 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,124 @@
44
import pytest
55
import requests
66

7-
from test_helpers.sample_data import CPM_PRODUCT_TEAM_NO_ID_NO_KEYS
87
from test_helpers.terraform import read_terraform_output
98

109
from .utils import execute_smoke_test, get_app_key, get_base_url, get_headers
1110

1211

13-
def create_and_read_product_team(base_url: str, headers: dict):
14-
product_team_body = json.dumps(CPM_PRODUCT_TEAM_NO_ID_NO_KEYS)
15-
url = f"{base_url}/ProductTeam"
16-
response = requests.post(url=url, headers=headers, data=product_team_body)
17-
response_body = response.json()
18-
url = f"{base_url}/ProductTeam/{response_body["id"]}"
19-
return requests.get(url=url, headers=headers)
20-
12+
def _request(base_url: str, headers: dict, path: str, method: str):
13+
url = f"{base_url}{path}"
14+
if method == "POST":
15+
body = json.dumps({"foo": "bar"})
16+
return requests.post(url=url, headers=headers, data=body)
2117

22-
REQUEST_METHODS = [
23-
create_and_read_product_team,
24-
]
18+
return requests.get(url=url, headers=headers)
2519

2620

2721
@pytest.mark.smoke
28-
def test_smoke_tests():
22+
@pytest.mark.parametrize(
23+
"request_details",
24+
[
25+
[
26+
"/ProductTeam",
27+
"POST",
28+
400,
29+
["MISSING_VALUE", "VALIDATION_ERROR"],
30+
[
31+
"CreateProductTeamIncomingParams.ods_code: field required",
32+
"CreateProductTeamIncomingParams.name: field required",
33+
"CreateProductTeamIncomingParams.foo: extra fields not permitted",
34+
],
35+
],
36+
[
37+
"/ProductTeam/123/Product",
38+
"POST",
39+
400,
40+
["MISSING_VALUE", "VALIDATION_ERROR"],
41+
[
42+
"CreateCpmProductIncomingParams.product_name: field required",
43+
"CreateCpmProductIncomingParams.foo: extra fields not permitted",
44+
],
45+
],
46+
[
47+
"/ProductTeam/123/Product/Epr",
48+
"POST",
49+
400,
50+
["MISSING_VALUE", "VALIDATION_ERROR"],
51+
[
52+
"CreateCpmProductIncomingParams.product_name: field required",
53+
"CreateCpmProductIncomingParams.foo: extra fields not permitted",
54+
],
55+
],
56+
[
57+
"/ProductTeam/123/Product/abc/DeviceReferenceData",
58+
"POST",
59+
400,
60+
["MISSING_VALUE", "VALIDATION_ERROR"],
61+
[
62+
"CreateDeviceReferenceDataParams.name: field required",
63+
"CreateDeviceReferenceDataParams.foo: extra fields not permitted",
64+
],
65+
],
66+
# ('/ProductTeam/123/Product/abc/Device', 'POST', 400, ['MISSING_VALUE', 'VALIDATION_ERROR']),
67+
[
68+
"/ProductTeam/123",
69+
"GET",
70+
404,
71+
["RESOURCE_NOT_FOUND"],
72+
["Could not find ProductTeam for key ('123')"],
73+
],
74+
[
75+
"/ProductTeam/123/Product",
76+
"GET",
77+
404,
78+
["RESOURCE_NOT_FOUND"],
79+
["Could not find ProductTeam for key ('123')"],
80+
],
81+
[
82+
"/ProductTeam/123/Product/abc",
83+
"GET",
84+
404,
85+
["RESOURCE_NOT_FOUND"],
86+
["Could not find ProductTeam for key ('123')"],
87+
],
88+
[
89+
"/ProductTeam/123/Product/abc/DeviceReferenceData/xyz",
90+
"GET",
91+
404,
92+
["RESOURCE_NOT_FOUND"],
93+
["Could not find ProductTeam for key ('123')"],
94+
],
95+
# ['/ProductTeam/123/Product/abc/Device/xyz', 404, ['RESOURCE_NOT_FOUND'], ["Could not find ProductTeam for key ('123')"]],
96+
[
97+
"/Questionnaire/987",
98+
"GET",
99+
404,
100+
["RESOURCE_NOT_FOUND"],
101+
["Could not find Questionnaire for key ('987')"],
102+
],
103+
[
104+
"/searchSdsDevice",
105+
"GET",
106+
400,
107+
["MISSING_VALUE"],
108+
[
109+
"SearchSDSDeviceQueryParams.nhs_as_client: field required",
110+
"SearchSDSDeviceQueryParams.nhs_as_svc_ia: field required",
111+
],
112+
],
113+
[
114+
"/searchSdsEndpoint",
115+
"GET",
116+
400,
117+
["VALIDATION_ERROR"],
118+
[
119+
"SearchSDSEndpointQueryParams.__root__: At least 2 query parameters should be provided of type, nhs_id_code, nhs_mhs_svc_ia and nhs_mhs_party_key"
120+
],
121+
],
122+
],
123+
)
124+
def test_smoke_tests(request_details):
29125
workspace = os.environ.get("WORKSPACE") or read_terraform_output("workspace.value")
30126
environment = os.environ.get("ACCOUNT") or read_terraform_output(
31127
"environment.value"
@@ -34,10 +130,12 @@ def test_smoke_tests():
34130
headers = get_headers(app_key=app_key)
35131
base_url = get_base_url(workspace=workspace, environment=environment)
36132
print( # noqa: T201
37-
f"πŸƒ Running πŸƒ smoke test ({environment}.{workspace} --> {base_url}) - πŸ€”"
133+
f"πŸƒ Running πŸƒ smoke test ({environment}.{workspace} --> {base_url}{request_details[0]}) - πŸ€”"
38134
)
39135

40-
for request_method in REQUEST_METHODS:
41-
execute_smoke_test(
42-
request_method=request_method, base_url=base_url, headers=headers
43-
)
136+
execute_smoke_test(
137+
request_method=_request,
138+
base_url=base_url,
139+
headers=headers,
140+
request_details=request_details,
141+
)

β€Žsrc/api/tests/smoke_tests/utils.pyβ€Ž

Lines changed: 60 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,14 @@ def get_base_url(workspace: str, environment: str) -> str:
4848
return f"https://{base_url}/{api_name}"
4949

5050

51-
def is_2xx(status_code: int):
52-
return 200 <= status_code < 300
51+
def is_2xx(status_code: int, expected_status_code: int):
52+
return 200 <= status_code < 300 and status_code == expected_status_code
53+
54+
55+
def is_4xx(status_code: int, expected_status_code: int):
56+
return (
57+
400 <= status_code < 500 and status_code != 401
58+
) and status_code == expected_status_code
5359

5460

5561
def item_already_exists(response_json: dict) -> bool:
@@ -58,28 +64,64 @@ def item_already_exists(response_json: dict) -> bool:
5864
return _item_exists
5965

6066

61-
def execute_smoke_test(request_method: FunctionType, base_url: str, headers: str):
62-
response: requests.Response = request_method(base_url=base_url, headers=headers)
67+
def raise_smoke_test_error(request_method, status_code, response_content):
68+
raise SmokeTestError(
69+
f"The smoke test for method '{request_method.__name__}' "
70+
f"failed with status code {status_code} 😭😭\n"
71+
f"{response_content}"
72+
)
73+
74+
75+
def execute_smoke_test(
76+
request_method: FunctionType, base_url: str, headers: str, request_details: list
77+
):
78+
response: requests.Response = request_method(
79+
base_url=base_url,
80+
headers=headers,
81+
path=request_details[0],
82+
method=request_details[1],
83+
)
6384

6485
try:
6586
response_json: dict = response.json()
6687
except requests.JSONDecodeError:
6788
response_json = None
6889

69-
success = is_2xx(status_code=response.status_code) or (
70-
response_json and item_already_exists(response_json=response_json)
90+
success2xx = is_2xx(
91+
status_code=response.status_code, expected_status_code=request_details[2]
7192
)
72-
if success:
73-
print( # noqa: T201
74-
f"πŸŽ‰πŸŽ‰ - πŸ’¨ Smoke πŸ’¨ test for method '{request_method.__name__}' has passed - πŸŽ‰πŸŽ‰"
75-
)
76-
if not success:
77-
if response.status_code == 401:
93+
if success2xx:
94+
if response_json == request_details[3]:
7895
print( # noqa: T201
79-
">> Did you forget to manually register your app with the Apigee Product? <<"
96+
f"πŸŽ‰πŸŽ‰ - πŸ’¨ Smoke πŸ’¨ test for method '{request_method.__name__}' has passed - πŸŽ‰πŸŽ‰"
97+
)
98+
else:
99+
raise_smoke_test_error(
100+
request_method, response.status_code, response_json or response.text
101+
)
102+
103+
if not success2xx:
104+
if is_4xx(
105+
status_code=response.status_code, expected_status_code=request_details[2]
106+
):
107+
error_assertion = all(
108+
response_error["code"] in request_details[3]
109+
and response_error["message"] in request_details[4]
110+
for response_error in response_json.get("errors", [])
111+
)
112+
if error_assertion:
113+
print( # noqa: T201
114+
f"πŸŽ‰πŸŽ‰ - πŸ’¨ Smoke πŸ’¨ test for method '{request_method.__name__}' has passed - πŸŽ‰πŸŽ‰"
115+
)
116+
else:
117+
raise_smoke_test_error(
118+
request_method, response.status_code, response_json or response.text
119+
)
120+
else:
121+
if response.status_code == 401:
122+
print( # noqa: T201
123+
">> Did you forget to manually register your app with the Apigee Product? <<"
124+
)
125+
raise_smoke_test_error(
126+
request_method, response.status_code, response_json or response.text
80127
)
81-
raise SmokeTestError(
82-
f"The smoke test for method '{request_method.__name__}' "
83-
f"has failed with status code {response.status_code} 😭😭\n"
84-
f"{response_json or response.text}"
85-
)

0 commit comments

Comments
Β (0)