mirror of
https://github.com/opentofu/opentofu.git
synced 2025-01-02 12:17:39 -06:00
1409f30f9c
This is part of a general effort to move all of Terraform's non-library package surface under internal in order to reinforce that these are for internal use within Terraform only. If you were previously importing packages under this prefix into an external codebase, you could pin to an earlier release tag as an interim solution until you've make a plan to achieve the same functionality some other way.
156 lines
4.8 KiB
Go
156 lines
4.8 KiB
Go
package moduletest
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/google/go-cmp/cmp"
|
|
"github.com/hashicorp/terraform/internal/providers"
|
|
"github.com/zclconf/go-cty-debug/ctydebug"
|
|
"github.com/zclconf/go-cty/cty"
|
|
)
|
|
|
|
func TestProvider(t *testing.T) {
|
|
|
|
assertionConfig := cty.ObjectVal(map[string]cty.Value{
|
|
"component": cty.StringVal("spline_reticulator"),
|
|
"equal": cty.MapVal(map[string]cty.Value{
|
|
"match": cty.ObjectVal(map[string]cty.Value{
|
|
"description": cty.StringVal("this should match"),
|
|
"got": cty.StringVal("a"),
|
|
"want": cty.StringVal("a"),
|
|
}),
|
|
"unmatch": cty.ObjectVal(map[string]cty.Value{
|
|
"description": cty.StringVal("this should not match"),
|
|
"got": cty.StringVal("a"),
|
|
"want": cty.StringVal("b"),
|
|
}),
|
|
}),
|
|
"check": cty.MapVal(map[string]cty.Value{
|
|
"pass": cty.ObjectVal(map[string]cty.Value{
|
|
"description": cty.StringVal("this should pass"),
|
|
"condition": cty.True,
|
|
}),
|
|
"fail": cty.ObjectVal(map[string]cty.Value{
|
|
"description": cty.StringVal("this should fail"),
|
|
"condition": cty.False,
|
|
}),
|
|
}),
|
|
})
|
|
|
|
// The provider code expects to receive an object that was decoded from
|
|
// HCL using the schema, so to make sure we're testing a more realistic
|
|
// situation here we'll require the config to conform to the schema. If
|
|
// this fails, it's a bug in the configuration definition above rather
|
|
// than in the provider itself.
|
|
for _, err := range assertionConfig.Type().TestConformance(testAssertionsSchema.Block.ImpliedType()) {
|
|
t.Error(err)
|
|
}
|
|
|
|
p := NewProvider()
|
|
|
|
configureResp := p.ConfigureProvider(providers.ConfigureProviderRequest{
|
|
Config: cty.EmptyObjectVal,
|
|
})
|
|
if got, want := len(configureResp.Diagnostics), 1; got != want {
|
|
t.Fatalf("got %d Configure diagnostics, but want %d", got, want)
|
|
}
|
|
if got, want := configureResp.Diagnostics[0].Description().Summary, "The test provider is experimental"; got != want {
|
|
t.Fatalf("wrong diagnostic message\ngot: %s\nwant: %s", got, want)
|
|
}
|
|
|
|
validateResp := p.ValidateResourceConfig(providers.ValidateResourceConfigRequest{
|
|
TypeName: "test_assertions",
|
|
Config: assertionConfig,
|
|
})
|
|
if got, want := len(validateResp.Diagnostics), 0; got != want {
|
|
t.Fatalf("got %d ValidateResourceTypeConfig diagnostics, but want %d", got, want)
|
|
}
|
|
|
|
planResp := p.PlanResourceChange(providers.PlanResourceChangeRequest{
|
|
TypeName: "test_assertions",
|
|
Config: assertionConfig,
|
|
PriorState: cty.NullVal(assertionConfig.Type()),
|
|
ProposedNewState: assertionConfig,
|
|
})
|
|
if got, want := len(planResp.Diagnostics), 0; got != want {
|
|
t.Fatalf("got %d PlanResourceChange diagnostics, but want %d", got, want)
|
|
}
|
|
planned := planResp.PlannedState
|
|
if got, want := planned, assertionConfig; !want.RawEquals(got) {
|
|
t.Fatalf("wrong planned new value\n%s", ctydebug.DiffValues(want, got))
|
|
}
|
|
|
|
gotComponents := p.TestResults()
|
|
wantComponents := map[string]*Component{
|
|
"spline_reticulator": {
|
|
Assertions: map[string]*Assertion{
|
|
"pass": {
|
|
Outcome: Pending,
|
|
Description: "this should pass",
|
|
},
|
|
"fail": {
|
|
Outcome: Pending,
|
|
Description: "this should fail",
|
|
},
|
|
"match": {
|
|
Outcome: Pending,
|
|
Description: "this should match",
|
|
},
|
|
"unmatch": {
|
|
Outcome: Pending,
|
|
Description: "this should not match",
|
|
},
|
|
},
|
|
},
|
|
}
|
|
if diff := cmp.Diff(wantComponents, gotComponents); diff != "" {
|
|
t.Fatalf("wrong test results after planning\n%s", diff)
|
|
}
|
|
|
|
applyResp := p.ApplyResourceChange(providers.ApplyResourceChangeRequest{
|
|
TypeName: "test_assertions",
|
|
Config: assertionConfig,
|
|
PriorState: cty.NullVal(assertionConfig.Type()),
|
|
PlannedState: planned,
|
|
})
|
|
if got, want := len(applyResp.Diagnostics), 0; got != want {
|
|
t.Fatalf("got %d ApplyResourceChange diagnostics, but want %d", got, want)
|
|
}
|
|
final := applyResp.NewState
|
|
if got, want := final, assertionConfig; !want.RawEquals(got) {
|
|
t.Fatalf("wrong new value\n%s", ctydebug.DiffValues(want, got))
|
|
}
|
|
|
|
gotComponents = p.TestResults()
|
|
wantComponents = map[string]*Component{
|
|
"spline_reticulator": {
|
|
Assertions: map[string]*Assertion{
|
|
"pass": {
|
|
Outcome: Passed,
|
|
Description: "this should pass",
|
|
Message: "condition passed",
|
|
},
|
|
"fail": {
|
|
Outcome: Failed,
|
|
Description: "this should fail",
|
|
Message: "condition failed",
|
|
},
|
|
"match": {
|
|
Outcome: Passed,
|
|
Description: "this should match",
|
|
Message: "correct value\n got: \"a\"\n",
|
|
},
|
|
"unmatch": {
|
|
Outcome: Failed,
|
|
Description: "this should not match",
|
|
Message: "wrong value\n got: \"a\"\n want: \"b\"\n",
|
|
},
|
|
},
|
|
},
|
|
}
|
|
if diff := cmp.Diff(wantComponents, gotComponents); diff != "" {
|
|
t.Fatalf("wrong test results after applying\n%s", diff)
|
|
}
|
|
|
|
}
|