test: added live openai tests

This commit is contained in:
Hayden Hargreaves 2026-04-09 12:15:32 -07:00
parent 9dafd16646
commit 457f1a9481
2 changed files with 79 additions and 1 deletions

View File

@ -1341,6 +1341,7 @@ _Document results here as tests are completed_
| 2.3.x | ✅ PASSED | 2026-04-07 | OpenCode | 2-minute timeout behavior and network failure handling validated |
| 2.4.x | ✅ PASSED | 2026-04-07 | OpenCode | JSON parsing success/failure/empty choices/missing fields covered |
| 2.5.x | ✅ PASSED | 2026-04-07 | OpenCode | Upstream 500/429 and malformed content error handling validated |
| 2.x live consistency | ⏭️ READY (manual run) | 2026-04-07 | OpenCode | Added opt-in live test `TestCallLLM_Live_ScoreConsistencyPlusMinus10` gated by `RUN_LIVE_OPENAI_TESTS=1` |
| 3.1.x | ✅ PASSED | 2026-04-07 | OpenCode | Overall score range and consistency scenarios covered with deterministic mocks |
| 3.2.x | ✅ PASSED | 2026-04-07 | OpenCode | Criteria population, score bounds, evidence/comments presence verified |
| 3.3.x | ✅ PASSED | 2026-04-07 | OpenCode | Strengths/weaknesses/missing information structure checks validated |
@ -1397,7 +1398,7 @@ _Document any test failures here with details_
**Next Steps:**
1. Add CI step to run `go test ./...` before image build/push
2. Tighten manual validation notes for production-like OpenAI calls
2. Run opt-in live consistency test (`RUN_LIVE_OPENAI_TESTS=1`) and log observed score distribution
3. Backfill health-check endpoint or document non-AI endpoint strategy
4. Keep the intentional 1.2.6 skip documented until encrypted-PDF fixtures are added

View File

@ -0,0 +1,77 @@
package services
import (
"math"
"os"
"testing"
"time"
)
// TestCallLLM_Live_ScoreConsistencyPlusMinus10 validates SRD_NonFuncReq_0006 /
// SRD_QualAssurReq_0001 against the live OpenAI API.
//
// This test is opt-in to avoid API cost/flakiness in default runs:
// RUN_LIVE_OPENAI_TESTS=1 OPENAI_API_KEY=... go test ./internal/services -run TestCallLLM_Live_ScoreConsistencyPlusMinus10 -v
func TestCallLLM_Live_ScoreConsistencyPlusMinus10(t *testing.T) {
if os.Getenv("RUN_LIVE_OPENAI_TESTS") != "1" {
t.Skip("set RUN_LIVE_OPENAI_TESTS=1 to run live OpenAI consistency test")
}
if os.Getenv("OPENAI_API_KEY") == "" {
t.Skip("OPENAI_API_KEY is required for live OpenAI test")
}
resume := `Senior Software Engineer with 7 years of experience building Go backend services.
Led microservice migrations, improved API latency by 35%, and maintained CI/CD pipelines.
Experience includes Kubernetes, Docker, PostgreSQL, and cloud deployments on AWS.`
job := `We are hiring a Senior Go Backend Engineer with strong API design skills,
production Kubernetes experience, and ownership of scalable distributed systems.
Candidates should demonstrate measurable impact, collaboration, and code quality.`
const runs = 10
scores := make([]int, 0, runs)
for i := range runs {
result, err := callLLM(resume, job)
if err != nil {
t.Fatalf("run %d failed: %v", i+1, err)
}
if result.OverallScore < 0 || result.OverallScore > 100 {
t.Fatalf("run %d produced out-of-range score: %d", i+1, result.OverallScore)
}
scores = append(scores, result.OverallScore)
t.Logf("run %d score: %d", i+1, result.OverallScore)
if i < runs-1 {
time.Sleep(300 * time.Millisecond)
}
}
baseline := scores[0]
for i, score := range scores {
delta := score - baseline
if delta < 0 {
delta = -delta
}
if delta > 10 {
t.Fatalf("run %d score %d exceeded +/-10 bound from baseline %d", i+1, score, baseline)
}
}
var sum float64
for _, s := range scores {
sum += float64(s)
}
mean := sum / float64(len(scores))
var variance float64
for _, s := range scores {
d := float64(s) - mean
variance += d * d
}
variance /= float64(len(scores))
stddev := math.Sqrt(variance)
t.Logf("baseline=%d scores=%v mean=%.2f stddev=%.2f", baseline, scores, mean, stddev)
}