Skip to content

Commit d1f659d

Browse files
authored
refactor: remove internal/logger from platform deploy (#384)
* refactor: remove logger from platform deploy and delete internal/logger package * refactor: fix package and deploy spinner * refactor: remove outdate FIXME * refactor: remove unused result from deployHook func * refactor: remove DeployResult from Deploy func * refactor: remove unused return args from deployApp func * refactor: minor alignments with original source code * refactor: remove unused sleep time to test packaging * refactor: replace strPtr and boolPtr with new-new constructor
1 parent 1ab5496 commit d1f659d

9 files changed

Lines changed: 195 additions & 544 deletions

File tree

cmd/platform/deploy.go

Lines changed: 8 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,15 @@ package platform
1616

1717
import (
1818
"context"
19-
"encoding/json"
2019
"fmt"
2120
"strings"
2221

2322
"github.com/slackapi/slack-cli/cmd/app"
2423
"github.com/slackapi/slack-cli/cmd/feedback"
2524
"github.com/slackapi/slack-cli/cmd/triggers"
26-
"github.com/slackapi/slack-cli/internal/api"
2725
"github.com/slackapi/slack-cli/internal/cmdutil"
2826
"github.com/slackapi/slack-cli/internal/config"
2927
"github.com/slackapi/slack-cli/internal/hooks"
30-
"github.com/slackapi/slack-cli/internal/logger"
3128
"github.com/slackapi/slack-cli/internal/pkg/platform"
3229
"github.com/slackapi/slack-cli/internal/prompts"
3330
"github.com/slackapi/slack-cli/internal/shared"
@@ -52,9 +49,6 @@ type deployCmdFlags struct {
5249

5350
var deployFlags deployCmdFlags
5451

55-
var packageSpinner *style.Spinner
56-
var deploySpinner *style.Spinner
57-
5852
func NewDeployCommand(clients *shared.ClientFactory) *cobra.Command {
5953
cmd := &cobra.Command{
6054
Use: "deploy [flags]",
@@ -68,16 +62,8 @@ func NewDeployCommand(clients *shared.ClientFactory) *cobra.Command {
6862
return cmdutil.IsValidProjectDirectory(clients)
6963
},
7064
RunE: func(cmd *cobra.Command, args []string) error {
71-
var event *logger.LogEvent
7265
ctx := cmd.Context()
7366

74-
packageSpinner = style.NewSpinner(cmd.OutOrStdout())
75-
deploySpinner = style.NewSpinner(cmd.OutOrStdout())
76-
defer func() {
77-
packageSpinner.Stop()
78-
deploySpinner.Stop()
79-
}()
80-
8167
selection, err := appSelectPromptFunc(ctx, clients, prompts.ShowHostedOnly, prompts.ShowAllApps)
8268
if err != nil {
8369
return err
@@ -94,22 +80,22 @@ func NewDeployCommand(clients *shared.ClientFactory) *cobra.Command {
9480
if installState == types.InstallRequestPending || installState == types.InstallRequestCancelled || installState == types.InstallRequestNotSent {
9581
return nil
9682
}
83+
9784
switch {
9885
case clients.SDKConfig.Hooks.Deploy.IsAvailable():
99-
event, err = deployHook(ctx, clients)
86+
err = deployHook(ctx, clients)
10087
if err != nil {
10188
return err
10289
}
10390
default:
104-
log := newDeployLogger(cmd)
10591
showTriggers := triggers.ShowTriggers(clients, deployFlags.hideTriggers)
106-
event, err = deployFunc(ctx, clients, showTriggers, log, app)
92+
err = deployFunc(ctx, clients, showTriggers, app)
10793
if err != nil {
10894
return err
10995
}
11096
}
11197

112-
err = printDeployHostingCompletion(clients, cmd, event)
98+
err = printDeployHostingCompletion(clients, cmd)
11399
if err != nil {
114100
return err
115101
}
@@ -127,25 +113,6 @@ func NewDeployCommand(clients *shared.ClientFactory) *cobra.Command {
127113
return cmd
128114
}
129115

130-
// newDeployLogger creates a logger instance to receive event notifications
131-
func newDeployLogger(cmd *cobra.Command) *logger.Logger {
132-
return logger.New(
133-
// OnEvent
134-
func(event *logger.LogEvent) {
135-
switch event.Name {
136-
case "on_app_package":
137-
printDeployPackage(cmd, event)
138-
case "on_app_package_completion":
139-
printDeployPackageCompletion(cmd, event)
140-
case "on_app_deploy_hosting":
141-
printDeployHosting(cmd, event)
142-
default:
143-
// Ignore the event
144-
}
145-
},
146-
)
147-
}
148-
149116
// hasValidDeploymentMethod errors if an app has no known ways to deploy
150117
func hasValidDeploymentMethod(
151118
ctx context.Context,
@@ -188,11 +155,7 @@ func hasValidDeploymentMethod(
188155
}
189156

190157
// deployHook executes the provided program and streams IO for the process
191-
func deployHook(ctx context.Context, clients *shared.ClientFactory) (*logger.LogEvent, error) {
192-
var log = logger.LogEvent{
193-
// FIXME: Include app information
194-
Data: logger.LogData{"authSession": "{}"},
195-
}
158+
func deployHook(ctx context.Context, clients *shared.ClientFactory) error {
196159
clients.IO.PrintInfo(ctx, false, "\n%s", style.Sectionf(style.TextSection{
197160
Emoji: "mailbox_with_mail",
198161
Text: "App Deploy",
@@ -220,82 +183,16 @@ func deployHook(ctx context.Context, clients *shared.ClientFactory) (*logger.Log
220183
IO: clients.IO,
221184
}
222185
if _, err := shell.Execute(ctx, hookExecOpts); err != nil {
223-
return &log, err
186+
return err
224187
}
225188
// Follow successful hook executions with a newline to match section formatting
226189
// but break immediately after an error!
227190
_, _ = clients.IO.WriteOut().Write([]byte("\n"))
228-
return &log, nil
229-
}
230-
231-
func printDeployPackage(cmd *cobra.Command, event *logger.LogEvent) {
232-
cmd.Println()
233-
packageSpinner.Update("Packaging app for deployment", "").Start()
234-
}
235-
236-
func printDeployPackageCompletion(cmd *cobra.Command, event *logger.LogEvent) {
237-
packagedSize := event.DataToString("packagedSize")
238-
packagedTime := event.DataToString("packagedTime")
239-
240-
deployPackageSuccessText := style.Sectionf(style.TextSection{
241-
Emoji: "gift",
242-
Text: "App packaged and ready to deploy",
243-
Secondary: []string{fmt.Sprintf("%s was packaged in %s", packagedSize, packagedTime)},
244-
})
245-
packageSpinner.Update(deployPackageSuccessText, "").Stop()
246-
}
247-
248-
func printDeployHosting(cmd *cobra.Command, event *logger.LogEvent) {
249-
deployHostingText := "Deploying to Slack Platform" + style.Secondary(" (this will take a moment)")
250-
deploySpinner.Update(deployHostingText, "").Start()
191+
return nil
251192
}
252193

253-
func printDeployHostingCompletion(clients *shared.ClientFactory, cmd *cobra.Command, event *logger.LogEvent) error {
194+
func printDeployHostingCompletion(clients *shared.ClientFactory, cmd *cobra.Command) error {
254195
var ctx = cmd.Context()
255-
var authSession api.AuthSession
256-
257-
appName := event.DataToString("appName")
258-
deployTime := event.DataToString("deployTime")
259-
err := json.Unmarshal([]byte(event.DataToString("authSession")), &authSession)
260-
if err != nil {
261-
return err
262-
}
263-
264-
parsedAppInfo := map[string]string{}
265-
266-
host := clients.API().Host()
267-
if appID := event.DataToString("appID"); appID != "" && host != "" {
268-
parsedAppInfo["Dashboard"] = fmt.Sprintf("%s/apps/%s", host, appID)
269-
}
270-
271-
if authSession.UserName != nil && authSession.UserID != nil {
272-
userInfo := fmt.Sprintf("%s (%s)", *authSession.UserName, *authSession.UserID)
273-
parsedAppInfo["App Owner"] = userInfo
274-
}
275-
276-
if authSession.TeamName != nil && authSession.TeamID != nil {
277-
workspaceInfo := fmt.Sprintf("%s (%s)", *authSession.TeamName, *authSession.TeamID)
278-
if authSession.EnterpriseID != nil {
279-
parsedAppInfo["Organization"] = workspaceInfo
280-
} else {
281-
parsedAppInfo["Workspace"] = workspaceInfo
282-
}
283-
}
284-
285-
var finalMessage string
286-
if appName != "" && deployTime != "" {
287-
finalMessage = fmt.Sprintf("%s deployed in %s", style.Bold(appName), deployTime)
288-
} else {
289-
finalMessage = "Successfully deployed the app!"
290-
}
291-
292-
successfulDeployText := style.Sectionf(style.TextSection{
293-
Emoji: "rocket",
294-
Text: finalMessage,
295-
Secondary: []string{style.Mapf(parsedAppInfo)},
296-
})
297-
298-
deploySpinner.Update(successfulDeployText, "").Stop()
299196

300197
clients.IO.PrintTrace(ctx, slacktrace.PlatformDeploySuccess)
301198

cmd/platform/deploy_test.go

Lines changed: 24 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
"github.com/slackapi/slack-cli/internal/config"
2626
"github.com/slackapi/slack-cli/internal/hooks"
2727
"github.com/slackapi/slack-cli/internal/iostreams"
28-
"github.com/slackapi/slack-cli/internal/logger"
2928
"github.com/slackapi/slack-cli/internal/prompts"
3029
"github.com/slackapi/slack-cli/internal/shared"
3130
"github.com/slackapi/slack-cli/internal/shared/types"
@@ -44,9 +43,9 @@ type DeployPkgMock struct {
4443
mock.Mock
4544
}
4645

47-
func (m *DeployPkgMock) Deploy(ctx context.Context, clients *shared.ClientFactory, showPrompts bool, log *logger.Logger, app types.App) (*logger.LogEvent, error) {
48-
args := m.Called(ctx, clients, showPrompts, log, app)
49-
return args.Get(0).(*logger.LogEvent), args.Error(1)
46+
func (m *DeployPkgMock) Deploy(ctx context.Context, clients *shared.ClientFactory, showPrompts bool, app types.App) error {
47+
args := m.Called(ctx, clients, showPrompts, app)
48+
return args.Error(0)
5049
}
5150

5251
// Setup a mock for Install package
@@ -79,9 +78,7 @@ func TestDeployCommand(t *testing.T) {
7978

8079
deployPkgMock := new(DeployPkgMock)
8180
deployFunc = deployPkgMock.Deploy
82-
deployPkgMock.On("Deploy", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&logger.LogEvent{
83-
Data: logger.LogData{"authSession": "{}"},
84-
}, nil)
81+
deployPkgMock.On("Deploy", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil)
8582

8683
appSelectMock := prompts.NewAppSelectMock()
8784
appSelectMock.On("AppSelectPrompt", mock.Anything, mock.Anything, prompts.ShowHostedOnly, prompts.ShowAllApps).Return(prompts.SelectedApp{}, nil)
@@ -106,7 +103,7 @@ func TestDeployCommand(t *testing.T) {
106103
assert.Fail(t, "cmd.Execute had unexpected error", err.Error())
107104
}
108105

109-
deployPkgMock.AssertCalled(t, "Deploy", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)
106+
deployPkgMock.AssertCalled(t, "Deploy", mock.Anything, mock.Anything, mock.Anything, mock.Anything)
110107
}
111108

112109
func TestDeployCommand_HasValidDeploymentMethod(t *testing.T) {
@@ -305,62 +302,23 @@ func TestDeployCommand_DeployHook(t *testing.T) {
305302
}
306303

307304
func TestDeployCommand_PrintHostingCompletion(t *testing.T) {
308-
tests := map[string]struct {
309-
event logger.LogData
310-
expected []string
311-
}{
312-
"information from a workspace deploy is printed": {
313-
event: logger.LogData{
314-
"appName": "DeployerApp",
315-
"appID": "A123",
316-
"deployTime": "12.34",
317-
"authSession": `{"user": "slackbot", "user_id": "USLACKBOT", "team": "speck", "team_id": "T001"}`,
318-
},
319-
expected: []string{
320-
"DeployerApp deployed in 12.34",
321-
"Dashboard: https://slacker.com/apps/A123",
322-
"App Owner: slackbot (USLACKBOT)",
323-
"Workspace: speck (T001)",
324-
},
325-
},
326-
"information from an enterprise deploy is printed": {
327-
event: logger.LogData{
328-
"appName": "Spackulen",
329-
"appID": "A999",
330-
"deployTime": "8.05",
331-
"authSession": `{"user": "stub", "user_id": "U111", "team": "spack", "team_id": "E002", "is_enterprise_install": true, "enterprise_id": "E002"}`,
332-
},
333-
expected: []string{
334-
"Spackulen deployed in 8.05",
335-
"Dashboard : https://slacker.com/apps/A999",
336-
"App Owner : stub (U111)",
337-
"Organization: spack (E002)",
338-
},
339-
},
340-
"a message is still displayed with missing info": {
341-
event: logger.LogData{
342-
"authSession": "{}",
343-
},
344-
expected: []string{
345-
"Successfully deployed the app!",
346-
},
347-
},
348-
}
349-
for name, tc := range tests {
350-
t.Run(name, func(t *testing.T) {
351-
clientsMock := shared.NewClientsMock()
352-
clientsMock.API.On("Host").Return("https://slacker.com")
353-
clientsMock.AddDefaultMocks()
354-
clients := shared.NewClientFactory(clientsMock.MockClientFactory())
355-
cmd := NewDeployCommand(clients)
356-
log := &logger.LogEvent{Data: tc.event}
357-
err := printDeployHostingCompletion(clients, cmd, log)
358-
assert.NoError(t, err)
359-
clientsMock.IO.AssertCalled(t, "PrintTrace", mock.Anything, slacktrace.PlatformDeploySuccess, mock.Anything)
360-
spinnerText, _ := deploySpinner.Status()
361-
for _, line := range tc.expected {
362-
assert.Contains(t, spinnerText, line)
363-
}
364-
})
365-
}
305+
ctx := slackcontext.MockContext(t.Context())
306+
clientsMock := shared.NewClientsMock()
307+
clientsMock.AddDefaultMocks()
308+
309+
stdoutBuffer := bytes.Buffer{}
310+
stdoutLogger := log.Logger{}
311+
stdoutLogger.SetOutput(&stdoutBuffer)
312+
clientsMock.IO.Stdout = &stdoutLogger
313+
314+
clients := shared.NewClientFactory(clientsMock.MockClientFactory())
315+
cmd := NewDeployCommand(clients)
316+
cmd.SetContext(ctx)
317+
err := printDeployHostingCompletion(clients, cmd)
318+
assert.NoError(t, err)
319+
clientsMock.IO.AssertCalled(t, "PrintTrace", mock.Anything, slacktrace.PlatformDeploySuccess, mock.Anything)
320+
output := stdoutBuffer.String()
321+
assert.Contains(t, output, "Visit Slack to try out your live app!")
322+
assert.Contains(t, output, "deploy")
323+
assert.Contains(t, output, "activity --tail")
366324
}

internal/logger/logdata.go

Lines changed: 0 additions & 18 deletions
This file was deleted.

0 commit comments

Comments
 (0)