Skip to content

Commit 6b598d2

Browse files
NRL-2015 Reject v2 requests if they don't have permission to interact with the endpoint being called
1 parent 9e90f3f commit 6b598d2

12 files changed

Lines changed: 285 additions & 23 deletions

File tree

api/consumer/readDocumentReference/tests/test_read_document_reference_consumer.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from moto import mock_aws
55

66
from api.consumer.readDocumentReference.read_document_reference import handler
7-
from nrlf.core.constants import CLIENT_RP_DETAILS, V2Headers
7+
from nrlf.core.constants import CLIENT_RP_DETAILS, ConsumerApiInteractions, V2Headers
88
from nrlf.core.dynamodb.repository import DocumentPointer, DocumentPointerRepository
99
from nrlf.tests.data import load_document_reference
1010
from nrlf.tests.dynamodb import mock_repository
@@ -15,6 +15,10 @@
1515
default_response_headers,
1616
)
1717

18+
create_mock_context_default_args = {
19+
"function_name": "nhsd-nrlf--qa-sandbox-2--api--producer--readDocumentReference"
20+
}
21+
1822

1923
@mock_aws
2024
@mock_repository
@@ -63,6 +67,7 @@ def test_read_document_reference_happy_path_v2(
6367

6468
get_pointer_permissions_mock.return_value = {
6569
"access_controls": [],
70+
"interactions": [ConsumerApiInteractions.READ_DOCUMENT_REFERENCE.value],
6671
"types": ["http://snomed.info/sct|736253002"],
6772
}
6873

@@ -71,7 +76,7 @@ def test_read_document_reference_happy_path_v2(
7176
path_parameters={"id": doc_pointer.id},
7277
)
7378

74-
result = handler(event, create_mock_context())
79+
result = handler(event, create_mock_context(**create_mock_context_default_args))
7580
body = result.pop("body")
7681

7782
assert result == {
@@ -222,6 +227,7 @@ def test_read_document_reference_unauthorised_for_type_v2(
222227

223228
get_pointer_permissions_mock.return_value = {
224229
"access_controls": [],
230+
"interactions": [ConsumerApiInteractions.READ_DOCUMENT_REFERENCE.value],
225231
"types": ["http://snomed.info/sct|736373009"],
226232
}
227233

@@ -230,7 +236,7 @@ def test_read_document_reference_unauthorised_for_type_v2(
230236
path_parameters={"id": doc_pointer.id},
231237
)
232238

233-
result = handler(event, create_mock_context())
239+
result = handler(event, create_mock_context(**create_mock_context_default_args))
234240
body = result.pop("body")
235241

236242
assert result == {

api/consumer/searchDocumentReference/tests/test_search_document_reference_consumer.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
CLIENT_RP_DETAILS,
1111
TYPE_ATTRIBUTES,
1212
Categories,
13+
ConsumerApiInteractions,
1314
PointerTypes,
1415
V2Headers,
1516
)
@@ -23,6 +24,10 @@
2324
default_response_headers,
2425
)
2526

27+
create_mock_context_default_args = {
28+
"function_name": "nhsd-nrlf--perftest-2--api--consumer--searchDocumentReference"
29+
}
30+
2631

2732
@mock_aws
2833
@mock_repository
@@ -85,6 +90,7 @@ def test_search_document_reference_happy_path_v2(
8590

8691
get_pointer_permissions_mock.return_value = {
8792
"access_controls": [],
93+
"interactions": [ConsumerApiInteractions.SEARCH_DOCUMENT_REFERENCE.value],
8894
"types": ["http://snomed.info/sct|736253002"],
8995
}
9096

@@ -95,7 +101,7 @@ def test_search_document_reference_happy_path_v2(
95101
},
96102
)
97103

98-
result = handler(event, create_mock_context())
104+
result = handler(event, create_mock_context(**create_mock_context_default_args))
99105
body = result.pop("body")
100106

101107
assert result == {
@@ -752,6 +758,7 @@ def test_search_document_reference_invalid_type_v2(
752758

753759
get_pointer_permissions_mock.return_value = {
754760
"access_controls": [],
761+
"interactions": ConsumerApiInteractions.list(),
755762
"types": ["http://snomed.info/sct|736253002"],
756763
}
757764

@@ -763,7 +770,7 @@ def test_search_document_reference_invalid_type_v2(
763770
},
764771
)
765772

766-
result = handler(event, create_mock_context())
773+
result = handler(event, create_mock_context(**create_mock_context_default_args))
767774
body = result.pop("body")
768775

769776
assert result == {

api/consumer/searchPostDocumentReference/tests/test_search_post_document_reference_consumer.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
CLIENT_RP_DETAILS,
1212
TYPE_ATTRIBUTES,
1313
Categories,
14+
ConsumerApiInteractions,
1415
PointerTypes,
1516
V2Headers,
1617
)
@@ -24,6 +25,10 @@
2425
default_response_headers,
2526
)
2627

28+
create_mock_context_default_args = {
29+
"function_name": "nhsd-nrlf--qa-2--api--producer--searchPostDocumentReference"
30+
}
31+
2732

2833
@mock_aws
2934
@mock_repository
@@ -88,6 +93,7 @@ def test_search_post_document_reference_happy_path_v2(
8893

8994
get_pointer_permissions_mock.return_value = {
9095
"access_controls": [],
96+
"interactions": [ConsumerApiInteractions.SEARCH_POST_DOCUMENT_REFERENCE.value],
9197
"types": ["http://snomed.info/sct|736253002"],
9298
}
9399

@@ -100,7 +106,7 @@ def test_search_post_document_reference_happy_path_v2(
100106
),
101107
)
102108

103-
result = handler(event, create_mock_context())
109+
result = handler(event, create_mock_context(**create_mock_context_default_args))
104110
body = result.pop("body")
105111

106112
assert result == {
@@ -510,6 +516,7 @@ def test_search_post_document_reference_invalid_type_v2(
510516

511517
get_pointer_permissions_mock.return_value = {
512518
"access_controls": [],
519+
"interactions": ConsumerApiInteractions.list(),
513520
"types": ["http://snomed.info/sct|736253002"],
514521
}
515522

@@ -523,7 +530,7 @@ def test_search_post_document_reference_invalid_type_v2(
523530
),
524531
)
525532

526-
result = handler(event, create_mock_context())
533+
result = handler(event, create_mock_context(**create_mock_context_default_args))
527534
body = result.pop("body")
528535

529536
assert result == {

api/producer/createDocumentReference/tests/test_create_document_reference.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
CLIENT_RP_DETAILS,
1515
SNOMED_SYSTEM_URL,
1616
AccessControls,
17+
ProducerApiInteractions,
1718
V2Headers,
1819
)
1920
from nrlf.core.dynamodb.repository import DocumentPointer, DocumentPointerRepository
@@ -32,6 +33,10 @@
3233
default_response_headers,
3334
)
3435

36+
create_mock_context_default_args = {
37+
"function_name": "nhsd-nrlf--01ba47--api--producer--createDocumentReference"
38+
}
39+
3540

3641
@mock_aws
3742
@mock_repository
@@ -757,6 +762,7 @@ def test_create_document_reference_happy_path_v2(
757762

758763
get_pointer_permissions_mock.return_value = {
759764
"access_controls": [],
765+
"interactions": [ProducerApiInteractions.CREATE_DOCUMENT_REFERENCE.value],
760766
"types": ["http://snomed.info/sct|736253002"],
761767
}
762768

@@ -765,7 +771,7 @@ def test_create_document_reference_happy_path_v2(
765771
body=doc_ref_data,
766772
)
767773

768-
result = handler(event, create_mock_context())
774+
result = handler(event, create_mock_context(**create_mock_context_default_args))
769775
body = result.pop("body")
770776

771777
assert result == {
@@ -818,6 +824,7 @@ def test_create_document_reference_pointer_type_not_allowed_v2(
818824
# Return a type that does not match the document's type
819825
get_pointer_permissions_mock.return_value = {
820826
"access_controls": [],
827+
"interactions": [ProducerApiInteractions.CREATE_DOCUMENT_REFERENCE.value],
821828
"types": ["http://snomed.info/sct|736373009"],
822829
}
823830

@@ -826,7 +833,7 @@ def test_create_document_reference_pointer_type_not_allowed_v2(
826833
body=doc_ref.model_dump_json(exclude_none=True),
827834
)
828835

829-
result = handler(event, create_mock_context())
836+
result = handler(event, create_mock_context(**create_mock_context_default_args))
830837
body = result.pop("body")
831838

832839
assert result == {
@@ -1571,6 +1578,7 @@ def test_supersede_non_existent_pointer_succeeds_with_v2_access_control(
15711578

15721579
get_pointer_permissions_mock.return_value = {
15731580
"access_controls": [AccessControls.ALLOW_SUPERSEDE_WITH_DELETE_FAILURE.value],
1581+
"interactions": [ProducerApiInteractions.CREATE_DOCUMENT_REFERENCE.value],
15741582
"types": ["http://snomed.info/sct|736253002"],
15751583
}
15761584

@@ -1579,7 +1587,7 @@ def test_supersede_non_existent_pointer_succeeds_with_v2_access_control(
15791587
body=doc_ref.model_dump_json(exclude_none=True),
15801588
)
15811589

1582-
result = handler(event, create_mock_context())
1590+
result = handler(event, create_mock_context(**create_mock_context_default_args))
15831591
body = result.pop("body")
15841592

15851593
assert result == {
@@ -1640,6 +1648,7 @@ def test_supersede_fails_without_v2_access_control(
16401648

16411649
get_pointer_permissions_mock.return_value = {
16421650
"access_controls": [],
1651+
"interactions": [ProducerApiInteractions.CREATE_DOCUMENT_REFERENCE.value],
16431652
"types": ["http://snomed.info/sct|736253002"],
16441653
}
16451654

@@ -1648,7 +1657,7 @@ def test_supersede_fails_without_v2_access_control(
16481657
body=doc_ref.model_dump_json(exclude_none=True),
16491658
)
16501659

1651-
result = handler(event, create_mock_context())
1660+
result = handler(event, create_mock_context(**create_mock_context_default_args))
16521661
body = result.pop("body")
16531662

16541663
assert result == {

api/producer/searchDocumentReference/tests/test_search_document_reference_producer.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
TYPE_ATTRIBUTES,
1111
Categories,
1212
PointerTypes,
13+
ProducerApiInteractions,
1314
V2Headers,
1415
)
1516
from nrlf.core.dynamodb.repository import DocumentPointer, DocumentPointerRepository
@@ -22,6 +23,10 @@
2223
default_response_headers,
2324
)
2425

26+
create_mock_context_default_args = {
27+
"function_name": "nhsd-nrlf--qa-2--api--consumer--searchDocumentReference"
28+
}
29+
2530

2631
@mock_aws
2732
@mock_repository
@@ -78,6 +83,7 @@ def test_search_document_reference_happy_path_v2(
7883

7984
get_pointer_permissions_mock.return_value = {
8085
"access_controls": [],
86+
"interactions": [ProducerApiInteractions.SEARCH_DOCUMENT_REFERENCE.value],
8187
"types": ["http://snomed.info/sct|736253002"],
8288
}
8389

@@ -88,7 +94,7 @@ def test_search_document_reference_happy_path_v2(
8894
},
8995
)
9096

91-
result = handler(event, create_mock_context())
97+
result = handler(event, create_mock_context(**create_mock_context_default_args))
9298
body = result.pop("body")
9399

94100
assert result == {
@@ -543,6 +549,7 @@ def test_search_document_reference_filters_by_pointer_types_v2(
543549

544550
get_pointer_permissions_mock.return_value = {
545551
"access_controls": [],
552+
"interactions": ProducerApiInteractions.list(),
546553
"types": ["http://snomed.info/sct|736253002"],
547554
}
548555

@@ -553,7 +560,7 @@ def test_search_document_reference_filters_by_pointer_types_v2(
553560
},
554561
)
555562

556-
result = handler(event, create_mock_context())
563+
result = handler(event, create_mock_context(**create_mock_context_default_args))
557564
body = result.pop("body")
558565

559566
assert result == {

api/producer/searchPostDocumentReference/tests/test_search_post_document_reference_producer.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
TYPE_ATTRIBUTES,
1313
Categories,
1414
PointerTypes,
15+
ProducerApiInteractions,
1516
V2Headers,
1617
)
1718
from nrlf.core.dynamodb.repository import DocumentPointer, DocumentPointerRepository
@@ -24,6 +25,10 @@
2425
default_response_headers,
2526
)
2627

28+
create_mock_context_default_args = {
29+
"function_name": "nhsd-nrlf--ref-2--api--producer--searchPostDocumentReference"
30+
}
31+
2732

2833
@mock_aws
2934
@mock_repository
@@ -82,6 +87,7 @@ def test_search_post_document_reference_happy_path_v2(
8287

8388
get_pointer_permissions_mock.return_value = {
8489
"access_controls": [],
90+
"interactions": [ProducerApiInteractions.SEARCH_POST_DOCUMENT_REFERENCE.value],
8591
"types": ["http://snomed.info/sct|736253002"],
8692
}
8793

@@ -94,7 +100,7 @@ def test_search_post_document_reference_happy_path_v2(
94100
),
95101
)
96102

97-
result = handler(event, create_mock_context())
103+
result = handler(event, create_mock_context(**create_mock_context_default_args))
98104
body = result.pop("body")
99105

100106
assert result == {
@@ -562,6 +568,7 @@ def test_search_post_document_reference_filters_by_pointer_types_v2(
562568

563569
get_pointer_permissions_mock.return_value = {
564570
"access_controls": [],
571+
"interactions": ProducerApiInteractions.list(),
565572
"types": ["http://snomed.info/sct|736253002"],
566573
}
567574

@@ -574,7 +581,7 @@ def test_search_post_document_reference_filters_by_pointer_types_v2(
574581
),
575582
)
576583

577-
result = handler(event, create_mock_context())
584+
result = handler(event, create_mock_context(**create_mock_context_default_args))
578585
body = result.pop("body")
579586

580587
assert result == {

0 commit comments

Comments
 (0)