package output import ( "bytes" "fmt" "regexp" "testing" "github.com/yannh/kubeconform/pkg/resource" "github.com/yannh/kubeconform/pkg/validator" ) func TestJunitWrite(t *testing.T) { for _, testCase := range []struct { name string withSummary bool isStdin bool verbose bool results []validator.Result expect string }{ { "an empty result", true, false, false, []validator.Result{}, "\n", }, { "a single deployment, summary, no verbose", true, false, false, []validator.Result{ { Resource: resource.Resource{ Path: "deployment.yml", Bytes: []byte(`apiVersion: apps/v1 kind: Deployment metadata: name: "my-app" `), }, Status: validator.Valid, Err: nil, }, }, "\n" + " \n" + " \n" + " \n" + "\n", }, { "a deployment, an empty resource, summary, no verbose", true, false, false, []validator.Result{ { Resource: resource.Resource{ Path: "deployment.yml", Bytes: []byte(`apiVersion: apps/v1 kind: Deployment metadata: name: "my-app" `), }, Status: validator.Valid, Err: nil, }, { Resource: resource.Resource{ Path: "deployment.yml", Bytes: []byte(`#A single comment`), }, Status: validator.Empty, Err: nil, }, }, "\n" + " \n" + " \n" + " \n" + "\n", }, { "one error, one invalid", true, false, false, []validator.Result{ { Resource: resource.Resource{ Path: "deployment.yml", Bytes: []byte(`apiVersion: apps/v1 kind: Deployment metadata: name: "my-app" `), }, Status: validator.Error, Err: fmt.Errorf("error validating deployment.yml"), }, { Resource: resource.Resource{ Path: "deployment2.yml", Bytes: []byte(`apiVersion: apps/v1 kind: Deployment metadata: name: "my-app" `), }, Status: validator.Error, Err: fmt.Errorf("error validating deployment.yml"), }, { Resource: resource.Resource{ Path: "deployment3.yml", Bytes: []byte(`apiVersion: apps/v1 kind: Deployment metadata: name: "my-app" `), }, Status: validator.Invalid, Err: fmt.Errorf("deployment3.yml is invalid"), }, }, "\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "\n", }, } { w := new(bytes.Buffer) o := junitOutput(w, testCase.withSummary, testCase.isStdin, testCase.verbose) for _, res := range testCase.results { o.Write(res) } o.Flush() // We remove the time, which will be different every time, before the comparison output := w.String() r := regexp.MustCompile(`time="[^"]*"`) output = r.ReplaceAllString(output, "time=\"\"") if output != testCase.expect { t.Errorf("%s - expected:, got:\n%s\n%s", testCase.name, testCase.expect, output) } } }