1package usecase_test
2
3import (
4 "context"
5 "errors"
6 "testing"
7 "time"
8
9 "github.com/bnema/dumber/internal/application/port"
10 portmocks "github.com/bnema/dumber/internal/application/port/mocks"
11 "github.com/bnema/dumber/internal/application/usecase"
12 "github.com/bnema/dumber/internal/domain/entity"
13 repomocks "github.com/bnema/dumber/internal/domain/repository/mocks"
14 "github.com/bnema/dumber/internal/logging"
15 "github.com/rs/zerolog"
16 "github.com/stretchr/testify/assert"
17 "github.com/stretchr/testify/mock"
18 "github.com/stretchr/testify/require"
19)
20
21func testContext() context.Context {
22 logger := logging.NewFromConfigValues("debug", "console")
23 return logging.WithContext(context.Background(), logger)
24}
25
26func TestManageSessionUseCase_StartSession_SavesAndReturnsLogger(t *testing.T) {
27 ctx := testContext()
28
29 sessionRepo := repomocks.NewMockSessionRepository(t)
30 loggerPort := portmocks.NewMockSessionLogger(t)
31
32 cfg := port.SessionLogConfig{Level: "info", Format: "json", TimeFormat: "15:04:05", EnableFileLog: false}
33 returnedLogger := zerolog.New(zerolog.NewConsoleWriter())
34
35 loggerPort.EXPECT().CreateLogger(mock.Anything, mock.Anything, cfg).
36 Return(returnedLogger, func() {}, nil)
37
38 sessionRepo.EXPECT().Save(mock.Anything, mock.AnythingOfType("*entity.Session")).
39 Run(func(_ context.Context, s *entity.Session) {
40 require.Equal(t, entity.SessionTypeBrowser, s.Type)
41 require.NotEmpty(t, s.ID)
42 require.False(t, s.StartedAt.IsZero())
43 }).
44 Return(nil)
45
46 uc := usecase.NewManageSessionUseCase(sessionRepo, loggerPort)
47
48 out, err := uc.StartSession(ctx, usecase.StartSessionInput{Type: entity.SessionTypeBrowser, Now: time.Now(), LogConfig: cfg})
49 require.NoError(t, err)
50 require.NotNil(t, out)
51 assert.NotNil(t, out.Session)
52 assert.Equal(t, returnedLogger, out.Logger)
53}
54
55func TestManageSessionUseCase_StartSession_WhenSaveFails_CleansUp(t *testing.T) {
56 ctx := testContext()
57
58 sessionRepo := repomocks.NewMockSessionRepository(t)
59 loggerPort := portmocks.NewMockSessionLogger(t)
60
61 cfg := port.SessionLogConfig{Level: "info", Format: "json", EnableFileLog: false}
62 returnedLogger := zerolog.New(zerolog.NewConsoleWriter())
63
64 cleanupCalled := false
65 cleanupFn := func() { cleanupCalled = true }
66
67 loggerPort.EXPECT().CreateLogger(mock.Anything, mock.Anything, cfg).
68 Return(returnedLogger, cleanupFn, nil)
69
70 sessionRepo.EXPECT().Save(mock.Anything, mock.AnythingOfType("*entity.Session")).
71 Return(errors.New("db down"))
72
73 uc := usecase.NewManageSessionUseCase(sessionRepo, loggerPort)
74
75 _, err := uc.StartSession(ctx, usecase.StartSessionInput{Type: entity.SessionTypeBrowser, Now: time.Now(), LogConfig: cfg})
76 require.Error(t, err)
77 assert.True(t, cleanupCalled)
78}