Skip to content

Commit 2ef7c5a

Browse files
committed
VED-746: test for search by identifier
1 parent a228100 commit 2ef7c5a

File tree

2 files changed

+3
-295
lines changed

2 files changed

+3
-295
lines changed

e2e/test_search_by_identifier.py

Lines changed: 3 additions & 198 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
1-
import pprint
2-
import uuid
3-
from typing import NamedTuple, Literal, Optional, List
1+
42
from decimal import Decimal
53
from utils.base_test import ImmunizationBaseTest
6-
from utils.constants import (
7-
valid_nhs_number1,
8-
valid_nhs_number2,
9-
valid_patient_identifier2,
10-
valid_patient_identifier1,
11-
)
4+
from utils.constants import valid_nhs_number1
5+
126
from utils.resource import generate_imms_resource, generate_filtered_imms_resource
137
from utils.mappings import VaccineTypes
148
from lib.env import get_service_base_path
@@ -132,199 +126,10 @@ def test_search_backwards_compatible(self):
132126
self.assertEqual(imms_identifier[0]["value"], identifier_value)
133127

134128
# Check structure of one of the imms resources
135-
# expected_imms_resource["patient"]["reference"] = response_patient["fullUrl"]
136129
response_imm = next(item for item in entries if item["resource"]["id"] == imms_id)
137130
self.assertEqual(
138131
response_imm["fullUrl"], f"{get_service_base_path()}/Immunization/{imms_id}"
139132
)
140133
self.assertEqual(response_imm["search"], {"mode": "match"})
141134
expected_imms_resource["patient"]["reference"] = response_imm["resource"]["patient"]["reference"]
142135
self.assertEqual(response_imm["resource"], expected_imms_resource)
143-
144-
def test_search_immunization_parameter_smoke_tests(self):
145-
time_1 = "2024-01-30T13:28:17.271+00:00"
146-
time_2 = "2024-02-01T13:28:17.271+00:00"
147-
stored_records = [
148-
generate_imms_resource(valid_nhs_number1, VaccineTypes.mmr, imms_identifier_value=str(uuid.uuid4())),
149-
generate_imms_resource(valid_nhs_number1, VaccineTypes.flu, imms_identifier_value=str(uuid.uuid4())),
150-
generate_imms_resource(valid_nhs_number1, VaccineTypes.covid_19, imms_identifier_value=str(uuid.uuid4())),
151-
generate_imms_resource(valid_nhs_number1, VaccineTypes.covid_19,
152-
occurrence_date_time=time_1,
153-
imms_identifier_value=str(uuid.uuid4())),
154-
generate_imms_resource(valid_nhs_number1, VaccineTypes.covid_19,
155-
occurrence_date_time=time_2,
156-
imms_identifier_value=str(uuid.uuid4())),
157-
generate_imms_resource(valid_nhs_number2, VaccineTypes.flu, imms_identifier_value=str(uuid.uuid4())),
158-
generate_imms_resource(valid_nhs_number2, VaccineTypes.covid_19, imms_identifier_value=str(uuid.uuid4())),
159-
]
160-
161-
created_resource_ids = list(self.store_records(*stored_records))
162-
# created_resource_ids = [result["id"] for result in stored_records]
163-
164-
# When
165-
class SearchTestParams(NamedTuple):
166-
method: Literal["POST", "GET"]
167-
query_string: Optional[str]
168-
body: Optional[str]
169-
should_be_success: bool
170-
expected_indexes: List[int]
171-
expected_status_code: int = 200
172-
173-
searches = [
174-
SearchTestParams(
175-
"GET",
176-
"",
177-
None,
178-
False,
179-
[],
180-
400
181-
),
182-
# No results.
183-
SearchTestParams(
184-
"GET",
185-
f"patient.identifier={valid_patient_identifier2}&-immunization.target={VaccineTypes.mmr}",
186-
None,
187-
True,
188-
[],
189-
200
190-
),
191-
# Basic success.
192-
SearchTestParams(
193-
"GET",
194-
f"patient.identifier={valid_patient_identifier1}&-immunization.target={VaccineTypes.mmr}",
195-
None,
196-
True,
197-
[0],
198-
200
199-
),
200-
# "Or" params.
201-
SearchTestParams(
202-
"GET",
203-
f"patient.identifier={valid_patient_identifier1}&-immunization.target={VaccineTypes.mmr},"
204-
+ f"{VaccineTypes.flu}",
205-
None,
206-
True,
207-
[0, 1],
208-
200
209-
),
210-
# GET does not support body.
211-
SearchTestParams(
212-
"GET",
213-
f"patient.identifier={valid_patient_identifier1}&-immunization.target={VaccineTypes.mmr}",
214-
f"patient.identifier={valid_patient_identifier1}",
215-
True,
216-
[0],
217-
200
218-
),
219-
SearchTestParams(
220-
"POST",
221-
None,
222-
f"patient.identifier={valid_patient_identifier1}&-immunization.target={VaccineTypes.mmr}",
223-
True,
224-
[0],
225-
200
226-
),
227-
# Duplicated NHS number not allowed, spread across query and content.
228-
SearchTestParams(
229-
"POST",
230-
f"patient.identifier={valid_patient_identifier1}&-immunization.target={VaccineTypes.mmr}",
231-
f"patient.identifier={valid_patient_identifier1}",
232-
False,
233-
[],
234-
400
235-
),
236-
SearchTestParams(
237-
"GET",
238-
f"patient.identifier={valid_patient_identifier1}"
239-
f"&patient.identifier={valid_patient_identifier1}"
240-
f"&-immunization.target={VaccineTypes.mmr}",
241-
None,
242-
False,
243-
[],
244-
400
245-
),
246-
# "And" params not supported.
247-
SearchTestParams(
248-
"GET",
249-
f"patient.identifier={valid_patient_identifier1}&-immunization.target={VaccineTypes.mmr}"
250-
f"&-immunization.target={VaccineTypes.flu}",
251-
None,
252-
False,
253-
[],
254-
400
255-
),
256-
# Date
257-
SearchTestParams(
258-
"GET",
259-
f"patient.identifier={valid_patient_identifier1}&-immunization.target={VaccineTypes.covid_19}",
260-
None,
261-
True,
262-
[2, 3, 4],
263-
200
264-
),
265-
SearchTestParams(
266-
"GET",
267-
f"patient.identifier={valid_patient_identifier1}&-immunization.target={VaccineTypes.covid_19}"
268-
f"&-date.from=2024-01-30",
269-
None,
270-
True,
271-
[3, 4],
272-
200
273-
),
274-
SearchTestParams(
275-
"GET",
276-
f"patient.identifier={valid_patient_identifier1}&-immunization.target={VaccineTypes.covid_19}"
277-
f"&-date.to=2024-01-30",
278-
None,
279-
True,
280-
[2, 3],
281-
200
282-
),
283-
SearchTestParams(
284-
"GET",
285-
f"patient.identifier={valid_patient_identifier1}&-immunization.target={VaccineTypes.covid_19}"
286-
f"&-date.from=2024-01-01&-date.to=2024-01-30",
287-
None,
288-
True,
289-
[3],
290-
200
291-
),
292-
# "from" after "to" is an error.
293-
SearchTestParams(
294-
"GET",
295-
f"patient.identifier={valid_patient_identifier1}&-immunization.target={VaccineTypes.covid_19}"
296-
f"&-date.from=2024-02-01&-date.to=2024-01-30",
297-
None,
298-
False,
299-
[0],
300-
400
301-
),
302-
]
303-
304-
for search in searches:
305-
pprint.pprint(search)
306-
response = self.default_imms_api.search_immunizations_full(search.method, search.query_string,
307-
body=search.body,
308-
expected_status_code=search.expected_status_code)
309-
310-
# Then
311-
assert response.ok == search.should_be_success, response.text
312-
313-
results: dict = response.json()
314-
if search.should_be_success:
315-
assert "entry" in results.keys()
316-
assert response.status_code == 200
317-
assert results["resourceType"] == "Bundle"
318-
319-
result_ids = [result["resource"]["id"] for result in results["entry"]]
320-
created_and_returned_ids = list(set(result_ids) & set(created_resource_ids))
321-
print("\n Search Test Debug Info:")
322-
print("Search method:", search.method)
323-
print("Search query string:", search.query_string)
324-
print("Expected indexes:", search.expected_indexes)
325-
print("Expected IDs:", [created_resource_ids[i] for i in search.expected_indexes])
326-
print("Actual returned IDs:", result_ids)
327-
print("Matched IDs:", created_and_returned_ids)
328-
assert len(created_and_returned_ids) == len(search.expected_indexes)
329-
for expected_index in search.expected_indexes:
330-
assert created_resource_ids[expected_index] in result_ids

e2e/test_search_immunization.py

Lines changed: 0 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -138,27 +138,6 @@ def test_search_backwards_compatible(self):
138138
self.assertEqual(response_imm["search"], {"mode": "match"})
139139
self.assertEqual(response_imm["resource"], expected_imms_resource)
140140

141-
def test_search_ignore_deleted(self):
142-
# Given patient has three vaccines and the last one is deleted
143-
mmr1 = generate_imms_resource(valid_nhs_number1, VaccineTypes.mmr)
144-
mmr2 = generate_imms_resource(valid_nhs_number1, VaccineTypes.mmr)
145-
mmr1_id, mmr2_id = self.store_records(mmr1, mmr2)
146-
147-
to_delete_mmr = generate_imms_resource(valid_nhs_number1, VaccineTypes.mmr)
148-
deleted_mmr = self.default_imms_api.create_a_deleted_immunization_resource(to_delete_mmr)
149-
150-
# When
151-
response = self.default_imms_api.search_immunizations(valid_nhs_number1, VaccineTypes.mmr)
152-
153-
# Then
154-
self.assertEqual(response.status_code, 200, response.text)
155-
body = response.json()
156-
157-
resource_ids = [entity["resource"]["id"] for entity in body["entry"]]
158-
self.assertTrue(mmr1_id in resource_ids)
159-
self.assertTrue(mmr2_id in resource_ids)
160-
self.assertTrue(deleted_mmr["id"] not in resource_ids)
161-
162141
def test_search_immunization_parameter_smoke_tests(self):
163142
time_1 = "2024-01-30T13:28:17.271+00:00"
164143
time_2 = "2024-02-01T13:28:17.271+00:00"
@@ -336,82 +315,6 @@ class SearchTestParams(NamedTuple):
336315

337316
result_ids = [result["resource"]["id"] for result in results["entry"]]
338317
created_and_returned_ids = list(set(result_ids) & set(created_resource_ids))
339-
print("\n Search Test Debug Info:")
340-
print("Search method:", search.method)
341-
print("Search query string:", search.query_string)
342-
print("Expected indexes:", search.expected_indexes)
343-
print("Expected IDs:", [created_resource_ids[i] for i in search.expected_indexes])
344-
print("Actual returned IDs:", result_ids)
345-
print("Matched IDs:", created_and_returned_ids)
346318
assert len(created_and_returned_ids) == len(search.expected_indexes)
347319
for expected_index in search.expected_indexes:
348320
assert created_resource_ids[expected_index] in result_ids
349-
350-
def test_search_immunization_accepts_include_and_provides_patient(self):
351-
"""it should accept the _include parameter of "Immunization:patient" and return the patient."""
352-
353-
# Arrange
354-
imms_obj = generate_imms_resource(valid_nhs_number1, VaccineTypes.mmr)
355-
imms_obj_id = self.store_records(imms_obj)
356-
357-
response = self.default_imms_api.search_immunizations_full(
358-
"POST",
359-
f"patient.identifier={valid_patient_identifier1}&-immunization.target={VaccineTypes.mmr}"
360-
+ "&_include=Immunization:patient",
361-
body=None,
362-
)
363-
364-
assert response.ok
365-
result = response.json()
366-
entries = result["entry"]
367-
368-
entry_ids = [result["resource"]["id"] for result in result["entry"]]
369-
assert imms_obj_id in entry_ids
370-
371-
patient_entry = next(entry for entry in entries if entry["resource"]["resourceType"] == "Patient")
372-
assert patient_entry["search"]["mode"] == "include"
373-
374-
assert patient_entry["resource"]["identifier"][0]["system"] == "https://fhir.nhs.uk/Id/nhs-number"
375-
assert patient_entry["resource"]["identifier"][0]["value"] == valid_nhs_number1
376-
377-
response_without_include = self.default_imms_api.search_immunizations_full(
378-
"POST",
379-
f"patient.identifier={valid_patient_identifier1}&-immunization.target={VaccineTypes.mmr}",
380-
body=None
381-
)
382-
383-
assert response_without_include.ok
384-
result_without_include = response_without_include.json()
385-
386-
# Matches Immunisation History API in that it doesn't matter if you don't pass "_include".
387-
388-
# Ignore link, patient full url and immunisation patient reference as these will always differ.
389-
result["link"] = []
390-
result_without_include["link"] = []
391-
392-
for entry in result["entry"]:
393-
if entry["resource"]["resourceType"] == "Immunization":
394-
entry["resource"]["patient"]["reference"] = "MOCK VALUE"
395-
elif entry["resource"]["resourceType"] == "Patient":
396-
entry["fullUrl"] = "MOCK VALUE"
397-
398-
for entry in result_without_include["entry"]:
399-
if entry["resource"]["resourceType"] == "Immunization":
400-
entry["resource"]["patient"]["reference"] = "MOCK VALUE"
401-
elif entry["resource"]["resourceType"] == "Patient":
402-
entry["fullUrl"] = "MOCK VALUE"
403-
404-
self.assertEqual(result, result_without_include)
405-
406-
def test_search_reject_tbc(self):
407-
# Given patient has a vaccine with no NHS number
408-
imms = generate_imms_resource("TBC", VaccineTypes.mmr)
409-
del imms["contained"][1]["identifier"][0]["value"]
410-
self.store_records(imms)
411-
412-
# When
413-
response = self.default_imms_api.search_immunizations("TBC", f"{VaccineTypes.mmr}",
414-
expected_status_code=400)
415-
416-
# Then
417-
self.assert_operation_outcome(response, 400)

0 commit comments

Comments
 (0)