| // Copyright IBM Corp. 2014, 2026 |
| // SPDX-License-Identifier: BUSL-1.1 |
| |
| package stackmigrate |
| |
| import ( |
| "os" |
| "path/filepath" |
| "testing" |
| |
| "github.com/hashicorp/terraform/internal/backend/local" |
| ) |
| |
| // DefaultDataDir is the default directory for storing local data. |
| const DefaultDataDir = ".terraform" |
| |
| func TestMeta_Workspace_override(t *testing.T) { |
| defer func(value string) { |
| os.Setenv(WorkspaceNameEnvVar, value) |
| }(os.Getenv(WorkspaceNameEnvVar)) |
| |
| m := new(Meta) |
| |
| testCases := map[string]struct { |
| workspace string |
| err error |
| }{ |
| "": { |
| "default", |
| nil, |
| }, |
| "development": { |
| "development", |
| nil, |
| }, |
| "invalid name": { |
| "", |
| errInvalidWorkspaceNameEnvVar, |
| }, |
| } |
| |
| for name, tc := range testCases { |
| t.Run(name, func(t *testing.T) { |
| os.Setenv(WorkspaceNameEnvVar, name) |
| workspace, err := m.Workspace() |
| if workspace != tc.workspace { |
| t.Errorf("Unexpected workspace\n got: %s\nwant: %s\n", workspace, tc.workspace) |
| } |
| if err != tc.err { |
| t.Errorf("Unexpected error\n got: %s\nwant: %s\n", err, tc.err) |
| } |
| }) |
| } |
| } |
| |
| // If somehow an invalid workspace has been selected, the Meta.Workspace |
| // method should not return an error, to ensure that we don't break any |
| // existing workflows with invalid workspace names. |
| func TestMeta_Workspace_invalidSelected(t *testing.T) { |
| td := t.TempDir() |
| t.Chdir(td) |
| |
| // this is an invalid workspace name |
| workspace := "test workspace" |
| |
| // create the workspace directories |
| if err := os.MkdirAll(filepath.Join(local.DefaultWorkspaceDir, workspace), 0755); err != nil { |
| t.Fatal(err) |
| } |
| |
| // create the workspace file to select it |
| if err := os.MkdirAll(DefaultDataDir, 0755); err != nil { |
| t.Fatal(err) |
| } |
| if err := os.WriteFile(filepath.Join(DefaultDataDir, local.DefaultWorkspaceFile), []byte(workspace), 0644); err != nil { |
| t.Fatal(err) |
| } |
| |
| m := new(Meta) |
| |
| // Normally, errors are returned when selecting an invalid workspace. |
| ws, err := m.Workspace() |
| if ws != "" { |
| t.Errorf("Unexpected workspace\n got: %s\nwant: %s\n", ws, workspace) |
| } |
| if err == nil { |
| t.Errorf("Expected error but got none") |
| } |
| |
| // The Meta in the command package has a field `bypassWorkspaceNameValidityCheck` that allows |
| // a selected workspace to be invalid in specific commands (i.e. enough to enable users to recover from an invalid value). |
| // This can be implemented in Stacks when/if needed. |
| } |