84 lines
2.5 KiB
Go
84 lines
2.5 KiB
Go
|
|
package service
|
||
|
|
|
||
|
|
import (
|
||
|
|
"database/sql"
|
||
|
|
"encoding/json"
|
||
|
|
"testing"
|
||
|
|
|
||
|
|
"github.com/seifghazi/claude-code-monitor/internal/model"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestApplyStoredResponseToSummary(t *testing.T) {
|
||
|
|
t.Parallel()
|
||
|
|
|
||
|
|
summary := &model.RequestSummary{}
|
||
|
|
applyStoredResponseToSummary(summary, sql.NullString{
|
||
|
|
Valid: true,
|
||
|
|
String: `{"statusCode":201,"responseTime":42,"body":{"usage":{"input_tokens":10,"output_tokens":5},"stop_reason":"end_turn"}}`,
|
||
|
|
})
|
||
|
|
|
||
|
|
if summary.StatusCode != 201 {
|
||
|
|
t.Fatalf("expected status code 201, got %d", summary.StatusCode)
|
||
|
|
}
|
||
|
|
if summary.ResponseTime != 42 {
|
||
|
|
t.Fatalf("expected response time 42, got %d", summary.ResponseTime)
|
||
|
|
}
|
||
|
|
if summary.Usage == nil || summary.Usage.InputTokens != 10 || summary.Usage.OutputTokens != 5 {
|
||
|
|
t.Fatalf("expected usage decoded, got %#v", summary.Usage)
|
||
|
|
}
|
||
|
|
if summary.StopReason != "end_turn" {
|
||
|
|
t.Fatalf("expected stop reason end_turn, got %q", summary.StopReason)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestApplyStoredResponseToSummaryIgnoresInvalidPayload(t *testing.T) {
|
||
|
|
t.Parallel()
|
||
|
|
|
||
|
|
summary := &model.RequestSummary{}
|
||
|
|
applyStoredResponseToSummary(summary, sql.NullString{Valid: true, String: `{not-json`})
|
||
|
|
|
||
|
|
if summary.StatusCode != 0 || summary.ResponseTime != 0 || summary.Usage != nil || summary.StopReason != "" {
|
||
|
|
t.Fatalf("expected invalid payload ignored, got %#v", summary)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestDecodeResponseBodySummary(t *testing.T) {
|
||
|
|
t.Parallel()
|
||
|
|
|
||
|
|
body, _ := json.Marshal(map[string]interface{}{
|
||
|
|
"usage": map[string]interface{}{
|
||
|
|
"input_tokens": 7,
|
||
|
|
"output_tokens": 3,
|
||
|
|
"cache_read_input_tokens": 2,
|
||
|
|
"cache_creation_input_tokens": 1,
|
||
|
|
},
|
||
|
|
"stop_reason": "tool_use",
|
||
|
|
})
|
||
|
|
|
||
|
|
summary, ok := decodeResponseBodySummary(body)
|
||
|
|
if !ok {
|
||
|
|
t.Fatal("expected response body summary to decode")
|
||
|
|
}
|
||
|
|
if total := totalTokensFromUsage(summary.Usage); total != 13 {
|
||
|
|
t.Fatalf("expected total tokens 13, got %d", total)
|
||
|
|
}
|
||
|
|
if summary.StopReason != "tool_use" {
|
||
|
|
t.Fatalf("expected stop reason tool_use, got %q", summary.StopReason)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestUsageCountsFromStoredResponse(t *testing.T) {
|
||
|
|
t.Parallel()
|
||
|
|
|
||
|
|
input, output, cache, ok := usageCountsFromStoredResponse(sql.NullString{
|
||
|
|
Valid: true,
|
||
|
|
String: `{"body":{"usage":{"input_tokens":7,"output_tokens":3,"cache_read_input_tokens":2,"cache_creation_input_tokens":1}}}`,
|
||
|
|
})
|
||
|
|
if !ok {
|
||
|
|
t.Fatal("expected usage counts to decode")
|
||
|
|
}
|
||
|
|
if input != 7 || output != 3 || cache != 3 {
|
||
|
|
t.Fatalf("unexpected usage counts: input=%d output=%d cache=%d", input, output, cache)
|
||
|
|
}
|
||
|
|
}
|