Files
odidere/internal/service/service_test.go
2026-06-27 00:13:16 +00:00

110 lines
2.5 KiB
Go

package service
import (
"encoding/json"
"net/http"
"net/http/httptest"
"strings"
"testing"
"code.chimeric.al/chimerical/odidere/internal/llm"
)
func TestStatusHandler(t *testing.T) {
svc := &Service{}
req := httptest.NewRequest(http.MethodGet, "/status", nil)
w := httptest.NewRecorder()
svc.status(w, req)
if w.Code != http.StatusOK {
t.Errorf(
"status handler returned %d, want %d",
w.Code,
http.StatusOK,
)
}
}
func TestResponseIncludesStatsInJSON(t *testing.T) {
resp := Response{
Messages: []llm.Message{
{Role: llm.RoleAssistant, ContentParts: []llm.ContentPart{{
Type: llm.ContentTypeText,
Text: "hello",
}}},
},
Provider: "test-provider",
Model: "test-model",
Usage: &llm.Usage{
PromptTokens: 10,
CompletionTokens: 5,
TotalTokens: 15,
PromptTokensDetails: &llm.TokenDetails{
CachedTokens: 3,
},
CompletionTokensDetails: &llm.TokenDetails{
ReasoningTokens: 2,
},
},
Timings: &llm.Timings{
PromptMS: 50.5,
PromptPerSecond: 198.0,
PredictedMS: 100.0,
PredictedPerSecond: 50.0,
},
}
// Verify JSON encoding includes stats fields
var buf strings.Builder
enc := json.NewEncoder(&buf)
if err := enc.Encode(resp); err != nil {
t.Fatalf("encode Response: %v", err)
}
jsonStr := buf.String()
if !strings.Contains(jsonStr, `"prompt_tokens":10`) {
t.Errorf("JSON missing prompt_tokens: %s", jsonStr)
}
if !strings.Contains(jsonStr, `"completion_tokens":5`) {
t.Errorf("JSON missing completion_tokens: %s", jsonStr)
}
if !strings.Contains(jsonStr, `"total_tokens":15`) {
t.Errorf("JSON missing total_tokens: %s", jsonStr)
}
if !strings.Contains(jsonStr, `"prompt_ms":50.5`) {
t.Errorf("JSON missing prompt_ms: %s", jsonStr)
}
if !strings.Contains(jsonStr, `"predicted_ms":100`) {
t.Errorf("JSON missing predicted_ms: %s", jsonStr)
}
}
func TestStreamMessageIncludesUsageInJSON(t *testing.T) {
msg := StreamMessage{
Delta: "hello",
Provider: "test-provider",
Model: "test-model",
Usage: &llm.Usage{
PromptTokens: 10,
CompletionTokens: 5,
TotalTokens: 15,
},
}
var buf strings.Builder
enc := json.NewEncoder(&buf)
if err := enc.Encode(msg); err != nil {
t.Fatalf("encode StreamMessage: %v", err)
}
jsonStr := buf.String()
if !strings.Contains(jsonStr, `"prompt_tokens":10`) {
t.Errorf("JSON missing prompt_tokens: %s", jsonStr)
}
if !strings.Contains(jsonStr, `"total_tokens":15`) {
t.Errorf("JSON missing total_tokens: %s", jsonStr)
}
}