(t *testing.T)
| 815 | } |
| 816 | |
| 817 | func TestComputeRunMetricsDiff_WithTokenUsageDetails(t *testing.T) { |
| 818 | summary1 := &RunSummary{ |
| 819 | RunID: 100, |
| 820 | Run: WorkflowRun{Duration: 5 * time.Minute, Turns: 4}, |
| 821 | TokenUsage: &TokenUsageSummary{ |
| 822 | TotalInputTokens: 8000, |
| 823 | TotalOutputTokens: 1500, |
| 824 | TotalAIC: 0.6, |
| 825 | TotalRequests: 8, |
| 826 | CacheEfficiency: 0.25, |
| 827 | }, |
| 828 | } |
| 829 | summary2 := &RunSummary{ |
| 830 | RunID: 200, |
| 831 | Run: WorkflowRun{Duration: 7 * time.Minute, Turns: 6}, |
| 832 | TokenUsage: &TokenUsageSummary{ |
| 833 | TotalInputTokens: 12000, |
| 834 | TotalOutputTokens: 2000, |
| 835 | TotalAIC: 0.9, |
| 836 | TotalRequests: 11, |
| 837 | CacheEfficiency: 0.30, |
| 838 | }, |
| 839 | } |
| 840 | |
| 841 | diff := computeRunMetricsDiff(summary1, summary2) |
| 842 | |
| 843 | require.NotNil(t, diff, "Should produce metrics diff") |
| 844 | require.NotNil(t, diff.TokenUsageDetails, "Should populate TokenUsageDetails from RunSummary.TokenUsage") |
| 845 | |
| 846 | assert.Equal(t, 8000, diff.TokenUsageDetails.Run1InputTokens, "Run1 input tokens should be 8000") |
| 847 | assert.Equal(t, 12000, diff.TokenUsageDetails.Run2InputTokens, "Run2 input tokens should be 12000") |
| 848 | assert.Equal(t, "+50%", diff.TokenUsageDetails.InputTokensChange, "Input tokens change should be +50%") |
| 849 | |
| 850 | assert.InDelta(t, 0.6, diff.TokenUsageDetails.Run1AIC, 1e-9, "Run1 AI Credits should be 0.6") |
| 851 | assert.InDelta(t, 0.9, diff.TokenUsageDetails.Run2AIC, 1e-9, "Run2 AI Credits should be 0.9") |
| 852 | assert.Equal(t, "+0.300", diff.TokenUsageDetails.AICChange, "AI Credits delta should be +0.300") |
| 853 | } |
| 854 | |
| 855 | func TestComputeRunMetricsDiff_TokenUsageDetailsAloneNotNil(t *testing.T) { |
| 856 | // Verify that detailed token usage data alone (without Run.TokenUsage set) |
nothing calls this directly
no test coverage detected