132 lines
3.1 KiB
Go
132 lines
3.1 KiB
Go
|
package cmd
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"io"
|
||
|
"os"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/snyk/driftctl/pkg"
|
||
|
"github.com/snyk/driftctl/pkg/cmd/scan/output"
|
||
|
"github.com/snyk/driftctl/test"
|
||
|
"github.com/spf13/cobra"
|
||
|
"github.com/stretchr/testify/assert"
|
||
|
"github.com/stretchr/testify/require"
|
||
|
)
|
||
|
|
||
|
func Test_runFmt_InvalidInput(t *testing.T) {
|
||
|
opts := &pkg.FmtOptions{
|
||
|
Output: output.OutputConfig{
|
||
|
Key: output.ConsoleOutputType,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
input, err := os.Open("testdata/fmt/input_stdin_invalid.json")
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
defer input.Close()
|
||
|
|
||
|
err = runFmt(opts, input)
|
||
|
require.NotNil(t, err)
|
||
|
assert.Equal(t, "invalid character 'i' looking for beginning of value", err.Error())
|
||
|
}
|
||
|
|
||
|
func Test_runFmt(t *testing.T) {
|
||
|
opts := &pkg.FmtOptions{
|
||
|
Output: output.OutputConfig{
|
||
|
Key: output.ConsoleOutputType,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
input, err := os.Open("testdata/fmt/input_stdin_valid.json")
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
defer input.Close()
|
||
|
|
||
|
stdout := os.Stdout // keep backup of the real stdout
|
||
|
stderr := os.Stderr // keep backup of the real stderr
|
||
|
r, w, _ := os.Pipe()
|
||
|
os.Stdout = w
|
||
|
os.Stderr = w
|
||
|
|
||
|
err = runFmt(opts, input)
|
||
|
|
||
|
outC := make(chan []byte)
|
||
|
// copy the output in a separate goroutine so printing can't block indefinitely
|
||
|
go func() {
|
||
|
var buf bytes.Buffer
|
||
|
_, _ = io.Copy(&buf, r)
|
||
|
outC <- buf.Bytes()
|
||
|
}()
|
||
|
|
||
|
// back to normal state
|
||
|
assert.Nil(t, w.Close())
|
||
|
os.Stdout = stdout // restoring the real stdout
|
||
|
os.Stderr = stderr
|
||
|
output := <-outC
|
||
|
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
expectedBytes, err := os.ReadFile("testdata/fmt/expected_console.txt")
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
assert.Equal(t, string(expectedBytes), string(output))
|
||
|
}
|
||
|
|
||
|
func TestFmtCmd_Valid(t *testing.T) {
|
||
|
rootCmd := &cobra.Command{Use: "root"}
|
||
|
scanCmd := NewFmtCmd(&pkg.FmtOptions{})
|
||
|
scanCmd.RunE = func(_ *cobra.Command, args []string) error { return nil }
|
||
|
rootCmd.AddCommand(scanCmd)
|
||
|
|
||
|
cases := []struct {
|
||
|
args []string
|
||
|
}{
|
||
|
{args: []string{"fmt"}},
|
||
|
{args: []string{"fmt", "-o", "json://test.json"}},
|
||
|
}
|
||
|
|
||
|
for _, tt := range cases {
|
||
|
t.Run("", func(t *testing.T) {
|
||
|
output, err := test.Execute(rootCmd, tt.args...)
|
||
|
if output != "" {
|
||
|
t.Errorf("Unexpected output: %v", output)
|
||
|
}
|
||
|
if err != nil {
|
||
|
t.Errorf("Unexpected error: %v", err)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestFmtCmd_Invalid(t *testing.T) {
|
||
|
cases := []struct {
|
||
|
args []string
|
||
|
expected string
|
||
|
}{
|
||
|
{args: []string{"fmt", "test"}, expected: `unknown command "test" for "root fmt"`},
|
||
|
{args: []string{"fmt", "-o", "json://test.json", "-o", "html://test.html"}, expected: "Only one output format can be set"},
|
||
|
{args: []string{"fmt", "-o", "foobar://barfoo"}, expected: "Unsupported output 'foobar': \nValid formats are: console://,html://PATH/TO/FILE.html,json://PATH/TO/FILE.json,plan://PATH/TO/FILE.json"},
|
||
|
}
|
||
|
|
||
|
for _, tt := range cases {
|
||
|
t.Run("", func(t *testing.T) {
|
||
|
rootCmd := &cobra.Command{Use: "root"}
|
||
|
rootCmd.AddCommand(NewFmtCmd(&pkg.FmtOptions{}))
|
||
|
_, err := test.Execute(rootCmd, tt.args...)
|
||
|
if err == nil {
|
||
|
t.Errorf("Invalid arg should generate error")
|
||
|
}
|
||
|
if err.Error() != tt.expected {
|
||
|
t.Errorf("Expected '%v', got '%v'", tt.expected, err)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
}
|