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

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 

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" 

15 

16 

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} 

26 

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 ) 

37 

38 assert job_id == 12345 

39 mock_auth.assert_called_once() 

40 mock_order.assert_called_once() 

41 

42 

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} 

52 

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 ) 

63 

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 

71 

72 

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} 

82 

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 ) 

93 

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 

98 

99 

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

107 

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 ) 

119 

120 

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

130 

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 )