diff --git a/e2e/agentnetwork/chat_test.go b/e2e/agentnetwork/chat_test.go index 4e49ec252..65c4d813f 100644 --- a/e2e/agentnetwork/chat_test.go +++ b/e2e/agentnetwork/chat_test.go @@ -125,17 +125,17 @@ func verifyUsageRowsSQL(t *testing.T, srv *harness.Combined) { var provider, model string var inTok, outTok, readTok, writeTok int64 var inCost, cachedInCost, cacheCreateCost, outCost, cost, cacheCost float64 - var wantIn, wantCachedIn, wantCacheCreate, wantOut, wantTotal, wantCache float64 + var wantInput, wantCachedInput, wantCacheCreation, wantOutput, wantTotal, wantCache float64 require.NoError(t, rows.Scan(&provider, &model, &inTok, &outTok, &readTok, &writeTok, &inCost, &cachedInCost, &cacheCreateCost, &outCost, &cost, &cacheCost, - &wantIn, &wantCachedIn, &wantCacheCreate, &wantOut, &wantTotal, &wantCache), "scan usage row") + &wantInput, &wantCachedInput, &wantCacheCreation, &wantOutput, &wantTotal, &wantCache), "scan usage row") t.Logf("[sql] %s/%s: in=%d out=%d cache_read=%d cache_write=%d stored in/cached/create/out=$%.6f/$%.6f/$%.6f/$%.6f total=$%.6f cache=$%.6f expected total=$%.6f cache=$%.6f", provider, model, inTok, outTok, readTok, writeTok, inCost, cachedInCost, cacheCreateCost, outCost, cost, cacheCost, wantTotal, wantCache) - assert.InDeltaf(t, wantIn, inCost, 1e-6, "stored input_cost_usd for %s/%s must match the published-rate recompute", provider, model) - assert.InDeltaf(t, wantCachedIn, cachedInCost, 1e-6, "stored cached_input_cost_usd for %s/%s must match the published-rate recompute", provider, model) - assert.InDeltaf(t, wantCacheCreate, cacheCreateCost, 1e-6, "stored cache_creation_cost_usd for %s/%s must match the published-rate recompute", provider, model) - assert.InDeltaf(t, wantOut, outCost, 1e-6, "stored output_cost_usd for %s/%s must match the published-rate recompute", provider, model) + assert.InDeltaf(t, wantInput, inCost, 1e-6, "stored input_cost_usd for %s/%s must match the published-rate recompute", provider, model) + assert.InDeltaf(t, wantCachedInput, cachedInCost, 1e-6, "stored cached_input_cost_usd for %s/%s must match the published-rate recompute", provider, model) + assert.InDeltaf(t, wantCacheCreation, cacheCreateCost, 1e-6, "stored cache_creation_cost_usd for %s/%s must match the published-rate recompute", provider, model) + assert.InDeltaf(t, wantOutput, outCost, 1e-6, "stored output_cost_usd for %s/%s must match the published-rate recompute", provider, model) assert.InDeltaf(t, wantTotal, cost, 1e-6, "derived cost_usd for %s/%s must match the published-rate recompute", provider, model) assert.InDeltaf(t, wantCache, cacheCost, 1e-6, "derived cache_cost_usd for %s/%s must match the published-rate recompute", provider, model) assert.InDeltaf(t, inCost+cachedInCost+cacheCreateCost+outCost, cost, 1e-9, diff --git a/management/internals/modules/agentnetwork/types/cost_test.go b/management/internals/modules/agentnetwork/types/cost_test.go index 51268c686..9194ef4a3 100644 --- a/management/internals/modules/agentnetwork/types/cost_test.go +++ b/management/internals/modules/agentnetwork/types/cost_test.go @@ -55,19 +55,19 @@ func TestSessionSummary_SumsMatchSummedEntries(t *testing.T) { require.Len(t, sessions, 1) sess := sessions[0].ToAPIResponse() - var wantIn, wantCachedIn, wantCacheCreate, wantOut float64 + var wantInput, wantCachedInput, wantCacheCreation, wantOutput float64 for _, e := range entries { - wantIn += e.InputCostUSD - wantCachedIn += e.CachedInputCostUSD - wantCacheCreate += e.CacheCreationCostUSD - wantOut += e.OutputCostUSD + wantInput += e.InputCostUSD + wantCachedInput += e.CachedInputCostUSD + wantCacheCreation += e.CacheCreationCostUSD + wantOutput += e.OutputCostUSD } - assert.InDelta(t, wantIn, sess.InputCostUsd, 1e-12, "session input cost is the sum of its entries") - assert.InDelta(t, wantCachedIn, sess.CachedInputCostUsd, 1e-12, "session cache-read cost is the sum of its entries") - assert.InDelta(t, wantCacheCreate, sess.CacheCreationCostUsd, 1e-12, "session cache-write cost is the sum of its entries") - assert.InDelta(t, wantOut, sess.OutputCostUsd, 1e-12, "session output cost is the sum of its entries") - assert.InDelta(t, wantIn+wantCachedIn+wantCacheCreate+wantOut, sess.CostUsd, 1e-12, + assert.InDelta(t, wantInput, sess.InputCostUsd, 1e-12, "session input cost is the sum of its entries") + assert.InDelta(t, wantCachedInput, sess.CachedInputCostUsd, 1e-12, "session cache-read cost is the sum of its entries") + assert.InDelta(t, wantCacheCreation, sess.CacheCreationCostUsd, 1e-12, "session cache-write cost is the sum of its entries") + assert.InDelta(t, wantOutput, sess.OutputCostUsd, 1e-12, "session output cost is the sum of its entries") + assert.InDelta(t, wantInput+wantCachedInput+wantCacheCreation+wantOutput, sess.CostUsd, 1e-12, "session total equals the summed entry buckets") // Summing the rendered entries must give the same answer as reading the diff --git a/management/server/migration/migration_test.go b/management/server/migration/migration_test.go index 65f62798b..b60a50ee1 100644 --- a/management/server/migration/migration_test.go +++ b/management/server/migration/migration_test.go @@ -717,8 +717,11 @@ func TestFoldCostAggregatesIntoBuckets_SkipsAlreadyMigrated(t *testing.T) { require.NoError(t, db.Migrator().DropTable(&agentNetworkTypes.AgentNetworkUsage{})) require.NoError(t, db.AutoMigrate(&agentNetworkTypes.AgentNetworkUsage{})) + // Timestamp must be set explicitly: a zero time.Time serialises as + // '0000-00-00 00:00:00', which MySQL rejects under strict mode. require.NoError(t, db.Create(&agentNetworkTypes.AgentNetworkUsage{ ID: "u1", AccountID: "acct-1", Model: "claude-sonnet-4-6", + Timestamp: time.Date(2026, 5, 5, 9, 0, 0, 0, time.UTC), InputCostUSD: 0.001, CachedInputCostUSD: 0.002, CacheCreationCostUSD: 0.003, OutputCostUSD: 0.004, }).Error)