Skip to content

Commit 3e6ab45

Browse files
committed
[NRL-1631] Add unit tests for new logging
1 parent 873ad91 commit 3e6ab45

File tree

7 files changed

+474
-17
lines changed

7 files changed

+474
-17
lines changed

api/producer/createDocumentReference/create_document_reference.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -258,19 +258,21 @@ def handler(
258258

259259
pointer_type = core_model.type
260260
if pointer_type not in TYPES_WITH_MULTIPLES:
261-
patient_number = core_model.nhs_number
261+
nhs_number = core_model.nhs_number
262262
pointer_custodian = core_model.custodian
263+
pointer_master_identifier = core_model.master_identifier
263264
existing_pointers_count = repository.count_by_nhs_number(
264-
patient_number, [pointer_type]
265+
nhs_number, [pointer_type]
265266
)
266267

267268
if existing_pointers_count > 0:
268269
logger.log(
269270
LogReference.PROCREATE012,
271+
new_pointer_master_id=pointer_master_identifier,
270272
pointer_type=pointer_type,
271-
patient_number=patient_number,
273+
nhs_number=nhs_number,
272274
existing_pointers_count=existing_pointers_count,
273-
pointer_custodian=pointer_custodian,
275+
custodian=pointer_custodian,
274276
)
275277

276278
logger.log(LogReference.PROCREATE009, pointer_id=result.resource.id)

api/producer/createDocumentReference/tests/test_create_document_reference.py

Lines changed: 141 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import json
2-
from unittest.mock import patch
2+
from unittest.mock import Mock, patch
33

44
from freeze_uuid import freeze_uuid
55
from freezegun import freeze_time
@@ -1734,3 +1734,143 @@ def test__set_create_time_fields_when_no_date_but_perms():
17341734
},
17351735
"date": test_time,
17361736
}
1737+
1738+
1739+
@mock_aws
1740+
@mock_repository
1741+
@freeze_uuid("00000000-0000-0000-0000-000000000001")
1742+
@patch("api.producer.createDocumentReference.create_document_reference.logger")
1743+
def test_create_logs_for_unexpected_multi_pointer(
1744+
mock_logger: Mock,
1745+
repository: DocumentPointerRepository,
1746+
):
1747+
doc_ref = load_document_reference("Y05868-736253002-Valid-with-master-id")
1748+
doc_pointer = DocumentPointer.from_document_reference(doc_ref)
1749+
repository.create(doc_pointer)
1750+
1751+
event = create_test_api_gateway_event(
1752+
headers=create_headers(),
1753+
body=doc_ref.model_dump_json(exclude_none=True),
1754+
)
1755+
1756+
result = handler(event, create_mock_context())
1757+
body = result.pop("body")
1758+
1759+
assert result == {
1760+
"statusCode": "201",
1761+
"headers": {
1762+
"Location": "/producer/FHIR/R4/DocumentReference/Y05868-00000000-0000-0000-0000-000000000001",
1763+
**default_response_headers(),
1764+
},
1765+
"isBase64Encoded": False,
1766+
}
1767+
1768+
parsed_body = json.loads(body)
1769+
1770+
assert parsed_body == {
1771+
"resourceType": "OperationOutcome",
1772+
"issue": [
1773+
{
1774+
"severity": "information",
1775+
"code": "informational",
1776+
"details": {
1777+
"coding": [
1778+
{
1779+
"code": "RESOURCE_CREATED",
1780+
"display": "Resource created",
1781+
"system": "https://fhir.nhs.uk/ValueSet/NRL-ResponseCode",
1782+
}
1783+
]
1784+
},
1785+
"diagnostics": "The document has been created",
1786+
}
1787+
],
1788+
}
1789+
1790+
assert any(
1791+
call[0][0].name == "PROCREATE012" for call in mock_logger.log.call_args_list
1792+
)
1793+
1794+
assert {
1795+
"existing_pointers_count": 1,
1796+
"nhs_number": (
1797+
doc_ref.subject.identifier.value
1798+
if doc_ref.subject and doc_ref.subject.identifier
1799+
else None
1800+
),
1801+
"pointer_type": (
1802+
f"{doc_ref.type.coding[0].system}|{doc_ref.type.coding[0].code}"
1803+
if doc_ref.type and doc_ref.type.coding
1804+
else None
1805+
),
1806+
"custodian": (
1807+
doc_ref.custodian.identifier.value
1808+
if doc_ref.custodian and doc_ref.custodian.identifier
1809+
else None
1810+
),
1811+
"new_pointer_master_id": (
1812+
doc_ref.masterIdentifier.value if doc_ref.masterIdentifier else None
1813+
),
1814+
} == [
1815+
call[1:][0]
1816+
for call in mock_logger.log.call_args_list
1817+
if call[0][0].name == "PROCREATE012"
1818+
][
1819+
0
1820+
]
1821+
1822+
1823+
@mock_aws
1824+
@mock_repository
1825+
@freeze_uuid("00000000-0000-0000-0000-000000000001")
1826+
@patch("api.producer.createDocumentReference.create_document_reference.logger")
1827+
def test_create_logs_for_expected_multi_pointer(
1828+
mock_logger: Mock,
1829+
repository: DocumentPointerRepository,
1830+
):
1831+
doc_ref = load_document_reference("Y05868-Appointment-Valid")
1832+
doc_pointer = DocumentPointer.from_document_reference(doc_ref)
1833+
repository.create(doc_pointer)
1834+
1835+
event = create_test_api_gateway_event(
1836+
headers=create_headers(),
1837+
body=doc_ref.model_dump_json(exclude_none=True),
1838+
)
1839+
1840+
result = handler(event, create_mock_context())
1841+
body = result.pop("body")
1842+
1843+
assert result == {
1844+
"statusCode": "201",
1845+
"headers": {
1846+
"Location": "/producer/FHIR/R4/DocumentReference/Y05868-00000000-0000-0000-0000-000000000001",
1847+
**default_response_headers(),
1848+
},
1849+
"isBase64Encoded": False,
1850+
}
1851+
1852+
parsed_body = json.loads(body)
1853+
1854+
assert parsed_body == {
1855+
"resourceType": "OperationOutcome",
1856+
"issue": [
1857+
{
1858+
"severity": "information",
1859+
"code": "informational",
1860+
"details": {
1861+
"coding": [
1862+
{
1863+
"code": "RESOURCE_CREATED",
1864+
"display": "Resource created",
1865+
"system": "https://fhir.nhs.uk/ValueSet/NRL-ResponseCode",
1866+
}
1867+
]
1868+
},
1869+
"diagnostics": "The document has been created",
1870+
}
1871+
],
1872+
}
1873+
1874+
assert not any(
1875+
call[0][0].name == "PROCREATE012" for call in mock_logger.log.call_args_list
1876+
)

api/producer/upsertDocumentReference/tests/test_upsert_document_reference.py

Lines changed: 98 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import json
2-
from unittest.mock import patch
2+
from unittest.mock import Mock, patch
33

44
from freezegun import freeze_time
55
from moto import mock_aws
@@ -1703,13 +1703,100 @@ def test__set_create_time_fields_when_no_date_but_perms():
17031703

17041704
@mock_aws
17051705
@mock_repository
1706+
@patch("api.producer.upsertDocumentReference.upsert_document_reference.logger")
17061707
def test_upsert_logs_for_unexpected_multi_pointer(
1708+
mock_logger: Mock,
17071709
repository: DocumentPointerRepository,
17081710
):
1709-
doc_ref = load_document_reference("Y05868-736253002-Valid")
1711+
doc_ref = load_document_reference("Y05868-736253002-Valid-with-master-id")
1712+
doc_pointer = DocumentPointer.from_document_reference(doc_ref)
1713+
repository.create(doc_pointer)
1714+
1715+
doc_ref.id = "Y05868-99999-99999-999999-02"
1716+
1717+
event = create_test_api_gateway_event(
1718+
headers=create_headers(),
1719+
body=doc_ref.model_dump_json(exclude_none=True),
1720+
)
1721+
1722+
result = handler(event, create_mock_context())
1723+
body = result.pop("body")
1724+
1725+
assert result == {
1726+
"statusCode": "201",
1727+
"headers": {
1728+
"Location": "/producer/FHIR/R4/DocumentReference/Y05868-99999-99999-999999-02",
1729+
**default_response_headers(),
1730+
},
1731+
"isBase64Encoded": False,
1732+
}
1733+
1734+
parsed_body = json.loads(body)
1735+
1736+
assert parsed_body == {
1737+
"resourceType": "OperationOutcome",
1738+
"issue": [
1739+
{
1740+
"severity": "information",
1741+
"code": "informational",
1742+
"details": {
1743+
"coding": [
1744+
{
1745+
"code": "RESOURCE_CREATED",
1746+
"display": "Resource created",
1747+
"system": "https://fhir.nhs.uk/ValueSet/NRL-ResponseCode",
1748+
}
1749+
]
1750+
},
1751+
"diagnostics": "The document has been created",
1752+
}
1753+
],
1754+
}
1755+
1756+
assert any(
1757+
call[0][0].name == "PROUPSERT012" for call in mock_logger.log.call_args_list
1758+
)
1759+
1760+
assert {
1761+
"existing_pointers_count": 1,
1762+
"nhs_number": (
1763+
doc_ref.subject.identifier.value
1764+
if doc_ref.subject and doc_ref.subject.identifier
1765+
else None
1766+
),
1767+
"pointer_type": (
1768+
f"{doc_ref.type.coding[0].system}|{doc_ref.type.coding[0].code}"
1769+
if doc_ref.type and doc_ref.type.coding
1770+
else None
1771+
),
1772+
"custodian": (
1773+
doc_ref.custodian.identifier.value
1774+
if doc_ref.custodian and doc_ref.custodian.identifier
1775+
else None
1776+
),
1777+
"new_pointer_id": doc_ref.id,
1778+
} == [
1779+
call[1:][0]
1780+
for call in mock_logger.log.call_args_list
1781+
if call[0][0].name == "PROUPSERT012"
1782+
][
1783+
0
1784+
]
1785+
1786+
1787+
@mock_aws
1788+
@mock_repository
1789+
@patch("api.producer.upsertDocumentReference.upsert_document_reference.logger")
1790+
def test_upsert_logs_for_expected_multi_pointer(
1791+
mock_logger: Mock,
1792+
repository: DocumentPointerRepository,
1793+
):
1794+
doc_ref = load_document_reference("Y05868-Appointment-Valid")
17101795
doc_pointer = DocumentPointer.from_document_reference(doc_ref)
17111796
repository.create(doc_pointer)
17121797

1798+
doc_ref.id = "Y05868-99999-99999-999999-02"
1799+
17131800
event = create_test_api_gateway_event(
17141801
headers=create_headers(),
17151802
body=doc_ref.model_dump_json(exclude_none=True),
@@ -1719,9 +1806,9 @@ def test_upsert_logs_for_unexpected_multi_pointer(
17191806
body = result.pop("body")
17201807

17211808
assert result == {
1722-
"statusCode": "200",
1809+
"statusCode": "201",
17231810
"headers": {
1724-
"Location": "/producer/FHIR/R4/DocumentReference/Y05868-99999-99999-999999",
1811+
"Location": "/producer/FHIR/R4/DocumentReference/Y05868-99999-99999-999999-02",
17251812
**default_response_headers(),
17261813
},
17271814
"isBase64Encoded": False,
@@ -1738,13 +1825,17 @@ def test_upsert_logs_for_unexpected_multi_pointer(
17381825
"details": {
17391826
"coding": [
17401827
{
1741-
"code": "RESOURCE_UPDATED",
1742-
"display": "Resource updated",
1828+
"code": "RESOURCE_CREATED",
1829+
"display": "Resource created",
17431830
"system": "https://fhir.nhs.uk/ValueSet/NRL-ResponseCode",
17441831
}
17451832
]
17461833
},
1747-
"diagnostics": "The document has been updated",
1834+
"diagnostics": "The document has been created",
17481835
}
17491836
],
17501837
}
1838+
1839+
assert not any(
1840+
call[0][0].name == "PROUPSERT012" for call in mock_logger.log.call_args_list
1841+
)

api/producer/upsertDocumentReference/upsert_document_reference.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -265,19 +265,20 @@ def handler(
265265

266266
pointer_type = core_model.type
267267
if pointer_type not in TYPES_WITH_MULTIPLES:
268-
patient_number = core_model.nhs_number
268+
nhs_number = core_model.nhs_number
269269
pointer_custodian = core_model.custodian
270270
existing_pointers_count = repository.count_by_nhs_number(
271-
patient_number, [pointer_type]
271+
nhs_number, [pointer_type]
272272
)
273273

274274
if existing_pointers_count > 0:
275275
logger.log(
276-
LogReference.PROCREATE012,
276+
LogReference.PROUPSERT012,
277+
new_pointer_id=core_model.id,
277278
pointer_type=pointer_type,
278-
patient_number=patient_number,
279+
nhs_number=nhs_number,
279280
existing_pointers_count=existing_pointers_count,
280-
pointer_custodian=pointer_custodian,
281+
custodian=pointer_custodian,
281282
)
282283

283284
logger.log(LogReference.PROUPSERT009, pointer_id=result.resource.id)

layer/test_permissions/Y05868-TestApp-12345678/Y05868.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@
33
"http://snomed.info/sct|736253002",
44
"http://snomed.info/sct|1363501000000100",
55
"http://snomed.info/sct|861421000000109",
6+
"http://snomed.info/sct|749001000000101",
67
"https://nicip.nhs.uk|MAULR"
78
]

0 commit comments

Comments
 (0)