package core import ( "strings" "testing" ) func TestValidateName(t *testing.T) { tests := []struct { name string input string ok bool }{ {"simple", "demo", true}, {"alnum", "db123", true}, {"with-hyphen", "my-db", true}, {"with-underscore", "my_db", true}, {"mixed", "a-b_c-1", true}, {"single-char", "a", true}, {"single-digit", "7", true}, {"max-length", strings.Repeat("a", MaxNameLen), true}, {"empty", "", false}, {"dot", ".", false}, {"dotdot", "..", false}, {"embedded-dot", "a.b", false}, {"leading-hyphen", "-db", false}, {"trailing-hyphen", "db-", false}, {"leading-underscore", "_db", false}, {"trailing-underscore", "db_", false}, {"slash", "a/b", false}, {"space", "a b", false}, {"tilde", "~db", false}, {"too-long", strings.Repeat("a", MaxNameLen+1), false}, {"unicode", "café", false}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { err := ValidateName(tt.input) if tt.ok && err != nil { t.Fatalf("ValidateName(%q) = %v, want nil", tt.input, err) } if !tt.ok && err == nil { t.Fatalf("ValidateName(%q) = nil, want error", tt.input) } }) } } func TestParseRepoPath(t *testing.T) { tests := []struct { name string input string wantOwner string wantDB string wantErr bool }{ {"tilde", "~user/db", "user", "db", false}, {"no-tilde", "user/db", "user", "db", false}, {"leading-slash", "/~user/db", "user", "db", false}, {"trailing-slash", "~user/db/", "user", "db", false}, {"both-slashes", "/~user/db/", "user", "db", false}, {"names-with-symbols", "~my-user/my_db-1", "my-user", "my_db-1", false}, {"empty", "", "", "", true}, {"only-slashes", "///", "", "", true}, {"one-segment", "~user", "", "", true}, {"three-segments", "~user/db/extra", "", "", true}, {"empty-inner-segment", "~user//db", "", "", true}, {"traversal-dotdot", "~user/..", "", "", true}, {"traversal-owner-dotdot", "../db", "", "", true}, {"traversal-dot", "~user/.", "", "", true}, {"tilde-only-owner", "~/db", "", "", true}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { owner, db, err := ParseRepoPath(tt.input) if tt.wantErr { if err == nil { t.Fatalf("ParseRepoPath(%q) = (%q,%q,nil), want error", tt.input, owner, db) } return } if err != nil { t.Fatalf("ParseRepoPath(%q) unexpected error: %v", tt.input, err) } if owner != tt.wantOwner || db != tt.wantDB { t.Fatalf("ParseRepoPath(%q) = (%q,%q), want (%q,%q)", tt.input, owner, db, tt.wantOwner, tt.wantDB) } }) } }