package build import ( "errors" "strings" "testing" "git.novox.be/novox/mesh-sdk/go/catalogue" ) // manifestOf is a manifest holding these artifacts: the plan reads only their name, kind and language. func manifestOf(artifacts ...catalogue.Artifact) catalogue.Manifest { return catalogue.Manifest{Module: "m", Build: &catalogue.Build{Artifacts: artifacts}} } func TestPlanRoutesEachKindToItsBuildModule(t *testing.T) { // 1607/AC2 m := manifestOf( catalogue.Artifact{Name: "tool", Kind: "bundle", Language: "go"}, catalogue.Artifact{Name: "web", Kind: "bundle", Language: "typescript"}, catalogue.Artifact{Name: "files", Kind: "archive"}) p, err := PlanOf(m) if err != nil { t.Fatal(err) } want := []Task{ {Artifact: "files", Kind: "archive", Module: GoBuildModule, Language: "go"}, {Artifact: "tool", Kind: "bundle", Module: GoBuildModule, Language: "go"}, {Artifact: "web", Kind: "bundle", Module: NodeBuildModule, Language: "typescript"}, } if len(p.Tasks) != len(want) { t.Fatalf("tasks = %+v, want %+v", p.Tasks, want) } for i := range want { if p.Tasks[i] != want[i] { t.Errorf("task %d = %+v, want %+v", i, p.Tasks[i], want[i]) } } if modules := p.Modules(); len(modules) != 2 || modules[0] != GoBuildModule || modules[1] != NodeBuildModule { t.Errorf("modules = %v", modules) } } func TestPlanRefusesImageUpstreamAndPackageByName(t *testing.T) { // 1607/AC2, ADR 0478 clause 2 for _, c := range []struct { artifact catalogue.Artifact kind string }{ {catalogue.Artifact{Name: "img", Kind: "image"}, "image"}, {catalogue.Artifact{Name: "up", Kind: "upstream"}, "upstream"}, {catalogue.Artifact{Name: "pkg", Kind: "package", Language: "typescript"}, "package"}, } { m := manifestOf(catalogue.Artifact{Name: "ok", Kind: "archive"}, c.artifact) p, err := PlanOf(m) if err == nil { t.Errorf("%s: plan %+v, want a refusal", c.kind, p) continue } var r *Refused if !asRefused(err, &r) || !strings.HasPrefix(err.Error(), RefusedPrefix) || !strings.Contains(err.Error(), c.kind) || !strings.Contains(err.Error(), "build-agent") { t.Errorf("%s: error = %v, want it to open %q and name the kind and build-agent", c.kind, err, RefusedPrefix) } } } func TestPlanRefusesABundleOfAnotherLanguageAndAModuleWithNoArtifact(t *testing.T) { if _, err := PlanOf(manifestOf(catalogue.Artifact{Name: "x", Kind: "bundle", Language: "python"})); err == nil || !strings.HasPrefix(err.Error(), RefusedPrefix) { t.Errorf("a python bundle: error = %v, want a refusal", err) } p, err := PlanOf(manifestOf()) if err != nil || len(p.Tasks) != 0 { t.Errorf("no artifact: plan %+v error %v, want an empty plan", p, err) } } func asRefused(err error, target **Refused) bool { return errors.As(err, target) }