Coverage for app/backend/src/tests/test_postcard_service.py: 100%
55 statements
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-05 06:23 +0000
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-05 06:23 +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
10def test_get_postcard_front_image_returns_png():
11 data = get_postcard_front_image()
12 assert isinstance(data, bytes)
13 assert len(data) > 0
14 assert data[:4] == b"\x89PNG"
17def test_send_postcard_success():
18 with (
19 patch("couchers.postal.my_postcard._place_order") as mock_order,
20 patch("couchers.postal.my_postcard._authenticate") as mock_auth,
21 patch("couchers.postal.my_postcard.get_postcard_front_image") as mock_image,
22 ):
23 mock_image.return_value = b"fake-image"
24 mock_auth.return_value = "auth-token"
25 mock_order.return_value = {"job_id": 12345}
27 job_id = send_postcard(
28 recipient_name="Test User",
29 address_line_1="123 Main St",
30 address_line_2="Apt 4",
31 city="Berlin",
32 state=None,
33 postal_code="10717",
34 country="DE",
35 verification_code="ABC123",
36 )
38 assert job_id == 12345
39 mock_auth.assert_called_once()
40 mock_order.assert_called_once()
43def test_send_postcard_builds_recipient_correctly():
44 with (
45 patch("couchers.postal.my_postcard._place_order") as mock_order,
46 patch("couchers.postal.my_postcard._authenticate") as mock_auth,
47 patch("couchers.postal.my_postcard.get_postcard_front_image") as mock_image,
48 ):
49 mock_image.return_value = b"fake-image"
50 mock_auth.return_value = "auth-token"
51 mock_order.return_value = {"job_id": 123}
53 send_postcard(
54 recipient_name="Test User",
55 address_line_1="123 Main St",
56 address_line_2="Apt 4",
57 city="Berlin",
58 state=None,
59 postal_code="10717",
60 country="DE",
61 verification_code="ABC123",
62 )
64 recipient_arg = mock_order.call_args[0][1]
65 assert recipient_arg["recipientName"] == "Test User"
66 assert recipient_arg["addressLine1"] == "123 Main St"
67 assert recipient_arg["addressLine2"] == "Apt 4"
68 assert recipient_arg["zip"] == "10717"
69 assert recipient_arg["countryiso"] == "DE"
70 assert "state" not in recipient_arg
73def test_send_postcard_excludes_none_optional_fields():
74 with (
75 patch("couchers.postal.my_postcard._place_order") as mock_order,
76 patch("couchers.postal.my_postcard._authenticate") as mock_auth,
77 patch("couchers.postal.my_postcard.get_postcard_front_image") as mock_image,
78 ):
79 mock_image.return_value = b"fake-image"
80 mock_auth.return_value = "auth-token"
81 mock_order.return_value = {"job_id": 123}
83 send_postcard(
84 recipient_name="Test User",
85 address_line_1="123 Main St",
86 address_line_2=None,
87 city="Berlin",
88 state=None,
89 postal_code=None,
90 country="DE",
91 verification_code="ABC123",
92 )
94 recipient_arg = mock_order.call_args[0][1]
95 assert "addressLine2" not in recipient_arg
96 assert "zip" not in recipient_arg
97 assert "state" not in recipient_arg
100def test_send_postcard_auth_failure():
101 with (
102 patch("couchers.postal.my_postcard._authenticate") as mock_auth,
103 patch("couchers.postal.my_postcard.get_postcard_front_image") as mock_image,
104 ):
105 mock_image.return_value = b"fake-image"
106 mock_auth.side_effect = RequestException("Connection refused")
108 with pytest.raises(RequestException, match="Connection refused"):
109 send_postcard(
110 recipient_name="Test User",
111 address_line_1="123 Main St",
112 address_line_2=None,
113 city="Berlin",
114 state=None,
115 postal_code=None,
116 country="DE",
117 verification_code="ABC123",
118 )
121def test_send_postcard_order_failure():
122 with (
123 patch("couchers.postal.my_postcard._place_order") as mock_order,
124 patch("couchers.postal.my_postcard._authenticate") as mock_auth,
125 patch("couchers.postal.my_postcard.get_postcard_front_image") as mock_image,
126 ):
127 mock_image.return_value = b"fake-image"
128 mock_auth.return_value = "auth-token"
129 mock_order.side_effect = RequestException("500 Server Error")
131 with pytest.raises(RequestException, match="500 Server Error"):
132 send_postcard(
133 recipient_name="Test User",
134 address_line_1="123 Main St",
135 address_line_2=None,
136 city="Berlin",
137 state=None,
138 postal_code=None,
139 country="DE",
140 verification_code="ABC123",
141 )