package workflows import ( "context" "errors" "testing" ) func TestStubRunnerDiagnoseReturnsTypedNotImplemented(t *testing.T) { 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) } } func TestStubRunnerGradesAnswer(t *testing.T) { runner := NewStubRunner() grade, err := runner.GradeInterviewAnswer(context.Background(), GradeAnswerInput{ UserID: "user-1", 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) } if grade.UserID != "user-1" { t.Fatalf("UserID = %q", grade.UserID) } 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)) } } 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") } } }