236 lines
5.2 KiB
Go
236 lines
5.2 KiB
Go
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/snyk/driftctl/pkg/cmd/scan/output"
|
|
"github.com/snyk/driftctl/pkg/iac/config"
|
|
)
|
|
|
|
func Test_parseFromFlag(t *testing.T) {
|
|
type args struct {
|
|
from []string
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
want []config.SupplierConfig
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "test complete from parsing",
|
|
args: args{
|
|
from: []string{"tfstate+s3://bucket/path/to/state.tfstate"},
|
|
},
|
|
want: []config.SupplierConfig{
|
|
{
|
|
Key: "tfstate",
|
|
Backend: "s3",
|
|
Path: "bucket/path/to/state.tfstate",
|
|
},
|
|
},
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "test complete from parsing with multiples flags",
|
|
args: args{
|
|
from: []string{"tfstate+s3://bucket/path/to/state.tfstate", "tfstate:///tmp/my-state.tfstate"},
|
|
},
|
|
want: []config.SupplierConfig{
|
|
{
|
|
Key: "tfstate",
|
|
Backend: "s3",
|
|
Path: "bucket/path/to/state.tfstate",
|
|
},
|
|
{
|
|
Key: "tfstate",
|
|
Backend: "",
|
|
Path: "/tmp/my-state.tfstate",
|
|
},
|
|
},
|
|
wantErr: false,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got, err := parseFromFlag(tt.args.from)
|
|
if (err != nil) != tt.wantErr {
|
|
t.Errorf("parseFromFlag() error = %v, err %v", err, tt.wantErr)
|
|
return
|
|
}
|
|
if !reflect.DeepEqual(got, tt.want) {
|
|
t.Errorf("parseFromFlag() got = %v, want %v", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func Test_parseOutputFlag(t *testing.T) {
|
|
type args struct {
|
|
out []string
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
want []output.OutputConfig
|
|
err error
|
|
}{
|
|
{
|
|
name: "test empty output",
|
|
args: args{
|
|
out: []string{""},
|
|
},
|
|
want: []output.OutputConfig{},
|
|
err: fmt.Errorf("Unable to parse output flag '': \nAccepted formats are: console://,html://PATH/TO/FILE.html,json://PATH/TO/FILE.json,plan://PATH/TO/FILE.json"),
|
|
},
|
|
{
|
|
name: "test empty array",
|
|
args: args{
|
|
out: []string{},
|
|
},
|
|
want: []output.OutputConfig{},
|
|
err: nil,
|
|
},
|
|
{
|
|
name: "test invalid",
|
|
args: args{
|
|
out: []string{"sdgjsdgjsdg"},
|
|
},
|
|
want: []output.OutputConfig{},
|
|
err: fmt.Errorf("Unable to parse output flag 'sdgjsdgjsdg': \nAccepted formats are: console://,html://PATH/TO/FILE.html,json://PATH/TO/FILE.json,plan://PATH/TO/FILE.json"),
|
|
},
|
|
{
|
|
name: "test invalid",
|
|
args: args{
|
|
out: []string{"://"},
|
|
},
|
|
want: []output.OutputConfig{},
|
|
err: fmt.Errorf("Unable to parse output flag '://': \nAccepted formats are: console://,html://PATH/TO/FILE.html,json://PATH/TO/FILE.json,plan://PATH/TO/FILE.json"),
|
|
},
|
|
{
|
|
name: "test unsupported",
|
|
args: args{
|
|
out: []string{"foobar://"},
|
|
},
|
|
want: []output.OutputConfig{},
|
|
err: fmt.Errorf("Unsupported output 'foobar': \nValid formats are: console://,html://PATH/TO/FILE.html,json://PATH/TO/FILE.json,plan://PATH/TO/FILE.json"),
|
|
},
|
|
{
|
|
name: "test empty json",
|
|
args: args{
|
|
out: []string{"json://"},
|
|
},
|
|
want: []output.OutputConfig{},
|
|
err: fmt.Errorf("Invalid json output 'json://': \nMust be of kind: json://PATH/TO/FILE.json"),
|
|
},
|
|
{
|
|
name: "test valid console",
|
|
args: args{
|
|
out: []string{"console://"},
|
|
},
|
|
want: []output.OutputConfig{
|
|
{
|
|
Key: "console",
|
|
},
|
|
},
|
|
err: nil,
|
|
},
|
|
{
|
|
name: "test valid json",
|
|
args: args{
|
|
out: []string{"json:///tmp/foobar.json"},
|
|
},
|
|
want: []output.OutputConfig{
|
|
{
|
|
Key: "json",
|
|
Path: "/tmp/foobar.json",
|
|
},
|
|
},
|
|
err: nil,
|
|
},
|
|
{
|
|
name: "test empty jsonplan",
|
|
args: args{
|
|
out: []string{"plan://"},
|
|
},
|
|
want: []output.OutputConfig{},
|
|
err: fmt.Errorf("Invalid plan output 'plan://': \nMust be of kind: plan://PATH/TO/FILE.json"),
|
|
},
|
|
{
|
|
name: "test valid jsonplan",
|
|
args: args{
|
|
out: []string{"plan:///tmp/foobar.json"},
|
|
},
|
|
want: []output.OutputConfig{
|
|
{
|
|
Key: "plan",
|
|
Path: "/tmp/foobar.json",
|
|
},
|
|
},
|
|
err: nil,
|
|
},
|
|
{
|
|
name: "test multiple output values",
|
|
args: args{
|
|
out: []string{"console:///dev/stdout", "json://result.json"},
|
|
},
|
|
want: []output.OutputConfig{
|
|
{
|
|
Key: "console",
|
|
},
|
|
{
|
|
Key: "json",
|
|
Path: "result.json",
|
|
},
|
|
},
|
|
err: nil,
|
|
},
|
|
{
|
|
name: "test multiple output values with invalid value",
|
|
args: args{
|
|
out: []string{"console:///dev/stdout", "invalid://result.json"},
|
|
},
|
|
want: []output.OutputConfig{
|
|
{
|
|
Key: "console",
|
|
},
|
|
},
|
|
err: fmt.Errorf("Unsupported output 'invalid': \nValid formats are: console://,html://PATH/TO/FILE.html,json://PATH/TO/FILE.json,plan://PATH/TO/FILE.json"),
|
|
},
|
|
{
|
|
name: "test multiple valid output values",
|
|
args: args{
|
|
out: []string{"json://result1.json", "json://result2.json", "json://result3.json"},
|
|
},
|
|
want: []output.OutputConfig{
|
|
{
|
|
Key: "json",
|
|
Path: "result1.json",
|
|
},
|
|
{
|
|
Key: "json",
|
|
Path: "result2.json",
|
|
},
|
|
{
|
|
Key: "json",
|
|
Path: "result3.json",
|
|
},
|
|
},
|
|
err: nil,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got, err := parseOutputFlags(tt.args.out)
|
|
if err != nil && err.Error() != tt.err.Error() {
|
|
t.Fatalf("got error = '%v', expected '%v'", err, tt.err)
|
|
}
|
|
if !reflect.DeepEqual(got, tt.want) {
|
|
t.Fatalf("parseOutputFlag() got = '%v', want '%v'", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|