@@ -0,0 +1,69 @@
1+package shell
2+
3+import (
4+ "testing"
5+
6+ "github.com/charmbracelet/crush/internal/db"
7+ "github.com/charmbracelet/crush/internal/message"
8+ "github.com/charmbracelet/crush/internal/session"
9+ "github.com/google/uuid"
10+ "github.com/stretchr/testify/require"
11+)
12+
13+func TestPersistOutput_SkipsMissingSession(t *testing.T) {
14+ t.Parallel()
15+
16+ conn, err := db.Connect(t.Context(), t.TempDir())
17+ require.NoError(t, err)
18+ t.Cleanup(func() { conn.Close() })
19+
20+ messages := message.NewService(db.New(conn))
21+
22+ missingID := uuid.New().String()
23+ err = PersistOutput(t.Context(), messages, missingID, "cat file.txt", "hello", 0)
24+ require.NoError(t, err)
25+
26+ stored, err := messages.List(t.Context(), missingID)
27+ require.NoError(t, err)
28+ require.Empty(t, stored)
29+}
30+
31+func TestPersistOutput_NoOpForEmptySessionID(t *testing.T) {
32+ t.Parallel()
33+
34+ conn, err := db.Connect(t.Context(), t.TempDir())
35+ require.NoError(t, err)
36+ t.Cleanup(func() { conn.Close() })
37+
38+ messages := message.NewService(db.New(conn))
39+
40+ require.NoError(t, PersistOutput(t.Context(), messages, "", "echo hi", "hi", 0))
41+}
42+
43+func TestPersistOutput_PersistsForExistingSession(t *testing.T) {
44+ t.Parallel()
45+
46+ conn, err := db.Connect(t.Context(), t.TempDir())
47+ require.NoError(t, err)
48+ t.Cleanup(func() { conn.Close() })
49+
50+ q := db.New(conn)
51+ sessions := session.NewService(q, conn)
52+ messages := message.NewService(q)
53+
54+ sess, err := sessions.Create(t.Context(), "shell test")
55+ require.NoError(t, err)
56+
57+ err = PersistOutput(t.Context(), messages, sess.ID, "cat file.txt", "hello", 0)
58+ require.NoError(t, err)
59+
60+ stored, err := messages.List(t.Context(), sess.ID)
61+ require.NoError(t, err)
62+ require.Len(t, stored, 1)
63+ require.Equal(t, message.User, stored[0].Role)
64+ shellParts := stored[0].ShellCommands()
65+ require.Len(t, shellParts, 1)
66+ require.Equal(t, "cat file.txt", shellParts[0].Command)
67+ require.Equal(t, "hello", shellParts[0].Output)
68+ require.Zero(t, shellParts[0].ExitCode)
69+}