blob: f1ae0f48eca5ba7a172d5e61b77a15744ab858f4 [file] [log] [blame]
package cloud
import (
"testing"
"github.com/hashicorp/terraform/internal/configs"
legacy "github.com/hashicorp/terraform/internal/legacy/terraform"
)
func TestDetectConfigChangeType(t *testing.T) {
tests := map[string]struct {
stateType string
configType string
localStates bool
want ConfigChangeMode
wantInvolvesCloud bool
wantIsCloudMigration bool
}{
"init cloud": {
``, `cloud`, false,
ConfigChangeInPlace,
true, false,
},
"reinit cloud": {
`cloud`, `cloud`, false,
ConfigChangeInPlace,
true, false,
},
"migrate default local to cloud with existing local state": {
``, `cloud`, true,
ConfigMigrationIn,
true, true,
},
"migrate local to cloud": {
`local`, `cloud`, false,
ConfigMigrationIn,
true, true,
},
"migrate remote to cloud": {
`local`, `cloud`, false,
ConfigMigrationIn,
true, true,
},
"migrate cloud to local": {
`cloud`, `local`, false,
ConfigMigrationOut,
true, true,
},
"migrate cloud to remote": {
`cloud`, `remote`, false,
ConfigMigrationOut,
true, true,
},
"migrate cloud to default local": {
`cloud`, ``, false,
ConfigMigrationOut,
true, true,
},
// Various other cases can potentially be valid (decided by the
// Terraform CLI layer) but are irrelevant for Cloud mode purposes.
"init default local": {
``, ``, false,
ConfigChangeIrrelevant,
false, false,
},
"init default local with existing local state": {
``, ``, true,
ConfigChangeIrrelevant,
false, false,
},
"init remote backend": {
``, `remote`, false,
ConfigChangeIrrelevant,
false, false,
},
"init remote backend with existing local state": {
``, `remote`, true,
ConfigChangeIrrelevant,
false, false,
},
"reinit remote backend": {
`remote`, `remote`, false,
ConfigChangeIrrelevant,
false, false,
},
"migrate local to remote backend": {
`local`, `remote`, false,
ConfigChangeIrrelevant,
false, false,
},
"migrate remote to default local": {
`remote`, ``, false,
ConfigChangeIrrelevant,
false, false,
},
}
for name, test := range tests {
t.Run(name, func(t *testing.T) {
var state *legacy.BackendState
var config *configs.Backend
if test.stateType != "" {
state = &legacy.BackendState{
Type: test.stateType,
// everything else is irrelevant for our purposes here
}
}
if test.configType != "" {
config = &configs.Backend{
Type: test.configType,
// everything else is irrelevant for our purposes here
}
}
got := DetectConfigChangeType(state, config, test.localStates)
if got != test.want {
t.Errorf(
"wrong result\nstate type: %s\nconfig type: %s\nlocal states: %t\n\ngot: %s\nwant: %s",
test.stateType, test.configType, test.localStates,
got, test.want,
)
}
if got, want := got.InvolvesCloud(), test.wantInvolvesCloud; got != want {
t.Errorf(
"wrong InvolvesCloud result\ngot: %t\nwant: %t",
got, want,
)
}
if got, want := got.IsCloudMigration(), test.wantIsCloudMigration; got != want {
t.Errorf(
"wrong IsCloudMigration result\ngot: %t\nwant: %t",
got, want,
)
}
})
}
}