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}