internal/policy/names_test.go
79 lines · 2348 bytes
4 symbols in this file
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}