| 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, |
| ) |
| } |
| }) |
| } |
| } |