internal/policy/names_test.go

f8b976a97290a20d552056a999511f5d27d8e8ec
gitbay/internal/policy/names_test.go history · blame · raw

79 lines · 2348 bytes

 1package policy
 2
 3import (
 4	"strings"
 5	"testing"
 6)
 7
 8func TestValidateOwnerName(t *testing.T) {
 9	valid := []string{"alice", "krz", "a", "user-1", "a.b_c", "0day"}
10	for _, n := range valid {
11		if err := ValidateOwnerName(n); err != nil {
12			t.Errorf("ValidateOwnerName(%q) = %v, want nil", n, err)
13		}
14	}
15
16	invalid := []string{
17		"",
18		"Alice",    // uppercase
19		"-lead",    // bad first char
20		".hidden",  // bad first char
21		"a b",      // space
22		"repo.git", // .git suffix
23		"..",       //
24		"login",    // reserved
25		"admin",    // reserved
26		"static",   // reserved
27		"api",      // reserved
28		"register", // reserved
29	}
30	for _, n := range invalid {
31		if err := ValidateOwnerName(n); err == nil {
32			t.Errorf("ValidateOwnerName(%q) = nil, want error", n)
33		}
34	}
35}
36
37func TestRepoNameAllowsReservedWords(t *testing.T) {
38	// Repo routes are namespaced under the owner, so reserved words are fine.
39	if err := ValidateName("api"); err != nil {
40		t.Errorf("ValidateName(\"api\") = %v, want nil", err)
41	}
42	if err := ValidateName("repo.git"); err == nil {
43		t.Error("ValidateName(\"repo.git\") = nil, want error")
44	}
45	if err := ValidateName("activity.atom"); err == nil {
46		t.Error("ValidateName(\"activity.atom\") = nil, want error")
47	}
48}
49
50func TestRepoNameAllowsLeadingDot(t *testing.T) {
51	// .gitbay holds an owner's profile content; a leading dot marks a
52	// repository as infrastructure rather than a project.
53	for _, n := range []string{".gitbay", ".dotfiles", ".a"} {
54		if err := ValidateName(n); err != nil {
55			t.Errorf("ValidateName(%q) = %v, want nil", n, err)
56		}
57	}
58	for _, n := range []string{".", "..", ".git", "repo.git", "..a", ".-a"} {
59		if err := ValidateName(n); err == nil {
60			t.Errorf("ValidateName(%q) = nil, want error", n)
61		}
62	}
63	// The ceiling is 63 characters, the dot included.
64	if err := ValidateName("." + strings.Repeat("a", 62)); err != nil {
65		t.Errorf("63-character dotted name rejected: %v", err)
66	}
67	if err := ValidateName("." + strings.Repeat("a", 63)); err == nil {
68		t.Error("64-character dotted name accepted")
69	}
70}
71
72func TestOwnerNameRefusesLeadingDot(t *testing.T) {
73	// The dot is a repository affordance. An owner is a top-level route.
74	for _, n := range []string{".gitbay", ".hidden", ".a"} {
75		if err := ValidateOwnerName(n); err == nil {
76			t.Errorf("ValidateOwnerName(%q) = nil, want error", n)
77		}
78	}
79}