@@ -28,128 +28,33 @@ def _fake_response(status_code: int, payload: dict | list) -> requests.Response:
28
28
return resp
29
29
30
30
31
- @patch ("core.utils.controller.client.get_http_session" )
32
- def test_post_success (mock_get_http_session ):
33
- session = MagicMock ()
34
- session .post .return_value = _fake_response (201 , {"id" : 99 })
35
- mock_get_http_session .return_value = session
36
-
37
- assert cc .post (session , "/labels/" , {"name" : "foo" }) == {"id" : 99 }
38
- session .post .assert_called_once ()
39
-
40
-
41
- @patch ("core.utils.controller.client.get_http_session" )
42
- def test_post_duplicate_name (mock_get_http_session ):
43
- session = MagicMock ()
44
- session .post .return_value = _fake_response (400 , {"error" : "duplicate" })
45
- session .get .return_value = _fake_response (
46
- 200 , {"results" : [{"id" : 42 , "name" : "foo" }]}
47
- )
48
- mock_get_http_session .return_value = session
49
-
50
- out = cc .post (session , "/labels/" , {"name" : "foo" })
51
- assert out == {"id" : 42 , "name" : "foo" }
52
-
53
- session .get .assert_called_once ()
54
- session .post .assert_called_once ()
55
-
56
-
57
31
@patch ("core.utils.controller.client.get_http_session" )
58
32
def test_post_non_400_error_is_propagated (mock_get_http_session ):
33
+ """
34
+ Test that a non-400 error is also immediately propagated.
35
+ """
59
36
session = MagicMock ()
60
37
session .post .return_value = _fake_response (500 , {"error" : "server" })
61
38
mock_get_http_session .return_value = session
62
39
63
40
with pytest .raises (requests .HTTPError ):
64
41
cc .post (session , "/labels/" , {"name" : "foo" })
65
42
66
- # Ensure we don't try to deduplicate
67
43
session .get .assert_not_called ()
44
+ session .post .assert_called_once ()
68
45
69
46
70
47
@patch ("core.utils.controller.client.get_http_session" )
71
- def test_post_400_dedupe_no_results_raises (mock_get_http_session ):
72
- session = MagicMock ()
73
- post_resp = _fake_response (400 , {"detail" : "duplicate" })
74
- session .post .return_value = post_resp
75
- session .get .return_value = _fake_response (200 , {"results" : []})
76
- mock_get_http_session .return_value = session
77
-
78
- with pytest .raises (requests .HTTPError ) as exc :
79
- cc .post (session , "/labels/" , {"name" : "foo" , "organization" : 1 })
80
-
81
- assert isinstance (exc .value , requests .HTTPError )
82
- assert exc .value .response .status_code == 400
83
- session .get .assert_called_once ()
84
- # Ensure params include both default dedupe keys
85
- _ , kwargs = session .get .call_args
86
- assert kwargs ["params" ] == {"name" : "foo" , "organization" : 1 }
87
-
88
-
89
- @patch ("core.utils.controller.client.get_http_session" )
90
- def test_post_400_dedupe_lookup_http_error_still_raises (mock_get_http_session ):
91
- session = MagicMock ()
92
- session .post .return_value = _fake_response (400 , {"detail" : "duplicate" })
93
- # Lookup GET itself errors (e.g., 404)
94
- session .get .return_value = _fake_response (404 , {"detail" : "not found" })
95
- mock_get_http_session .return_value = session
96
-
97
- with pytest .raises (requests .HTTPError ):
98
- cc .post (session , "/labels/" , {"name" : "foo" })
99
-
100
- session .get .assert_called_once ()
101
-
102
-
103
- @patch ("core.utils.controller.client.get_http_session" )
104
- def test_post_400_dedupe_params_subset_when_missing_org (mock_get_http_session ):
105
- session = MagicMock ()
106
- session .post .return_value = _fake_response (400 , {"detail" : "duplicate" })
107
- session .get .return_value = _fake_response (200 , {"results" : []})
108
- mock_get_http_session .return_value = session
109
-
110
- with pytest .raises (requests .HTTPError ):
111
- cc .post (session , "/labels/" , {"name" : "foo" })
112
-
113
- # Only 'name' present in params, no 'organization' since it wasn’t provided
114
- _ , kwargs = session .get .call_args
115
- assert kwargs ["params" ] == {"name" : "foo" }
116
-
117
-
118
- @patch ("core.utils.controller.client.get_http_session" )
119
- def test_post_400_with_custom_dedupe_keys (mock_get_http_session ):
120
- session = MagicMock ()
121
- session .post .return_value = _fake_response (400 , {"detail" : "duplicate" })
122
- session .get .return_value = _fake_response (200 , {"results" : []})
123
- mock_get_http_session .return_value = session
124
-
125
- with pytest .raises (requests .HTTPError ):
126
- cc .post (
127
- session ,
128
- "/labels/" ,
129
- {"name" : "foo" , "organization" : 1 , "extra" : "x" },
130
- dedupe_keys = ("name" , "extra" ),
131
- )
132
-
133
- # Only custom keys should be used
134
- _ , kwargs = session .get .call_args
135
- assert kwargs ["params" ] == {"name" : "foo" , "extra" : "x" }
136
-
137
-
138
- @patch ("core.utils.controller.client.get_http_session" )
139
- def test_post_400_error_json_fallback_to_text (mock_get_http_session ):
48
+ def test_post_success (mock_get_http_session ):
49
+ """
50
+ Test that a successful POST request returns the JSON response.
51
+ """
140
52
session = MagicMock ()
141
- # Create a response whose .json() raises, forcing fallback to .text
142
- resp = MagicMock (spec = requests .Response )
143
- resp .status_code = 400
144
- resp .text = "not json"
145
- resp .json .side_effect = Exception ("bad json" )
146
- resp .raise_for_status .side_effect = requests .HTTPError (response = resp )
147
- session .post .return_value = resp
148
- session .get .return_value = _fake_response (200 , {"results" : []})
53
+ session .post .return_value = _fake_response (201 , {"id" : 123 , "name" : "foo" })
149
54
mock_get_http_session .return_value = session
150
55
151
- with pytest . raises ( requests . HTTPError ) as exc :
152
- cc . post ( session , "/labels/" , { "name" : "foo" })
56
+ out = cc . post ( session , "/labels/" , { "name" : "foo" })
57
+ assert out == { "id" : 123 , "name" : "foo" }
153
58
154
- # Error message should include the fallback text
155
- assert "not json" in str ( exc . value )
59
+ session . get . assert_not_called ()
60
+ session . post . assert_called_once ( )
0 commit comments