diff --git a/types/model/name.go b/types/model/name.go index f32b2596..d85fd0c6 100644 --- a/types/model/name.go +++ b/types/model/name.go @@ -251,6 +251,10 @@ func (n Name) DisplayShortest() string { return sb.String() } +func IsValidNamespace(namespace string) bool { + return isValidPart(kindNamespace, namespace) +} + // IsValid reports whether all parts of the name are present and valid. The // digest is a special case, and is checked for validity only if present. func (n Name) IsValid() bool { diff --git a/types/model/name_test.go b/types/model/name_test.go index 27a8ccf8..26d70ef3 100644 --- a/types/model/name_test.go +++ b/types/model/name_test.go @@ -385,3 +385,30 @@ func FuzzName(f *testing.F) { }) } + +func TestIsValidNamespace(t *testing.T) { + cases := []struct { + username string + expected bool + }{ + {"", false}, + {"a", true}, + {"a:b", false}, + {"a/b", false}, + {"a:b/c", false}, + {"a/b:c", false}, + {"a/b:c", false}, + {"a/b:c/d", false}, + {"a/b:c/d@e", false}, + {"a/b:c/d@sha256-100", false}, + {"himynameisjoe", true}, + {"himynameisreallyreallyreallyreallylongbutitshouldstillbevalid", true}, + } + for _, tt := range cases { + t.Run(tt.username, func(t *testing.T) { + if got := IsValidNamespace(tt.username); got != tt.expected { + t.Errorf("IsValidName(%q) = %v; want %v", tt.username, got, tt.expected) + } + }) + } +}