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

1from unittest.mock import patch 

2 

3import pytest 

4from requests import RequestException 

5 

6from couchers.postal.my_postcard import send_postcard 

7from couchers.resources import get_postcard_front_image 

8 

9 

10@pytest.fixture(autouse=True) 

11def _(testconfig): 

12 pass 

13 

14 

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" 

20 

21 

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} 

31 

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 ) 

42 

43 assert job_id == 12345 

44 mock_auth.assert_called_once() 

45 mock_order.assert_called_once() 

46 

47 

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} 

57 

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 ) 

68 

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 

76 

77 

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} 

87 

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 ) 

98 

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 

103 

104 

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") 

112 

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 ) 

124 

125 

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") 

135 

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 )