v0.31.0 bf0756b

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	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}

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