From fc0631fca767256ef8b4d72ccc435c107f23d3f8 Mon Sep 17 00:00:00 2001 From: Daniel Hiller Date: Wed, 11 Dec 2024 18:04:02 +0100 Subject: [PATCH] sigs-validator: add unit tests Adds unit tests for sig validation as precondition of refactoring. Signed-off-by: Daniel Hiller --- validators/cmd/sigs/sigs-validator.go | 2 +- validators/cmd/sigs/sigs-validator_test.go | 462 ++++++++++++++++++ .../cmd/sigs/testdata/existing-dir/.gitkeep | 0 validators/cmd/sigs/testdata/existing-file | 1 + 4 files changed, 464 insertions(+), 1 deletion(-) create mode 100644 validators/cmd/sigs/sigs-validator_test.go create mode 100644 validators/cmd/sigs/testdata/existing-dir/.gitkeep create mode 100644 validators/cmd/sigs/testdata/existing-file diff --git a/validators/cmd/sigs/sigs-validator.go b/validators/cmd/sigs/sigs-validator.go index ed85931d..fdf043de 100644 --- a/validators/cmd/sigs/sigs-validator.go +++ b/validators/cmd/sigs/sigs-validator.go @@ -203,7 +203,7 @@ func validateSubprojects(groupToValidate *sigs.Group, groupLog *log.Entry, kubev } func validateOwnersReferences(subProject *sigs.SubProject, subprojectLog *log.Entry) []string { - foundOwners := make([]string, 0) + var foundOwners []string for _, ownersFileURL := range subProject.Owners { response, err := http.DefaultClient.Head(ownersFileURL) if err != nil { diff --git a/validators/cmd/sigs/sigs-validator_test.go b/validators/cmd/sigs/sigs-validator_test.go new file mode 100644 index 00000000..b0e1ee6d --- /dev/null +++ b/validators/cmd/sigs/sigs-validator_test.go @@ -0,0 +1,462 @@ +/* + * This file is part of the KubeVirt project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Copyright the KubeVirt Authors. + * + */ + +package main + +import ( + log "github.com/sirupsen/logrus" + "gopkg.in/yaml.v3" + "kubevirt.io/community/pkg/labels" + "kubevirt.io/community/pkg/orgs" + "kubevirt.io/community/pkg/sigs" + "reflect" + "testing" +) + +func Test_validateGroups(t *testing.T) { + type args struct { + sigsYAML *sigs.Sigs + expectedSigsYAML *sigs.Sigs + labelsYAML *labels.LabelsYAML + kubevirtOrg orgs.Org + } + tests := []struct { + name string + args args + }{ + { + name: "sig: removes directory", + args: args{ + sigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + Dir: "non-existing-dir", + }, + }, + }, + expectedSigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + }, + }, + }, + }, + }, + { + name: "sig: leaves directory", + args: args{ + sigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + Dir: "testdata/existing-dir", + }, + }, + }, + expectedSigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + Dir: "testdata/existing-dir", + }, + }, + }, + }, + }, + { + name: "sig: removes directory if not a dir", + args: args{ + sigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + Dir: "testdata/existing-file", + }, + }, + }, + expectedSigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + }, + }, + }, + }, + }, + { + name: "sig: removes chair", + args: args{ + sigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + Leadership: &sigs.Leadership{ + Chairs: []*sigs.Chair{ + {Github: "nonexisting-gh"}, + }, + }, + }, + }, + }, + expectedSigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + Leadership: &sigs.Leadership{}, + }, + }, + }, + }, + }, + { + name: "sig: leaves chair", + args: args{ + sigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + Leadership: &sigs.Leadership{ + Chairs: []*sigs.Chair{ + {Github: "existing-gh"}, + }, + }, + }, + }, + }, + expectedSigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + Leadership: &sigs.Leadership{ + Chairs: []*sigs.Chair{ + {Github: "existing-gh"}, + }, + }, + }, + }, + }, + kubevirtOrg: orgs.Org{ + Members: []string{ + "existing-gh", + }, + }, + }, + }, + { + name: "sig: removes lead", + args: args{ + sigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + Leads: []*sigs.Lead{ + { + Github: "nonexisting-gh", + }, + }, + }, + }, + }, + expectedSigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + }, + }, + }, + }, + }, + { + name: "sig: leaves lead", + args: args{ + sigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + Leads: []*sigs.Lead{ + { + Github: "existing-gh", + }, + }, + }, + }, + }, + expectedSigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + Leads: []*sigs.Lead{ + { + Github: "existing-gh", + }, + }, + }, + }, + }, + kubevirtOrg: orgs.Org{ + Members: []string{ + "existing-gh", + }, + }, + }, + }, + { + name: "sig: removes label", + args: args{ + sigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + Label: "nonexisting-label", + }, + }, + }, + expectedSigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + }, + }, + }, + labelsYAML: &labels.LabelsYAML{ + Default: &labels.Repo{Labels: []*labels.Label{}}, + }, + }, + }, + { + name: "sig: leaves default label", + args: args{ + sigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + Label: "existing-label", + }, + }, + }, + expectedSigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + Label: "existing-label", + }, + }, + }, + labelsYAML: &labels.LabelsYAML{ + Default: &labels.Repo{Labels: []*labels.Label{{ + Name: "existing-label", + }}}, + }, + }, + }, + { + name: "sig: removes repo-specific label", + args: args{ + sigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + Label: "existing-label", + }, + }, + }, + expectedSigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + }, + }, + }, + labelsYAML: &labels.LabelsYAML{ + Default: &labels.Repo{Labels: []*labels.Label{{}}}, + Repos: map[string]*labels.Repo{ + "somerepo": {Labels: []*labels.Label{ + { + Name: "existing-label", + }, + }}, + }, + }, + }, + }, + { + name: "sig: subproject - leaves existing owners references", + args: args{ + sigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + SubProjects: []*sigs.SubProject{ + { + Name: "some-subproject", + Owners: []string{ + "https://raw.githubusercontent.com/kubevirt/community/main/OWNERS", + }, + }, + }, + }, + }, + }, + expectedSigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + SubProjects: []*sigs.SubProject{ + { + Name: "some-subproject", + Owners: []string{ + "https://raw.githubusercontent.com/kubevirt/community/main/OWNERS", + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "sig: subproject - remove owners reference if not found", + args: args{ + sigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + SubProjects: []*sigs.SubProject{ + { + Name: "some-subproject", + Owners: []string{ + "https://raw.githubusercontent.com/kubevirt/non-existing-repo/main/OWNERS", + }, + }, + }, + }, + }, + }, + expectedSigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + SubProjects: []*sigs.SubProject{ + { + Name: "some-subproject", + }, + }, + }, + }, + }, + }, + }, + { + name: "sig: subproject - leaves lead", + args: args{ + sigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + SubProjects: []*sigs.SubProject{ + { + Name: "some-subproject", + Leads: []*sigs.Lead{ + { + Github: "existing-gh", + }, + }, + }, + }, + }, + }, + }, + expectedSigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + SubProjects: []*sigs.SubProject{ + { + Name: "some-subproject", + Leads: []*sigs.Lead{ + { + Github: "existing-gh", + }, + }, + }, + }, + }, + }, + }, + kubevirtOrg: orgs.Org{ + Members: []string{ + "existing-gh", + }, + }, + }, + }, + { + name: "sig: subproject - removes lead if not org member", + args: args{ + sigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + SubProjects: []*sigs.SubProject{ + { + Name: "some-subproject", + Leads: []*sigs.Lead{ + { + Github: "existing-gh", + }, + }, + }, + }, + }, + }, + }, + expectedSigsYAML: &sigs.Sigs{ + Sigs: []*sigs.Group{ + { + Name: "sig-test", + SubProjects: []*sigs.SubProject{ + { + Name: "some-subproject", + }, + }, + }, + }, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + validateGroups(tt.args.sigsYAML, tt.args.labelsYAML, tt.args.kubevirtOrg) + if !reflect.DeepEqual(tt.args.expectedSigsYAML, tt.args.sigsYAML) { + t.Errorf("sigs yaml:\n\ngot: %v\n\nwant: %v", printSigsYAML(tt.args.sigsYAML), printSigsYAML(tt.args.expectedSigsYAML)) + } + }) + } +} + +func printSigsYAML(s *sigs.Sigs) string { + out, err := yaml.Marshal(s) + if err != nil { + log.Fatalf("failed to print sigs yaml: %v", err) + } + return string(out) +} diff --git a/validators/cmd/sigs/testdata/existing-dir/.gitkeep b/validators/cmd/sigs/testdata/existing-dir/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/validators/cmd/sigs/testdata/existing-file b/validators/cmd/sigs/testdata/existing-file new file mode 100644 index 00000000..89626620 --- /dev/null +++ b/validators/cmd/sigs/testdata/existing-file @@ -0,0 +1 @@ +whatever \ No newline at end of file