// internal/session/session_test.go package session_test import ( "encoding/json" "os" "path/filepath" "testing" "time" "github.com/mathiasbq/supervisor/internal/session" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestAppend_WritesJSONLEntry(t *testing.T) { dir := t.TempDir() entry := session.Entry{ SessionID: "test-session-1", Timestamp: time.Now().UTC(), Skill: "tdd_green", Phase: "green", ProjectRoot: "/tmp/myproject", FinalStatus: "pass", ModelUsed: "ollama/qwen3", DurationMs: 5000, } require.NoError(t, session.Append(dir, "test-session-1", entry)) path := filepath.Join(dir, "test-session-1.jsonl") data, err := os.ReadFile(path) require.NoError(t, err) var got session.Entry require.NoError(t, json.Unmarshal(data, &got)) assert.Equal(t, "test-session-1", got.SessionID) assert.Equal(t, "tdd_green", got.Skill) assert.Equal(t, "pass", got.FinalStatus) } func TestAppend_AppendsMultipleEntries(t *testing.T) { dir := t.TempDir() for i := 0; i < 3; i++ { require.NoError(t, session.Append(dir, "s1", session.Entry{ SessionID: "s1", Timestamp: time.Now().UTC(), Skill: "tdd_red", FinalStatus: "pass", })) } entries, err := session.Read(dir, "s1") require.NoError(t, err) assert.Len(t, entries, 3) } func TestRead_EmptyWhenNoFile(t *testing.T) { dir := t.TempDir() entries, err := session.Read(dir, "missing") require.NoError(t, err) assert.Empty(t, entries) } func TestAttemptRoundTrip(t *testing.T) { a := session.Attempt{ Attempt: 1, Model: "ollama/devstral", Tier: "local", DurationMs: 4200, WarmStart: true, Verified: false, Verdict: "escalate", Feedback: "missing line references", } data, err := json.Marshal(a) require.NoError(t, err) var got session.Attempt require.NoError(t, json.Unmarshal(data, &got)) assert.Equal(t, a, got) }