1package ui
2
3import (
4 "context"
5 "errors"
6 "testing"
7
8 "github.com/bnema/dumber/internal/application/dto"
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/stretchr/testify/mock"
15 "github.com/stretchr/testify/require"
16)
17
18func TestNew_DoesNotWireClipboardOrchestratorWhenClipboardMissing(t *testing.T) {
19 ctx := context.Background()
20 engine := portmocks.NewMockEngine(t)
21 var registerDeps port.HandlerDependencies
22 engine.EXPECT().RegisterHandlers(mock.Anything, mock.Anything).
23 Run(func(_ context.Context, deps port.HandlerDependencies) {
24 registerDeps = deps
25 }).
26 Return(nil).
27 Once()
28 runtimeConfig := portmocks.NewMockRuntimeConfigProvider(t)
29 runtimeConfig.EXPECT().
30 Current().
31 Return(entity.RuntimeConfigSnapshot{}).
32 Once()
33
34 deps := &Dependencies{
35 Ctx: ctx,
36 RuntimeConfig: runtimeConfig,
37 Engine: engine,
38 HandlerDeps: port.HandlerDeps{
39 SaveConfig: func(context.Context, dto.WebUIConfig) error { return nil },
40 SaveOmniboxInitialBehavior: func(context.Context, entity.OmniboxInitialBehavior) error { return nil },
41 SaveModeLegendCollapsed: func(context.Context, bool) error { return nil },
42 },
43 Clipboard: nil,
44 }
45
46 app, err := New(deps)
47 require.NoError(t, err)
48 require.NotNil(t, app)
49 require.Nil(t, registerDeps.ClipboardTextOrchestrator)
50}
51
52func TestNew_ClosesHistoryRecorderWhenRegisterHandlersFails(t *testing.T) {
53 ctx := context.Background()
54 engine := portmocks.NewMockEngine(t)
55 registerErr := errors.New("register failed")
56 engine.EXPECT().RegisterHandlers(mock.Anything, mock.Anything).Return(registerErr).Once()
57 runtimeConfig := portmocks.NewMockRuntimeConfigProvider(t)
58 runtimeConfig.EXPECT().Current().Return(entity.RuntimeConfigSnapshot{}).Once()
59 historyRepo := repomocks.NewMockHistoryRepository(t)
60 historyRecorder := usecase.NewHistoryRecorderUseCase(historyRepo, nil)
61
62 deps := &Dependencies{
63 Ctx: ctx,
64 RuntimeConfig: runtimeConfig,
65 Engine: engine,
66 HistoryRecorderUC: historyRecorder,
67 HandlerDeps: port.HandlerDeps{
68 SaveConfig: func(context.Context, dto.WebUIConfig) error { return nil },
69 SaveOmniboxInitialBehavior: func(context.Context, entity.OmniboxInitialBehavior) error { return nil },
70 SaveModeLegendCollapsed: func(context.Context, bool) error { return nil },
71 },
72 }
73
74 app, err := New(deps)
75 require.Nil(t, app)
76 require.ErrorIs(t, err, registerErr)
77
78 historyRecorder.RecordHistory(ctx, "pane-1", "https://example.com/leak-check")
79 historyRecorder.Close()
80}
81
82func TestNew_WiresClipboardOrchestratorWhenClipboardPresent(t *testing.T) {
83 ctx := context.Background()
84 engine := portmocks.NewMockEngine(t)
85 clipboard := portmocks.NewMockClipboard(t)
86 var registerDeps port.HandlerDependencies
87 engine.EXPECT().RegisterHandlers(mock.Anything, mock.Anything).
88 Run(func(_ context.Context, deps port.HandlerDependencies) {
89 registerDeps = deps
90 }).
91 Return(nil).
92 Once()
93 runtimeConfig := portmocks.NewMockRuntimeConfigProvider(t)
94 runtimeConfig.EXPECT().
95 Current().
96 Return(entity.RuntimeConfigSnapshot{}).
97 Once()
98
99 deps := &Dependencies{
100 Ctx: ctx,
101 RuntimeConfig: runtimeConfig,
102 Engine: engine,
103 HandlerDeps: port.HandlerDeps{
104 SaveConfig: func(context.Context, dto.WebUIConfig) error { return nil },
105 SaveOmniboxInitialBehavior: func(context.Context, entity.OmniboxInitialBehavior) error { return nil },
106 SaveModeLegendCollapsed: func(context.Context, bool) error { return nil },
107 },
108 Clipboard: clipboard,
109 }
110
111 app, err := New(deps)
112 require.NoError(t, err)
113 require.NotNil(t, app)
114 require.NotNil(t, registerDeps.ClipboardTextOrchestrator)
115}