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 clearNavigationHighlightCalls int
19}
20
21func (wv *vimNavigationWebView) FocusNextInput() {
22 wv.focusNextInputCalls++
23}
24
25func (wv *vimNavigationWebView) NavigatePageFocus(backward bool) {
26 wv.pageFocusBackward = append(wv.pageFocusBackward, backward)
27}
28
29func (wv *vimNavigationWebView) NavigateSemantic(_ context.Context, request dto.SemanticNavigationRequest) error {
30 wv.semanticRequests = append(wv.semanticRequests, request)
31 return nil
32}
33
34func (wv *vimNavigationWebView) ClearSemanticNavigationHighlight(context.Context) error {
35 wv.clearNavigationHighlightCalls++
36 return nil
37}
38
39func TestVimNavigationUseCaseExecuteDispatchesConfiguredActions(t *testing.T) {
40 wv := &vimNavigationWebView{MockWebView: portmocks.NewMockWebView(t)}
41 uc := NewVimNavigationUseCase()
42
43 require.NoError(t, uc.Execute(context.Background(), wv, "focus-input", 1, ""))
44 require.NoError(t, uc.Execute(context.Background(), wv, "heading-prev", 3, "#aabbcc"))
45
46 assert.Equal(t, 1, wv.focusNextInputCalls)
47 require.Len(t, wv.semanticRequests, 1)
48 assert.Equal(t, dto.SemanticNavigationRequest{
49 Target: dto.SemanticNavigationTargetHeading,
50 Direction: dto.SemanticNavigationBackward,
51 Count: 3,
52 HighlightColor: "#aabbcc",
53 }, wv.semanticRequests[0])
54}
55
56func TestVimNavigationUseCaseClearSemanticNavigationHighlight(t *testing.T) {
57 wv := &vimNavigationWebView{MockWebView: portmocks.NewMockWebView(t)}
58
59 require.NoError(t, NewVimNavigationUseCase().ClearSemanticNavigationHighlight(context.Background(), wv))
60 assert.Equal(t, 1, wv.clearNavigationHighlightCalls)
61}
62
63func TestVimNavigationUseCaseNavigatePageFocus(t *testing.T) {
64 wv := &vimNavigationWebView{MockWebView: portmocks.NewMockWebView(t)}
65
66 handled := NewVimNavigationUseCase().NavigatePageFocus(wv, true)
67
68 assert.True(t, handled)
69 assert.Equal(t, []bool{true}, wv.pageFocusBackward)
70}
71
72func TestVimNavigationUseCaseIgnoresUnsupportedCapability(t *testing.T) {
73 wv := portmocks.NewMockWebView(t)
74
75 require.ErrorIs(t, NewVimNavigationUseCase().Execute(context.Background(), wv, "focus-input", 1, ""), errUnsupportedVimNavigationEngine)
76 assert.False(t, NewVimNavigationUseCase().NavigatePageFocus(wv, true))
77}