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)
}
})
}
}