diff --git a/configs/parser_config_test.go b/configs/parser_config_test.go index affc946267..2f118933cd 100644 --- a/configs/parser_config_test.go +++ b/configs/parser_config_test.go @@ -4,6 +4,8 @@ import ( "io/ioutil" "path/filepath" "testing" + + "github.com/hashicorp/hcl2/hcl" ) // TestParseLoadConfigFileSuccess is a simple test that just verifies that @@ -41,3 +43,102 @@ func TestParserLoadConfigFileSuccess(t *testing.T) { }) } } + +// TestParseLoadConfigFileFailure is a simple test that just verifies that +// a number of test configuration files (in test-fixtures/invalid-files) +// produce errors as expected. +// +// This test does not verify specific error messages, so more detailed +// assertions should be made on some subset of these configuration files in +// other tests. +func TestParserLoadConfigFileFailure(t *testing.T) { + files, err := ioutil.ReadDir("test-fixtures/invalid-files") + if err != nil { + t.Fatal(err) + } + + for _, info := range files { + name := info.Name() + t.Run(name, func(t *testing.T) { + src, err := ioutil.ReadFile(filepath.Join("test-fixtures/invalid-files", name)) + if err != nil { + t.Fatal(err) + } + + parser := testParser(map[string]string{ + name: string(src), + }) + + _, diags := parser.LoadConfigFile(name) + if !diags.HasErrors() { + t.Errorf("LoadConfigFile succeeded; want errors") + } + for _, diag := range diags { + t.Logf("- %s", diag) + } + }) + } +} + +// This test uses a subset of the same fixture files as +// TestParserLoadConfigFileFailure, but additionally verifies that each +// file produces the expected diagnostic summary. +func TestParserLoadConfigFileFailureMessages(t *testing.T) { + tests := []struct { + Filename string + WantError string + }{ + { + "data-resource-lifecycle.tf", + "Unsupported lifecycle block", + }, + { + "variable-type-unknown.tf", + "Invalid variable type hint", + }, + { + "variable-type-quoted.tf", + "Invalid variable type hint", + }, + { + "unexpected-attr.tf", + "Unsupported attribute", + }, + { + "unexpected-block.tf", + "Unsupported block type", + }, + { + "resource-lifecycle-badbool.tf", + "Unsuitable value type", + }, + } + + for _, test := range tests { + t.Run(test.Filename, func(t *testing.T) { + src, err := ioutil.ReadFile(filepath.Join("test-fixtures/invalid-files", test.Filename)) + if err != nil { + t.Fatal(err) + } + + parser := testParser(map[string]string{ + test.Filename: string(src), + }) + + _, diags := parser.LoadConfigFile(test.Filename) + if len(diags) != 1 { + t.Errorf("Wrong number of diagnostics %d; want 1", len(diags)) + for _, diag := range diags { + t.Logf("- %s", diag) + } + return + } + if diags[0].Severity != hcl.DiagError { + t.Errorf("Wrong diagnostic severity %s; want %s", diags[0].Severity, hcl.DiagError) + } + if diags[0].Summary != test.WantError { + t.Errorf("Wrong diagnostic summary\ngot: %s\nwant: %s", diags[0].Summary, test.WantError) + } + }) + } +} diff --git a/configs/test-fixtures/invalid-files/data-resource-lifecycle.tf b/configs/test-fixtures/invalid-files/data-resource-lifecycle.tf new file mode 100644 index 0000000000..b0c34d4633 --- /dev/null +++ b/configs/test-fixtures/invalid-files/data-resource-lifecycle.tf @@ -0,0 +1,5 @@ +data "example" "example" { + lifecycle { + # This block intentionally left blank + } +} diff --git a/configs/test-fixtures/invalid-files/resource-lifecycle-badbool.tf b/configs/test-fixtures/invalid-files/resource-lifecycle-badbool.tf new file mode 100644 index 0000000000..fdddb69445 --- /dev/null +++ b/configs/test-fixtures/invalid-files/resource-lifecycle-badbool.tf @@ -0,0 +1,5 @@ +resource "example" "example" { + lifecycle { + create_before_destroy = "ABSOLUTELY NOT" + } +} diff --git a/configs/test-fixtures/invalid-files/unexpected-attr.tf b/configs/test-fixtures/invalid-files/unexpected-attr.tf new file mode 100644 index 0000000000..5abc475eb9 --- /dev/null +++ b/configs/test-fixtures/invalid-files/unexpected-attr.tf @@ -0,0 +1 @@ +foo = "bar" diff --git a/configs/test-fixtures/invalid-files/unexpected-block.tf b/configs/test-fixtures/invalid-files/unexpected-block.tf new file mode 100644 index 0000000000..491173c386 --- /dev/null +++ b/configs/test-fixtures/invalid-files/unexpected-block.tf @@ -0,0 +1,2 @@ +varyable "whoops" { +} diff --git a/configs/test-fixtures/invalid-files/variable-type-quoted.tf b/configs/test-fixtures/invalid-files/variable-type-quoted.tf new file mode 100644 index 0000000000..15db803f23 --- /dev/null +++ b/configs/test-fixtures/invalid-files/variable-type-quoted.tf @@ -0,0 +1,3 @@ +variable "bad_type" { + type = "string" +} diff --git a/configs/test-fixtures/invalid-files/variable-type-unknown.tf b/configs/test-fixtures/invalid-files/variable-type-unknown.tf new file mode 100644 index 0000000000..bcbb88d908 --- /dev/null +++ b/configs/test-fixtures/invalid-files/variable-type-unknown.tf @@ -0,0 +1,3 @@ +variable "bad_type" { + type = notatype +} diff --git a/configs/test-fixtures/invalid-files/zerolen.tf.json b/configs/test-fixtures/invalid-files/zerolen.tf.json new file mode 100644 index 0000000000..e69de29bb2