package deploy import ( "os" "strings" "testing" "go.yaml.in/yaml/v4" ) func TestCIValidatesProtocolAndDeploymentAssets(t *testing.T) { payload, err := os.ReadFile("../.github/workflows/ci.yml") if err != nil { t.Fatalf("read ci workflow: %v", err) } workflow := string(payload) var document map[string]any if err := yaml.Unmarshal(payload, &document); err != nil { t.Fatalf("parse ci workflow: %v", err) } jobs, ok := document["jobs"].(map[string]any) if !ok { t.Fatal("ci workflow has no jobs") } for _, name := range []string{"openapi", "proto", "deployment", "test", "race", "integration"} { if _, exists := jobs[name]; !exists { t.Errorf("ci workflow has no %s job", name) } } for _, required := range []string{ "./scripts/verify-openapi.ps1", "./scripts/verify-proto.ps1", "docker compose -f deploy/docker-compose.yml config --quiet", "kubectl kustomize deploy/kubernetes/base", "kubectl kustomize deploy/kubernetes/overlays/development-mtls", "go run ./deploy/tools/configcheck deploy/kubernetes/overlays/development-mtls/config.yaml", } { if !strings.Contains(workflow, required) { t.Errorf("ci workflow does not validate %q", required) } } deployment, ok := jobs["deployment"].(map[string]any) if !ok { t.Fatal("ci deployment job has invalid definition") } steps, ok := deployment["steps"].([]any) if !ok { t.Fatal("ci deployment job has no steps") } for _, step := range steps { definition, ok := step.(map[string]any) if !ok || definition["uses"] != "actions/setup-go@v5" { continue } options, ok := definition["with"].(map[string]any) if !ok || options["go-version-file"] != "go.mod" { t.Error("ci deployment job must pin actions/setup-go to go.mod") return } return } t.Error("ci deployment job must install the Go version declared by go.mod before running configcheck") }