Skip to content

Commit b56a9bc

Browse files
committed
VED-1013 Part 1: Added retry behaviour (#1131)
1 parent f1e87d1 commit b56a9bc

9 files changed

Lines changed: 47 additions & 32 deletions

File tree

tests/e2e_automation/features/APITests/steps/common_steps.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from venv import logger
55

66
import pytest_check as check
7-
import requests
87
from pytest_bdd import given, parsers, then, when
98
from src.dynamoDB.dynamo_db_helper import fetch_immunization_events_detail, parse_imms_int_imms_event_response
109
from src.objectModels.api_immunization_builder import (
@@ -26,6 +25,7 @@
2625
from utilities.api_get_header import get_create_post_url_header, get_delete_url_header, get_update_url_header
2726
from utilities.date_helper import is_valid_date
2827
from utilities.enums import Operation
28+
from utilities.http_requests_session import http_requests_session
2929
from utilities.vaccination_constants import ROUTE_MAP, SITE_MAP
3030

3131

@@ -76,7 +76,7 @@ def Trigger_the_post_create_request(context):
7676
get_create_post_url_header(context)
7777
context.create_object = context.immunization_object
7878
context.request = context.create_object.dict(exclude_none=True, exclude_unset=True)
79-
context.response = requests.post(context.url, json=context.request, headers=context.headers)
79+
context.response = http_requests_session.post(context.url, json=context.request, headers=context.headers)
8080
print(f"Create Request is {json.dumps(context.request)}")
8181

8282

@@ -238,7 +238,9 @@ def send_update_for_vaccination_detail(context):
238238
context.update_object.route = build_site_route(random.choice(ROUTE_MAP))
239239
context.create_object = context.update_object
240240
context.request = context.update_object.dict(exclude_none=True, exclude_unset=True)
241-
context.response = requests.put(context.url + "/" + context.ImmsID, json=context.request, headers=context.headers)
241+
context.response = http_requests_session.put(
242+
context.url + "/" + context.ImmsID, json=context.request, headers=context.headers
243+
)
242244
print(f"Update Request is {json.dumps(context.request)}")
243245

244246

@@ -269,14 +271,16 @@ def created_event_is_being_deleted(context):
269271
def send_delete_for_immunization_event_created(context):
270272
get_delete_url_header(context)
271273
print(f"\n Delete Request is {context.url}/{context.ImmsID}")
272-
context.response = requests.delete(f"{context.url}/{context.ImmsID}", headers=context.headers)
274+
context.response = http_requests_session.delete(f"{context.url}/{context.ImmsID}", headers=context.headers)
273275

274276

275277
def trigger_the_updated_request(context):
276278
context.expected_version = int(context.expected_version) + 1
277279
context.create_object = context.update_object
278280
context.request = context.update_object.dict(exclude_none=True, exclude_unset=True)
279-
context.response = requests.put(context.url + "/" + context.ImmsID, json=context.request, headers=context.headers)
281+
context.response = http_requests_session.put(
282+
context.url + "/" + context.ImmsID, json=context.request, headers=context.headers
283+
)
280284
print(f"Update Request is {json.dumps(context.request)}")
281285

282286

tests/e2e_automation/features/APITests/steps/test_create_steps.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ def create_request_with_invalid_Nhsnumber(context, invalid_NhsNumber):
285285
def create_request_with_invalid_forename(context, forename):
286286
valid_json_payload_is_created(context)
287287
if forename == "single_value_max_len":
288-
context.immunization_object.contained[1].name[0].given = [get_text("name_length_36")]
288+
context.immunization_object.contained[1].name[0].given = [get_text("name_length_181")]
289289
elif forename == "max_len_array":
290290
context.immunization_object.contained[1].name[0].given = [
291291
get_text("name_length_15"),

tests/e2e_automation/features/APITests/steps/test_delete_steps.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import logging
22
import uuid
33

4-
import requests
54
from pytest_bdd import parsers, scenarios, then, when
65
from src.dynamoDB.dynamo_db_helper import (
76
fetch_immunization_int_delta_detail_by_immsID,
@@ -10,6 +9,7 @@
109
from utilities.api_fhir_immunization_helper import find_entry_by_Imms_id, parse_FHIR_immunization_response
1110
from utilities.api_get_header import get_delete_url_header
1211
from utilities.enums import ActionFlag, Operation
12+
from utilities.http_requests_session import http_requests_session
1313

1414
from .common_steps import (
1515
The_request_will_have_status_code,
@@ -30,7 +30,7 @@ def send_delete_for_immunization_event_created_invalid(context):
3030
get_delete_url_header(context)
3131
context.ImmsID = str(uuid.uuid4())
3232
print(f"\n Delete Request is {context.url}/{context.ImmsID}")
33-
context.response = requests.delete(f"{context.url}/{context.ImmsID}", headers=context.headers)
33+
context.response = http_requests_session.delete(f"{context.url}/{context.ImmsID}", headers=context.headers)
3434

3535

3636
@when(parsers.parse("Send a delete for Immunization event created for the above created event is send by '{Supplier}'"))

tests/e2e_automation/features/APITests/steps/test_read_steps.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import logging
22
import uuid
33

4-
import requests
54
from pytest_bdd import scenarios, then, when
65
from utilities.api_fhir_immunization_helper import parse_read_response, validate_to_compare_request_and_response
76
from utilities.api_get_header import get_read_url_header
7+
from utilities.http_requests_session import http_requests_session
88

99
logging.basicConfig(filename="debugLog.log", level=logging.INFO)
1010
logger = logging.getLogger(__name__)
@@ -16,7 +16,7 @@
1616
def send_read_for_immunization_event_created(context):
1717
get_read_url_header(context)
1818
print(f"\n Read Request is {context.url}")
19-
context.response = requests.get(f"{context.url}", headers=context.headers)
19+
context.response = http_requests_session.get(f"{context.url}", headers=context.headers)
2020

2121

2222
@then("The Read Response JSONs field values should match with the input JSONs field values")
@@ -32,4 +32,4 @@ def send_read_for_immunization_event_created_with_invalid_imms_id(context):
3232
context.ImmsID = str(uuid.uuid4())
3333
get_read_url_header(context)
3434
print(f"\n Read Request is {context.url}")
35-
context.response = requests.get(f"{context.url}", headers=context.headers)
35+
context.response = http_requests_session.get(f"{context.url}", headers=context.headers)

tests/e2e_automation/features/APITests/steps/test_search_steps.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from urllib.parse import parse_qs
44

55
import pytest_check as check
6-
import requests
76
from pytest_bdd import parsers, scenarios, then, when
87
from src.objectModels.api_search_object import convert_to_form_data, set_request_data
98
from utilities.api_fhir_immunization_helper import (
@@ -14,6 +13,7 @@
1413
)
1514
from utilities.api_get_header import get_search_get_url_header, get_search_post_url_header
1615
from utilities.date_helper import iso_to_compact
16+
from utilities.http_requests_session import http_requests_session
1717

1818
from .common_steps import normalize_param
1919

@@ -27,7 +27,7 @@ def send_search_post_request_with_identifier_header(context):
2727
"identifier": f"{context.create_object.identifier[0].system}|{context.create_object.identifier[0].value}"
2828
}
2929
print(f"\n Search Post Request - \n {context.request}")
30-
context.response = requests.post(context.url, headers=context.headers, data=context.request)
30+
context.response = http_requests_session.post(context.url, headers=context.headers, data=context.request)
3131

3232

3333
@when("Send a search request with Post method using identifier and _elements header for Immunization event created")
@@ -38,15 +38,15 @@ def send_search_post_request_with_identifier_and_elements_header(context):
3838
"_elements": "meta,id",
3939
}
4040
print(f"\n Search Post Request - \n {context.request}")
41-
context.response = requests.post(context.url, headers=context.headers, data=context.request)
41+
context.response = http_requests_session.post(context.url, headers=context.headers, data=context.request)
4242

4343

4444
@when("Send a search request with post method using invalid identifier header for Immunization event created")
4545
def send_search_post_request_with_invalid_identifier_header(context):
4646
get_search_post_url_header(context)
4747
context.request = {"identifier": f"https://www.ieds.england.nhs.uk/|{str(uuid.uuid4())}", "_elements": "meta,id"}
4848
print(f"\n Search Post Request - \n {context.request}")
49-
context.response = requests.post(context.url, headers=context.headers, data=context.request)
49+
context.response = http_requests_session.post(context.url, headers=context.headers, data=context.request)
5050

5151

5252
@when("Send a search request with GET method for Immunization event created")
@@ -58,7 +58,7 @@ def TriggerSearchGetRequest(context):
5858
)
5959
)
6060
print(f"\n Search Get Parameters - \n {context.params}")
61-
context.response = requests.get(context.url, params=context.params, headers=context.headers)
61+
context.response = http_requests_session.get(context.url, params=context.params, headers=context.headers)
6262

6363
print(f"\n Search Get Response - \n {context.response.json()}")
6464

@@ -72,7 +72,7 @@ def TriggerSearchPostRequest(context):
7272
)
7373
)
7474
print(f"\n Search Post Request - \n {context.request}")
75-
context.response = requests.post(context.url, headers=context.headers, data=context.request)
75+
context.response = http_requests_session.post(context.url, headers=context.headers, data=context.request)
7676

7777
print(f"\n Search Post Response - \n {context.response.json()}")
7878

@@ -102,7 +102,7 @@ def send_invalid_param_get_request(context, NHSNumber, DiseaseType):
102102
set_request_data(NHSNumber, DiseaseType, datetime.today().strftime("%Y-%m-%d"))
103103
)
104104
print(f"\n Search Get parameters - \n {context.params}")
105-
context.response = requests.get(context.url, params=context.params, headers=context.headers)
105+
context.response = http_requests_session.get(context.url, params=context.params, headers=context.headers)
106106

107107

108108
@when(
@@ -130,7 +130,7 @@ def send_invalid_param_post_request(context, NHSNumber, DiseaseType):
130130
set_request_data(NHSNumber, DiseaseType, datetime.today().strftime("%Y-%m-%d"))
131131
)
132132
print(f"\n Search Post request - \n {context.request}")
133-
context.response = requests.post(context.url, headers=context.headers, data=context.request)
133+
context.response = http_requests_session.post(context.url, headers=context.headers, data=context.request)
134134

135135

136136
@when(
@@ -156,7 +156,7 @@ def send_invalid_date_get_request(context, DateFrom, DateTo):
156156

157157
context.params = convert_to_form_data(set_request_data(9001066569, context.vaccine_type, DateFrom, DateTo))
158158
print(f"\n Search Get parameters - \n {context.params}")
159-
context.response = requests.get(context.url, params=context.params, headers=context.headers)
159+
context.response = http_requests_session.get(context.url, params=context.params, headers=context.headers)
160160

161161

162162
@when(
@@ -182,7 +182,7 @@ def send_invalid_param_post_request_with_dates(context, DateFrom, DateTo):
182182

183183
context.request = convert_to_form_data(set_request_data(9001066569, context.vaccine_type, DateFrom, DateTo))
184184
print(f"\n Search Post request - \n {context.request}")
185-
context.response = requests.post(context.url, headers=context.headers, data=context.request)
185+
context.response = http_requests_session.post(context.url, headers=context.headers, data=context.request)
186186

187187

188188
@when(
@@ -195,7 +195,7 @@ def send_valid_param_get_request(context, NHSNumber, vaccine_type, DateFrom, Dat
195195

196196
context.params = convert_to_form_data(set_request_data(NHSNumber, vaccine_type, DateFrom, DateTo))
197197
print(f"\n Search Get parameters - \n {context.params}")
198-
context.response = requests.get(context.url, params=context.params, headers=context.headers)
198+
context.response = http_requests_session.get(context.url, params=context.params, headers=context.headers)
199199

200200

201201
@when(
@@ -208,7 +208,7 @@ def send_valid_param_post_request(context, NHSNumber, vaccine_type, DateFrom, Da
208208

209209
context.request = convert_to_form_data(set_request_data(NHSNumber, vaccine_type, DateFrom, DateTo))
210210
print(f"\n Search Get parameters - \n {context.request}")
211-
context.response = requests.post(context.url, headers=context.headers, data=context.request)
211+
context.response = http_requests_session.post(context.url, headers=context.headers, data=context.request)
212212

213213

214214
@when(
@@ -220,7 +220,7 @@ def send_valid_param_get_request_with_include(context, NHSNumber, vaccine_type,
220220
get_search_get_url_header(context)
221221
context.params = convert_to_form_data(set_request_data(NHSNumber, vaccine_type, include=include))
222222
print(f"\n Search Get parameters - \n {context.params}")
223-
context.response = requests.get(context.url, params=context.params, headers=context.headers)
223+
context.response = http_requests_session.get(context.url, params=context.params, headers=context.headers)
224224

225225

226226
@when(
@@ -232,7 +232,7 @@ def send_valid_param_post_request_with_include(context, NHSNumber, vaccine_type,
232232
get_search_post_url_header(context)
233233
context.request = convert_to_form_data(set_request_data(NHSNumber, vaccine_type, include=include))
234234
print(f"\n Search Post parameters - \n {context.request}")
235-
context.response = requests.post(context.url, headers=context.headers, data=context.request)
235+
context.response = http_requests_session.post(context.url, headers=context.headers, data=context.request)
236236

237237

238238
@when(
@@ -244,7 +244,7 @@ def send_valid_param_post_request_with_include_and_dates(context, NHSNumber, vac
244244
get_search_post_url_header(context)
245245
context.request = convert_to_form_data(set_request_data(NHSNumber, vaccine_type, DateFrom, DateTo, include))
246246
print(f"\n Search Post parameters - \n {context.request}")
247-
context.response = requests.post(context.url, headers=context.headers, data=context.request)
247+
context.response = http_requests_session.post(context.url, headers=context.headers, data=context.request)
248248

249249

250250
@when(
@@ -256,7 +256,7 @@ def send_valid_param_get_request_with_include_and_dates(context, NHSNumber, vacc
256256
get_search_get_url_header(context)
257257
context.params = convert_to_form_data(set_request_data(NHSNumber, vaccine_type, DateFrom, DateTo, include))
258258
print(f"\n Search Get parameters - \n {context.params}")
259-
context.response = requests.get(context.url, params=context.params, headers=context.headers)
259+
context.response = http_requests_session.get(context.url, params=context.params, headers=context.headers)
260260

261261

262262
@then("The occurrenceDateTime of the immunization events should be within the Date From and Date To range")

tests/e2e_automation/features/conftest.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33

44
import allure
55
import pytest
6-
import requests
76
from dotenv import load_dotenv
87
from utilities.api_fhir_immunization_helper import empty_folder
98
from utilities.api_gen_token import get_tokens
109
from utilities.api_get_header import get_delete_url_header
1110
from utilities.aws_token import refresh_sso_token, set_aws_session_token
1211
from utilities.context import ScenarioContext
1312
from utilities.enums import SupplierNameWithODSCode
13+
from utilities.http_requests_session import http_requests_session
1414

1515
# Ignore F403 * imports. Pytest BDD requires common steps to be imported in conftest
1616
from features.APITests.steps.common_steps import * # noqa: F403
@@ -103,7 +103,7 @@ def pytest_bdd_after_scenario(request, feature, scenario):
103103
if "Delete_cleanUp" in tags:
104104
if context.ImmsID is not None:
105105
print(f"\n Delete Request is {context.url}/{context.ImmsID}")
106-
context.response = requests.delete(f"{context.url}/{context.ImmsID}", headers=context.headers)
106+
context.response = http_requests_session.delete(f"{context.url}/{context.ImmsID}", headers=context.headers)
107107
assert context.response.status_code == 204, (
108108
f"Expected status code 204, but got {context.response.status_code}. Response: {context.response.json()}"
109109
)
@@ -119,7 +119,7 @@ def pytest_bdd_after_scenario(request, feature, scenario):
119119
for imms_id in context.vaccine_df["IMMS_ID_CLEAN"].dropna().unique():
120120
delete_url = f"{context.url}/{imms_id}"
121121
print(f"Sending DELETE request to: {delete_url}")
122-
response = requests.delete(delete_url, headers=context.headers)
122+
response = http_requests_session.delete(delete_url, headers=context.headers)
123123

124124
assert response.status_code == 204, (
125125
f" Failed to delete {imms_id}: expected 204, got {response.status_code}. Response: {response.text}"

tests/e2e_automation/pytest.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,4 @@ markers =
5151
supplier_name_PINNACLE: tag for Pinnacle supplier name scenarios
5252
supplier_name_TPP: tag for TPP supplier name scenarios
5353
supplier_name_MEDICUS: tag for MEDICUS supplier name scenarios
54-
supplier_name_CEGEDIM: tag for CEGEDIM supplier name scenarios
54+
supplier_name_CEGEDIM: tag for CEGEDIM supplier name scenarios

tests/e2e_automation/utilities/error_constants.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@
129129
},
130130
"max_len_forename": {
131131
"code": "INVARIANT",
132-
"diagnostics": "Validation errors: contained[?(@.resourceType=='Patient')].name[0].given[0] must be 35 or fewer characters",
132+
"diagnostics": "Validation errors: contained[?(@.resourceType=='Patient')].name[0].given[0] must be 180 or fewer characters",
133133
},
134134
"max_item_forename": {
135135
"code": "INVARIANT",
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
"""A simple global HTTP requests session. It will retry three times with backoff for any 502 errors of any HTTP method.
2+
This is due to a known issue with the Apigee -> AWS APIGW backend where intermittent 502 errors can be seen when
3+
initially ramping up traffic"""
4+
5+
import requests
6+
from requests.adapters import HTTPAdapter
7+
from urllib3.util.retry import Retry
8+
9+
retry_strategy = Retry(total=3, allowed_methods=None, status_forcelist=[502], backoff_factor=1)
10+
http_requests_session = requests.Session()
11+
http_requests_session.mount("https://", HTTPAdapter(max_retries=retry_strategy))

0 commit comments

Comments
 (0)