@@ -331,6 +331,50 @@ struct CostUsageScannerPriorityTests {
331331 #expect( breakdown. priorityTokens == 110 )
332332 }
333333
334+ @Test
335+ func `codex daily report totals use complet ed model priority cost`() throws {
336+ let env = try CostUsageTestEnvironment ( )
337+ defer { env. cleanup ( ) }
338+
339+ let day = try env. makeLocalNoon ( year: 2026 , month: 5 , day: 10 )
340+ let iso0 = env. isoString ( for: day)
341+ let iso1 = env. isoString ( for: day. addingTimeInterval ( 1 ) )
342+ let entries : [ [ String : Any ] ] = [
343+ [ " type " : " turn_context " , " timestamp " : iso0, " payload " : [ " model " : " gpt-5.4 " ] ] ,
344+ [ " type " : " event_msg " , " timestamp " : iso1, " payload " : [ " type " : " task_started " , " turn_id " : " priority-turn " ] ] ,
345+ self . tokenCount ( timestamp: iso1, input: 100 , cached: 20 , output: 10 ) ,
346+ ]
347+ _ = try env. writeCodexSessionFile ( day: day, filename: " session.jsonl " , contents: env. jsonl ( entries) )
348+
349+ let dbURL = env. root. appendingPathComponent ( " logs_2.sqlite " )
350+ try CostUsageScannerCodexPriorityTests . createTestLogsDatabase ( at: dbURL)
351+ try self . insertPriorityTrace ( dbURL: dbURL, timestamp: iso1, model: " gpt-5.4 " )
352+ try CostUsageScannerCodexPriorityTests . insertTestLog (
353+ dbURL: dbURL,
354+ timestamp: iso1,
355+ body: " thread_id=thread turn.id=priority-turn websocket event: "
356+ + #"{"type":"response.completed","response":{"model":"gpt-5.5"}}"# )
357+
358+ var options = CostUsageScanner . Options (
359+ codexSessionsRoot: env. codexSessionsRoot,
360+ cacheRoot: env. cacheRoot,
361+ codexTraceDatabaseURL: dbURL)
362+ options. refreshMinIntervalSeconds = 0
363+
364+ let report = CostUsageScanner . loadDailyReport (
365+ provider: . codex,
366+ since: day,
367+ until: day,
368+ now: day,
369+ options: options)
370+ let priorityCost = ( 80.0 * 1.25e-5 ) + ( 20.0 * 1.25e-6 ) + ( 10.0 * 7.5e-5 )
371+
372+ #expect( report. summary? . totalCostUSD == priorityCost)
373+ let breakdown = try #require( report. data. first? . modelBreakdowns? . first)
374+ #expect( breakdown. costUSD == priorityCost)
375+ #expect( breakdown. priorityCostUSD == priorityCost)
376+ }
377+
334378 @Test
335379 func `codex daily report reprices cached priority alias when complet ed model arrives`() throws {
336380 let env = try CostUsageTestEnvironment ( )
0 commit comments