Skip to content

Commit a999964

Browse files
authored
Merge pull request #464 from NHSDigital/remove-shared-key-from-mesh-client
Use predefined endpoints for mailbox connectivity
2 parents b5fd2e7 + 9193cc7 commit a999964

File tree

4 files changed

+37
-26
lines changed

4 files changed

+37
-26
lines changed

manage_breast_screening/notifications/services/mesh_inbox.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
import os
22
from tempfile import NamedTemporaryFile
33

4-
from mesh_client import MeshClient, Message
4+
from mesh_client import INT_ENDPOINT, LIVE_ENDPOINT, Endpoint, MeshClient, Message
55

66

77
class MeshInbox:
88
def __init__(self):
9-
cert_file, private_key_file, ca_cert_file = self.ssl_credentials()
9+
cert_file, private_key_file = self.ssl_credentials()
1010
self.client = MeshClient(
11-
url=os.getenv("NBSS_MESH_HOST"),
11+
self.endpoint_for_env(),
1212
mailbox=os.getenv("NBSS_MESH_INBOX_NAME"),
1313
password=os.getenv("NBSS_MESH_PASSWORD"),
14-
shared_key=os.getenv("NBSS_MESH_SHARED_KEY"),
1514
cert=(cert_file, private_key_file),
16-
verify=ca_cert_file,
1715
)
1816
self.client.handshake()
1917

@@ -26,6 +24,15 @@ def fetch_message(self, message_id: str) -> Message:
2624
def acknowledge(self, message_id: str):
2725
self.client.acknowledge_message(message_id)
2826

27+
def endpoint_for_env(self) -> Endpoint:
28+
current_environment = os.getenv("DJANGO_ENV", "dev")
29+
if current_environment == "production":
30+
return LIVE_ENDPOINT
31+
elif current_environment == "test":
32+
return Endpoint(os.getenv("NBSS_MESH_HOST"), None, None, False, False)
33+
else:
34+
return INT_ENDPOINT
35+
2936
def __enter__(self):
3037
return self
3138

@@ -36,12 +43,10 @@ def __exit__(self, type_, value, tb):
3643
def ssl_credentials(cls) -> tuple[NamedTemporaryFile]:
3744
cert = os.getenv("NBSS_MESH_CERT")
3845
private_key = os.getenv("NBSS_MESH_PRIVATE_KEY")
39-
ca_cert = os.getenv("NBSS_MESH_CA_CERT")
4046

4147
return (
4248
cls.to_file(cert).name,
4349
cls.to_file(private_key).name,
44-
cls.to_file(ca_cert).name,
4550
)
4651

4752
@staticmethod

manage_breast_screening/notifications/tests/end_to_end/test_get_from_mesh_and_send_message_batch.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
class TestEndToEnd:
2525
@pytest.fixture(autouse=True)
2626
def setup(self, monkeypatch):
27+
monkeypatch.setenv("DJANGO_ENV", "test")
2728
monkeypatch.setenv("NBSS_MESH_HOST", "http://localhost:8700")
2829
monkeypatch.setenv("NBSS_MESH_PASSWORD", "password")
2930
monkeypatch.setenv("NBSS_MESH_SHARED_KEY", "TestKey")

manage_breast_screening/notifications/tests/integration/test_store_mesh_messages.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
class TestStoreMeshMessages:
1616
@pytest.fixture(autouse=True)
1717
def setup(self, monkeypatch):
18+
monkeypatch.setenv("DJANGO_ENV", "test")
1819
monkeypatch.setenv("NBSS_MESH_HOST", "http://localhost:8700")
1920
monkeypatch.setenv("NBSS_MESH_PASSWORD", "password")
20-
monkeypatch.setenv("NBSS_MESH_SHARED_KEY", "TestKey")
2121
monkeypatch.setenv("NBSS_MESH_INBOX_NAME", "X26ABC1")
2222
monkeypatch.setenv("NBSS_MESH_CERT", "mesh-cert")
2323
monkeypatch.setenv("NBSS_MESH_PRIVATE_KEY", "mesh-private-key")
@@ -45,7 +45,6 @@ def test_retrieve_file(self, helpers):
4545
url=os.getenv("NBSS_MESH_HOST"),
4646
mailbox=os.getenv("NBSS_MESH_INBOX_NAME"),
4747
password=os.getenv("NBSS_MESH_PASSWORD"),
48-
shared_key=os.getenv("NBSS_MESH_SHARED_KEY"),
4948
) as client:
5049
assert len(client.list_messages()) == 2
5150

manage_breast_screening/notifications/tests/services/test_mesh_inbox.py

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from unittest.mock import ANY, MagicMock, patch
22

33
import pytest
4+
from mesh_client import INT_ENDPOINT, LIVE_ENDPOINT
45

56
from manage_breast_screening.notifications.services.mesh_inbox import MeshInbox
67

@@ -9,42 +10,52 @@
910
class TestMeshInbox:
1011
@pytest.fixture(autouse=True)
1112
def setup(self, monkeypatch):
12-
monkeypatch.setenv("NBSS_MESH_HOST", "https://mesh.test")
13+
monkeypatch.setenv("DJANGO_ENV", "dev")
1314
monkeypatch.setenv("NBSS_MESH_INBOX_NAME", "mesh-inbox-name")
1415
monkeypatch.setenv("NBSS_MESH_PASSWORD", "mesh-password")
15-
monkeypatch.setenv("NBSS_MESH_SHARED_KEY", "mesh-shared-key")
1616
monkeypatch.setenv("NBSS_MESH_CERT", "mesh-cert")
1717
monkeypatch.setenv("NBSS_MESH_PRIVATE_KEY", "mesh-private-key")
18-
monkeypatch.setenv("NBSS_MESH_CA_CERT", "mesh-ca-cert")
1918

2019
def test_client_initialises(self, mock_mesh_client):
2120
with patch.object(
2221
MeshInbox,
2322
"ssl_credentials",
24-
return_value=("cert", "private-key", "ca-cert"),
23+
return_value=("cert", "private-key"),
2524
):
2625
MeshInbox()
2726

2827
mock_mesh_client.assert_called_once_with(
29-
url="https://mesh.test",
28+
INT_ENDPOINT,
29+
mailbox="mesh-inbox-name",
30+
password="mesh-password",
31+
cert=("cert", "private-key"),
32+
)
33+
34+
def test_client_initialises_with_prod_endpoint(self, mock_mesh_client, monkeypatch):
35+
monkeypatch.setenv("DJANGO_ENV", "production")
36+
with patch.object(
37+
MeshInbox,
38+
"ssl_credentials",
39+
return_value=("cert", "private-key"),
40+
):
41+
MeshInbox()
42+
43+
mock_mesh_client.assert_called_once_with(
44+
LIVE_ENDPOINT,
3045
mailbox="mesh-inbox-name",
3146
password="mesh-password",
32-
shared_key="mesh-shared-key",
3347
cert=("cert", "private-key"),
34-
verify="ca-cert",
3548
)
3649

3750
def test_constructor_as_contextmanager(self, mock_mesh_client):
3851
with MeshInbox() as inbox:
3952
inbox.fetch_message_ids()
4053

4154
mock_mesh_client.assert_called_once_with(
42-
url="https://mesh.test",
55+
INT_ENDPOINT,
4356
mailbox="mesh-inbox-name",
4457
password="mesh-password",
45-
shared_key="mesh-shared-key",
4658
cert=(ANY, ANY),
47-
verify=ANY,
4859
)
4960
mock_mesh_client.return_value.list_messages.assert_called_once()
5061
mock_mesh_client.return_value.close.assert_called_once()
@@ -54,21 +65,16 @@ def test_ssl_credentials(self, _unused_mock):
5465
mock_cert_file.name = "cert"
5566
mock_private_key_file = MagicMock()
5667
mock_private_key_file.name = "private-key"
57-
mock_ca_cert_file = MagicMock()
58-
mock_ca_cert_file.name = "ca-cert"
5968

6069
with patch.object(
6170
MeshInbox,
6271
"to_file",
63-
side_effect=[mock_cert_file, mock_private_key_file, mock_ca_cert_file],
72+
side_effect=[mock_cert_file, mock_private_key_file],
6473
):
65-
cert_file_name, private_key_file_name, ca_cert_file_name = (
66-
MeshInbox.ssl_credentials()
67-
)
74+
cert_file_name, private_key_file_name = MeshInbox.ssl_credentials()
6875

6976
assert cert_file_name == "cert"
7077
assert private_key_file_name == "private-key"
71-
assert ca_cert_file_name == "ca-cert"
7278

7379
def test_fetch_message_ids(self, mock_mesh_client):
7480
MeshInbox().fetch_message_ids()

0 commit comments

Comments
 (0)