gitpod/install/installer/cmd/render_test.go
2022-12-08 13:05:19 -03:00

93 lines
2.0 KiB
Go

// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
/// Licensed under the GNU Affero General Public License (AGPL).
// See License.AGPL.txt in the project root for license information.
package cmd
import (
"flag"
"io/ioutil"
"os"
"testing"
"github.com/google/go-cmp/cmp"
"github.com/stretchr/testify/require"
)
var (
update = flag.Bool("update", false, "update the golden files of this test")
)
func init() {
// Ensure that the randomisation always returns the same values
rootOpts.SeedValue = 42
}
func TestMain(m *testing.M) {
flag.Parse()
os.Exit(m.Run())
}
func TestRender(t *testing.T) {
dir, err := ioutil.ReadDir("testdata/render")
require.NoError(t, err)
var testCases []struct {
Name string
}
for _, d := range dir {
if d.IsDir() {
testCases = append(testCases, struct{ Name string }{
Name: d.Name(),
})
}
}
for _, testCase := range testCases {
t.Run(testCase.Name, func(t *testing.T) {
// reset seed for each test case
setSeed()
rootOpts.VersionMF = "testdata/render/versions.yaml"
renderOpts.ConfigFN = "testdata/render/" + testCase.Name + "/config.yaml"
goldenPath := "testdata/render/" + testCase.Name + "/output.golden"
// Enable experimental config
renderOpts.UseExperimentalConfig = true
// Generate the YAML from the render function
yaml, err := renderFn()
require.NoError(t, err)
// Concatenate the []strings with a newline between
got := ""
for _, item := range yaml {
got += item + "\n"
}
if *update {
err := os.WriteFile(goldenPath, []byte(got), 0600)
require.NoError(t, err)
return
}
// Get the expected output from the golden file
f, err := os.OpenFile(goldenPath, os.O_RDWR, 0644)
defer f.Close()
require.NoError(t, err)
content, err := ioutil.ReadAll(f)
if err != nil {
require.NoError(t, err)
}
// Compare
if diff := cmp.Diff(string(content), got); diff != "" {
t.Errorf("non-matching golden file %s (-want +got):\n%s", testCase.Name, diff)
}
})
}
}