1package usecase
2
3import (
4 "context"
5 "testing"
6
7 "github.com/bnema/dumber/internal/application/dto"
8 portmocks "github.com/bnema/dumber/internal/application/port/mocks"
9 "github.com/stretchr/testify/assert"
10 "github.com/stretchr/testify/require"
11)
12
13type vimNavigationWebView struct {
14 *portmocks.MockWebView
15 focusNextInputCalls int
16 pageFocusBackward []bool
17 semanticRequests []dto.SemanticNavigationRequest
18 activateNavigationTargetCalls int
19 clearNavigationHighlightCalls int
20}
21
22func (wv *vimNavigationWebView) FocusNextInput() {
23 wv.focusNextInputCalls++
24}
25
26func (wv *vimNavigationWebView) NavigatePageFocus(backward bool) {
27 wv.pageFocusBackward = append(wv.pageFocusBackward, backward)
28}
29
30func (wv *vimNavigationWebView) NavigateSemantic(_ context.Context, request dto.SemanticNavigationRequest) error {
31 wv.semanticRequests = append(wv.semanticRequests, request)
32 return nil
33}
34
35func (wv *vimNavigationWebView) ActivateSemanticNavigationTarget(context.Context) error {
36 wv.activateNavigationTargetCalls++
37 return nil
38}
39
40func (wv *vimNavigationWebView) ClearSemanticNavigationHighlight(context.Context) error {
41 wv.clearNavigationHighlightCalls++
42 return nil
43}
44
45func TestVimNavigationUseCaseExecuteDispatchesConfiguredActions(t *testing.T) {
46 wv := &vimNavigationWebView{MockWebView: portmocks.NewMockWebView(t)}
47 uc := NewVimNavigationUseCase()
48
49 require.NoError(t, uc.Execute(context.Background(), wv, "focus-input", 1, ""))
50 require.NoError(t, uc.Execute(context.Background(), wv, "heading-prev", 3, "#aabbcc"))
51 require.NoError(t, uc.Execute(context.Background(), wv, "confirm", 1, ""))
52
53 assert.Equal(t, 1, wv.focusNextInputCalls)
54 assert.Equal(t, 1, wv.activateNavigationTargetCalls)
55 require.Len(t, wv.semanticRequests, 1)
56 assert.Equal(t, dto.SemanticNavigationRequest{
57 Target: dto.SemanticNavigationTargetHeading,
58 Direction: dto.SemanticNavigationBackward,
59 Count: 3,
60 HighlightColor: "#aabbcc",
61 }, wv.semanticRequests[0])
62}
63
64func TestVimNavigationUseCaseClearSemanticNavigationHighlight(t *testing.T) {
65 wv := &vimNavigationWebView{MockWebView: portmocks.NewMockWebView(t)}
66
67 require.NoError(t, NewVimNavigationUseCase().ClearSemanticNavigationHighlight(context.Background(), wv))
68 assert.Equal(t, 1, wv.clearNavigationHighlightCalls)
69}
70
71func TestVimNavigationUseCaseNavigatePageFocus(t *testing.T) {
72 wv := &vimNavigationWebView{MockWebView: portmocks.NewMockWebView(t)}
73
74 handled := NewVimNavigationUseCase().NavigatePageFocus(wv, true)
75
76 assert.True(t, handled)
77 assert.Equal(t, []bool{true}, wv.pageFocusBackward)
78}
79
80func TestVimNavigationUseCaseIgnoresUnsupportedCapability(t *testing.T) {
81 wv := portmocks.NewMockWebView(t)
82
83 require.ErrorIs(t, NewVimNavigationUseCase().Execute(context.Background(), wv, "focus-input", 1, ""), errUnsupportedVimNavigationEngine)
84 assert.False(t, NewVimNavigationUseCase().NavigatePageFocus(wv, true))
85}