@@ -113,19 +113,51 @@ def test_generated_idempotency_key_only_on_header_replay_mutations(self) -> None
113113 {"status" : 201 , "body" : {}},
114114 {"status" : 201 , "body" : {}},
115115 {"status" : 201 , "body" : {}},
116+ {"status" : 201 , "body" : {}},
116117 {"status" : 200 , "body" : {}},
117118 ])
118119 sdk .events .list ()
119120 sdk .events .create (chart_id = "c_1" )
120121 sdk .charts .create (name = "Arena" )
121122 sdk .charts .copy ("c_1" )
122123 sdk .workspaces .create (name = "Promoter" )
124+ sdk .templates .instantiate_template ("tpl_1" )
123125 sdk .inventory .hold ("ev_1" , labels = ["A-1" ])
124126
125127 assert calls [0 ].get_header ("Idempotency-key" ) is None
126- for call in calls [1 :5 ]:
128+ for call in calls [1 :6 ]:
127129 assert call .get_header ("Idempotency-key" )
128- assert calls [5 ].get_header ("Idempotency-key" ) is None
130+ assert calls [6 ].get_header ("Idempotency-key" ) is None
131+
132+ def test_template_and_ticket_release_wire_contracts (self ) -> None :
133+ sdk , calls = make_client ([
134+ {"status" : 201 , "body" : {"meta" : {"id" : "c_1" }}},
135+ {"status" : 200 , "body" : {"releases" : []}},
136+ {"status" : 200 , "body" : {"releases" : []}},
137+ {"status" : 200 , "body" : {"releases" : []}},
138+ ])
139+
140+ sdk .templates .instantiate_template ("tpl/a" )
141+ sdk .events .list_ticket_releases ("ev/a" )
142+ sdk .events .update_ticket_releases (
143+ "ev/a" ,
144+ [{"name" : "Early" , "price" : 2500 , "action" : "buy" }],
145+ )
146+ sdk .events .close_ticket_release ("ev/a" , "rel/a" )
147+
148+ assert calls [0 ].full_url .endswith ("/v1/templates/tpl%2Fa/instantiate" )
149+ assert json .loads (calls [0 ].data ) == {}
150+ assert calls [0 ].get_header ("Idempotency-key" )
151+ assert calls [1 ].method == "GET"
152+ assert calls [1 ].full_url .endswith ("/v1/events/ev%2Fa/releases" )
153+ assert calls [2 ].method == "PUT"
154+ assert json .loads (calls [2 ].data ) == {
155+ "releases" : [{"name" : "Early" , "price" : 2500 , "action" : "buy" }]
156+ }
157+ assert calls [2 ].get_header ("Idempotency-key" ) is None
158+ assert calls [3 ].method == "POST"
159+ assert calls [3 ].full_url .endswith ("/v1/events/ev%2Fa/releases/rel%2Fa/close" )
160+ assert calls [3 ].get_header ("Idempotency-key" ) is None
129161
130162 def test_honours_caller_supplied_idempotency_key (self ) -> None :
131163 sdk , calls = make_client ([{"status" : 201 , "body" : {}}])
@@ -242,6 +274,26 @@ def test_retries_429_and_reuses_idempotency_key(self) -> None:
242274 # Same key on the retry, or the server would create two events.
243275 assert calls [0 ].get_header ("Idempotency-key" ) == calls [1 ].get_header ("Idempotency-key" )
244276
277+ def test_template_instantiate_retries_but_release_mutations_do_not (self ) -> None :
278+ template , template_calls = make_client ([
279+ {"status" : 503 , "body" : {"error" : "unavailable" }},
280+ {"status" : 201 , "body" : {"meta" : {"id" : "c_1" }}},
281+ ])
282+ template .templates .instantiate_template ("tpl_1" )
283+ assert len (template_calls ) == 2
284+ assert template_calls [0 ].get_header ("Idempotency-key" ) == template_calls [1 ].get_header (
285+ "Idempotency-key"
286+ )
287+
288+ releases , release_calls = make_client ([
289+ {"status" : 503 , "body" : {"error" : "unavailable" }},
290+ ])
291+ with pytest .raises (SeatLayerError ):
292+ releases .events .update_ticket_releases (
293+ "ev_1" , [{"name" : "Early" , "price" : 2500 }]
294+ )
295+ assert len (release_calls ) == 1
296+
245297 def test_booking_mutations_are_single_attempt_even_with_a_supplied_key (self ) -> None :
246298 sdk , calls = make_client ([
247299 {"status" : 500 , "body" : {"error" : "internal" }},
0 commit comments