package core
import (
"strings"
"testing"
)
func TestValidOwner(t *testing.T) {
tests := []struct {
in string
want bool
}{
{"bigbes", true},
{"user_name", true},
{"user-name", true},
{"user.name", true},
{"u123", true},
{"a", true},
{"", false},
{"-leading", false},
{"has/slash", false},
{"has..dots", false},
{"Upper", false},
{"has space", false},
{"tilde~", false},
{"emoji😀", false},
}
for _, tc := range tests {
if got := ValidOwner(tc.in); got != tc.want {
t.Errorf("ValidOwner(%q) = %v, want %v", tc.in, got, tc.want)
}
}
}
func TestValidRepoName(t *testing.T) {
tests := []struct {
in string
want bool
}{
{"core-go", true},
{"my.repo", true},
{"repo_1", true},
{strings.Repeat("a", 100), true},
{"", false},
{strings.Repeat("a", 101), false},
{"-dashfirst", false},
{"a/b", false},
{"a..b", false},
{"CamelCase", false},
}
for _, tc := range tests {
if got := ValidRepoName(tc.in); got != tc.want {
t.Errorf("ValidRepoName(%q) = %v, want %v", tc.in, got, tc.want)
}
}
}
func TestValidRef(t *testing.T) {
tests := []struct {
in string
want bool
}{
// Accepted.
{"main", true},
{"feature/foo", true},
{"feature/with-slash", true},
{"release/v1.0", true},
{"v1.0.0", true},
{"a/b/c/d", true},
{"0123456789abcdef0123456789abcdef01234567", true}, // SHA-1
{"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", true}, // SHA-256
{"DEADBEEFdeadbeef0000111122223333abcdabcd", true}, // mixed-case SHA-1
{"foo.lockfile", true}, // ".lock" only rejected as a suffix
// Rejected — structural.
{"", false},
{"@", false},
{"-oops", false},
{".hidden", false},
{"/leading", false},
{"trailing/", false},
{"trailing.", false},
{"foo.lock", false},
{"feature/bar.lock", false}, // per-component .lock
{"feature/.hidden", false}, // per-component leading dot
{"a..b", false},
{"a//b", false},
{"main@{u}", false},
// Rejected — forbidden bytes.
{"has space", false},
{"tilde~1", false},
{"caret^", false},
{"colon:x", false},
{"star*", false},
{"quest?", false},
{"brack[et", false},
{"back\\slash", false},
{"ctrl\x01char", false},
{"del\x7fchar", false},
// Not a full-length SHA -> falls through to name rules (valid here).
{"abcdef", true},
}
for _, tc := range tests {
if got := ValidRef(tc.in); got != tc.want {
t.Errorf("ValidRef(%q) = %v, want %v", tc.in, got, tc.want)
}
}
}