Skip to content

Commit cca9a20

Browse files
vegerismwbrooks
andauthored
feat: remove the experiment flag for the sandbox commands and add new partner template IDs (#512)
* rm experiment flag * incl partner template names, new err code msg * alphabetize sandbox errors * update info log * chore: annotate sandbox error codes as Slack API errors --------- Co-authored-by: Michael Brooks <mbrooks@slack-corp.com>
1 parent 2df36eb commit cca9a20

12 files changed

Lines changed: 63 additions & 192 deletions

File tree

cmd/app/link.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ func LinkAppFooterSection(ctx context.Context, clients *shared.ClientFactory, ap
210210

211211
// promptExistingApp gathers details to represent app information
212212
func promptExistingApp(ctx context.Context, clients *shared.ClientFactory) (types.App, *types.SlackAuth, error) {
213-
slackAuth, err := prompts.PromptTeamSlackAuth(ctx, clients, "Select the existing app team")
213+
slackAuth, err := prompts.PromptTeamSlackAuth(ctx, clients, "Select the existing app team", nil)
214214
if err != nil {
215215
return types.App{}, &types.SlackAuth{}, err
216216
}

cmd/sandbox/create.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,16 @@ var createCmdFlags createFlags
4545

4646
// templateNameToID maps user-friendly template names to integer IDs
4747
var templateNameToID = map[string]int{
48-
"default": 1, // The default template
4948
"empty": 0, // The sandbox will be empty if the template param is not set
49+
"default": 1, // The default template
50+
51+
// Additional partner sandbox template options
52+
"finance": 2,
53+
"hr": 3,
54+
"it-incident-management": 4,
55+
"customer-support": 5,
56+
"sales": 6,
57+
"marketing": 7,
5058
}
5159

5260
func NewCreateCommand(clients *shared.ClientFactory) *cobra.Command {
@@ -60,9 +68,6 @@ func NewCreateCommand(clients *shared.ClientFactory) *cobra.Command {
6068
{Command: "sandbox create --name test-box --password mypass --domain test-box --archive-date 2025-12-31", Meaning: "Create a sandbox that will be archived on a specific date"},
6169
}),
6270
Args: cobra.NoArgs,
63-
PreRunE: func(cmd *cobra.Command, args []string) error {
64-
return requireSandboxExperiment(clients)
65-
},
6671
RunE: func(cmd *cobra.Command, args []string) error {
6772
return runCreateCommand(cmd, clients)
6873
},

cmd/sandbox/create_test.go

Lines changed: 0 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"testing"
2121
"time"
2222

23-
"github.com/slackapi/slack-cli/internal/experiment"
2423
"github.com/slackapi/slack-cli/internal/shared"
2524
"github.com/slackapi/slack-cli/internal/shared/types"
2625
"github.com/slackapi/slack-cli/test/testutil"
@@ -36,7 +35,6 @@ func TestCreateCommand(t *testing.T) {
3635
testutil.TableTestCommand(t, testutil.CommandTests{
3736
"create success": {
3837
CmdArgs: []string{
39-
"--experiment=sandboxes",
4038
"--token", "xoxb-test-token",
4139
"--name", "test-box",
4240
"--domain", "test-box",
@@ -52,8 +50,6 @@ func TestCreateCommand(t *testing.T) {
5250
cm.API.On("UsersInfo", mock.Anything, mock.Anything, mock.Anything).Return(&types.UserInfo{Profile: types.UserProfile{}}, nil)
5351

5452
cm.AddDefaultMocks()
55-
cm.Config.ExperimentsFlag = []string{string(experiment.Sandboxes)}
56-
cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug)
5753
},
5854
ExpectedStdoutOutputs: []string{"T123", "https://test-box.slack.com", "Sandbox Created"},
5955
ExpectedAsserts: func(t *testing.T, ctx context.Context, cm *shared.ClientsMock) {
@@ -63,7 +59,6 @@ func TestCreateCommand(t *testing.T) {
6359
},
6460
"create with derived domain": {
6561
CmdArgs: []string{
66-
"--experiment=sandboxes",
6762
"--token", "xoxb-test-token",
6863
"--name", "My Test Box",
6964
"--domain", "my-test-box",
@@ -78,16 +73,13 @@ func TestCreateCommand(t *testing.T) {
7873
Return("T789", "https://my-test-box.slack.com", nil)
7974

8075
cm.AddDefaultMocks()
81-
cm.Config.ExperimentsFlag = []string{string(experiment.Sandboxes)}
82-
cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug)
8376
},
8477
ExpectedAsserts: func(t *testing.T, ctx context.Context, cm *shared.ClientsMock) {
8578
cm.API.AssertCalled(t, "CreateSandbox", mock.Anything, "xoxb-test-token", "My Test Box", "my-test-box", "pass", "", "", 0, "", int64(0), false)
8679
},
8780
},
8881
"create with a relative time-to-live value": {
8982
CmdArgs: []string{
90-
"--experiment=sandboxes",
9183
"--token", "xoxb-test-token",
9284
"--name", "tmp-box",
9385
"--domain", "tmp-box",
@@ -103,16 +95,13 @@ func TestCreateCommand(t *testing.T) {
10395
Return("T111", "https://tmp-box.slack.com", nil)
10496

10597
cm.AddDefaultMocks()
106-
cm.Config.ExperimentsFlag = []string{string(experiment.Sandboxes)}
107-
cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug)
10898
},
10999
ExpectedAsserts: func(t *testing.T, ctx context.Context, cm *shared.ClientsMock) {
110100
cm.API.AssertCalled(t, "CreateSandbox", mock.Anything, "xoxb-test-token", "tmp-box", "tmp-box", "pass", "", "", 0, "", mock.MatchedBy(func(v int64) bool { return v > 0 }), false)
111101
},
112102
},
113103
"create API error": {
114104
CmdArgs: []string{
115-
"--experiment=sandboxes",
116105
"--token", "xoxb-test-token",
117106
"--name", "err-box",
118107
"--domain", "err-box",
@@ -127,14 +116,11 @@ func TestCreateCommand(t *testing.T) {
127116
Return("", "", errors.New("api_error"))
128117

129118
cm.AddDefaultMocks()
130-
cm.Config.ExperimentsFlag = []string{string(experiment.Sandboxes)}
131-
cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug)
132119
},
133120
ExpectedErrorStrings: []string{"api_error"},
134121
},
135122
"create with 'default' template": {
136123
CmdArgs: []string{
137-
"--experiment=sandboxes",
138124
"--token", "xoxb-test-token",
139125
"--name", "tpl-box",
140126
"--domain", "tpl-box",
@@ -150,8 +136,6 @@ func TestCreateCommand(t *testing.T) {
150136
Return("T333", "https://tpl-box.slack.com", nil)
151137

152138
cm.AddDefaultMocks()
153-
cm.Config.ExperimentsFlag = []string{string(experiment.Sandboxes)}
154-
cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug)
155139
},
156140
ExpectedStdoutOutputs: []string{"T333", "https://tpl-box.slack.com", "Sandbox Created"},
157141
ExpectedAsserts: func(t *testing.T, ctx context.Context, cm *shared.ClientsMock) {
@@ -160,7 +144,6 @@ func TestCreateCommand(t *testing.T) {
160144
},
161145
"create with partner flag": {
162146
CmdArgs: []string{
163-
"--experiment=sandboxes",
164147
"--token", "xoxb-test-token",
165148
"--name", "partner-box",
166149
"--domain", "partner-box",
@@ -176,8 +159,6 @@ func TestCreateCommand(t *testing.T) {
176159
Return("T555", "https://partner-box.slack.com", nil)
177160

178161
cm.AddDefaultMocks()
179-
cm.Config.ExperimentsFlag = []string{string(experiment.Sandboxes)}
180-
cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug)
181162
},
182163
ExpectedStdoutOutputs: []string{"T555", "https://partner-box.slack.com", "Sandbox Created"},
183164
ExpectedAsserts: func(t *testing.T, ctx context.Context, cm *shared.ClientsMock) {
@@ -186,7 +167,6 @@ func TestCreateCommand(t *testing.T) {
186167
},
187168
"create with invalid template fails": {
188169
CmdArgs: []string{
189-
"--experiment=sandboxes",
190170
"--token", "xoxb-test-token",
191171
"--name", "tmpl-box",
192172
"--domain", "tmpl-box",
@@ -200,8 +180,6 @@ func TestCreateCommand(t *testing.T) {
200180
cm.Auth.On("ResolveLogstashHost", mock.Anything, mock.Anything).Return("https://slackb.com/events/cli")
201181

202182
cm.AddDefaultMocks()
203-
cm.Config.ExperimentsFlag = []string{string(experiment.Sandboxes)}
204-
cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug)
205183
},
206184
ExpectedErrorStrings: []string{"Invalid template"},
207185
ExpectedAsserts: func(t *testing.T, ctx context.Context, cm *shared.ClientsMock) {
@@ -210,7 +188,6 @@ func TestCreateCommand(t *testing.T) {
210188
},
211189
"create with archive-date": {
212190
CmdArgs: []string{
213-
"--experiment=sandboxes",
214191
"--token", "xoxb-test-token",
215192
"--name", "date-box",
216193
"--domain", "date-box",
@@ -226,16 +203,13 @@ func TestCreateCommand(t *testing.T) {
226203
Return("T222", "https://date-box.slack.com", nil)
227204

228205
cm.AddDefaultMocks()
229-
cm.Config.ExperimentsFlag = []string{string(experiment.Sandboxes)}
230-
cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug)
231206
},
232207
ExpectedAsserts: func(t *testing.T, ctx context.Context, cm *shared.ClientsMock) {
233208
cm.API.AssertCalled(t, "CreateSandbox", mock.Anything, "xoxb-test-token", "date-box", "date-box", "pass", "", "", 0, "", archiveEpoch, false)
234209
},
235210
},
236211
"create with both archive and archive-date fails": {
237212
CmdArgs: []string{
238-
"--experiment=sandboxes",
239213
"--token", "xoxb-test-token",
240214
"--name", "tmp-box",
241215
"--domain", "tmp-box",
@@ -250,8 +224,6 @@ func TestCreateCommand(t *testing.T) {
250224
cm.Auth.On("ResolveLogstashHost", mock.Anything, mock.Anything).Return("https://slackb.com/events/cli")
251225

252226
cm.AddDefaultMocks()
253-
cm.Config.ExperimentsFlag = []string{string(experiment.Sandboxes)}
254-
cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug)
255227
},
256228
ExpectedErrorStrings: []string{"Cannot use both --archive-ttl and --archive-date"},
257229
ExpectedAsserts: func(t *testing.T, ctx context.Context, cm *shared.ClientsMock) {
@@ -260,7 +232,6 @@ func TestCreateCommand(t *testing.T) {
260232
},
261233
"create with invalid archive-ttl value fails": {
262234
CmdArgs: []string{
263-
"--experiment=sandboxes",
264235
"--token", "xoxb-test-token",
265236
"--name", "tmp-box",
266237
"--domain", "tmp-box",
@@ -274,28 +245,12 @@ func TestCreateCommand(t *testing.T) {
274245
cm.Auth.On("ResolveLogstashHost", mock.Anything, mock.Anything).Return("https://slackb.com/events/cli")
275246

276247
cm.AddDefaultMocks()
277-
cm.Config.ExperimentsFlag = []string{string(experiment.Sandboxes)}
278-
cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug)
279248
},
280249
ExpectedErrorStrings: []string{"Invalid TTL"},
281250
ExpectedAsserts: func(t *testing.T, ctx context.Context, cm *shared.ClientsMock) {
282251
cm.API.AssertNotCalled(t, "CreateSandbox", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)
283252
},
284253
},
285-
"experiment required": {
286-
CmdArgs: []string{
287-
"--name", "test-box",
288-
"--domain", "test-box",
289-
"--password", "pass",
290-
},
291-
Setup: func(t *testing.T, ctx context.Context, cm *shared.ClientsMock, cf *shared.ClientFactory) {
292-
cm.AddDefaultMocks()
293-
},
294-
ExpectedErrorStrings: []string{"sandbox"},
295-
ExpectedAsserts: func(t *testing.T, ctx context.Context, cm *shared.ClientsMock) {
296-
cm.API.AssertNotCalled(t, "CreateSandbox", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)
297-
},
298-
},
299254
}, func(cf *shared.ClientFactory) *cobra.Command {
300255
return NewCreateCommand(cf)
301256
})
@@ -310,8 +265,6 @@ func setupCreateMocks(t *testing.T, ctx context.Context, cm *shared.ClientsMock,
310265
cm.API.On("CreateSandbox", mock.Anything, testToken, name, domain, password, "", "", 0, "", archiveEpoch, partner).
311266
Return("T222", "https://"+domain+".slack.com", nil)
312267
cm.AddDefaultMocks()
313-
cm.Config.ExperimentsFlag = []string{string(experiment.Sandboxes)}
314-
cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug)
315268
}
316269

317270
func setupCreateAuthOnly(t *testing.T, ctx context.Context, cm *shared.ClientsMock) {
@@ -321,15 +274,12 @@ func setupCreateAuthOnly(t *testing.T, ctx context.Context, cm *shared.ClientsMo
321274
cm.Auth.On("ResolveAPIHost", mock.Anything, mock.Anything, mock.Anything).Return("https://api.slack.com")
322275
cm.Auth.On("ResolveLogstashHost", mock.Anything, mock.Anything).Return("https://slackb.com/events/cli")
323276
cm.AddDefaultMocks()
324-
cm.Config.ExperimentsFlag = []string{string(experiment.Sandboxes)}
325-
cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug)
326277
}
327278

328279
func Test_getEpochFromTTL(t *testing.T) {
329280
testutil.TableTestCommand(t, testutil.CommandTests{
330281
"1d": {
331282
CmdArgs: []string{
332-
"--experiment=sandboxes",
333283
"--token", "xoxb-test-token",
334284
"--name", "ttl-box",
335285
"--domain", "ttl-box",
@@ -346,7 +296,6 @@ func Test_getEpochFromTTL(t *testing.T) {
346296
},
347297
"1w": {
348298
CmdArgs: []string{
349-
"--experiment=sandboxes",
350299
"--token", "xoxb-test-token",
351300
"--name", "ttl-box",
352301
"--domain", "ttl-box",
@@ -363,7 +312,6 @@ func Test_getEpochFromTTL(t *testing.T) {
363312
},
364313
"6mo": {
365314
CmdArgs: []string{
366-
"--experiment=sandboxes",
367315
"--token", "xoxb-test-token",
368316
"--name", "ttl-box",
369317
"--domain", "ttl-box",
@@ -380,7 +328,6 @@ func Test_getEpochFromTTL(t *testing.T) {
380328
},
381329
"invalid": {
382330
CmdArgs: []string{
383-
"--experiment=sandboxes",
384331
"--token", "xoxb-test-token",
385332
"--name", "ttl-box",
386333
"--domain", "ttl-box",
@@ -408,7 +355,6 @@ func Test_getEpochFromDate(t *testing.T) {
408355
testutil.TableTestCommand(t, testutil.CommandTests{
409356
"valid": {
410357
CmdArgs: []string{
411-
"--experiment=sandboxes",
412358
"--token", "xoxb-test-token",
413359
"--name", "date-box",
414360
"--domain", "date-box",
@@ -425,7 +371,6 @@ func Test_getEpochFromDate(t *testing.T) {
425371
},
426372
"invalid format": {
427373
CmdArgs: []string{
428-
"--experiment=sandboxes",
429374
"--token", "xoxb-test-token",
430375
"--name", "date-box",
431376
"--domain", "date-box",
@@ -442,7 +387,6 @@ func Test_getEpochFromDate(t *testing.T) {
442387
},
443388
"invalid date": {
444389
CmdArgs: []string{
445-
"--experiment=sandboxes",
446390
"--token", "xoxb-test-token",
447391
"--name", "date-box",
448392
"--domain", "date-box",
@@ -459,7 +403,6 @@ func Test_getEpochFromDate(t *testing.T) {
459403
},
460404
"date in past": {
461405
CmdArgs: []string{
462-
"--experiment=sandboxes",
463406
"--token", "xoxb-test-token",
464407
"--name", "date-box",
465408
"--domain", "date-box",
@@ -483,7 +426,6 @@ func Test_getTemplateID(t *testing.T) {
483426
testutil.TableTestCommand(t, testutil.CommandTests{
484427
"valid template name": {
485428
CmdArgs: []string{
486-
"--experiment=sandboxes",
487429
"--token", "xoxb-test-token",
488430
"--name", "tpl-box",
489431
"--domain", "tpl-box",
@@ -498,8 +440,6 @@ func Test_getTemplateID(t *testing.T) {
498440
cm.API.On("CreateSandbox", mock.Anything, testToken, "tpl-box", "tpl-box", "pass", "", "", 1, "", int64(0), false).
499441
Return("T333", "https://tpl-box.slack.com", nil)
500442
cm.AddDefaultMocks()
501-
cm.Config.ExperimentsFlag = []string{string(experiment.Sandboxes)}
502-
cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug)
503443
},
504444
ExpectedStdoutOutputs: []string{"Sandbox Created"},
505445
ExpectedAsserts: func(t *testing.T, ctx context.Context, cm *shared.ClientsMock) {
@@ -508,7 +448,6 @@ func Test_getTemplateID(t *testing.T) {
508448
},
509449
"integer value also accepted": {
510450
CmdArgs: []string{
511-
"--experiment=sandboxes",
512451
"--token", "xoxb-test-token",
513452
"--name", "tpl-box",
514453
"--domain", "tpl-box",
@@ -523,8 +462,6 @@ func Test_getTemplateID(t *testing.T) {
523462
cm.API.On("CreateSandbox", mock.Anything, testToken, "tpl-box", "tpl-box", "pass", "", "", 1, "", int64(0), false).
524463
Return("T333", "https://tpl-box.slack.com", nil)
525464
cm.AddDefaultMocks()
526-
cm.Config.ExperimentsFlag = []string{string(experiment.Sandboxes)}
527-
cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug)
528465
},
529466
ExpectedStdoutOutputs: []string{"Sandbox Created"},
530467
ExpectedAsserts: func(t *testing.T, ctx context.Context, cm *shared.ClientsMock) {
@@ -533,7 +470,6 @@ func Test_getTemplateID(t *testing.T) {
533470
},
534471
"invalid template name fails": {
535472
CmdArgs: []string{
536-
"--experiment=sandboxes",
537473
"--token", "xoxb-test-token",
538474
"--name", "tpl-box",
539475
"--domain", "tpl-box",
@@ -557,7 +493,6 @@ func Test_domainFromName(t *testing.T) {
557493
testutil.TableTestCommand(t, testutil.CommandTests{
558494
"handles invalid URL characters": {
559495
CmdArgs: []string{
560-
"--experiment=sandboxes",
561496
"--token", "xoxb-test-token",
562497
"--name", "-Hello_World 123-",
563498
"--password", "pass",
@@ -572,7 +507,6 @@ func Test_domainFromName(t *testing.T) {
572507
},
573508
"empty": {
574509
CmdArgs: []string{
575-
"--experiment=sandboxes",
576510
"--token", "xoxb-test-token",
577511
"--name", "",
578512
"--password", "pass",

cmd/sandbox/delete.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,6 @@ func NewDeleteCommand(clients *shared.ClientFactory) *cobra.Command {
4040
{Command: "sandbox delete --sandbox-id E0123456", Meaning: "Delete a sandbox identified by its team ID"},
4141
}),
4242
Args: cobra.NoArgs,
43-
PreRunE: func(cmd *cobra.Command, args []string) error {
44-
return requireSandboxExperiment(clients)
45-
},
4643
RunE: func(cmd *cobra.Command, args []string) error {
4744
return runDeleteCommand(cmd, clients)
4845
},

0 commit comments

Comments
 (0)