Skip to content

Commit 0e81e6a

Browse files
NRL-1554 Retrieval instead of Repository, add unit tests
1 parent e444ccc commit 0e81e6a

File tree

10 files changed

+144
-15
lines changed

10 files changed

+144
-15
lines changed

api/consumer/swagger.yaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1018,8 +1018,7 @@ components:
10181018
enum: ["SSP", "Direct", "LDR"]
10191019
display:
10201020
type: string
1021-
enum:
1022-
["Spine Secure Proxy", "Direct", "Large Document Repository"]
1021+
enum: ["Spine Secure Proxy", "Direct", "Large Document Retrieval"]
10231022
required:
10241023
- system
10251024
- code

api/producer/swagger.yaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1674,8 +1674,7 @@ components:
16741674
enum: ["SSP", "Direct", "LDR"]
16751675
display:
16761676
type: string
1677-
enum:
1678-
["Spine Secure Proxy", "Direct", "Large Document Repository"]
1677+
enum: ["Spine Secure Proxy", "Direct", "Large Document Retrieval"]
16791678
required:
16801679
- system
16811680
- code

layer/nrlf/consumer/fhir/r4/model.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# generated by datamodel-codegen:
22
# filename: swagger.yaml
3-
# timestamp: 2025-08-28T16:30:30+00:00
3+
# timestamp: 2025-09-05T08:22:10+00:00
44

55
from __future__ import annotations
66

@@ -243,7 +243,7 @@ class ContentStabilityExtensionCoding(Coding):
243243
class RetrievalMechanismExtensionCoding(Coding):
244244
system: Literal["https://fhir.nhs.uk/England/CodeSystem/England-RetrievalMechanism"]
245245
code: Literal["SSP", "Direct", "LDR"]
246-
display: Literal["Spine Secure Proxy", "Direct", "Large Document Repository"]
246+
display: Literal["Spine Secure Proxy", "Direct", "Large Document Retrieval"]
247247

248248

249249
class NRLFormatCode(Coding):

layer/nrlf/core/constants.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,7 @@ def coding_value(self):
687687
CONTENT_RETRIEVAL_CODE_MAP = {
688688
"Direct": "Direct",
689689
"SSP": "Spine Secure Proxy",
690-
"LDR": "Large Document Repository",
690+
"LDR": "Large Document Retrieval",
691691
}
692692
CONTENT_FORMAT_CODE_URL = "https://fhir.nhs.uk/England/CodeSystem/England-NRLFormatCode"
693693
CONTENT_FORMAT_CODE_MAP = {

layer/nrlf/core/tests/test_validators.py

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from nrlf.core.constants import (
66
CATEGORY_ATTRIBUTES,
7+
CONTENT_RETRIEVAL_CODE_MAP,
78
ODS_SYSTEM,
89
TYPE_ATTRIBUTES,
910
TYPE_CATEGORIES,
@@ -16,9 +17,15 @@
1617
validate_type,
1718
)
1819
from nrlf.producer.fhir.r4.model import (
20+
ContentStabilityExtension,
21+
ContentStabilityExtensionCoding,
22+
ContentStabilityExtensionValueCodeableConcept,
1923
DocumentReference,
2024
OperationOutcomeIssue,
2125
RequestQueryType,
26+
RetrievalMechanismExtension,
27+
RetrievalMechanismExtensionCoding,
28+
RetrievalMechanismExtensionValueCodeableConcept,
2229
)
2330
from nrlf.tests.data import load_document_reference_json
2431

@@ -1780,3 +1787,127 @@ def test_validate_content_retrieval_lowercase_urls():
17801787
"diagnostics": "Invalid content retrieval extension (content[0].extension[0].url: Input should be 'https://fhir.nhs.uk/England/StructureDefinition/Extension-England-RetrievalMechanism', see: https://fhir.nhs.uk/England/ValueSet/England-RetrievalMechanism)",
17811788
"expression": ["content[0].extension[0].url"],
17821789
}
1790+
1791+
1792+
def make_content_stability_extension(code, display):
1793+
return ContentStabilityExtension(
1794+
url="https://fhir.nhs.uk/England/StructureDefinition/Extension-England-ContentStability",
1795+
valueCodeableConcept=ContentStabilityExtensionValueCodeableConcept(
1796+
coding=[
1797+
ContentStabilityExtensionCoding(
1798+
system="https://fhir.nhs.uk/England/CodeSystem/England-NRLContentStability",
1799+
code=code,
1800+
display=display,
1801+
)
1802+
]
1803+
),
1804+
)
1805+
1806+
1807+
def make_retrieval_mechanism_extension(code, display):
1808+
return RetrievalMechanismExtension(
1809+
url="https://fhir.nhs.uk/England/StructureDefinition/Extension-England-RetrievalMechanism",
1810+
valueCodeableConcept=RetrievalMechanismExtensionValueCodeableConcept(
1811+
coding=[
1812+
RetrievalMechanismExtensionCoding(
1813+
system="https://fhir.nhs.uk/England/CodeSystem/England-RetrievalMechanism",
1814+
code=code,
1815+
display=display,
1816+
)
1817+
]
1818+
),
1819+
)
1820+
1821+
1822+
def test_has_valid_extensions():
1823+
validator = DocumentReferenceValidator()
1824+
extensions = [
1825+
make_content_stability_extension("static", "Static"),
1826+
make_retrieval_mechanism_extension("Direct", "Direct"),
1827+
]
1828+
assert validator._has_valid_extensions(extensions, 0) is True
1829+
1830+
1831+
def test_has_valid_extensions_multiple_retrieval_mechanism():
1832+
validator = DocumentReferenceValidator()
1833+
extensions = [
1834+
make_content_stability_extension("static", "Static"),
1835+
make_retrieval_mechanism_extension("Direct", "Direct"),
1836+
make_retrieval_mechanism_extension("SSP", "Spine Secure Proxy"),
1837+
]
1838+
assert validator._has_valid_extensions(extensions, 0) is False
1839+
assert any(
1840+
"Invalid content retrieval extension: Extension must have one content retrieval extension, see: ('https://fhir.nhs.uk/England/ValueSet/England-RetrievalMechanism')"
1841+
in issue.diagnostics
1842+
for issue in validator.result.issues
1843+
)
1844+
1845+
1846+
def test_no_content_extensions():
1847+
validator = DocumentReferenceValidator()
1848+
extensions = []
1849+
assert validator._has_valid_extensions(extensions, 0) is False
1850+
assert any(
1851+
"Invalid content extension: Extension must have one content stability extension, see: ('https://fhir.nhs.uk/England/ValueSet/England-NRLContentStability')"
1852+
in issue.diagnostics
1853+
for issue in validator.result.issues
1854+
)
1855+
1856+
1857+
@pytest.mark.parametrize(
1858+
"code, display", [("static", "Static"), ("dynamic", "Dynamic")]
1859+
)
1860+
def test_validate_content_stability_extension_valid(code, display):
1861+
validator = DocumentReferenceValidator()
1862+
ext = make_content_stability_extension("static", "Static")
1863+
assert validator._validate_content_stability_extension(ext, 0, 0) is True
1864+
assert validator.result.issues == []
1865+
1866+
1867+
@pytest.mark.parametrize(
1868+
"code, display", [("dynamic", "Static"), ("static", "Dynamic")]
1869+
)
1870+
def test_validate_content_stability_extension_display_mismatch(code, display):
1871+
validator = DocumentReferenceValidator()
1872+
ext = make_content_stability_extension(code, display)
1873+
assert validator._validate_content_stability_extension(ext, 0, 0) is False
1874+
assert any(
1875+
f"Invalid content extension display: {display} Extension display must be the same as code either 'Static' or 'Dynamic'"
1876+
in issue.diagnostics
1877+
for issue in validator.result.issues
1878+
)
1879+
1880+
1881+
@pytest.mark.parametrize(
1882+
"code, display",
1883+
[
1884+
("SSP", "Spine Secure Proxy"),
1885+
("Direct", "Direct"),
1886+
("LDR", "Large Document Retrieval"),
1887+
],
1888+
)
1889+
def test_validate_retrieval_mechanism_extension_valid(code, display):
1890+
validator = DocumentReferenceValidator()
1891+
ext = make_retrieval_mechanism_extension(code, display)
1892+
assert validator._validate_retrieval_mechanism_extension(ext, 0, 0) is True
1893+
assert validator.result.issues == []
1894+
1895+
1896+
@pytest.mark.parametrize(
1897+
"code, display",
1898+
[
1899+
(code, wrong_display)
1900+
for code, correct_display in CONTENT_RETRIEVAL_CODE_MAP.items()
1901+
for wrong_display in CONTENT_RETRIEVAL_CODE_MAP.values()
1902+
if wrong_display != correct_display
1903+
],
1904+
)
1905+
def test_validate_retrieval_mechanism_extension_display_mismatch(code, display):
1906+
validator = DocumentReferenceValidator()
1907+
ext = make_retrieval_mechanism_extension(code, display)
1908+
assert validator._validate_retrieval_mechanism_extension(ext, 0, 0) is False
1909+
assert any(
1910+
f"Invalid content extension display: {display} Expected display is '{CONTENT_RETRIEVAL_CODE_MAP.get(code)}'"
1911+
in issue.diagnostics
1912+
for issue in validator.result.issues
1913+
)

layer/nrlf/producer/fhir/r4/model.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# generated by datamodel-codegen:
22
# filename: swagger.yaml
3-
# timestamp: 2025-08-28T16:30:27+00:00
3+
# timestamp: 2025-09-05T08:22:07+00:00
44

55
from __future__ import annotations
66

@@ -287,7 +287,7 @@ class ContentStabilityExtensionCoding(Coding):
287287
class RetrievalMechanismExtensionCoding(Coding):
288288
system: Literal["https://fhir.nhs.uk/England/CodeSystem/England-RetrievalMechanism"]
289289
code: Literal["SSP", "Direct", "LDR"]
290-
display: Literal["Spine Secure Proxy", "Direct", "Large Document Repository"]
290+
display: Literal["Spine Secure Proxy", "Direct", "Large Document Retrieval"]
291291

292292

293293
class NRLFormatCode(Coding):

layer/nrlf/producer/fhir/r4/strict_model.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# generated by datamodel-codegen:
22
# filename: swagger.yaml
3-
# timestamp: 2025-08-28T16:30:28+00:00
3+
# timestamp: 2025-09-05T08:22:08+00:00
44

55
from __future__ import annotations
66

@@ -258,7 +258,7 @@ class ContentStabilityExtensionCoding(Coding):
258258
class RetrievalMechanismExtensionCoding(Coding):
259259
system: Literal["https://fhir.nhs.uk/England/CodeSystem/England-RetrievalMechanism"]
260260
code: Literal["SSP", "Direct", "LDR"]
261-
display: Literal["Spine Secure Proxy", "Direct", "Large Document Repository"]
261+
display: Literal["Spine Secure Proxy", "Direct", "Large Document Retrieval"]
262262

263263

264264
class NRLFormatCode(Coding):

resources/fhir/NRLF-Retrieval-CodeSystem.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@
5454
},
5555
{
5656
"code": "LDR",
57-
"display": "Large Document Repository",
58-
"definition": "This document can be retrieved via the Large Document Repository proxy service."
57+
"display": "Large Document Retrieval",
58+
"definition": "This document can be retrieved via the Large Document Retrieval proxy service."
5959
}
6060
]
6161
}

resources/fhir/NRLF-RetrievalMechanism-ValueSet.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
},
3333
{
3434
"code": "LDR",
35-
"display": "Large Document Repository"
35+
"display": "Large Document Retrieval"
3636
}
3737
]
3838
}

tests/features/producer/createDocumentReference-failure.feature

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1436,7 +1436,7 @@ Feature: Producer - createDocumentReference - Failure Scenarios
14361436
}
14371437
]
14381438
},
1439-
"diagnostics": "Invalid content retrieval extension (content[0].extension[0].valueCodeableConcept.coding[0].display: Input should be 'Spine Secure Proxy', 'Direct' or 'Large Document Repository', see: https://fhir.nhs.uk/England/ValueSet/England-RetrievalMechanism)",
1439+
"diagnostics": "Invalid content retrieval extension (content[0].extension[0].valueCodeableConcept.coding[0].display: Input should be 'Spine Secure Proxy', 'Direct' or 'Large Document Retrieval', see: https://fhir.nhs.uk/England/ValueSet/England-RetrievalMechanism)",
14401440
"expression": ["content[0].extension[0].valueCodeableConcept.coding[0].display"]
14411441
}
14421442
"""

0 commit comments

Comments
 (0)