aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/validator
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2025-01-09 15:45:40 +0100
committerTaras Madan <tarasmadan@google.com>2025-01-27 10:05:21 +0000
commit0868754a9d325ba9011e1cb74510f68d4b627c79 (patch)
treece1f63a84afa095227d308ccfff258e2d1dea225 /pkg/validator
parentd99a33ad01eb09190a8680d743f8d520e459ef0f (diff)
dashboard/app: show manager unique coverage
1. Make heatmap testable, move out the spanner client instantiation. 2. Generate spannerdb.ReadOnlyTransaction mocks. 3. Generate spannerdb.RowIterator mocks. 4. Generate spannerdb.Row mocks. 5. Prepare spannerdb fixture. 6. Fixed html control name + value. 7. Added multiple tests. 8. Show line coverage from selected manager. 9. Propagate coverage url params to file coverage url.
Diffstat (limited to 'pkg/validator')
-rw-r--r--pkg/validator/validator.go21
-rw-r--r--pkg/validator/validator_test.go18
2 files changed, 39 insertions, 0 deletions
diff --git a/pkg/validator/validator.go b/pkg/validator/validator.go
index 9aebc8150..b9031302a 100644
--- a/pkg/validator/validator.go
+++ b/pkg/validator/validator.go
@@ -48,12 +48,33 @@ func PanicIfNot(results ...Result) error {
return nil
}
+var ErrValueNotAllowed = errors.New("value is not allowed")
+
+func Allowlisted(str string, allowlist []string, valueName ...string) Result {
+ for _, allowed := range allowlist {
+ if allowed == str {
+ return Result{
+ Ok: true,
+ }
+ }
+ }
+ if len(valueName) == 0 {
+ return Result{
+ Err: fmt.Errorf("value %s is not allowed", str),
+ }
+ }
+ return Result{
+ Err: fmt.Errorf("%s(%s) is not allowed", valueName[0], str),
+ }
+}
+
var (
EmptyStr = makeStrLenFunc("not empty", 0)
AlphaNumeric = makeStrReFunc("not an alphanum", "^[a-zA-Z0-9]*$")
CommitHash = makeCombinedStrFunc("not a hash", AlphaNumeric, makeStrLenFunc("len is not 40", 40))
KernelFilePath = makeStrReFunc("not a kernel file path", "^[./_a-zA-Z0-9-]*$")
NamespaceName = makeStrReFunc("not a namespace name", "^[a-zA-Z0-9_.-]{4,32}$")
+ ManagerName = makeStrReFunc("not a manager name", "^ci[a-z0-9-]*$")
DashClientName = makeStrReFunc("not a dashboard client name", "^[a-zA-Z0-9_.-]{4,100}$")
DashClientKey = makeStrReFunc("not a dashboard client key",
"^([a-zA-Z0-9]{16,128})|("+regexp.QuoteMeta(auth.OauthMagic)+".*)$")
diff --git a/pkg/validator/validator_test.go b/pkg/validator/validator_test.go
index 9aa08e2d0..ffe935600 100644
--- a/pkg/validator/validator_test.go
+++ b/pkg/validator/validator_test.go
@@ -36,6 +36,16 @@ func TestIsNamespaceName(t *testing.T) {
}
// nolint: dupl
+func TestIsManagerName(t *testing.T) {
+ assert.True(t, validator.ManagerName("ci-upstream").Ok)
+ assert.False(t, validator.ManagerName("").Ok)
+
+ assert.Equal(t, "not a manager name", validator.ManagerName("*").Err.Error())
+ assert.Equal(t, "manager: not a manager name",
+ validator.ManagerName("*", "manager").Err.Error())
+}
+
+// nolint: dupl
func TestIsDashboardClientName(t *testing.T) {
assert.True(t, validator.DashClientName("name").Ok)
assert.False(t, validator.DashClientName("").Ok)
@@ -86,3 +96,11 @@ func TestAnyOk(t *testing.T) {
assert.Equal(t, badResult, validator.AnyOk(badResult))
assert.Equal(t, validator.ResultOk, validator.AnyOk(badResult, validator.ResultOk))
}
+
+func TestAllowlisted(t *testing.T) {
+ assert.True(t, validator.Allowlisted("good", []string{"good", "also-good"}).Ok)
+ assert.False(t, validator.Allowlisted("bad", []string{"good", "also-good"}).Ok)
+ assert.Equal(t,
+ validator.Result{Ok: false, Err: errors.New("name(bad) is not allowed")},
+ validator.Allowlisted("bad", nil, "name"))
+}