omnibox_ghost_normalize_test.go RawHistoryFolder

1package component
2
3import "testing"
4
5func TestNormalizeGhostSuggestion_PrefersHostOnlyForRedirectURL(t *testing.T) {
6	full, suffix := normalizeGhostSuggestion(
7		"google",
8		"google.com/url?q=https://dashboard.stripe.com/auth_challenge/email_link/abc",
9		".com/url?q=https://dashboard.stripe.com/auth_challenge/email_link/abc",
10	)
11	if full != "google.com" {
12		t.Fatalf("expected host-only completion, got %q", full)
13	}
14	if suffix != ".com" {
15		t.Fatalf("expected .com suffix, got %q", suffix)
16	}
17}
18
19func TestNormalizeGhostSuggestion_KeepsFallbackWhenInputLooksLikePath(t *testing.T) {
20	fallback := "/url?q=https://x"
21	full, suffix := normalizeGhostSuggestion("google.com/u", "google.com/url?q=https://x", fallback)
22	if full != "google.com/url?q=https://x" {
23		t.Fatalf("expected full URL fallback, got %q", full)
24	}
25	if suffix != fallback {
26		t.Fatalf("expected fallback suffix, got %q", suffix)
27	}
28}
29
30func TestExtractHostForCompletion(t *testing.T) {
31	got := extractHostForCompletion("https://WWW.Google.com/url?q=abc")
32	if got != "www.google.com" {
33		t.Fatalf("expected normalized host, got %q", got)
34	}
35}
36
37func TestGhostCompletionInput(t *testing.T) {
38	tests := []struct {
39		name        string
40		entryText   string
41		wantPrefix  string
42		wantTrimmed string
43		wantOK      bool
44	}{
45		{name: "no leading whitespace", entryText: "goo", wantPrefix: "", wantTrimmed: "goo", wantOK: true},
46		{name: "leading space", entryText: " goo", wantPrefix: " ", wantTrimmed: "goo", wantOK: true},
47		{name: "leading tab", entryText: "\tgoo", wantPrefix: "\t", wantTrimmed: "goo", wantOK: true},
48		{name: "only whitespace", entryText: "  \t", wantPrefix: "  \t", wantTrimmed: "", wantOK: false},
49	}
50
51	for _, tt := range tests {
52		t.Run(tt.name, func(t *testing.T) {
53			gotPrefix, gotTrimmed, gotOK := ghostCompletionInput(tt.entryText)
54			if gotPrefix != tt.wantPrefix {
55				t.Fatalf("ghostCompletionInput(%q) prefix = %q, want %q", tt.entryText, gotPrefix, tt.wantPrefix)
56			}
57			if gotTrimmed != tt.wantTrimmed {
58				t.Fatalf("ghostCompletionInput(%q) trimmed = %q, want %q", tt.entryText, gotTrimmed, tt.wantTrimmed)
59			}
60			if gotOK != tt.wantOK {
61				t.Fatalf("ghostCompletionInput(%q) ok = %v, want %v", tt.entryText, gotOK, tt.wantOK)
62			}
63		})
64	}
65}

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