Skip to content

Commit 6df50d8

Browse files
committed
Merge branch 'main' into feature/CCM-17208_Supplier_api_pact_tests
2 parents 1482662 + 5bb9579 commit 6df50d8

16 files changed

Lines changed: 368 additions & 278 deletions

infrastructure/terraform/components/dl/README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ No requirements.
8484
| <a name="module_report_generator"></a> [report\_generator](#module\_report\_generator) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.6/terraform-lambda.zip | n/a |
8585
| <a name="module_report_scheduler"></a> [report\_scheduler](#module\_report\_scheduler) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.6/terraform-lambda.zip | n/a |
8686
| <a name="module_report_sender"></a> [report\_sender](#module\_report\_sender) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.6/terraform-lambda.zip | n/a |
87-
| <a name="module_s3bucket_cf_logs"></a> [s3bucket\_cf\_logs](#module\_s3bucket\_cf\_logs) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.6/terraform-s3bucket.zip | n/a |
8887
| <a name="module_s3bucket_file_quarantine"></a> [s3bucket\_file\_quarantine](#module\_s3bucket\_file\_quarantine) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.6/terraform-s3bucket.zip | n/a |
8988
| <a name="module_s3bucket_file_safe"></a> [s3bucket\_file\_safe](#module\_s3bucket\_file\_safe) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.6/terraform-s3bucket.zip | n/a |
9089
| <a name="module_s3bucket_letters"></a> [s3bucket\_letters](#module\_s3bucket\_letters) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.6/terraform-s3bucket.zip | n/a |

infrastructure/terraform/components/dl/cloudfront_distribution_static_assets_hosting.tf

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ resource "aws_cloudfront_distribution" "static_assets_hosting" {
2222

2323
logging_config {
2424
include_cookies = false
25-
bucket = module.s3bucket_cf_logs.bucket_regional_domain_name
25+
bucket = "${local.acct.additional_s3_buckets_us["digital-letters_cdn-logs"].id}.s3.amazonaws.com"
26+
prefix = "${local.csi}/static-assets/"
2627
}
2728

2829
origin {

infrastructure/terraform/components/dl/module_lambda_mesh_download.tf

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,17 @@ module "mesh_download" {
3737
log_subscription_role_arn = local.acct.log_subscription_role_arn
3838

3939
lambda_env_vars = {
40-
DOWNLOAD_METRIC_NAME = "mesh-download-successful-downloads"
41-
DUPLICATE_DOWNLOAD_METRIC_NAME = "mesh-duplicate-downloads"
42-
DOWNLOAD_METRIC_NAMESPACE = "dl-mesh-download"
43-
ENVIRONMENT = var.environment
44-
EVENT_PUBLISHER_DLQ_URL = module.sqs_event_publisher_errors.sqs_queue_url
45-
EVENT_PUBLISHER_EVENT_BUS_ARN = aws_cloudwatch_event_bus.main.arn
46-
PII_BUCKET = module.s3bucket_pii_data.bucket
47-
SSM_MESH_PREFIX = local.ssm_mesh_prefix
48-
SSM_SENDERS_PREFIX = local.ssm_senders_prefix
49-
USE_MESH_MOCK = var.enable_mock_mesh ? "true" : "false"
40+
DOWNLOAD_METRIC_NAME = "mesh-download-successful-downloads"
41+
INTERNAL_DUPLICATE_DOWNLOAD_METRIC_NAME = "mesh-internal-duplicate-downloads"
42+
TRUST_DUPLICATE_DOWNLOAD_METRIC_NAME = "mesh-trust-duplicate-downloads"
43+
DOWNLOAD_METRIC_NAMESPACE = "dl-mesh-download"
44+
ENVIRONMENT = var.environment
45+
EVENT_PUBLISHER_DLQ_URL = module.sqs_event_publisher_errors.sqs_queue_url
46+
EVENT_PUBLISHER_EVENT_BUS_ARN = aws_cloudwatch_event_bus.main.arn
47+
PII_BUCKET = module.s3bucket_pii_data.bucket
48+
SSM_MESH_PREFIX = local.ssm_mesh_prefix
49+
SSM_SENDERS_PREFIX = local.ssm_senders_prefix
50+
USE_MESH_MOCK = var.enable_mock_mesh ? "true" : "false"
5051
}
5152

5253
}

infrastructure/terraform/components/dl/module_s3_bucket_cf_logs.tf

Lines changed: 0 additions & 175 deletions
This file was deleted.

lambdas/mesh-download/mesh_download/__tests__/test_document_store.py

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@
22
import pytest
33
from unittest.mock import Mock
44
from botocore.exceptions import ClientError
5-
from mesh_download.document_store import DocumentStore, IntermediaryBodyStoreError, DocumentAlreadyExistsError
5+
from mesh_download.document_store import (
6+
DocumentStore,
7+
IntermediaryBodyStoreError,
8+
DocumentAlreadyExistsError,
9+
DocumentAlreadyExistsInternalRetryError,
10+
)
611

712

813
def make_client_error(code):
@@ -36,11 +41,12 @@ def test_store_document_success(self):
3641
content=b'test content'
3742
)
3843

39-
assert result == 'document-reference/SENDER-001/ref-123_mesh-456'
44+
assert result == 'document-reference/SENDER-001/ref-123'
4045
mock_s3_client.put_object.assert_called_once_with(
4146
Bucket='test-pii-bucket',
42-
Key='document-reference/SENDER-001/ref-123_mesh-456',
47+
Key='document-reference/SENDER-001/ref-123',
4348
Body=b'test content',
49+
Metadata={'mesh_message_id': 'mesh-456'},
4450
IfNoneMatch='*'
4551
)
4652

@@ -84,21 +90,56 @@ def test_store_document_raises_error_on_non_200_response(self):
8490
content=b'test content'
8591
)
8692

87-
def test_store_document_precondition_failed_raises_document_already_exists(self):
88-
"""Raises DocumentAlreadyExistsError when S3 returns PreconditionFailed (object already exists)"""
93+
def test_store_document_precondition_failed_same_mesh_message_id_raises_internal_retry(self):
94+
"""Raises DocumentAlreadyExistsInternalRetryError when stored meshMessageId matches incoming (internal retry)"""
8995
mock_s3_client = Mock()
9096
mock_s3_client.put_object.side_effect = make_client_error('PreconditionFailed')
97+
mock_s3_client.head_object.return_value = {
98+
'Metadata': {'mesh_message_id': 'mesh-456'}
99+
}
91100

92101
config = Mock()
93102
config.s3_client = mock_s3_client
94103
config.transactional_data_bucket = 'test-pii-bucket'
95104

96105
store = DocumentStore(config)
97106

98-
with pytest.raises(DocumentAlreadyExistsError, match='document-reference/SENDER-001/ref-123_mesh-456'):
107+
with pytest.raises(DocumentAlreadyExistsInternalRetryError, match='document-reference/SENDER-001/ref-123'):
99108
store.store_document(
100109
sender_id='SENDER-001',
101110
message_reference='ref-123',
102111
mesh_message_id='mesh-456',
103112
content=b'test content'
104113
)
114+
115+
mock_s3_client.head_object.assert_called_once_with(
116+
Bucket='test-pii-bucket',
117+
Key='document-reference/SENDER-001/ref-123'
118+
)
119+
120+
def test_store_document_precondition_failed_different_mesh_message_id_raises_trust_duplicate(self):
121+
"""Raises DocumentAlreadyExistsError when stored meshMessageId differs from incoming (trust duplicate)"""
122+
mock_s3_client = Mock()
123+
mock_s3_client.put_object.side_effect = make_client_error('PreconditionFailed')
124+
mock_s3_client.head_object.return_value = {
125+
'Metadata': {'mesh_message_id': 'original-mesh-id'}
126+
}
127+
128+
config = Mock()
129+
config.s3_client = mock_s3_client
130+
config.transactional_data_bucket = 'test-pii-bucket'
131+
132+
store = DocumentStore(config)
133+
134+
with pytest.raises(DocumentAlreadyExistsError, match='document-reference/SENDER-001/ref-123'):
135+
store.store_document(
136+
sender_id='SENDER-001',
137+
message_reference='ref-123',
138+
mesh_message_id='new-mesh-id',
139+
content=b'test content'
140+
)
141+
142+
mock_s3_client.head_object.assert_called_once_with(
143+
Bucket='test-pii-bucket',
144+
Key='document-reference/SENDER-001/ref-123'
145+
)

0 commit comments

Comments
 (0)