github.com/simonswine/terraform@v0.9.0-beta2/command/env_command_test.go (about) 1 package command 2 3 import ( 4 "io/ioutil" 5 "os" 6 "path/filepath" 7 "strings" 8 "testing" 9 10 "github.com/hashicorp/terraform/backend" 11 "github.com/hashicorp/terraform/backend/local" 12 "github.com/hashicorp/terraform/state" 13 "github.com/hashicorp/terraform/terraform" 14 "github.com/mitchellh/cli" 15 ) 16 17 func TestEnv_createAndChange(t *testing.T) { 18 // Create a temporary working directory that is empty 19 td := tempDir(t) 20 os.MkdirAll(td, 0755) 21 defer os.RemoveAll(td) 22 defer testChdir(t, td)() 23 24 newCmd := &EnvNewCommand{} 25 26 current := newCmd.Env() 27 if current != backend.DefaultStateName { 28 t.Fatal("current env should be 'default'") 29 } 30 31 args := []string{"test"} 32 ui := new(cli.MockUi) 33 newCmd.Meta = Meta{Ui: ui} 34 if code := newCmd.Run(args); code != 0 { 35 t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter) 36 } 37 38 current = newCmd.Env() 39 if current != "test" { 40 t.Fatalf("current env should be 'test', got %q", current) 41 } 42 43 selCmd := &EnvSelectCommand{} 44 args = []string{backend.DefaultStateName} 45 ui = new(cli.MockUi) 46 selCmd.Meta = Meta{Ui: ui} 47 if code := selCmd.Run(args); code != 0 { 48 t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter) 49 } 50 51 current = newCmd.Env() 52 if current != backend.DefaultStateName { 53 t.Fatal("current env should be 'default'") 54 } 55 56 } 57 58 // Create some environments and test the list output. 59 // This also ensures we switch to the correct env after each call 60 func TestEnv_createAndList(t *testing.T) { 61 // Create a temporary working directory that is empty 62 td := tempDir(t) 63 os.MkdirAll(td, 0755) 64 defer os.RemoveAll(td) 65 defer testChdir(t, td)() 66 67 newCmd := &EnvNewCommand{} 68 69 envs := []string{"test_a", "test_b", "test_c"} 70 71 // create multiple envs 72 for _, env := range envs { 73 ui := new(cli.MockUi) 74 newCmd.Meta = Meta{Ui: ui} 75 if code := newCmd.Run([]string{env}); code != 0 { 76 t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter) 77 } 78 } 79 80 listCmd := &EnvListCommand{} 81 ui := new(cli.MockUi) 82 listCmd.Meta = Meta{Ui: ui} 83 84 if code := listCmd.Run(nil); code != 0 { 85 t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter) 86 } 87 88 actual := strings.TrimSpace(ui.OutputWriter.String()) 89 expected := "default\n test_a\n test_b\n* test_c" 90 91 if actual != expected { 92 t.Fatalf("\nexpcted: %q\nactual: %q", expected, actual) 93 } 94 } 95 96 func TestEnv_createWithState(t *testing.T) { 97 td := tempDir(t) 98 os.MkdirAll(td, 0755) 99 defer os.RemoveAll(td) 100 defer testChdir(t, td)() 101 102 // create a non-empty state 103 originalState := &terraform.State{ 104 Modules: []*terraform.ModuleState{ 105 &terraform.ModuleState{ 106 Path: []string{"root"}, 107 Resources: map[string]*terraform.ResourceState{ 108 "test_instance.foo": &terraform.ResourceState{ 109 Type: "test_instance", 110 Primary: &terraform.InstanceState{ 111 ID: "bar", 112 }, 113 }, 114 }, 115 }, 116 }, 117 } 118 119 err := (&state.LocalState{Path: "test.tfstate"}).WriteState(originalState) 120 if err != nil { 121 t.Fatal(err) 122 } 123 124 args := []string{"-state", "test.tfstate", "test"} 125 ui := new(cli.MockUi) 126 newCmd := &EnvNewCommand{ 127 Meta: Meta{Ui: ui}, 128 } 129 if code := newCmd.Run(args); code != 0 { 130 t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter) 131 } 132 133 newPath := filepath.Join(local.DefaultEnvDir, "test", DefaultStateFilename) 134 envState := state.LocalState{Path: newPath} 135 err = envState.RefreshState() 136 if err != nil { 137 t.Fatal(err) 138 } 139 140 newState := envState.State() 141 if !originalState.Equal(newState) { 142 t.Fatalf("states not equal\norig: %s\nnew: %s", originalState, newState) 143 } 144 } 145 146 func TestEnv_delete(t *testing.T) { 147 td := tempDir(t) 148 os.MkdirAll(td, 0755) 149 defer os.RemoveAll(td) 150 defer testChdir(t, td)() 151 152 // create the env directories 153 if err := os.MkdirAll(filepath.Join(local.DefaultEnvDir, "test"), 0755); err != nil { 154 t.Fatal(err) 155 } 156 157 // create the environment file 158 if err := os.MkdirAll(DefaultDataDir, 0755); err != nil { 159 t.Fatal(err) 160 } 161 if err := ioutil.WriteFile(filepath.Join(DefaultDataDir, local.DefaultEnvFile), []byte("test"), 0644); err != nil { 162 t.Fatal(err) 163 } 164 165 ui := new(cli.MockUi) 166 delCmd := &EnvDeleteCommand{ 167 Meta: Meta{Ui: ui}, 168 } 169 170 current := delCmd.Env() 171 if current != "test" { 172 t.Fatal("wrong env:", current) 173 } 174 175 // we can't delete out current environment 176 args := []string{"test"} 177 if code := delCmd.Run(args); code == 0 { 178 t.Fatal("expected error deleting current env") 179 } 180 181 // change back to default 182 if err := delCmd.SetEnv(backend.DefaultStateName); err != nil { 183 t.Fatal(err) 184 } 185 186 // try the delete again 187 ui = new(cli.MockUi) 188 delCmd.Meta.Ui = ui 189 if code := delCmd.Run(args); code != 0 { 190 t.Fatalf("error deleting env: %s", ui.ErrorWriter) 191 } 192 193 current = delCmd.Env() 194 if current != backend.DefaultStateName { 195 t.Fatalf("wrong env: %q", current) 196 } 197 } 198 func TestEnv_deleteWithState(t *testing.T) { 199 td := tempDir(t) 200 os.MkdirAll(td, 0755) 201 defer os.RemoveAll(td) 202 defer testChdir(t, td)() 203 204 // create the env directories 205 if err := os.MkdirAll(filepath.Join(local.DefaultEnvDir, "test"), 0755); err != nil { 206 t.Fatal(err) 207 } 208 209 // create a non-empty state 210 originalState := &terraform.State{ 211 Modules: []*terraform.ModuleState{ 212 &terraform.ModuleState{ 213 Path: []string{"root"}, 214 Resources: map[string]*terraform.ResourceState{ 215 "test_instance.foo": &terraform.ResourceState{ 216 Type: "test_instance", 217 Primary: &terraform.InstanceState{ 218 ID: "bar", 219 }, 220 }, 221 }, 222 }, 223 }, 224 } 225 226 envStatePath := filepath.Join(local.DefaultEnvDir, "test", DefaultStateFilename) 227 err := (&state.LocalState{Path: envStatePath}).WriteState(originalState) 228 if err != nil { 229 t.Fatal(err) 230 } 231 232 ui := new(cli.MockUi) 233 delCmd := &EnvDeleteCommand{ 234 Meta: Meta{Ui: ui}, 235 } 236 args := []string{"test"} 237 if code := delCmd.Run(args); code == 0 { 238 t.Fatalf("expected failure without -force.\noutput: %s", ui.OutputWriter) 239 } 240 241 ui = new(cli.MockUi) 242 delCmd.Meta.Ui = ui 243 244 args = []string{"-force", "test"} 245 if code := delCmd.Run(args); code != 0 { 246 t.Fatalf("failure: %s", ui.ErrorWriter) 247 } 248 249 if _, err := os.Stat(filepath.Join(local.DefaultEnvDir, "test")); !os.IsNotExist(err) { 250 t.Fatal("env 'test' still exists!") 251 } 252 }