terraform/internal/tfdiags/hcl_test.go

100 lines
2.6 KiB
Go

package tfdiags
import (
"fmt"
"testing"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
"github.com/hashicorp/hcl/v2"
"github.com/zclconf/go-cty/cty"
)
func TestDiagnosticsToHCL(t *testing.T) {
var diags Diagnostics
diags = diags.Append(Sourceless(
Error,
"A sourceless diagnostic",
"...that has a detail",
))
diags = diags.Append(fmt.Errorf("a diagnostic promoted from an error"))
diags = diags.Append(SimpleWarning("A diagnostic from a simple warning"))
diags = diags.Append(&hcl.Diagnostic{
Severity: hcl.DiagWarning,
Summary: "A diagnostic from HCL",
Detail: "...that has a detail and source information",
Subject: &hcl.Range{
Filename: "test.tf",
Start: hcl.Pos{Line: 1, Column: 2, Byte: 1},
End: hcl.Pos{Line: 1, Column: 3, Byte: 2},
},
Context: &hcl.Range{
Filename: "test.tf",
Start: hcl.Pos{Line: 1, Column: 1, Byte: 0},
End: hcl.Pos{Line: 1, Column: 4, Byte: 3},
},
EvalContext: &hcl.EvalContext{},
Expression: &fakeHCLExpression{},
})
got := diags.ToHCL()
want := hcl.Diagnostics{
{
Severity: hcl.DiagError,
Summary: "A sourceless diagnostic",
Detail: "...that has a detail",
},
{
Severity: hcl.DiagError,
Summary: "a diagnostic promoted from an error",
},
{
Severity: hcl.DiagWarning,
Summary: "A diagnostic from a simple warning",
},
{
Severity: hcl.DiagWarning,
Summary: "A diagnostic from HCL",
Detail: "...that has a detail and source information",
Subject: &hcl.Range{
Filename: "test.tf",
Start: hcl.Pos{Line: 1, Column: 2, Byte: 1},
End: hcl.Pos{Line: 1, Column: 3, Byte: 2},
},
Context: &hcl.Range{
Filename: "test.tf",
Start: hcl.Pos{Line: 1, Column: 1, Byte: 0},
End: hcl.Pos{Line: 1, Column: 4, Byte: 3},
},
EvalContext: &hcl.EvalContext{},
Expression: &fakeHCLExpression{},
},
}
if diff := cmp.Diff(want, got, cmpopts.IgnoreUnexported(hcl.EvalContext{})); diff != "" {
t.Errorf("incorrect result\n%s", diff)
}
}
// We have this here just to give us something easy to compare in the test
// above, because we only care that the expression passes through, not about
// how exactly it is shaped.
type fakeHCLExpression struct {
}
func (e *fakeHCLExpression) Range() hcl.Range {
return hcl.Range{}
}
func (e *fakeHCLExpression) StartRange() hcl.Range {
return hcl.Range{}
}
func (e *fakeHCLExpression) Variables() []hcl.Traversal {
return nil
}
func (e *fakeHCLExpression) Value(ctx *hcl.EvalContext) (cty.Value, hcl.Diagnostics) {
return cty.DynamicVal, nil
}