diff --git a/command/apply_test.go b/command/apply_test.go index 2d6e71ea9..9bb7987bc 100644 --- a/command/apply_test.go +++ b/command/apply_test.go @@ -9,12 +9,12 @@ import ( "net/url" "os" "path/filepath" - "reflect" "strings" "sync" "testing" "time" + "github.com/google/go-cmp/cmp" "github.com/mitchellh/cli" "github.com/zclconf/go-cty/cty" @@ -475,14 +475,14 @@ func TestApply_noArgs(t *testing.T) { if err != nil { t.Fatalf("err: %s", err) } - if err := os.Chdir(testFixturePath("plan")); err != nil { + if err := os.Chdir(testFixturePath("apply")); err != nil { t.Fatalf("err: %s", err) } defer os.Chdir(cwd) statePath := testTempFile(t) - p := testProvider() + p := applyFixtureProvider() ui := new(cli.MockUi) c := &ApplyCommand{ Meta: Meta{ @@ -774,7 +774,7 @@ func TestApply_refresh(t *testing.T) { Name: "foo", }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), &states.ResourceInstanceObjectSrc{ - AttrsJSON: []byte(`{"id":"bar"}`), + AttrsJSON: []byte(`{"ami":"bar"}`), Status: states.ObjectReady, }, addrs.ProviderConfig{Type: "test"}.Absolute(addrs.RootModuleInstance), @@ -884,6 +884,16 @@ func TestApply_shutdown(t *testing.T) { }, nil } + p.GetSchemaReturn = &terraform.ProviderSchema{ + ResourceTypes: map[string]*configschema.Block{ + "test_instance": { + Attributes: map[string]*configschema.Attribute{ + "ami": {Type: cty.String, Optional: true}, + }, + }, + }, + } + args := []string{ "-state", statePath, "-auto-approve", @@ -918,7 +928,7 @@ func TestApply_state(t *testing.T) { Name: "foo", }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), &states.ResourceInstanceObjectSrc{ - AttrsJSON: []byte(`{"id":"bar"}`), + AttrsJSON: []byte(`{"ami":"bar"}`), Status: states.ObjectReady, }, addrs.ProviderConfig{Type: "test"}.Absolute(addrs.RootModuleInstance), @@ -932,6 +942,11 @@ func TestApply_state(t *testing.T) { "ami": cty.StringVal("bar"), }), } + p.ApplyResourceChangeResponse = providers.ApplyResourceChangeResponse{ + NewState: cty.ObjectVal(map[string]cty.Value{ + "ami": cty.StringVal("bar"), + }), + } ui := new(cli.MockUi) c := &ApplyCommand{ @@ -954,7 +969,8 @@ func TestApply_state(t *testing.T) { // Verify that the provider was called with the existing state actual := p.PlanResourceChangeRequest.PriorState expected := cty.ObjectVal(map[string]cty.Value{ - "id": cty.StringVal("bar"), + "id": cty.NullVal(cty.String), + "ami": cty.StringVal("bar"), }) if !expected.RawEquals(actual) { t.Fatalf("wrong prior state during plan\ngot: %#v\nwant: %#v", actual, expected) @@ -962,7 +978,8 @@ func TestApply_state(t *testing.T) { actual = p.ApplyResourceChangeRequest.PriorState expected = cty.ObjectVal(map[string]cty.Value{ - "id": cty.StringVal("bar"), + "id": cty.NullVal(cty.String), + "ami": cty.StringVal("bar"), }) if actual != expected { t.Fatalf("wrong prior state during apply\ngot: %#v\nwant: %#v", actual, expected) @@ -1049,6 +1066,21 @@ func TestApply_vars(t *testing.T) { }, } + p.GetSchemaReturn = &terraform.ProviderSchema{ + ResourceTypes: map[string]*configschema.Block{ + "test_instance": { + Attributes: map[string]*configschema.Attribute{ + "value": {Type: cty.String, Optional: true}, + }, + }, + }, + } + p.ApplyResourceChangeFn = func (req providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse { + return providers.ApplyResourceChangeResponse{ + NewState: req.PlannedState, + } + } + actual := "" p.DiffFn = func( info *terraform.InstanceInfo, @@ -1093,6 +1125,21 @@ func TestApply_varFile(t *testing.T) { }, } + p.GetSchemaReturn = &terraform.ProviderSchema{ + ResourceTypes: map[string]*configschema.Block{ + "test_instance": { + Attributes: map[string]*configschema.Attribute{ + "value": {Type: cty.String, Optional: true}, + }, + }, + }, + } + p.ApplyResourceChangeFn = func (req providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse { + return providers.ApplyResourceChangeResponse{ + NewState: req.PlannedState, + } + } + actual := "" p.DiffFn = func( info *terraform.InstanceInfo, @@ -1147,6 +1194,21 @@ func TestApply_varFileDefault(t *testing.T) { }, } + p.GetSchemaReturn = &terraform.ProviderSchema{ + ResourceTypes: map[string]*configschema.Block{ + "test_instance": { + Attributes: map[string]*configschema.Attribute{ + "value": {Type: cty.String, Optional: true}, + }, + }, + }, + } + p.ApplyResourceChangeFn = func (req providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse { + return providers.ApplyResourceChangeResponse{ + NewState: req.PlannedState, + } + } + actual := "" p.DiffFn = func( info *terraform.InstanceInfo, @@ -1200,6 +1262,21 @@ func TestApply_varFileDefaultJSON(t *testing.T) { }, } + p.GetSchemaReturn = &terraform.ProviderSchema{ + ResourceTypes: map[string]*configschema.Block{ + "test_instance": { + Attributes: map[string]*configschema.Attribute{ + "value": {Type: cty.String, Optional: true}, + }, + }, + }, + } + p.ApplyResourceChangeFn = func (req providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse { + return providers.ApplyResourceChangeResponse{ + NewState: req.PlannedState, + } + } + actual := "" p.DiffFn = func( info *terraform.InstanceInfo, @@ -1235,7 +1312,7 @@ func TestApply_backup(t *testing.T) { Name: "foo", }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), &states.ResourceInstanceObjectSrc{ - AttrsJSON: []byte(`{"id":"bar"}`), + AttrsJSON: []byte("{\n \"id\": \"bar\"\n }"), Status: states.ObjectReady, }, addrs.ProviderConfig{Type: "test"}.Absolute(addrs.RootModuleInstance), @@ -1284,8 +1361,13 @@ func TestApply_backup(t *testing.T) { actual := backupState.RootModule().Resources["test_instance.foo"] expected := originalState.RootModule().Resources["test_instance.foo"] - if !reflect.DeepEqual(actual, expected) { - t.Fatalf("bad: %#v %#v", actual, expected) + if !cmp.Equal(actual, expected) { + t.Fatalf( + "wrong aws_instance.foo state\n%s", + cmp.Diff(expected, actual, cmp.Transformer("bytesAsString", func (b []byte) string { + return string(b) + })), + ) } } @@ -1322,17 +1404,19 @@ func TestApply_disableBackup(t *testing.T) { // Verify that the provider was called with the existing state actual := p.PlanResourceChangeRequest.PriorState expected := cty.ObjectVal(map[string]cty.Value{ - "id": cty.StringVal("bar"), + "id": cty.StringVal("bar"), + "ami": cty.NullVal(cty.String), }) - if actual != expected { + if !expected.RawEquals(actual) { t.Fatalf("wrong prior state during plan\ngot: %#v\nwant: %#v", actual, expected) } actual = p.ApplyResourceChangeRequest.PriorState expected = cty.ObjectVal(map[string]cty.Value{ "id": cty.StringVal("bar"), + "ami": cty.NullVal(cty.String), }) - if actual != expected { + if !expected.RawEquals(actual) { t.Fatalf("wrong prior state during apply\ngot: %#v\nwant: %#v", actual, expected) } @@ -1479,6 +1563,7 @@ func applyFixtureSchema() *terraform.ProviderSchema { ResourceTypes: map[string]*configschema.Block{ "test_instance": { Attributes: map[string]*configschema.Attribute{ + "id": {Type: cty.String, Optional: true, Computed: true}, "ami": {Type: cty.String, Optional: true}, }, }, @@ -1501,7 +1586,7 @@ func applyFixtureProvider() *terraform.MockProvider { } p.ApplyResourceChangeFn = func (req providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse { return providers.ApplyResourceChangeResponse{ - NewState: req.PlannedState, + NewState: cty.UnknownAsNull(req.PlannedState), } } return p