vim_navigation_test.go RawHistoryFolder

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}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close