1package bootstrap
2
3import (
4 "context"
5 "testing"
6 "time"
7
8 "github.com/bnema/dumber/internal/application/usecase"
9 "github.com/bnema/dumber/internal/domain/entity"
10 repomocks "github.com/bnema/dumber/internal/domain/repository/mocks"
11 "github.com/bnema/dumber/internal/infrastructure/config"
12 "github.com/stretchr/testify/mock"
13 "github.com/stretchr/testify/require"
14)
15
16func TestRunSessionCleanup_SkipsCurrentActiveSession(t *testing.T) {
17 t.Parallel()
18
19 ctx := context.Background()
20 repo := repomocks.NewMockSessionRepository(t)
21 sessionUC := usecase.NewManageSessionUseCase(repo, nil)
22 cleanupUC := usecase.NewCleanupSessionsUseCase(repo)
23 cfg := config.DefaultConfig()
24 logDir := t.TempDir()
25
26 now := time.Now().UTC()
27 current := &entity.Session{
28 ID: entity.SessionID("current"),
29 Type: entity.SessionTypeBrowser,
30 StartedAt: now,
31 }
32 stale := &entity.Session{
33 ID: entity.SessionID("stale"),
34 Type: entity.SessionTypeBrowser,
35 StartedAt: now.Add(-time.Hour),
36 }
37
38 repo.EXPECT().GetRecent(mock.Anything, recentSessionsLimit).Return([]*entity.Session{current, stale}, nil).Once()
39 repo.EXPECT().MarkEnded(mock.Anything, stale.ID, mock.MatchedBy(func(t time.Time) bool {
40 diff := t.Sub(now)
41 if diff < 0 {
42 diff = -diff
43 }
44 return diff < 2*time.Second
45 })).Return(nil).Once()
46 repo.EXPECT().DeleteExitedBefore(mock.Anything, mock.MatchedBy(func(time.Time) bool { return true })).Return(int64(0), nil).Once()
47 repo.EXPECT().DeleteOldestExited(mock.Anything, cfg.Session.MaxExitedSessions).Return(int64(0), nil).Once()
48
49 runSessionCleanup(ctx, sessionUC, cleanupUC, cfg, logDir, current.ID, nil)
50}
51
52func TestRunSessionCleanup_NoPanicOnNilSessions(t *testing.T) {
53 t.Parallel()
54
55 ctx := context.Background()
56 repo := repomocks.NewMockSessionRepository(t)
57 sessionUC := usecase.NewManageSessionUseCase(repo, nil)
58 cleanupUC := usecase.NewCleanupSessionsUseCase(repo)
59 cfg := config.DefaultConfig()
60 logDir := t.TempDir()
61
62 repo.EXPECT().GetRecent(mock.Anything, recentSessionsLimit).Return([]*entity.Session{nil}, nil).Once()
63 repo.EXPECT().DeleteExitedBefore(mock.Anything, mock.MatchedBy(func(time.Time) bool { return true })).Return(int64(0), nil).Once()
64 repo.EXPECT().DeleteOldestExited(mock.Anything, cfg.Session.MaxExitedSessions).Return(int64(0), nil).Once()
65
66 require.NotPanics(t, func() {
67 runSessionCleanup(ctx, sessionUC, cleanupUC, cfg, logDir, entity.SessionID("current"), nil)
68 })
69}