2222# helpers
2323# ---------------------------------------------------------------------------
2424
25+
2526def _make_uow (
2627 * ,
2728 machine_by_status = None ,
@@ -65,8 +66,9 @@ def _make_list_requests_orchestrator(requests=None):
6566 return orch
6667
6768
68- def _make_orchestrator (* , machine_by_status = None , request_by_status = None ,
69- provider_api_counts = None , requests = None ):
69+ def _make_orchestrator (
70+ * , machine_by_status = None , request_by_status = None , provider_api_counts = None , requests = None
71+ ):
7072 uow = _make_uow (
7173 machine_by_status = machine_by_status ,
7274 request_by_status = request_by_status ,
@@ -86,6 +88,7 @@ def _make_orchestrator(*, machine_by_status=None, request_by_status=None,
8688# _to_iso helper
8789# ---------------------------------------------------------------------------
8890
91+
8992@pytest .mark .unit
9093class TestToIso :
9194 def test_none_returns_none (self ):
@@ -116,10 +119,10 @@ def test_other_type_coerced_to_str(self):
116119# DashboardSummaryOrchestrator.execute
117120# ---------------------------------------------------------------------------
118121
122+
119123@pytest .mark .unit
120124@pytest .mark .application
121125class TestDashboardSummaryOrchestrator :
122-
123126 @pytest .mark .asyncio
124127 async def test_happy_path_aggregates_all_sections (self ):
125128 """All three sections must be populated from the UoW repos."""
@@ -169,8 +172,14 @@ async def test_well_known_keys_present_even_when_count_is_zero(self):
169172 for key in ("running" , "pending" , "stopped" , "terminated" , "shutting-down" ):
170173 assert key in result .machines ["by_status" ]
171174 for key in (
172- "pending" , "in_progress" , "acquiring" , "complete" ,
173- "failed" , "partial" , "cancelled" , "timeout" ,
175+ "pending" ,
176+ "in_progress" ,
177+ "acquiring" ,
178+ "complete" ,
179+ "failed" ,
180+ "partial" ,
181+ "cancelled" ,
182+ "timeout" ,
174183 ):
175184 assert key in result .requests ["by_status" ]
176185 for key in ("aws" , "EC2Fleet" , "SpotFleet" , "RunInstances" , "ASG" ):
@@ -211,10 +220,24 @@ async def test_recent_activity_capped_at_10(self):
211220 async def test_recent_activity_sorted_by_created_at_desc (self ):
212221 """Most recently created requests appear first."""
213222 requests = [
214- {"request_id" : "old" , "created_at" : "2024-01-01T00:00:00+00:00" , "status" : "complete" ,
215- "request_type" : "acquire" , "template_id" : "" , "successful_count" : 0 , "requested_count" : 0 },
216- {"request_id" : "new" , "created_at" : "2024-06-01T00:00:00+00:00" , "status" : "complete" ,
217- "request_type" : "acquire" , "template_id" : "" , "successful_count" : 0 , "requested_count" : 0 },
223+ {
224+ "request_id" : "old" ,
225+ "created_at" : "2024-01-01T00:00:00+00:00" ,
226+ "status" : "complete" ,
227+ "request_type" : "acquire" ,
228+ "template_id" : "" ,
229+ "successful_count" : 0 ,
230+ "requested_count" : 0 ,
231+ },
232+ {
233+ "request_id" : "new" ,
234+ "created_at" : "2024-06-01T00:00:00+00:00" ,
235+ "status" : "complete" ,
236+ "request_type" : "acquire" ,
237+ "template_id" : "" ,
238+ "successful_count" : 0 ,
239+ "requested_count" : 0 ,
240+ },
218241 ]
219242 orchestrator = _make_orchestrator (requests = requests )
220243 result = await orchestrator .execute (DashboardSummaryInput ())
@@ -225,12 +248,23 @@ async def test_recent_activity_sorted_by_created_at_desc(self):
225248 async def test_recent_activity_missing_created_at_lands_at_end (self ):
226249 """Rows without created_at must sort to the end (after dated rows)."""
227250 requests = [
228- {"request_id" : "has-date" , "created_at" : "2024-03-01T00:00:00+00:00" ,
229- "status" : "complete" , "request_type" : "acquire" , "template_id" : "" ,
230- "successful_count" : 0 , "requested_count" : 0 },
231- {"request_id" : "no-date" , "status" : "pending" ,
232- "request_type" : "acquire" , "template_id" : "" ,
233- "successful_count" : 0 , "requested_count" : 0 },
251+ {
252+ "request_id" : "has-date" ,
253+ "created_at" : "2024-03-01T00:00:00+00:00" ,
254+ "status" : "complete" ,
255+ "request_type" : "acquire" ,
256+ "template_id" : "" ,
257+ "successful_count" : 0 ,
258+ "requested_count" : 0 ,
259+ },
260+ {
261+ "request_id" : "no-date" ,
262+ "status" : "pending" ,
263+ "request_type" : "acquire" ,
264+ "template_id" : "" ,
265+ "successful_count" : 0 ,
266+ "requested_count" : 0 ,
267+ },
234268 ]
235269 orchestrator = _make_orchestrator (requests = requests )
236270 result = await orchestrator .execute (DashboardSummaryInput ())
@@ -303,9 +337,7 @@ async def test_count_by_status_called_on_machines_and_requests_repos(self):
303337 @pytest .mark .asyncio
304338 async def test_count_by_provider_api_returns_real_values (self ):
305339 """count_by_provider_api values flow into templates section."""
306- orchestrator = _make_orchestrator (
307- provider_api_counts = {"EC2Fleet" : 7 , "RunInstances" : 3 }
308- )
340+ orchestrator = _make_orchestrator (provider_api_counts = {"EC2Fleet" : 7 , "RunInstances" : 3 })
309341 result = await orchestrator .execute (DashboardSummaryInput ())
310342 assert result .templates ["by_provider_api" ]["EC2Fleet" ] == 7
311343 assert result .templates ["by_provider_api" ]["RunInstances" ] == 3
@@ -315,8 +347,14 @@ async def test_count_by_provider_api_returns_real_values(self):
315347 async def test_request_id_fallback_to_id_field (self ):
316348 """If 'request_id' absent, 'id' is used instead."""
317349 requests = [
318- {"id" : "fallback-id" , "status" : "pending" , "request_type" : "acquire" ,
319- "template_id" : "" , "successful_count" : 0 , "requested_count" : 0 }
350+ {
351+ "id" : "fallback-id" ,
352+ "status" : "pending" ,
353+ "request_type" : "acquire" ,
354+ "template_id" : "" ,
355+ "successful_count" : 0 ,
356+ "requested_count" : 0 ,
357+ }
320358 ]
321359 orchestrator = _make_orchestrator (requests = requests )
322360 result = await orchestrator .execute (DashboardSummaryInput ())
0 commit comments