Coverage for app / backend / src / tests / test_postcard_service.py: 100%
58 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-04 13:48 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-04 13:48 +0000
1from unittest.mock import patch
3import pytest
4from requests import RequestException
6from couchers.postal.my_postcard import send_postcard
7from couchers.resources import get_postcard_front_image
10@pytest.fixture(autouse=True)
11def _(testconfig):
12 pass
15def test_get_postcard_front_image_returns_png():
16 data = get_postcard_front_image()
17 assert isinstance(data, bytes)
18 assert len(data) > 0
19 assert data[:4] == b"\x89PNG"
22def test_send_postcard_success():
23 with (
24 patch("couchers.postal.my_postcard._place_order") as mock_order,
25 patch("couchers.postal.my_postcard._authenticate") as mock_auth,
26 patch("couchers.postal.my_postcard.get_postcard_front_image") as mock_image,
27 ):
28 mock_image.return_value = b"fake-image"
29 mock_auth.return_value = "auth-token"
30 mock_order.return_value = {"job_id": 12345}
32 job_id = send_postcard(
33 recipient_name="Test User",
34 address_line_1="123 Main St",
35 address_line_2="Apt 4",
36 city="Berlin",
37 state=None,
38 postal_code="10717",
39 country="DE",
40 verification_code="ABC123",
41 )
43 assert job_id == 12345
44 mock_auth.assert_called_once()
45 mock_order.assert_called_once()
48def test_send_postcard_builds_recipient_correctly():
49 with (
50 patch("couchers.postal.my_postcard._place_order") as mock_order,
51 patch("couchers.postal.my_postcard._authenticate") as mock_auth,
52 patch("couchers.postal.my_postcard.get_postcard_front_image") as mock_image,
53 ):
54 mock_image.return_value = b"fake-image"
55 mock_auth.return_value = "auth-token"
56 mock_order.return_value = {"job_id": 123}
58 send_postcard(
59 recipient_name="Test User",
60 address_line_1="123 Main St",
61 address_line_2="Apt 4",
62 city="Berlin",
63 state=None,
64 postal_code="10717",
65 country="DE",
66 verification_code="ABC123",
67 )
69 recipient_arg = mock_order.call_args[0][1]
70 assert recipient_arg["recipientName"] == "Test User"
71 assert recipient_arg["addressLine1"] == "123 Main St"
72 assert recipient_arg["addressLine2"] == "Apt 4"
73 assert recipient_arg["zip"] == "10717"
74 assert recipient_arg["countryiso"] == "DE"
75 assert "state" not in recipient_arg
78def test_send_postcard_excludes_none_optional_fields():
79 with (
80 patch("couchers.postal.my_postcard._place_order") as mock_order,
81 patch("couchers.postal.my_postcard._authenticate") as mock_auth,
82 patch("couchers.postal.my_postcard.get_postcard_front_image") as mock_image,
83 ):
84 mock_image.return_value = b"fake-image"
85 mock_auth.return_value = "auth-token"
86 mock_order.return_value = {"job_id": 123}
88 send_postcard(
89 recipient_name="Test User",
90 address_line_1="123 Main St",
91 address_line_2=None,
92 city="Berlin",
93 state=None,
94 postal_code=None,
95 country="DE",
96 verification_code="ABC123",
97 )
99 recipient_arg = mock_order.call_args[0][1]
100 assert "addressLine2" not in recipient_arg
101 assert "zip" not in recipient_arg
102 assert "state" not in recipient_arg
105def test_send_postcard_auth_failure():
106 with (
107 patch("couchers.postal.my_postcard._authenticate") as mock_auth,
108 patch("couchers.postal.my_postcard.get_postcard_front_image") as mock_image,
109 ):
110 mock_image.return_value = b"fake-image"
111 mock_auth.side_effect = RequestException("Connection refused")
113 with pytest.raises(RequestException, match="Connection refused"):
114 send_postcard(
115 recipient_name="Test User",
116 address_line_1="123 Main St",
117 address_line_2=None,
118 city="Berlin",
119 state=None,
120 postal_code=None,
121 country="DE",
122 verification_code="ABC123",
123 )
126def test_send_postcard_order_failure():
127 with (
128 patch("couchers.postal.my_postcard._place_order") as mock_order,
129 patch("couchers.postal.my_postcard._authenticate") as mock_auth,
130 patch("couchers.postal.my_postcard.get_postcard_front_image") as mock_image,
131 ):
132 mock_image.return_value = b"fake-image"
133 mock_auth.return_value = "auth-token"
134 mock_order.side_effect = RequestException("500 Server Error")
136 with pytest.raises(RequestException, match="500 Server Error"):
137 send_postcard(
138 recipient_name="Test User",
139 address_line_1="123 Main St",
140 address_line_2=None,
141 city="Berlin",
142 state=None,
143 postal_code=None,
144 country="DE",
145 verification_code="ABC123",
146 )