From 5a6ee5c1caf9873b440bb06739d4b067229dbc8f Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Mon, 2 Dec 2024 12:16:37 +0100 Subject: [PATCH] pkg: add new `manifesttest` package with test helpers This commit adds a new `manifesttest` that helps sharing code when testing generated osbuild manifests. --- internal/manifesttest/manifesttest.go | 27 +++++++++++++++++ internal/manifesttest/manifesttest_test.go | 35 ++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 internal/manifesttest/manifesttest.go create mode 100644 internal/manifesttest/manifesttest_test.go diff --git a/internal/manifesttest/manifesttest.go b/internal/manifesttest/manifesttest.go new file mode 100644 index 0000000..47b3e3a --- /dev/null +++ b/internal/manifesttest/manifesttest.go @@ -0,0 +1,27 @@ +package manifesttest + +import ( + "encoding/json" + "fmt" +) + +// PipelineNamesFrom will return all pipeline names from an osbuild +// json manifest. It will error on missing pipelines. +// +// TODO: move to images:pkg/manifesttest +func PipelineNamesFrom(osbuildManifest []byte) ([]string, error) { + var manifest map[string]interface{} + + if err := json.Unmarshal(osbuildManifest, &manifest); err != nil { + return nil, fmt.Errorf("cannot unmarshal manifest: %w", err) + } + if manifest["pipelines"] == nil { + return nil, fmt.Errorf("cannot find any pipelines in %v", manifest) + } + pipelines := manifest["pipelines"].([]interface{}) + pipelineNames := make([]string, len(pipelines)) + for idx, pi := range pipelines { + pipelineNames[idx] = pi.(map[string]interface{})["name"].(string) + } + return pipelineNames, nil +} diff --git a/internal/manifesttest/manifesttest_test.go b/internal/manifesttest/manifesttest_test.go new file mode 100644 index 0000000..ac73130 --- /dev/null +++ b/internal/manifesttest/manifesttest_test.go @@ -0,0 +1,35 @@ +package manifesttest_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/osbuild/image-builder-cli/internal/manifesttest" +) + +var fakeOsbuildManifest = `{ + "version": "2", + "pipelines": [ + { + "name": "noop" + }, + { + "name": "noop2" + } + ] +}` + +func TestPipelineNamesFrom(t *testing.T) { + names, err := manifesttest.PipelineNamesFrom([]byte(fakeOsbuildManifest)) + assert.NoError(t, err) + assert.Equal(t, []string{"noop", "noop2"}, names) +} + +func TestPipelineNamesFromSad(t *testing.T) { + _, err := manifesttest.PipelineNamesFrom([]byte("bad-json")) + assert.ErrorContains(t, err, "cannot unmarshal manifest: invalid char") + + _, err = manifesttest.PipelineNamesFrom([]byte("{}")) + assert.ErrorContains(t, err, "cannot find any pipelines in map[]") +}