| package views |
| |
| import ( |
| "encoding/json" |
| "strings" |
| "testing" |
| |
| "github.com/hashicorp/terraform/internal/command/arguments" |
| "github.com/hashicorp/terraform/internal/terminal" |
| "github.com/hashicorp/terraform/internal/tfdiags" |
| ) |
| |
| func TestValidateHuman(t *testing.T) { |
| testCases := map[string]struct { |
| diag tfdiags.Diagnostic |
| wantSuccess bool |
| wantSubstring string |
| }{ |
| "success": { |
| nil, |
| true, |
| "The configuration is valid.", |
| }, |
| "warning": { |
| tfdiags.Sourceless( |
| tfdiags.Warning, |
| "Your shoelaces are untied", |
| "Watch out, or you'll trip!", |
| ), |
| true, |
| "The configuration is valid, but there were some validation warnings", |
| }, |
| "error": { |
| tfdiags.Sourceless( |
| tfdiags.Error, |
| "Configuration is missing random_pet", |
| "Every configuration should have a random_pet.", |
| ), |
| false, |
| "Error: Configuration is missing random_pet", |
| }, |
| } |
| for name, tc := range testCases { |
| t.Run(name, func(t *testing.T) { |
| streams, done := terminal.StreamsForTesting(t) |
| view := NewView(streams) |
| view.Configure(&arguments.View{NoColor: true}) |
| v := NewValidate(arguments.ViewHuman, view) |
| |
| var diags tfdiags.Diagnostics |
| |
| if tc.diag != nil { |
| diags = diags.Append(tc.diag) |
| } |
| |
| ret := v.Results(diags) |
| |
| if tc.wantSuccess && ret != 0 { |
| t.Errorf("expected 0 return code, got %d", ret) |
| } else if !tc.wantSuccess && ret != 1 { |
| t.Errorf("expected 1 return code, got %d", ret) |
| } |
| |
| got := done(t).All() |
| if strings.Contains(got, "Success!") != tc.wantSuccess { |
| t.Errorf("unexpected output:\n%s", got) |
| } |
| if !strings.Contains(got, tc.wantSubstring) { |
| t.Errorf("expected output to include %q, but was:\n%s", tc.wantSubstring, got) |
| } |
| }) |
| } |
| } |
| |
| func TestValidateJSON(t *testing.T) { |
| testCases := map[string]struct { |
| diag tfdiags.Diagnostic |
| wantSuccess bool |
| }{ |
| "success": { |
| nil, |
| true, |
| }, |
| "warning": { |
| tfdiags.Sourceless( |
| tfdiags.Warning, |
| "Your shoelaces are untied", |
| "Watch out, or you'll trip!", |
| ), |
| true, |
| }, |
| "error": { |
| tfdiags.Sourceless( |
| tfdiags.Error, |
| "Configuration is missing random_pet", |
| "Every configuration should have a random_pet.", |
| ), |
| false, |
| }, |
| } |
| for name, tc := range testCases { |
| t.Run(name, func(t *testing.T) { |
| streams, done := terminal.StreamsForTesting(t) |
| view := NewView(streams) |
| view.Configure(&arguments.View{NoColor: true}) |
| v := NewValidate(arguments.ViewJSON, view) |
| |
| var diags tfdiags.Diagnostics |
| |
| if tc.diag != nil { |
| diags = diags.Append(tc.diag) |
| } |
| |
| ret := v.Results(diags) |
| |
| if tc.wantSuccess && ret != 0 { |
| t.Errorf("expected 0 return code, got %d", ret) |
| } else if !tc.wantSuccess && ret != 1 { |
| t.Errorf("expected 1 return code, got %d", ret) |
| } |
| |
| got := done(t).All() |
| |
| // Make sure the result looks like JSON; we comprehensively test |
| // the structure of this output in the command package tests. |
| var result map[string]interface{} |
| |
| if err := json.Unmarshal([]byte(got), &result); err != nil { |
| t.Fatal(err) |
| } |
| }) |
| } |
| } |