2026-04-26 16:14:31 +09:00
|
|
|
package workflows
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"errors"
|
|
|
|
|
"testing"
|
|
|
|
|
)
|
|
|
|
|
|
2026-04-26 16:24:35 +09:00
|
|
|
func TestStubRunnerDiagnoseReturnsTypedNotImplemented(t *testing.T) {
|
2026-04-26 16:14:31 +09:00
|
|
|
runner := NewStubRunner()
|
|
|
|
|
|
|
|
|
|
_, err := runner.DiagnoseJobSeeker(context.Background(), DiagnosticInput{
|
|
|
|
|
UserID: "user-1",
|
|
|
|
|
Track: "backend-developer",
|
|
|
|
|
TargetRole: "junior-backend-developer",
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
if !errors.Is(err, ErrNotImplemented) {
|
|
|
|
|
t.Fatalf("err = %v, want %v", err, ErrNotImplemented)
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-04-26 16:24:35 +09:00
|
|
|
|
|
|
|
|
func TestStubRunnerGradesAnswer(t *testing.T) {
|
|
|
|
|
runner := NewStubRunner()
|
|
|
|
|
|
|
|
|
|
grade, err := runner.GradeInterviewAnswer(context.Background(), GradeAnswerInput{
|
2026-04-26 16:34:52 +09:00
|
|
|
UserID: "user-1",
|
2026-04-26 16:24:35 +09:00
|
|
|
QuestionID: "q-1",
|
|
|
|
|
AnswerID: "a-1",
|
|
|
|
|
AnswerText: "Indexes can speed reads by helping the database find rows, but they add write overhead.",
|
|
|
|
|
Concepts: []ConceptRef{
|
|
|
|
|
{ID: "database-indexes", Label: "Database indexes", Track: "backend-developer"},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("GradeInterviewAnswer error: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if grade.AnswerID != "a-1" {
|
|
|
|
|
t.Fatalf("AnswerID = %q", grade.AnswerID)
|
|
|
|
|
}
|
2026-04-26 16:34:52 +09:00
|
|
|
if grade.UserID != "user-1" {
|
|
|
|
|
t.Fatalf("UserID = %q", grade.UserID)
|
|
|
|
|
}
|
2026-04-26 16:24:35 +09:00
|
|
|
if len(grade.Concepts) != 1 {
|
|
|
|
|
t.Fatalf("concepts = %d, want 1", len(grade.Concepts))
|
|
|
|
|
}
|
|
|
|
|
if len(grade.Evidence) != 1 {
|
|
|
|
|
t.Fatalf("evidence = %d, want 1", len(grade.Evidence))
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-04-26 16:34:52 +09:00
|
|
|
|
|
|
|
|
func TestStubRunnerExtractsLearningMemory(t *testing.T) {
|
|
|
|
|
runner := NewStubRunner()
|
|
|
|
|
grade := GradedAnswer{
|
|
|
|
|
UserID: "user-1",
|
|
|
|
|
AnswerID: "a-1",
|
|
|
|
|
QuestionID: "q-1",
|
|
|
|
|
Concepts: []ConceptRef{
|
|
|
|
|
{ID: "cache-invalidation", Label: "Cache invalidation", Track: "backend-developer"},
|
|
|
|
|
},
|
|
|
|
|
Overall: AnswerPartial,
|
|
|
|
|
Evidence: []EvidenceRef{
|
|
|
|
|
{Kind: EvidenceAnswer, ID: "a-1", Confidence: 1},
|
|
|
|
|
},
|
|
|
|
|
FollowUp: FollowUpRecommendation{
|
|
|
|
|
Needed: true,
|
|
|
|
|
Question: "Can you explain the tradeoff?",
|
|
|
|
|
Purpose: FollowUpRepair,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
candidate, err := runner.ExtractLearningMemory(context.Background(), grade)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("ExtractLearningMemory error: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if candidate.UserID != "user-1" {
|
|
|
|
|
t.Fatalf("UserID = %q", candidate.UserID)
|
|
|
|
|
}
|
|
|
|
|
if len(candidate.Updates) != 4 {
|
|
|
|
|
t.Fatalf("updates = %d, want 4", len(candidate.Updates))
|
|
|
|
|
}
|
|
|
|
|
for _, update := range candidate.Updates {
|
|
|
|
|
if len(update.Evidence) == 0 {
|
|
|
|
|
t.Fatal("expected every memory update to carry evidence")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|