v0.3.0 99dc266

navigation_test.go RawHistoryFolder

1package client
2
3import (
4	"testing"
5
6	"github.com/bnema/vev/internal/domain"
7	"github.com/bnema/vev/internal/ports"
8	"github.com/stretchr/testify/require"
9)
10
11func TestSyncReconnectRemoteKeepsRequestAndToastClassificationTogether(t *testing.T) {
12	reconnect := &reconnectUI{}
13	for _, tt := range []struct {
14		name   string
15		remote bool
16	}{
17		{name: "local picker", remote: false},
18		{name: "remote handoff", remote: true},
19	} {
20		t.Run(tt.name, func(t *testing.T) {
21			require.Equal(t, tt.remote, syncReconnectRemote(reconnect, tt.remote))
22			require.Equal(t, tt.remote, reconnect.remote)
23		})
24	}
25}
26
27func TestValidateAttachRequestNavigationTable(t *testing.T) {
28	var lifecycle domain.SessionLifecycleID
29	lifecycle[0] = 1
30	remoteRoute := &domain.RemoteSessionTarget{
31		Endpoint: "arch", DisplayOrigin: "arch", LifecycleID: lifecycle,
32		SessionName: "work", LiveTabID: "tab-1",
33	}
34	tests := []struct {
35		name    string
36		request AttachRequest
37		valid   bool
38	}{
39		{name: "ordinary route", request: AttachRequest{}, valid: true},
40		{name: "home picker without remote route", request: AttachRequest{Intent: ports.IntentAttach, SessionName: "work", NavigationCapabilities: ports.NavigationCapabilityHomePicker}, valid: false},
41		{name: "home picker on daemon-owned remote route", request: AttachRequest{Intent: ports.IntentAttach, SessionName: "work", Remote: true, EnvironmentPolicy: ports.EnvironmentPolicyDaemonOwned, NavigationCapabilities: ports.NavigationCapabilityHomePicker}, valid: true},
42		{name: "back on client-owned route", request: AttachRequest{StartupOverlay: ports.StartupOverlaySessionPicker, NavigationCapabilities: ports.NavigationCapabilityBack}, valid: true},
43		{name: "back on remote-target route", request: AttachRequest{Intent: ports.IntentAttach, SessionName: "work", RemoteTarget: remoteRoute, EnvironmentPolicy: ports.EnvironmentPolicyDaemonOwned, StartupOverlay: ports.StartupOverlaySessionPicker, NavigationCapabilities: ports.NavigationCapabilityBack}, valid: false},
44		{name: "unknown capability", request: AttachRequest{NavigationCapabilities: 4}, valid: false},
45		{name: "back without startup picker", request: AttachRequest{NavigationCapabilities: ports.NavigationCapabilityBack}, valid: false},
46		{name: "startup picker without back", request: AttachRequest{StartupOverlay: ports.StartupOverlaySessionPicker}, valid: false},
47	}
48
49	for _, tt := range tests {
50		t.Run(tt.name, func(t *testing.T) {
51			err := validateAttachRequest(tt.request)
52			if tt.valid {
53				require.NoError(t, err)
54				return
55			}
56			require.Error(t, err)
57			require.ErrorContains(t, err, "navigation")
58		})
59	}
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 12

Tags 11

↑↓ moveenter openesc close