delivery.NamedTree hashes the manifest digest with each named path's git object; catalogue.Manifest.NamedPaths gives the union of the paths, only when every artifact names some. The named: prefix keeps the value apart from a git tree id.
68 lines
4.0 KiB
Go
68 lines
4.0 KiB
Go
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)
|
|
}
|
|
}
|