From 9be399d49c2521ccb3b7dafb8d5eab227b6910fa Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Fri, 2 Feb 2018 17:40:28 -0800 Subject: [PATCH] configs: Another simple test for _invalid_ config files Much like TestParserLoadConfigFileSuccess, this is intended to be an easy-to-maintain collection of bad examples to test different permutations of our error handling. As with TestParserLoadConfigFileSuccess, we should also have more specific tests alongside this that check that the error outcome is what was expected, since this test just accepts any error and may thus not be testing what we think it is. --- configs/parser_config_test.go | 101 ++++++++++++++++++ .../invalid-files/data-resource-lifecycle.tf | 5 + .../resource-lifecycle-badbool.tf | 5 + .../invalid-files/unexpected-attr.tf | 1 + .../invalid-files/unexpected-block.tf | 2 + .../invalid-files/variable-type-quoted.tf | 3 + .../invalid-files/variable-type-unknown.tf | 3 + .../invalid-files/zerolen.tf.json | 0 8 files changed, 120 insertions(+) create mode 100644 configs/test-fixtures/invalid-files/data-resource-lifecycle.tf create mode 100644 configs/test-fixtures/invalid-files/resource-lifecycle-badbool.tf create mode 100644 configs/test-fixtures/invalid-files/unexpected-attr.tf create mode 100644 configs/test-fixtures/invalid-files/unexpected-block.tf create mode 100644 configs/test-fixtures/invalid-files/variable-type-quoted.tf create mode 100644 configs/test-fixtures/invalid-files/variable-type-unknown.tf create mode 100644 configs/test-fixtures/invalid-files/zerolen.tf.json 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