package oltp
import (
"reflect"
"testing"
)
// RFC 0009 §verdicts: required checks match branches the way protection
// does — names or globs, every matching rule applies — and a rule with
// no checks is a removed rule.
func TestRequiredChecksMatchLikeProtection(t *testing.T) {
db := testDB(t)
must := func(err error) {
t.Helper()
if err != nil {
t.Fatal(err)
}
}
must(db.SetCheckRule("r", "trunk", []string{"test", "build"}))
must(db.SetCheckRule("r", "release-*", []string{"test", "sign"}))
if got := db.RequiredChecks("r", "trunk"); !reflect.DeepEqual(got, []string{"build", "test"}) {
t.Fatalf("trunk: %v", got)
}
if got := db.RequiredChecks("r", "release-1.2"); !reflect.DeepEqual(got, []string{"sign", "test"}) {
t.Fatalf("glob: %v", got)
}
if got := db.RequiredChecks("r", "feature"); got != nil {
t.Fatalf("unmatched branch requires %v", got)
}
// Overlapping rules union without repeating.
must(db.SetCheckRule("r", "*", []string{"lint", "test"}))
if got := db.RequiredChecks("r", "trunk"); !reflect.DeepEqual(got, []string{"lint", "test", "build"}) {
t.Fatalf("union: %v", got)
}
// Blanking removes.
must(db.SetCheckRule("r", "*", nil))
must(db.SetCheckRule("r", "trunk", nil))
if got := db.RequiredChecks("r", "trunk"); got != nil {
t.Fatalf("removed but requires %v", got)
}
}