v0.27.0 dcb4c51

navigate_test.go RawHistoryFolder

1package usecase
2
3import (
4	"context"
5	"testing"
6
7	"github.com/bnema/dumber/internal/domain/entity"
8	repomocks "github.com/bnema/dumber/internal/domain/repository/mocks"
9	"github.com/stretchr/testify/mock"
10	"github.com/stretchr/testify/require"
11)
12
13func TestCanonicalizeURLForHistory_StripsHashTrackingAndTrailingSlash(t *testing.T) {
14	got := canonicalizeURLForHistory(
15		"https://Example.com/path/?utm_source=newsletter&utm_campaign=launch&a=2&b=1#section-1",
16		historyCanonicalizationOptions{StripTrackingParams: true},
17	)
18
19	require.Equal(t, "https://example.com/path?a=2&b=1", got)
20}
21
22func TestCanonicalizeURLForHistory_OptionallyKeepsTrackingParams(t *testing.T) {
23	got := canonicalizeURLForHistory(
24		"https://example.com/path/?utm_source=newsletter&b=1#section-1",
25		historyCanonicalizationOptions{StripTrackingParams: false},
26	)
27
28	require.Equal(t, "https://example.com/path?b=1&utm_source=newsletter", got)
29}
30
31func TestRecordHistory_IgnoresHashOnlyTransitions(t *testing.T) {
32	ctx := context.Background()
33	repo := repomocks.NewMockHistoryRepository(t)
34
35	repo.EXPECT().FindByURL(mock.Anything, "https://example.com/docs").Return(nil, nil).Once()
36	repo.EXPECT().Save(mock.Anything, mock.MatchedBy(func(entry *entity.HistoryEntry) bool {
37		return entry.URL == "https://example.com/docs" && entry.VisitCount == 1
38	})).Return(nil).Once()
39
40	uc := NewNavigateUseCase(repo, nil, entity.ZoomDefault)
41	uc.RecordHistory(ctx, "pane-1", "https://example.com/docs#intro")
42	uc.RecordHistory(ctx, "pane-1", "https://example.com/docs#api")
43	uc.Close()
44}
45
46func TestRecordHistory_DedupIsPerPaneAndCoalescesVisits(t *testing.T) {
47	ctx := context.Background()
48	repo := repomocks.NewMockHistoryRepository(t)
49
50	repo.EXPECT().FindByURL(mock.Anything, "https://example.com/article").Return(nil, nil).Once()
51	repo.EXPECT().Save(mock.Anything, mock.MatchedBy(func(entry *entity.HistoryEntry) bool {
52		return entry.URL == "https://example.com/article" && entry.VisitCount == 2
53	})).Return(nil).Once()
54
55	uc := NewNavigateUseCase(repo, nil, entity.ZoomDefault)
56	uc.RecordHistory(ctx, "pane-1", "https://example.com/article?utm_source=feed")
57	uc.RecordHistory(ctx, "pane-1", "https://example.com/article?utm_source=feed")
58	uc.RecordHistory(ctx, "pane-2", "https://example.com/article")
59	uc.Close()
60}

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