package catalogue import ( "strings" "testing" ) // An artifact names the paths it is built from with `paths` (novox/hq ADR 0499 clause 1): a package, or a bundle in a // language other than Go, may; a Go program's artifact, an archive, an image and an upstream artifact may not, and the // refusal names the artifact and its kind. Each path stays inside the module's directory: no `..`, no absolute path, // no pattern. func TestAnArtifactNamesThePathsItIsBuiltFrom(t *testing.T) { m, err := ParseManifest([]byte(`{"module":"mesh-sdk","version":"1","slug":"sdk","build":{"artifacts":[ {"name":"lib","kind":"package","language":"typescript", "paths":["src","test","package.json","package-lock.json","tsconfig.json"]}]},"resources":[]}`)) if err != nil { t.Fatalf("a package naming its paths was refused: %v", err) } if got := strings.Join(m.Build.Artifacts[0].Paths, ","); got != "src,test,package.json,package-lock.json,tsconfig.json" { t.Fatalf("the paths were not kept as written: %q", got) } if _, err := ParseManifest([]byte(`{"module":"a","version":"1","build":{"artifacts":[ {"name":"tools","kind":"bundle","language":"typescript","entrypoints":["index.js"],"loads":["index.js"],"paths":["src","package.json"]}]}}`)); err != nil { t.Fatalf("a TypeScript bundle naming its paths was refused: %v", err) } for _, c := range []struct{ artifact, says string }{ {`{"name":"x","kind":"bundle","language":"go","system":"linux-amd64","paths":["cmd"]}`, `"x" is a Go program`}, {`{"name":"x","kind":"archive","from":"files","paths":["files"]}`, `"x" is a "archive"`}, {`{"name":"x","kind":"image","from":"Dockerfile","paths":["src"]}`, `"x" is a "image"`}, {`{"name":"x","kind":"upstream","from":"nats:2.10","paths":["src"]}`, `"x" is a "upstream"`}, {`{"name":"x","kind":"package","language":"typescript","paths":["../other"]}`, "leaves the module's directory"}, {`{"name":"x","kind":"package","language":"typescript","paths":["src/../../x"]}`, "leaves the module's directory"}, {`{"name":"x","kind":"package","language":"typescript","paths":["/etc"]}`, "leaves the module's directory"}, {`{"name":"x","kind":"package","language":"typescript","paths":["src/*.ts"]}`, "is a pattern"}, {`{"name":"x","kind":"package","language":"typescript","paths":["src/[ab]"]}`, "is a pattern"}, {`{"name":"x","kind":"package","language":"typescript","paths":[""]}`, "names an empty path"}, {`{"name":"x","kind":"package","language":"typescript","paths":["."]}`, "names the module's whole directory"}, {`{"name":"x","kind":"package","language":"typescript","paths":[]}`, "names no path"}, } { _, err := ParseManifest([]byte(`{"module":"a","version":"1","build":{"artifacts":[` + c.artifact + `]}}`)) if err == nil || !strings.Contains(err.Error(), c.says) { t.Errorf("%s: %v, wanted a refusal saying %q", c.artifact, err, c.says) } } } // The paths a module's tree is taken from are the union its artifacts name, cleaned and sorted, and only when every // artifact names some (novox/hq ADR 0499 clause 2); a module with an artifact that names none, or with none at all, // keeps its directory's tree. func TestAModulesNamedPathsAreTheUnionWhenEveryArtifactNamesThem(t *testing.T) { m := Manifest{Module: "a", Build: &Build{Artifacts: []Artifact{ {Name: "lib", Kind: ArtifactPackage, Paths: []string{"src/", "package.json"}}, {Name: "tools", Kind: ArtifactBundle, Paths: []string{"./src", "tools"}}, }}} paths, every := m.NamedPaths() if !every || strings.Join(paths, ",") != "package.json,src,tools" { t.Fatalf("NamedPaths = %v, %v; want [package.json src tools], true", paths, every) } m.Build.Artifacts = append(m.Build.Artifacts, Artifact{Name: "img", Kind: ArtifactImage, From: "Dockerfile"}) if paths, every := m.NamedPaths(); every || paths != nil { t.Fatalf("a module with an artifact naming no path gave %v, %v", paths, every) } if paths, every := (Manifest{Module: "b"}).NamedPaths(); every || paths != nil { t.Fatalf("a module that builds nothing gave %v, %v", paths, every) } }