Skip to content

Commit 55c18d3

Browse files
committed
test for mock_mns_service
1 parent 6933833 commit 55c18d3

3 files changed

Lines changed: 103 additions & 7 deletions

File tree

lambdas/shared/src/common/api_clients/mns_setup.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
import os
23

34
import boto3
45
from botocore.config import Config
@@ -9,11 +10,13 @@
910
from common.cache import Cache
1011

1112
logging.basicConfig(level=logging.INFO)
13+
MNS_TEST_QUEUE_URL = os.getenv("MNS_TEST_QUEUE_URL")
1214

1315

1416
def get_mns_service(mns_env: str = "int"):
1517
if mns_env == "dev":
16-
return MockMnsService()
18+
logging.info("Dev environment: Using MockMnsService")
19+
return MockMnsService(MNS_TEST_QUEUE_URL)
1720
else:
1821
boto_config = Config(region_name="eu-west-2")
1922
cache = Cache(directory="/tmp") # NOSONAR(S5443)
@@ -24,6 +27,5 @@ def get_mns_service(mns_env: str = "int"):
2427
environment=mns_env,
2528
cache=cache,
2629
)
27-
2830
logging.info("Authentication Initiated...")
2931
return MnsService(authenticator)

lambdas/shared/src/common/api_clients/mock_mns_service.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
import json
2-
import os
32

43
import boto3
54

65
from common.clients import logger
76

8-
MNS_TEST_QUEUE_URL = os.getenv("MNS_TEST_QUEUE_URL")
9-
107

118
class MockMnsService:
129
def __init__(self, queue_url):
@@ -23,8 +20,8 @@ def publish_notification(self, mns_payload: dict) -> None:
2320
Args: payload: MNS notification payload
2421
"""
2522
try:
26-
response = self._get_sqs_client.send_message(
27-
QueueUrl=MNS_TEST_QUEUE_URL,
23+
response = self.sqs_client.send_message(
24+
QueueUrl=self.queue_url,
2825
MessageBody=json.dumps(mns_payload),
2926
MessageAttributes={"source": {"StringValue": "mns-publisher-lambda", "DataType": "String"}},
3027
)
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import json
2+
import unittest
3+
4+
import boto3
5+
from moto import mock_aws
6+
7+
from common.api_clients.mock_mns_service import MockMnsService
8+
9+
10+
@mock_aws
11+
class TestMockMnsService(unittest.TestCase):
12+
"""Tests for MockMnsService (dev environment)."""
13+
14+
def setUp(self):
15+
"""Set up mocked SQS queue and test payload."""
16+
# Create mock SQS queue
17+
self.sqs = boto3.client("sqs", region_name="eu-west-2")
18+
response = self.sqs.create_queue(QueueName="mns-test-notifications-dev")
19+
self.queue_url = response["QueueUrl"]
20+
21+
self.mns_payload = {
22+
"specversion": "1.0",
23+
"id": "236a1d4a-5d69-4fa9-9c7f-e72bf505aa5b",
24+
"source": "https://int.api.service.nhs.uk/immunisation-fhir-api",
25+
"type": "imms-vaccinations-2",
26+
"time": "20260212T174437+00:00",
27+
"subject": "9481152782",
28+
"dataref": "https://int.api.service.nhs.uk/immunisation-fhir-api/Immunization/d058014c-b0fd-4471-8db9-3316175eb825",
29+
"filtering": {
30+
"generalpractitioner": "Y12345",
31+
"sourceorganisation": "B0C4P",
32+
"sourceapplication": "TPP",
33+
"subjectage": 21,
34+
"immunisationtype": "HIB",
35+
"action": "CREATE",
36+
},
37+
}
38+
39+
def test_publish_notification_success(self):
40+
"""Test MockMnsService successfully publishes to SQS queue."""
41+
# Create mock service with queue URL
42+
mock_service = MockMnsService(queue_url=self.queue_url)
43+
44+
# Publish notification
45+
mock_service.publish_notification(self.mns_payload)
46+
47+
# Verify message was sent to queue
48+
messages = self.sqs.receive_message(
49+
QueueUrl=self.queue_url, MaxNumberOfMessages=1, MessageAttributeNames=["All"]
50+
)
51+
52+
# Assert message exists
53+
self.assertIn("Messages", messages)
54+
self.assertEqual(len(messages["Messages"]), 1)
55+
56+
# Verify message body
57+
message_body = json.loads(messages["Messages"][0]["Body"])
58+
self.assertEqual(message_body["id"], "236a1d4a-5d69-4fa9-9c7f-e72bf505aa5b")
59+
self.assertEqual(message_body["subject"], "9481152782")
60+
self.assertEqual(message_body["filtering"]["generalpractitioner"], "Y12345")
61+
self.assertEqual(message_body["filtering"]["sourceorganisation"], "B0C4P")
62+
self.assertEqual(message_body["filtering"]["sourceapplication"], "TPP")
63+
self.assertEqual(message_body["filtering"]["immunisationtype"], "HIB")
64+
self.assertEqual(message_body["filtering"]["action"], "CREATE")
65+
self.assertEqual(message_body["filtering"]["subjectage"], 21)
66+
67+
# Verify message attributes
68+
attributes = messages["Messages"][0]["MessageAttributes"]
69+
self.assertEqual(attributes["source"]["StringValue"], "mns-publisher-lambda")
70+
71+
def test_publish_notification_multiple_messages(self):
72+
"""Test MockMnsService handles multiple publications."""
73+
mock_service = MockMnsService(queue_url=self.queue_url)
74+
75+
# Publish multiple notifications
76+
payload1 = {**self.mns_payload, "id": "notification-1"}
77+
payload2 = {**self.mns_payload, "id": "notification-2"}
78+
79+
mock_service.publish_notification(payload1)
80+
mock_service.publish_notification(payload2)
81+
82+
# Verify both messages in queue
83+
messages = self.sqs.receive_message(QueueUrl=self.queue_url, MaxNumberOfMessages=10)
84+
85+
self.assertEqual(len(messages["Messages"]), 2)
86+
87+
# Verify IDs
88+
message_ids = [json.loads(msg["Body"])["id"] for msg in messages["Messages"]]
89+
self.assertIn("notification-1", message_ids)
90+
self.assertIn("notification-2", message_ids)
91+
92+
def test_publish_notification_sqs_failure(self):
93+
"""Test MockMnsService raises exception on SQS failure."""
94+
# Use invalid queue URL
95+
mock_service = MockMnsService(queue_url="queue_url=invalid_queue_url")
96+
with self.assertRaises(Exception):
97+
mock_service.publish_notification(self.mns_payload)

0 commit comments

Comments
 (0)