feat: add diagnostic interview loop
This commit is contained in:
87
internal/interview/service_test.go
Normal file
87
internal/interview/service_test.go
Normal file
@@ -0,0 +1,87 @@
|
||||
package interview
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"tutor/internal/workflows"
|
||||
)
|
||||
|
||||
func TestDiagnosticSessionAnswerFlow(t *testing.T) {
|
||||
service := NewService(NewMemoryStore(), workflows.NewStubRunner())
|
||||
|
||||
session, err := service.CreateSession(context.Background(), CreateSessionInput{
|
||||
UserID: "user-1",
|
||||
TargetRole: "junior backend developer",
|
||||
Stack: []string{"go", "postgres"},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("CreateSession error: %v", err)
|
||||
}
|
||||
if session.Track != BackendDeveloperTrack {
|
||||
t.Fatalf("Track = %q", session.Track)
|
||||
}
|
||||
if session.Status != SessionInProgress {
|
||||
t.Fatalf("Status = %q, want %q", session.Status, SessionInProgress)
|
||||
}
|
||||
if len(session.Questions) == 0 {
|
||||
t.Fatal("expected diagnostic questions")
|
||||
}
|
||||
|
||||
answer, err := service.SubmitAnswer(context.Background(), SubmitAnswerInput{
|
||||
SessionID: session.ID,
|
||||
QuestionID: session.Questions[0].ID,
|
||||
AnswerText: "Idempotent methods can be retried safely because repeated calls have the same intended effect.",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("SubmitAnswer error: %v", err)
|
||||
}
|
||||
if answer.Grade.AnswerID != answer.ID {
|
||||
t.Fatalf("grade answer id = %q, want %q", answer.Grade.AnswerID, answer.ID)
|
||||
}
|
||||
if len(answer.Grade.Concepts) == 0 {
|
||||
t.Fatal("expected graded concepts")
|
||||
}
|
||||
if len(answer.Grade.Evidence) == 0 {
|
||||
t.Fatal("expected grading evidence")
|
||||
}
|
||||
|
||||
loaded, err := service.GetSession(session.ID)
|
||||
if err != nil {
|
||||
t.Fatalf("GetSession error: %v", err)
|
||||
}
|
||||
if len(loaded.Answers) != 1 {
|
||||
t.Fatalf("answers = %d, want 1", len(loaded.Answers))
|
||||
}
|
||||
}
|
||||
|
||||
func TestDiagnosticSessionCompletesAfterAllQuestionsAnswered(t *testing.T) {
|
||||
service := NewService(NewMemoryStore(), workflows.NewStubRunner())
|
||||
|
||||
session, err := service.CreateSession(context.Background(), CreateSessionInput{
|
||||
UserID: "user-1",
|
||||
TargetRole: "junior backend developer",
|
||||
Stack: []string{"go"},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("CreateSession error: %v", err)
|
||||
}
|
||||
|
||||
for _, question := range session.Questions {
|
||||
if _, err := service.SubmitAnswer(context.Background(), SubmitAnswerInput{
|
||||
SessionID: session.ID,
|
||||
QuestionID: question.ID,
|
||||
AnswerText: "This answer gives a concrete backend tradeoff with an operational example for the interview.",
|
||||
}); err != nil {
|
||||
t.Fatalf("SubmitAnswer(%s) error: %v", question.ID, err)
|
||||
}
|
||||
}
|
||||
|
||||
loaded, err := service.GetSession(session.ID)
|
||||
if err != nil {
|
||||
t.Fatalf("GetSession error: %v", err)
|
||||
}
|
||||
if loaded.Status != SessionComplete {
|
||||
t.Fatalf("Status = %q, want %q", loaded.Status, SessionComplete)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user