@@ -289,6 +289,37 @@ def test_get_cache_info_unavailable(self, mock_get_redis_cache):
289289 assert result ["available" ] is False
290290 assert "error" in result
291291
292+ @patch ("gefapi.services.stats_service.db" )
293+ def test_execution_time_series_quarter_hour_bucket (self , mock_db ):
294+ """Quarter-hour grouping should return 15 minute buckets."""
295+ query_mock = MagicMock ()
296+ mock_db .session .query .return_value = query_mock
297+
298+ query_mock .join .return_value = query_mock
299+ query_mock .filter .return_value = query_mock
300+ query_mock .group_by .return_value = query_mock
301+ query_mock .all .return_value = [
302+ SimpleNamespace (
303+ timestamp = datetime (2025 , 1 , 1 , 10 , 15 , 0 ),
304+ total = 3 ,
305+ status = "FINISHED" ,
306+ slug = "productivity-v2.0.0" ,
307+ )
308+ ]
309+
310+ result = StatsService ._get_execution_time_series (
311+ "last_day" , "quarter_hour" , None , None
312+ )
313+
314+ assert result == [
315+ {
316+ "timestamp" : "2025-01-01T10:15:00" ,
317+ "total" : 3 ,
318+ "by_status" : {"FINISHED" : 3 },
319+ "by_task" : {"productivity" : 3 },
320+ }
321+ ]
322+
292323 @patch ("gefapi.services.stats_service.db" )
293324 def test_execution_time_series_aggregates_totals (self , mock_db ):
294325 """Total counts should reflect aggregated values from the query."""
0 commit comments