// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: BUSL-1.1 package configs import ( "testing" "github.com/google/go-cmp/cmp" "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/hclsyntax" ) func TestTestRun_Validate(t *testing.T) { tcs := map[string]struct { expectedFailures []string diagnostic string }{ "empty": {}, "supports_expected": { expectedFailures: []string{ "check.expected_check", "var.expected_var", "output.expected_output", "test_resource.resource", "resource.test_resource.resource", "data.test_resource.resource", }, }, "count": { expectedFailures: []string{ "count.index", }, diagnostic: "You cannot expect failures from count.index. You can only expect failures from checkable objects such as input variables, output values, check blocks, managed resources and data sources.", }, "foreach": { expectedFailures: []string{ "each.key", }, diagnostic: "You cannot expect failures from each.key. You can only expect failures from checkable objects such as input variables, output values, check blocks, managed resources and data sources.", }, "local": { expectedFailures: []string{ "local.value", }, diagnostic: "You cannot expect failures from local.value. You can only expect failures from checkable objects such as input variables, output values, check blocks, managed resources and data sources.", }, "module": { expectedFailures: []string{ "module.my_module", }, diagnostic: "You cannot expect failures from module.my_module. You can only expect failures from checkable objects such as input variables, output values, check blocks, managed resources and data sources.", }, "path": { expectedFailures: []string{ "path.walk", }, diagnostic: "You cannot expect failures from path.walk. You can only expect failures from checkable objects such as input variables, output values, check blocks, managed resources and data sources.", }, } for name, tc := range tcs { t.Run(name, func(t *testing.T) { run := &TestRun{} for _, addr := range tc.expectedFailures { run.ExpectFailures = append(run.ExpectFailures, parseTraversal(t, addr)) } diags := run.Validate(nil) if len(diags) > 1 { t.Fatalf("too many diags: %d", len(diags)) } if len(tc.diagnostic) == 0 { if len(diags) != 0 { t.Fatalf("expected no diags but got: %s", diags[0].Description().Detail) } return } if diff := cmp.Diff(tc.diagnostic, diags[0].Description().Detail); len(diff) > 0 { t.Fatalf("unexpected diff:\n%s", diff) } }) } } func parseTraversal(t *testing.T, addr string) hcl.Traversal { t.Helper() traversal, diags := hclsyntax.ParseTraversalAbs([]byte(addr), "", hcl.InitialPos) if diags.HasErrors() { t.Fatalf("invalid address: %s", diags.Error()) } return traversal }