// Copyright 2025 Stefan Prodan.
// SPDX-License-Identifier: AGPL-3.0
package main
import (
"os"
"testing"
. "github.com/onsi/gomega"
)
/*
To regenerate a golden file:
make cli-build
./bin/flux-operator-cli build resourceset \
-f cmd/cli/testdata/build_resourceset/rset-with-rsip.yaml \
--inputs-from-provider cmd/cli/testdata/build_resourceset/rsip.yaml \
> cmd/cli/testdata/build_resourceset/golden.yaml
*/
func TestBuildResourceSetCmd(t *testing.T) {
tests := []struct {
name string
args []string
goldenFile string
expectError string
}{
{
name: "standalone resourceset",
args: []string{"build", "resourceset", "-f", "testdata/build_resourceset/rset-standalone.yaml"},
goldenFile: "testdata/build_resourceset/golden.yaml",
},
{
name: "resourceset with input provider",
args: []string{"build", "resourceset", "-f", "testdata/build_resourceset/rset-with-rsip.yaml", "--inputs-from-provider", "testdata/build_resourceset/rsip.yaml"},
goldenFile: "testdata/build_resourceset/golden.yaml",
},
{
name: "resourceset with input provider and permutations",
args: []string{"build", "resourceset", "-f", "testdata/build_resourceset/rset-with-rsip-permuted.yaml", "--inputs-from-provider", "testdata/build_resourceset/rsip.yaml"},
goldenFile: "testdata/build_resourceset/golden-permuted.yaml",
},
{
name: "no filename flag",
args: []string{"build", "resourceset"},
expectError: "--filename is required",
},
{
name: "invalid filename",
args: []string{"build", "resourceset", "-f", "nonexistent.yaml"},
expectError: "must point to an existing file",
},
{
name: "resourceset with inputsFrom but no provider",
args: []string{"build", "resourceset", "-f", "testdata/build_resourceset/rset-with-rsip.yaml"},
expectError: "please provide the inputs with --inputs-from",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
g := NewWithT(t)
output, err := executeCommand(tt.args)
if tt.expectError != "" {
g.Expect(err).To(HaveOccurred())
g.Expect(err.Error()).To(ContainSubstring(tt.expectError))
return
}
g.Expect(err).ToNot(HaveOccurred())
g.Expect(output).ToNot(BeEmpty())
// Read expected golden output
expectedBytes, err := os.ReadFile(tt.goldenFile)
g.Expect(err).ToNot(HaveOccurred())
expected := string(expectedBytes)
g.Expect(output).To(MatchYAML(expected))
})
}
}
func TestBuildResourceSetCmdWithInputsFile(t *testing.T) {
g := NewWithT(t)
rsetFile := "testdata/build_resourceset/rset-with-rsip.yaml"
inputsFile := "testdata/build_resourceset/inputs.yaml"
// Execute command with inputs file
output, err := executeCommand([]string{"build", "rset", "-f", rsetFile, "--inputs-from", inputsFile})
g.Expect(err).ToNot(HaveOccurred())
g.Expect(output).ToNot(BeEmpty())
// Read expected golden output
expectedBytes, err := os.ReadFile("testdata/build_resourceset/golden.yaml")
g.Expect(err).ToNot(HaveOccurred())
expected := string(expectedBytes)
g.Expect(output).To(Equal(expected))
}
func TestBuildResourceSetCmdWithInputsFromProviderWithLabels(t *testing.T) {
g := NewWithT(t)
rsetFile := "testdata/build_resourceset/rset-with-rsip-labeled.yaml"
inputsFile := "testdata/build_resourceset/rsip-labeled.yaml"
// Execute command with inputs file
output, err := executeCommand([]string{"build", "rset", "-f", rsetFile, "--inputs-from-provider", inputsFile})
g.Expect(err).ToNot(HaveOccurred())
g.Expect(output).ToNot(BeEmpty())
// Read expected golden output
expectedBytes, err := os.ReadFile("testdata/build_resourceset/golden-labeled.yaml")
g.Expect(err).ToNot(HaveOccurred())
expected := string(expectedBytes)
g.Expect(output).To(Equal(expected))
}
func TestBuildResourceSetCmdWithInputsFromProviderWithNames(t *testing.T) {
g := NewWithT(t)
rsetFile := "testdata/build_resourceset/rset-with-rsip-named.yaml"
inputsFile := "testdata/build_resourceset/rsip-named.yaml"
// Execute command with inputs file
output, err := executeCommand([]string{"build", "rset", "-f", rsetFile, "--inputs-from-provider", inputsFile})
g.Expect(err).ToNot(HaveOccurred())
g.Expect(output).ToNot(BeEmpty())
// Read expected golden output
expectedBytes, err := os.ReadFile("testdata/build_resourceset/golden-named.yaml")
g.Expect(err).ToNot(HaveOccurred())
expected := string(expectedBytes)
g.Expect(output).To(Equal(expected))
}