package main
import (
"bytes"
"io/fs"
"testing"
"testing/fstest"
"github.com/google/go-cmp/cmp"
)
func TestProduceManifest(t *testing.T) {
type Expectation struct {
MF string
Error string
}
tests := []struct {
Name string
FS fs.FS
Expectation Expectation
}{
{
Name: "happy path",
FS: fstest.MapFS{
"c1/metadata.yaml": &fstest.MapFile{Data: []byte("helm-component: c1")},
"c1/imgnames.txt": &fstest.MapFile{Data: []byte("failthis\nimgc1:v1")},
"c2/metadata.yaml": &fstest.MapFile{Data: []byte("helm-component: c2.nested")},
"c2/imgnames.txt": &fstest.MapFile{Data: []byte("failthis\nimgc2:v2\n\n")},
"c20/metadata.yaml": &fstest.MapFile{Data: []byte("helm-component: c2.other")},
"c20/imgnames.txt": &fstest.MapFile{Data: []byte("failthis\nimgc2:v2\n\n")},
},
Expectation: Expectation{
MF: `components:
c1:
version: v1
c2:
nested:
version: v2
other:
version: v2
`,
},
},
{
Name: "imgnames only",
FS: fstest.MapFS{
"c1/imgnames.txt": &fstest.MapFile{Data: []byte("imgc1")},
},
Expectation: Expectation{MF: "components:\n"},
},
{
Name: "incomplete metadata",
FS: fstest.MapFS{
"c1/metadata.yaml": &fstest.MapFile{Data: []byte("")},
"c1/imgnames.txt": &fstest.MapFile{Data: []byte("failthis\nimgc1")},
},
Expectation: Expectation{MF: "components:\n"},
},
{
Name: "missing imgnames",
FS: fstest.MapFS{
"c1/metadata.yaml": &fstest.MapFile{Data: []byte("helm-component: foobar")},
},
Expectation: Expectation{Error: "cannot read image names for c1/metadata.yaml: open c1/imgnames.txt: file does not exist"},
},
{
Name: "broken metadata",
FS: fstest.MapFS{
"c1/metadata.yaml": &fstest.MapFile{Data: []byte("invalid YAML")},
"c1/imgnames.txt": &fstest.MapFile{Data: []byte("failthis\nimgc1")},
},
Expectation: Expectation{Error: "cannot unmarshal c1/metadata.yaml: yaml: unmarshal errors:\n line 1: cannot unmarshal !!str `invalid...` into main.MD"},
},
{
Name: "invalid image name",
FS: fstest.MapFS{
"c1/metadata.yaml": &fstest.MapFile{Data: []byte("helm-component: foobar")},
"c1/imgnames.txt": &fstest.MapFile{Data: []byte("failthis\nimgc1")},
},
Expectation: Expectation{Error: "invalid image format: imgc1"},
},
}
for _, test := range tests {
t.Run(test.Name, func(t *testing.T) {
buf := bytes.NewBuffer(nil)
err := produceManifest(buf, test.FS)
var act Expectation
if err != nil {
act.Error = err.Error()
} else {
act.MF = buf.String()
}
if diff := cmp.Diff(test.Expectation, act); diff != "" {
t.Errorf("produceManifest() mismatch (-want +got):\n%s", diff)
}
})
}
}