1package usecase
2
3import (
4 "context"
5 "testing"
6
7 "github.com/bnema/dumber/internal/application/port"
8 "github.com/stretchr/testify/require"
9)
10
11func TestBuildContextMenuUseCase_Build(t *testing.T) {
12 uc := NewBuildContextMenuUseCase()
13
14 tests := []struct {
15 name string
16 context port.MenuContext
17 expected []port.MenuAction
18 }{
19 {
20 name: "editable context uses native menu",
21 context: port.MenuContext{IsEditable: true},
22 expected: []port.MenuAction{},
23 },
24 {
25 name: "empty context baseline",
26 context: port.MenuContext{},
27 expected: []port.MenuAction{port.MenuActionReload, port.MenuActionInspectElement},
28 },
29 {
30 name: "selection context",
31 context: port.MenuContext{HasSelection: true},
32 expected: []port.MenuAction{
33 port.MenuActionReload,
34 port.MenuActionCopySelection,
35 port.MenuActionInspectElement,
36 },
37 },
38 {
39 name: "image only",
40 context: port.MenuContext{ImageURI: "https://example.com/image.png"},
41 expected: []port.MenuAction{
42 port.MenuActionReload,
43 port.MenuActionCopyImage,
44 port.MenuActionSaveImage,
45 port.MenuActionInspectElement,
46 },
47 },
48 {
49 name: "link only",
50 context: port.MenuContext{LinkURI: "https://example.com/link"},
51 expected: []port.MenuAction{
52 port.MenuActionReload,
53 port.MenuActionOpenLinkNewTab,
54 port.MenuActionCopyLink,
55 port.MenuActionInspectElement,
56 },
57 },
58 {
59 name: "navigation enabled states",
60 context: port.MenuContext{CanGoBack: true, CanGoForward: true},
61 expected: []port.MenuAction{
62 port.MenuActionBack,
63 port.MenuActionForward,
64 port.MenuActionReload,
65 port.MenuActionInspectElement,
66 },
67 },
68 }
69
70 for _, tt := range tests {
71 t.Run(tt.name, func(t *testing.T) {
72 items := uc.Build(context.Background(), tt.context)
73 require.Equal(t, tt.expected, menuActions(items))
74 })
75 }
76}
77
78func menuActions(items []port.MenuItem) []port.MenuAction {
79 actions := make([]port.MenuAction, 0, len(items))
80 for _, item := range items {
81 actions = append(actions, item.Action)
82 }
83 return actions
84}