tfdiags: Restructure tests into subtests

This commit is contained in:
Radek Simko 2018-11-14 11:45:04 +00:00
parent 2a6ad820bb
commit 547006d943
No known key found for this signature in database
GPG Key ID: 1F1C84FE689A88D7

View File

@ -1,6 +1,7 @@
package tfdiags package tfdiags
import ( import (
"fmt"
"reflect" "reflect"
"testing" "testing"
@ -33,109 +34,124 @@ baz "b" {
t.Fatal(parseDiags) t.Fatal(parseDiags)
} }
body := f.Body testCases := []struct {
var diags Diagnostics Diag Diagnostic
diags = diags.Append(AttributeValue( ExpectedRange *SourceRange
Error, }{
"foo[0].bar", {
"detail", AttributeValue(
cty.Path{ Error,
cty.GetAttrStep{Name: "foo"}, "foo[0].bar",
cty.IndexStep{Key: cty.NumberIntVal(0)}, "detail",
cty.GetAttrStep{Name: "bar"}, cty.Path{
cty.GetAttrStep{Name: "foo"},
cty.IndexStep{Key: cty.NumberIntVal(0)},
cty.GetAttrStep{Name: "bar"},
},
),
&SourceRange{
Filename: "test.tf",
Start: SourcePos{Line: 3, Column: 9, Byte: 15},
End: SourcePos{Line: 3, Column: 13, Byte: 19},
},
}, },
)) {
diags = diags.Append(AttributeValue( AttributeValue(
Error, Error,
"foo[1].bar", "foo[1].bar",
"detail", "detail",
cty.Path{ cty.Path{
cty.GetAttrStep{Name: "foo"}, cty.GetAttrStep{Name: "foo"},
cty.IndexStep{Key: cty.NumberIntVal(1)}, cty.IndexStep{Key: cty.NumberIntVal(1)},
cty.GetAttrStep{Name: "bar"}, cty.GetAttrStep{Name: "bar"},
},
),
&SourceRange{
Filename: "test.tf",
Start: SourcePos{Line: 6, Column: 9, Byte: 36},
End: SourcePos{Line: 6, Column: 14, Byte: 41},
},
}, },
)) {
diags = diags.Append(AttributeValue( AttributeValue(
Error, Error,
"bar.bar", "bar.bar",
"detail", "detail",
cty.Path{ cty.Path{
cty.GetAttrStep{Name: "bar"}, cty.GetAttrStep{Name: "bar"},
cty.GetAttrStep{Name: "bar"}, cty.GetAttrStep{Name: "bar"},
},
),
&SourceRange{
Filename: "test.tf",
Start: SourcePos{Line: 9, Column: 9, Byte: 58},
End: SourcePos{Line: 9, Column: 15, Byte: 64},
},
}, },
)) {
diags = diags.Append(AttributeValue( AttributeValue(
Error, Error,
`baz["a"].bar`, `baz["a"].bar`,
"detail", "detail",
cty.Path{ cty.Path{
cty.GetAttrStep{Name: "baz"}, cty.GetAttrStep{Name: "baz"},
cty.IndexStep{Key: cty.StringVal("a")}, cty.IndexStep{Key: cty.StringVal("a")},
cty.GetAttrStep{Name: "bar"}, cty.GetAttrStep{Name: "bar"},
},
),
&SourceRange{
Filename: "test.tf",
Start: SourcePos{Line: 12, Column: 9, Byte: 85},
End: SourcePos{Line: 12, Column: 15, Byte: 91},
},
}, },
)) {
diags = diags.Append(AttributeValue( AttributeValue(
Error, Error,
`baz["b"].bar`, `baz["b"].bar`,
"detail", "detail",
cty.Path{ cty.Path{
cty.GetAttrStep{Name: "baz"}, cty.GetAttrStep{Name: "baz"},
cty.IndexStep{Key: cty.StringVal("b")}, cty.IndexStep{Key: cty.StringVal("b")},
cty.GetAttrStep{Name: "bar"}, cty.GetAttrStep{Name: "bar"},
},
),
&SourceRange{
Filename: "test.tf",
Start: SourcePos{Line: 15, Column: 9, Byte: 112},
End: SourcePos{Line: 15, Column: 15, Byte: 118},
},
}, },
)) {
// Attribute value with subject already populated should not be disturbed. // Attribute value with subject already populated should not be disturbed.
// (in a real case, this might've been passed through from a deeper function // (in a real case, this might've been passed through from a deeper function
// in the call stack, for example.) // in the call stack, for example.)
diags = diags.Append(&attributeDiagnostic{ &attributeDiagnostic{
diagnosticBase: diagnosticBase{ diagnosticBase: diagnosticBase{
summary: "preexisting", summary: "preexisting",
detail: "detail", detail: "detail",
}, },
subject: &SourceRange{ subject: &SourceRange{
Filename: "somewhere_else.tf", Filename: "somewhere_else.tf",
}, },
}) },
&SourceRange{
gotDiags := diags.InConfigBody(body) Filename: "somewhere_else.tf",
},
wantRanges := map[string]*SourceRange{
`foo[0].bar`: {
Filename: "test.tf",
Start: SourcePos{Line: 3, Column: 9, Byte: 15},
End: SourcePos{Line: 3, Column: 13, Byte: 19},
},
`foo[1].bar`: {
Filename: "test.tf",
Start: SourcePos{Line: 6, Column: 9, Byte: 36},
End: SourcePos{Line: 6, Column: 14, Byte: 41},
},
`bar.bar`: {
Filename: "test.tf",
Start: SourcePos{Line: 9, Column: 9, Byte: 58},
End: SourcePos{Line: 9, Column: 15, Byte: 64},
},
`baz["a"].bar`: {
Filename: "test.tf",
Start: SourcePos{Line: 12, Column: 9, Byte: 85},
End: SourcePos{Line: 12, Column: 15, Byte: 91},
},
`baz["b"].bar`: {
Filename: "test.tf",
Start: SourcePos{Line: 15, Column: 9, Byte: 112},
End: SourcePos{Line: 15, Column: 15, Byte: 118},
},
`preexisting`: {
Filename: "somewhere_else.tf",
}, },
} }
gotRanges := make(map[string]*SourceRange)
for _, diag := range gotDiags {
gotRanges[diag.Description().Summary] = diag.Source().Subject
}
for _, problem := range deep.Equal(gotRanges, wantRanges) { for i, tc := range testCases {
t.Error(problem) t.Run(fmt.Sprintf("%d:%s", i, tc.Diag.Description()), func(t *testing.T) {
var diags Diagnostics
diags = diags.Append(tc.Diag)
gotDiags := diags.InConfigBody(f.Body)
gotRange := gotDiags[0].Source().Subject
for _, problem := range deep.Equal(gotRange, tc.ExpectedRange) {
t.Error(problem)
}
})
} }
} }