package main import ( "os" "path/filepath" "reflect" "testing" ) func catalogue(t *testing.T, manifests map[string]string) string { t.Helper() root := t.TempDir() for name, body := range manifests { dir := filepath.Join(root, "modules", name) if err := os.MkdirAll(dir, 0o755); err != nil { t.Fatal(err) } if err := os.WriteFile(filepath.Join(dir, "module.json"), []byte(body), 0o644); err != nil { t.Fatal(err) } } return root } func TestOnlyTheOwnerDeclaresAToolchainPackage(t *testing.T) { root := catalogue(t, map[string]string{ "go": `{"module":"go","resources":[{"id":"go","type":"package","package":"go"}]}`, "nodejs": `{"module":"nodejs","resources":[{"id":"nodejs","type":"package","package":"nodejs"},{"id":"npm","type":"package","package":"npm"}]}`, "lab": `{"module":"lab","resources":[{"id":"git","type":"package","package":"git"},{"id":"go","type":"package","package":"go"}]}`, "builder": `{"module":"builder","resources":[{"id":"n","type":"package","package":"nodejs"},{"id":"dir","type":"directory","path":"/go"}]}`, }) got, err := Check(root) if err != nil { t.Fatal(err) } want := []Finding{{Module: "builder", Package: "nodejs", Owner: "nodejs"}, {Module: "lab", Package: "go", Owner: "go"}} if !reflect.DeepEqual(got, want) { t.Errorf("found %v, want %v", got, want) } } func TestTheOwnersMustExistAndDeclareTheirPackages(t *testing.T) { root := catalogue(t, map[string]string{ "go": `{"module":"go","resources":[]}`, }) got, err := Check(root) if err != nil { t.Fatal(err) } if len(got) != 3 { t.Errorf("an owner missing its packages gave %v, want three findings (go, nodejs, npm)", got) } } // The catalogue as it stands: this is the check itself, run here too. func TestTheCatalogueGivesEachToolchainPackageToItsOwnerAlone(t *testing.T) { got, err := Check("../..") if err != nil { t.Fatal(err) } if len(got) != 0 { t.Errorf("the catalogue declares a toolchain package outside its owner: %v", got) } }