1package cmd
2
3import (
4 "context"
5 "fmt"
6 "os"
7 "path/filepath"
8 "testing"
9 "time"
10
11 "github.com/bnema/dumber/internal/domain/entity"
12 "github.com/bnema/dumber/internal/logging"
13 "github.com/stretchr/testify/require"
14)
15
16type fakeSessionMgr struct {
17 sessions []*entity.Session
18 err error
19}
20
21func (f *fakeSessionMgr) GetRecentSessions(_ context.Context, _ int) ([]*entity.Session, error) {
22 if f.err != nil {
23 return nil, f.err
24 }
25 return f.sessions, nil
26}
27
28func TestGetSessionsMerged_DBAndFS(t *testing.T) {
29 logDir := t.TempDir()
30
31 s1 := &entity.Session{ID: entity.SessionID("20251217_205106_a7b3"), Type: entity.SessionTypeBrowser, StartedAt: time.Date(2025, 12, 17, 20, 51, 6, 0, time.UTC)}
32 s2 := &entity.Session{ID: entity.SessionID("20251218_205106_bbbb"), Type: entity.SessionTypeBrowser, StartedAt: time.Date(2025, 12, 18, 20, 51, 6, 0, time.UTC)}
33
34 require.NoError(t, os.WriteFile(filepath.Join(logDir, logging.SessionFilename(string(s1.ID))), []byte("hi\n"), 0o600))
35 require.NoError(t, os.WriteFile(filepath.Join(logDir, logging.SessionFilename("legacy_only")), []byte("legacy\n"), 0o600))
36
37 mgr := &fakeSessionMgr{sessions: []*entity.Session{s1, s2}}
38
39 merged, err := getSessionsMerged(context.Background(), mgr, logDir)
40 require.NoError(t, err)
41 require.Len(t, merged, 3)
42
43 byID := map[string]SessionInfo{}
44 for _, s := range merged {
45 byID[s.SessionID] = s
46 }
47
48 require.True(t, byID[string(s1.ID)].FromDB)
49 require.True(t, byID[string(s2.ID)].FromDB)
50 require.False(t, byID["legacy_only"].FromDB)
51}
52
53func TestGetSessionsMerged_MissingTableFallsBack(t *testing.T) {
54 logDir := t.TempDir()
55 require.NoError(t, os.WriteFile(filepath.Join(logDir, logging.SessionFilename("legacy_only")), []byte("legacy\n"), 0o600))
56
57 mgr := &fakeSessionMgr{err: fmt.Errorf("no such table: sessions")}
58 merged, err := getSessionsMerged(context.Background(), mgr, logDir)
59 require.NoError(t, err)
60 require.Len(t, merged, 1)
61 require.Equal(t, "legacy_only", merged[0].SessionID)
62}
63
64func TestFindSession_DBShortIDMatch(t *testing.T) {
65 logDir := t.TempDir()
66
67 s1 := &entity.Session{ID: entity.SessionID("20251217_205106_a7b3"), Type: entity.SessionTypeBrowser, StartedAt: time.Date(2025, 12, 17, 20, 51, 6, 0, time.UTC)}
68 mgr := &fakeSessionMgr{sessions: []*entity.Session{s1}}
69
70 info, err := findSession(context.Background(), mgr, logDir, "a7b3")
71 require.NoError(t, err)
72 require.Equal(t, string(s1.ID), info.SessionID)
73 require.Equal(t, "a7b3", info.ShortID)
74}