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