From d7e8626f5531a145f7bbf4663e04dffdaf172fbe Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Tue, 23 Apr 2024 11:28:43 -0700 Subject: [PATCH 01/40] added cmd completed to envs get --- cmd/environments/environments.go | 19 +++++++++++++++++++ cmd/environments/get.go | 5 +++++ internal/analytics/client.go | 2 ++ internal/analytics/events.go | 6 ++++++ main.go | 4 +++- 5 files changed, 35 insertions(+), 1 deletion(-) diff --git a/cmd/environments/environments.go b/cmd/environments/environments.go index b1bc485e..c1da0e17 100644 --- a/cmd/environments/environments.go +++ b/cmd/environments/environments.go @@ -25,6 +25,25 @@ func NewEnvironmentsCmd( analytics.CmdRunEventProperties(cmd, "environments"), ) }, + PersistentPostRun: func(cmd *cobra.Command, args []string) { + outcome := analytics.SUCCESS + + if _, hasErr := cmd.Annotations["err"]; hasErr { + outcome = analytics.ERROR + } + if cmd.HasHelpSubCommands() { + outcome = analytics.HELP + } + + analyticsTracker.SendEvent( + viper.GetString(cliflags.AccessTokenFlag), + viper.GetString(cliflags.BaseURIFlag), + "CLI Command Completed", + map[string]interface{}{ + "outcome": outcome, + }, + ) + }, } getCmd, err := NewGetCmd(client) diff --git a/cmd/environments/get.go b/cmd/environments/get.go index aca2de7c..e011c384 100644 --- a/cmd/environments/get.go +++ b/cmd/environments/get.go @@ -26,21 +26,25 @@ func NewGetCmd( cmd.Flags().StringP(cliflags.EnvironmentFlag, "e", "", "Environment key") err := cmd.MarkFlagRequired(cliflags.EnvironmentFlag) if err != nil { + cmd.Annotations["err"] = err.Error() return nil, err } err = viper.BindPFlag(cliflags.EnvironmentFlag, cmd.Flags().Lookup(cliflags.EnvironmentFlag)) if err != nil { + cmd.Annotations["err"] = err.Error() return nil, err } cmd.Flags().StringP(cliflags.ProjectFlag, "p", "", "Project key") err = cmd.MarkFlagRequired(cliflags.ProjectFlag) if err != nil { + cmd.Annotations["err"] = err.Error() return nil, err } err = viper.BindPFlag(cliflags.ProjectFlag, cmd.Flags().Lookup(cliflags.ProjectFlag)) if err != nil { + cmd.Annotations["err"] = err.Error() return nil, err } @@ -62,6 +66,7 @@ func runGet( viper.GetString(cliflags.ProjectFlag), ) if err != nil { + cmd.Annotations["err"] = err.Error() return err } diff --git a/internal/analytics/client.go b/internal/analytics/client.go index 4951658f..f052d325 100644 --- a/internal/analytics/client.go +++ b/internal/analytics/client.go @@ -21,6 +21,7 @@ type Tracker interface { } type Client struct { + ID string HTTPClient *http.Client wg sync.WaitGroup } @@ -32,6 +33,7 @@ func (c *Client) SendEvent( eventName string, properties map[string]interface{}, ) { + properties["id"] = c.ID input := struct { Event string `json:"event"` Properties map[string]interface{} `json:"properties"` diff --git a/internal/analytics/events.go b/internal/analytics/events.go index fc6c4f30..ef9b52be 100644 --- a/internal/analytics/events.go +++ b/internal/analytics/events.go @@ -29,6 +29,12 @@ func CmdRunEventProperties(cmd *cobra.Command, name string) map[string]interface return properties } +const ( + SUCCESS = "success" + ERROR = "error" + HELP = "help" +) + func MockedTracker(name string, action string, flags []string) *MockTracker { id := "test-id" mockedTrackingArgs := []interface{}{ diff --git a/main.go b/main.go index 24e5bf64..4db601a1 100644 --- a/main.go +++ b/main.go @@ -6,6 +6,8 @@ import ( "ldcli/cmd" "ldcli/internal/analytics" + + "github.com/google/uuid" ) // main.version is set at build time via ldflags by go releaser https://goreleaser.com/cookbooks/using-main.version/ @@ -17,7 +19,7 @@ func main() { httpClient := &http.Client{ Timeout: time.Second * 3, } - analyticsClient := &analytics.Client{HTTPClient: httpClient} + analyticsClient := &analytics.Client{HTTPClient: httpClient, ID: uuid.New().String()} cmd.Execute(analyticsClient, version) analyticsClient.Wait() } From 647cf6197cdccc3702f8569d2abd745720947eac Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Tue, 23 Apr 2024 11:40:15 -0700 Subject: [PATCH 02/40] fix nil map error --- cmd/environments/get.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cmd/environments/get.go b/cmd/environments/get.go index e011c384..d4521229 100644 --- a/cmd/environments/get.go +++ b/cmd/environments/get.go @@ -26,25 +26,25 @@ func NewGetCmd( cmd.Flags().StringP(cliflags.EnvironmentFlag, "e", "", "Environment key") err := cmd.MarkFlagRequired(cliflags.EnvironmentFlag) if err != nil { - cmd.Annotations["err"] = err.Error() + cmd.Annotations = map[string]string{"err": "true"} return nil, err } err = viper.BindPFlag(cliflags.EnvironmentFlag, cmd.Flags().Lookup(cliflags.EnvironmentFlag)) if err != nil { - cmd.Annotations["err"] = err.Error() + cmd.Annotations = map[string]string{"err": "true"} return nil, err } cmd.Flags().StringP(cliflags.ProjectFlag, "p", "", "Project key") err = cmd.MarkFlagRequired(cliflags.ProjectFlag) if err != nil { - cmd.Annotations["err"] = err.Error() + cmd.Annotations = map[string]string{"err": "true"} return nil, err } err = viper.BindPFlag(cliflags.ProjectFlag, cmd.Flags().Lookup(cliflags.ProjectFlag)) if err != nil { - cmd.Annotations["err"] = err.Error() + cmd.Annotations = map[string]string{"err": "true"} return nil, err } @@ -66,7 +66,7 @@ func runGet( viper.GetString(cliflags.ProjectFlag), ) if err != nil { - cmd.Annotations["err"] = err.Error() + cmd.Annotations = map[string]string{"err": "true"} return err } From 052f9a06c9e58ab301818edefb67f7eaf05faa89 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Tue, 23 Apr 2024 12:16:07 -0700 Subject: [PATCH 03/40] add test for CLI Completed event --- internal/analytics/events.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/internal/analytics/events.go b/internal/analytics/events.go index ef9b52be..1026fc49 100644 --- a/internal/analytics/events.go +++ b/internal/analytics/events.go @@ -37,7 +37,8 @@ const ( func MockedTracker(name string, action string, flags []string) *MockTracker { id := "test-id" - mockedTrackingArgs := []interface{}{ + tracker := MockTracker{ID: id} + tracker.On("SendEvent", []interface{}{ "testAccessToken", "http://test.com", "CLI Command Run", @@ -48,8 +49,15 @@ func MockedTracker(name string, action string, flags []string) *MockTracker { "id": id, "name": name, }, - } - tracker := MockTracker{ID: id} - tracker.On("SendEvent", mockedTrackingArgs...) + }...) + tracker.On("SendEvent", []interface{}{ + "testAccessToken", + "http://test.com", + "CLI Command Completed", + map[string]interface{}{ + "id": id, + "outcome": SUCCESS, + }, + }...) return &tracker } From 6ac13c3fb06c266521b158ebd25d35a23d4c7176 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Tue, 23 Apr 2024 12:16:18 -0700 Subject: [PATCH 04/40] add test for CLI Completed event --- cmd/environments/get_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/environments/get_test.go b/cmd/environments/get_test.go index 13df0fe8..191ee40a 100644 --- a/cmd/environments/get_test.go +++ b/cmd/environments/get_test.go @@ -144,7 +144,7 @@ func TestGet(t *testing.T) { assert.EqualError(t, err, "base-uri is invalid"+errorHelp) }) - t.Run("will track analytics for CLI Command Run event", func(t *testing.T) { + t.Run("will track analytics for CLI Command Run and Completed events", func(t *testing.T) { tracker := analytics.MockedTracker( "environments", "get", From 0b11273aa85d07c1f087c23f3c0899ee8022a5a4 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Tue, 23 Apr 2024 12:20:11 -0700 Subject: [PATCH 05/40] abstract outcome --- cmd/environments/environments.go | 11 +---------- internal/analytics/events.go | 13 +++++++++++++ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/cmd/environments/environments.go b/cmd/environments/environments.go index c1da0e17..a2f7d59f 100644 --- a/cmd/environments/environments.go +++ b/cmd/environments/environments.go @@ -26,21 +26,12 @@ func NewEnvironmentsCmd( ) }, PersistentPostRun: func(cmd *cobra.Command, args []string) { - outcome := analytics.SUCCESS - - if _, hasErr := cmd.Annotations["err"]; hasErr { - outcome = analytics.ERROR - } - if cmd.HasHelpSubCommands() { - outcome = analytics.HELP - } - analyticsTracker.SendEvent( viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), "CLI Command Completed", map[string]interface{}{ - "outcome": outcome, + "outcome": analytics.Outcome(cmd), }, ) }, diff --git a/internal/analytics/events.go b/internal/analytics/events.go index 1026fc49..0b96b184 100644 --- a/internal/analytics/events.go +++ b/internal/analytics/events.go @@ -61,3 +61,16 @@ func MockedTracker(name string, action string, flags []string) *MockTracker { }...) return &tracker } + +func Outcome(cmd *cobra.Command) string { + outcome := SUCCESS + + if _, hasErr := cmd.Annotations["err"]; hasErr { + outcome = ERROR + } + if cmd.HasHelpSubCommands() { + outcome = HELP + } + + return outcome +} From af76eacd115babb37493d24b0251f62035ec121f Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Tue, 23 Apr 2024 12:26:45 -0700 Subject: [PATCH 06/40] added event to config --- cmd/config/config.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cmd/config/config.go b/cmd/config/config.go index f9779e62..c298930a 100644 --- a/cmd/config/config.go +++ b/cmd/config/config.go @@ -35,6 +35,16 @@ func NewConfigCmd(analyticsTracker analytics.Tracker) *cobra.Command { analytics.CmdRunEventProperties(cmd, "config"), ) }, + PostRun: func(cmd *cobra.Command, args []string) { + analyticsTracker.SendEvent( + viper.GetString(cliflags.AccessTokenFlag), + viper.GetString(cliflags.BaseURIFlag), + "CLI Command Completed", + map[string]interface{}{ + "outcome": analytics.Outcome(cmd), + }, + ) + }, } cmd.Flags().Bool(ListFlag, false, "List configs") From 93f7a65fa5d33f8816eb3b4b1708e68b623243d0 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Tue, 23 Apr 2024 16:00:11 -0700 Subject: [PATCH 07/40] moved where event is tracked --- cmd/cmdtest.go | 19 +++++++++++++++++++ cmd/environments/environments.go | 10 ---------- cmd/environments/get_test.go | 30 ++++++++++++++++++++++++++++++ cmd/root.go | 11 +++++++++++ 4 files changed, 60 insertions(+), 10 deletions(-) diff --git a/cmd/cmdtest.go b/cmd/cmdtest.go index 38a3edd0..58b54fc4 100644 --- a/cmd/cmdtest.go +++ b/cmd/cmdtest.go @@ -6,8 +6,10 @@ import ( "os" "testing" + "github.com/spf13/viper" "github.com/stretchr/testify/require" + "ldcli/cmd/cliflags" "ldcli/internal/analytics" ) @@ -32,9 +34,26 @@ func CallCmd( err = rootCmd.Execute() if err != nil { + tracker.SendEvent( + viper.GetString(cliflags.AccessTokenFlag), + viper.GetString(cliflags.BaseURIFlag), + "CLI Command Completed", + map[string]interface{}{ + "outcome": analytics.ERROR, + }, + ) return nil, err } + tracker.SendEvent( + viper.GetString(cliflags.AccessTokenFlag), + viper.GetString(cliflags.BaseURIFlag), + "CLI Command Completed", + map[string]interface{}{ + "outcome": analytics.SUCCESS, + }, + ) + out, err := io.ReadAll(b) require.NoError(t, err) diff --git a/cmd/environments/environments.go b/cmd/environments/environments.go index a2f7d59f..b1bc485e 100644 --- a/cmd/environments/environments.go +++ b/cmd/environments/environments.go @@ -25,16 +25,6 @@ func NewEnvironmentsCmd( analytics.CmdRunEventProperties(cmd, "environments"), ) }, - PersistentPostRun: func(cmd *cobra.Command, args []string) { - analyticsTracker.SendEvent( - viper.GetString(cliflags.AccessTokenFlag), - viper.GetString(cliflags.BaseURIFlag), - "CLI Command Completed", - map[string]interface{}{ - "outcome": analytics.Outcome(cmd), - }, - ) - }, } getCmd, err := NewGetCmd(client) diff --git a/cmd/environments/get_test.go b/cmd/environments/get_test.go index cf4aec7e..c5c14ee3 100644 --- a/cmd/environments/get_test.go +++ b/cmd/environments/get_test.go @@ -195,4 +195,34 @@ func TestGet(t *testing.T) { require.NoError(t, err) }) + + t.Run("will track analytics for api error", func(t *testing.T) { + tracker := analytics.MockedTracker( + "environments", + "get", + []string{ + "access-token", + "base-uri", + "environment", + "project", + }) + client := environments.MockClient{} + client. + On("Get", mockArgs...). + Return([]byte(`{}`), errors.NewError("An error")) + clients := cmd.APIClients{ + EnvironmentsClient: &client, + } + + args := []string{ + "environments", "get", + "--access-token", "testAccessToken", + "--base-uri", "http://test.com", + "--environment", "test-env", + "--project", "test-proj", + } + + _, err := cmd.CallCmd(t, clients, tracker, args) + require.EqualError(t, err, "An error") + }) } diff --git a/cmd/root.go b/cmd/root.go index 3bbb84c9..0f57ccbb 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -152,9 +152,20 @@ func Execute(analyticsTracker analytics.Tracker, version string) { } err = rootCmd.Execute() + outcome := analytics.SUCCESS if err != nil { + outcome = analytics.ERROR fmt.Fprintln(os.Stderr, err.Error()) } + + analyticsTracker.SendEvent( + viper.GetString(cliflags.AccessTokenFlag), + viper.GetString(cliflags.BaseURIFlag), + "CLI Command Completed", + map[string]interface{}{ + "outcome": outcome, + }, + ) } // setFlagsFromConfig reads in the config file if it exists and uses any flag values for commands. From 0f87f51a09ada4c0108c466c6fc78e1b24fc7b9b Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Tue, 23 Apr 2024 17:23:08 -0700 Subject: [PATCH 08/40] modify all tests --- cmd/environments/get_test.go | 4 ++-- cmd/flags/create_test.go | 2 +- cmd/flags/get_test.go | 2 +- cmd/flags/update_test.go | 4 ++-- cmd/members/create_test.go | 2 +- cmd/members/invite_test.go | 4 ++-- cmd/projects/create_test.go | 2 +- cmd/projects/list_test.go | 2 +- internal/analytics/events.go | 4 ++-- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/cmd/environments/get_test.go b/cmd/environments/get_test.go index c5c14ee3..511561ff 100644 --- a/cmd/environments/get_test.go +++ b/cmd/environments/get_test.go @@ -174,7 +174,7 @@ func TestGet(t *testing.T) { "base-uri", "environment", "project", - }) + }, analytics.SUCCESS) client := environments.MockClient{} client. On("Get", mockArgs...). @@ -205,7 +205,7 @@ func TestGet(t *testing.T) { "base-uri", "environment", "project", - }) + }, analytics.ERROR) client := environments.MockClient{} client. On("Get", mockArgs...). diff --git a/cmd/flags/create_test.go b/cmd/flags/create_test.go index 8403ce33..ab3f523a 100644 --- a/cmd/flags/create_test.go +++ b/cmd/flags/create_test.go @@ -154,7 +154,7 @@ func TestCreate(t *testing.T) { "base-uri", "data", "project", - }) + }, analytics.SUCCESS) client := flags.MockClient{} client. diff --git a/cmd/flags/get_test.go b/cmd/flags/get_test.go index 636db908..632ef265 100644 --- a/cmd/flags/get_test.go +++ b/cmd/flags/get_test.go @@ -130,7 +130,7 @@ func TestGet(t *testing.T) { "environment", "flag", "project", - }) + }, analytics.SUCCESS) client := flags.MockClient{} client. diff --git a/cmd/flags/update_test.go b/cmd/flags/update_test.go index c290f7e5..319f1eef 100644 --- a/cmd/flags/update_test.go +++ b/cmd/flags/update_test.go @@ -136,7 +136,7 @@ func TestUpdate(t *testing.T) { "data", "flag", "project", - }) + }, analytics.SUCCESS) client := flags.MockClient{} client. @@ -261,7 +261,7 @@ func TestToggle(t *testing.T) { "environment", "flag", "project", - }) + }, analytics.SUCCESS) client := flags.MockClient{} client. diff --git a/cmd/members/create_test.go b/cmd/members/create_test.go index 4244f716..b4923883 100644 --- a/cmd/members/create_test.go +++ b/cmd/members/create_test.go @@ -129,7 +129,7 @@ func TestCreate(t *testing.T) { "access-token", "base-uri", "data", - }) + }, analytics.SUCCESS) client := members.MockClient{} client. diff --git a/cmd/members/invite_test.go b/cmd/members/invite_test.go index 603ba3e1..54e1e94d 100644 --- a/cmd/members/invite_test.go +++ b/cmd/members/invite_test.go @@ -132,7 +132,7 @@ func TestInvite(t *testing.T) { "access-token", "base-uri", "emails", - }) + }, analytics.SUCCESS) client := members.MockClient{} client. @@ -229,7 +229,7 @@ func TestInviteWithOptionalRole(t *testing.T) { "base-uri", "emails", "role", - }) + }, analytics.SUCCESS) client := members.MockClient{} client. diff --git a/cmd/projects/create_test.go b/cmd/projects/create_test.go index aebf0e71..ca6aad0c 100644 --- a/cmd/projects/create_test.go +++ b/cmd/projects/create_test.go @@ -156,7 +156,7 @@ func TestCreate(t *testing.T) { "access-token", "base-uri", "data", - }) + }, analytics.SUCCESS) client := projects.MockClient{} client. diff --git a/cmd/projects/list_test.go b/cmd/projects/list_test.go index 652aad48..cbb2b348 100644 --- a/cmd/projects/list_test.go +++ b/cmd/projects/list_test.go @@ -138,7 +138,7 @@ func TestList(t *testing.T) { []string{ "access-token", "base-uri", - }) + }, analytics.SUCCESS) client := projects.MockClient{} client. diff --git a/internal/analytics/events.go b/internal/analytics/events.go index 0b96b184..10f5eddd 100644 --- a/internal/analytics/events.go +++ b/internal/analytics/events.go @@ -35,7 +35,7 @@ const ( HELP = "help" ) -func MockedTracker(name string, action string, flags []string) *MockTracker { +func MockedTracker(name string, action string, flags []string, outcome string) *MockTracker { id := "test-id" tracker := MockTracker{ID: id} tracker.On("SendEvent", []interface{}{ @@ -56,7 +56,7 @@ func MockedTracker(name string, action string, flags []string) *MockTracker { "CLI Command Completed", map[string]interface{}{ "id": id, - "outcome": SUCCESS, + "outcome": outcome, }, }...) return &tracker From 9f6b217df9550c274d1b9dae4e80a0b04fa63ecb Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Tue, 23 Apr 2024 17:41:06 -0700 Subject: [PATCH 09/40] update env and flags tests --- cmd/environments/get_test.go | 2 +- cmd/flags/create_test.go | 30 +++++++++++++++++ cmd/flags/get_test.go | 32 ++++++++++++++++++ cmd/flags/update_test.go | 65 ++++++++++++++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 1 deletion(-) diff --git a/cmd/environments/get_test.go b/cmd/environments/get_test.go index 511561ff..2b908dbe 100644 --- a/cmd/environments/get_test.go +++ b/cmd/environments/get_test.go @@ -165,7 +165,7 @@ func TestGet(t *testing.T) { assert.EqualError(t, err, "output is invalid"+errorHelp) }) - t.Run("will track analytics for CLI Command Run and Completed events", func(t *testing.T) { + t.Run("will track analytics for CLI Command Run event", func(t *testing.T) { tracker := analytics.MockedTracker( "environments", "get", diff --git a/cmd/flags/create_test.go b/cmd/flags/create_test.go index ab3f523a..29c340a8 100644 --- a/cmd/flags/create_test.go +++ b/cmd/flags/create_test.go @@ -175,4 +175,34 @@ func TestCreate(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.NoError(t, err) }) + + t.Run("will track analytics for api error", func(t *testing.T) { + tracker := analytics.MockedTracker( + "flags", + "create", + []string{ + "access-token", + "base-uri", + "data", + "project", + }, analytics.ERROR) + client := flags.MockClient{} + client. + On("Create", mockArgs...). + Return([]byte(`{}`), errors.NewError("An error")) + clients := cmd.APIClients{ + FlagsClient: &client, + } + + args := []string{ + "flags", "create", + "--access-token", "testAccessToken", + "--base-uri", "http://test.com", + "-d", `{"key": "test-key", "name": "test-name"}`, + "--project", "test-proj-key", + } + + _, err := cmd.CallCmd(t, clients, tracker, args) + require.EqualError(t, err, "An error") + }) } diff --git a/cmd/flags/get_test.go b/cmd/flags/get_test.go index 632ef265..ce56717a 100644 --- a/cmd/flags/get_test.go +++ b/cmd/flags/get_test.go @@ -152,4 +152,36 @@ func TestGet(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.NoError(t, err) }) + + t.Run("will track analytics for api error", func(t *testing.T) { + tracker := analytics.MockedTracker( + "flags", + "get", + []string{ + "access-token", + "base-uri", + "environment", + "flag", + "project", + }, analytics.ERROR) + client := flags.MockClient{} + client. + On("Get", mockArgs...). + Return([]byte(`{}`), errors.NewError("An error")) + clients := cmd.APIClients{ + FlagsClient: &client, + } + + args := []string{ + "flags", "get", + "--access-token", "testAccessToken", + "--base-uri", "http://test.com", + "--flag", "test-key", + "--project", "test-proj-key", + "--environment", "test-env-key", + } + + _, err := cmd.CallCmd(t, clients, tracker, args) + require.EqualError(t, err, "An error") + }) } diff --git a/cmd/flags/update_test.go b/cmd/flags/update_test.go index 319f1eef..6e998237 100644 --- a/cmd/flags/update_test.go +++ b/cmd/flags/update_test.go @@ -145,6 +145,7 @@ func TestUpdate(t *testing.T) { clients := cmd.APIClients{ FlagsClient: &client, } + args := []string{ "flags", "update", "--access-token", "testAccessToken", @@ -157,6 +158,38 @@ func TestUpdate(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.NoError(t, err) }) + + t.Run("will track analytics for api error", func(t *testing.T) { + tracker := analytics.MockedTracker( + "flags", + "update", + []string{ + "access-token", + "base-uri", + "data", + "flag", + "project", + }, analytics.ERROR) + client := flags.MockClient{} + client. + On("Update", mockArgs...). + Return([]byte(`{}`), errors.NewError("An error")) + clients := cmd.APIClients{ + FlagsClient: &client, + } + + args := []string{ + "flags", "update", + "--access-token", "testAccessToken", + "--base-uri", "http://test.com", + "-d", `[{"op": "replace", "path": "/name", "value": "new-name"}]`, + "--flag", "test-key", + "--project", "test-proj-key", + } + + _, err := cmd.CallCmd(t, clients, tracker, args) + require.EqualError(t, err, "An error") + }) } func TestToggle(t *testing.T) { @@ -282,4 +315,36 @@ func TestToggle(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.NoError(t, err) }) + + t.Run("will track analytics for api error", func(t *testing.T) { + tracker := analytics.MockedTracker( + "flags", + "toggle-on", + []string{ + "access-token", + "base-uri", + "environment", + "flag", + "project", + }, analytics.ERROR) + client := flags.MockClient{} + client. + On("Update", mockArgs...). + Return([]byte(`{}`), errors.NewError("An error")) + clients := cmd.APIClients{ + FlagsClient: &client, + } + + args := []string{ + "flags", "toggle-on", + "--access-token", "testAccessToken", + "--base-uri", "http://test.com", + "--flag", "test-flag-key", + "--project", "test-proj-key", + "--environment", "test-env-key", + } + + _, err := cmd.CallCmd(t, clients, tracker, args) + require.EqualError(t, err, "An error") + }) } From 56728c4004258cf8672d7a94872196423155deac Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Tue, 23 Apr 2024 17:41:48 -0700 Subject: [PATCH 10/40] remove unneeded config code --- cmd/config/config.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/cmd/config/config.go b/cmd/config/config.go index c298930a..f9779e62 100644 --- a/cmd/config/config.go +++ b/cmd/config/config.go @@ -35,16 +35,6 @@ func NewConfigCmd(analyticsTracker analytics.Tracker) *cobra.Command { analytics.CmdRunEventProperties(cmd, "config"), ) }, - PostRun: func(cmd *cobra.Command, args []string) { - analyticsTracker.SendEvent( - viper.GetString(cliflags.AccessTokenFlag), - viper.GetString(cliflags.BaseURIFlag), - "CLI Command Completed", - map[string]interface{}{ - "outcome": analytics.Outcome(cmd), - }, - ) - }, } cmd.Flags().Bool(ListFlag, false, "List configs") From 2270c8f4b39896e8ced8dcafe03100315be01c21 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Tue, 23 Apr 2024 17:43:48 -0700 Subject: [PATCH 11/40] tracking members --- cmd/members/create_test.go | 30 ++++++++++++++++++++++++++++++ cmd/members/invite_test.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/cmd/members/create_test.go b/cmd/members/create_test.go index b4923883..f76c568a 100644 --- a/cmd/members/create_test.go +++ b/cmd/members/create_test.go @@ -150,4 +150,34 @@ func TestCreate(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.NoError(t, err) }) + + t.Run("will track analytics for api error", func(t *testing.T) { + tracker := analytics.MockedTracker( + "members", + "create", + []string{ + "access-token", + "base-uri", + "data", + }, analytics.ERROR) + client := members.MockClient{} + client. + On("Create", mockArgs...). + Return([]byte(`{}`), errors.NewError("An error")) + clients := cmd.APIClients{ + MembersClient: &client, + } + + args := []string{ + "members", + "create", + "--access-token", "testAccessToken", + "--base-uri", "http://test.com", + "-d", + `[{"email": "testemail@test.com", "role": "writer"}]`, + } + + _, err := cmd.CallCmd(t, clients, tracker, args) + require.EqualError(t, err, "An error") + }) } diff --git a/cmd/members/invite_test.go b/cmd/members/invite_test.go index 54e1e94d..6f71c3ca 100644 --- a/cmd/members/invite_test.go +++ b/cmd/members/invite_test.go @@ -249,4 +249,34 @@ func TestInviteWithOptionalRole(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.NoError(t, err) }) + + t.Run("will track analytics for api error", func(t *testing.T) { + tracker := analytics.MockedTracker( + "members", + "invite", + []string{ + "access-token", + "base-uri", + "emails", + "role", + }, analytics.ERROR) + client := members.MockClient{} + client. + On("Create", mockArgs...). + Return([]byte(`{}`), errors.NewError("An error")) + clients := cmd.APIClients{ + MembersClient: &client, + } + + args := []string{ + "members", "invite", + "--access-token", "testAccessToken", + "--base-uri", "http://test.com", + "-e", `testemail1@test.com,testemail2@test.com`, + "--role", "writer", + } + + _, err := cmd.CallCmd(t, clients, tracker, args) + require.EqualError(t, err, "An error") + }) } From bc31a6a400227ddb0da74505d6971adf84aa0f0b Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Tue, 23 Apr 2024 17:46:58 -0700 Subject: [PATCH 12/40] projects done --- cmd/projects/create_test.go | 28 ++++++++++++++++++++++++++++ cmd/projects/list_test.go | 26 ++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/cmd/projects/create_test.go b/cmd/projects/create_test.go index ca6aad0c..a4f6c1dd 100644 --- a/cmd/projects/create_test.go +++ b/cmd/projects/create_test.go @@ -175,4 +175,32 @@ func TestCreate(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.NoError(t, err) }) + + t.Run("will track analytics for api error", func(t *testing.T) { + tracker := analytics.MockedTracker( + "projects", + "create", + []string{ + "access-token", + "base-uri", + "data", + }, analytics.ERROR) + client := projects.MockClient{} + client. + On("Create", mockArgs...). + Return([]byte(`{}`), errors.NewError("An error")) + clients := cmd.APIClients{ + ProjectsClient: &client, + } + + args := []string{ + "projects", "create", + "--access-token", "testAccessToken", + "--base-uri", "http://test.com", + "-d", `{"key": "test-key", "name": "test-name"}`, + } + + _, err := cmd.CallCmd(t, clients, tracker, args) + require.EqualError(t, err, "An error") + }) } diff --git a/cmd/projects/list_test.go b/cmd/projects/list_test.go index cbb2b348..44ad596c 100644 --- a/cmd/projects/list_test.go +++ b/cmd/projects/list_test.go @@ -156,4 +156,30 @@ func TestList(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.NoError(t, err) }) + + t.Run("will track analytics for api error", func(t *testing.T) { + tracker := analytics.MockedTracker( + "projects", + "list", + []string{ + "access-token", + "base-uri", + }, analytics.ERROR) + client := projects.MockClient{} + client. + On("List", mockArgs...). + Return([]byte(`{}`), errors.NewError("An error")) + clients := cmd.APIClients{ + ProjectsClient: &client, + } + + args := []string{ + "projects", "list", + "--access-token", "testAccessToken", + "--base-uri", "http://test.com", + } + + _, err := cmd.CallCmd(t, clients, tracker, args) + require.EqualError(t, err, "An error") + }) } From a3b914fdc8c1b32704be2242bd75966bbd4ad4ce Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Tue, 23 Apr 2024 17:49:20 -0700 Subject: [PATCH 13/40] remove annotations --- cmd/environments/get.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cmd/environments/get.go b/cmd/environments/get.go index 6fd3a62c..8e052412 100644 --- a/cmd/environments/get.go +++ b/cmd/environments/get.go @@ -27,25 +27,21 @@ func NewGetCmd( cmd.Flags().StringP(cliflags.EnvironmentFlag, "e", "", "Environment key") err := cmd.MarkFlagRequired(cliflags.EnvironmentFlag) if err != nil { - cmd.Annotations = map[string]string{"err": "true"} return nil, err } err = viper.BindPFlag(cliflags.EnvironmentFlag, cmd.Flags().Lookup(cliflags.EnvironmentFlag)) if err != nil { - cmd.Annotations = map[string]string{"err": "true"} return nil, err } cmd.Flags().StringP(cliflags.ProjectFlag, "p", "", "Project key") err = cmd.MarkFlagRequired(cliflags.ProjectFlag) if err != nil { - cmd.Annotations = map[string]string{"err": "true"} return nil, err } err = viper.BindPFlag(cliflags.ProjectFlag, cmd.Flags().Lookup(cliflags.ProjectFlag)) if err != nil { - cmd.Annotations = map[string]string{"err": "true"} return nil, err } @@ -67,7 +63,6 @@ func runGet( viper.GetString(cliflags.ProjectFlag), ) if err != nil { - cmd.Annotations = map[string]string{"err": "true"} return err } From 4c5defae2b266bf39d24dd0102013f7a43b99110 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Tue, 23 Apr 2024 17:50:10 -0700 Subject: [PATCH 14/40] remove new line --- cmd/flags/update_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/cmd/flags/update_test.go b/cmd/flags/update_test.go index 6e998237..144345d6 100644 --- a/cmd/flags/update_test.go +++ b/cmd/flags/update_test.go @@ -145,7 +145,6 @@ func TestUpdate(t *testing.T) { clients := cmd.APIClients{ FlagsClient: &client, } - args := []string{ "flags", "update", "--access-token", "testAccessToken", From 38c7066e3af38f566fc06d1670270f16d965e50e Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Tue, 23 Apr 2024 17:51:03 -0700 Subject: [PATCH 15/40] remove id from CmdRunEventProperties --- internal/analytics/events.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/internal/analytics/events.go b/internal/analytics/events.go index 10f5eddd..68bf07ea 100644 --- a/internal/analytics/events.go +++ b/internal/analytics/events.go @@ -3,14 +3,12 @@ package analytics import ( "ldcli/cmd/cliflags" - "github.com/google/uuid" "github.com/spf13/cobra" "github.com/spf13/pflag" "github.com/spf13/viper" ) func CmdRunEventProperties(cmd *cobra.Command, name string) map[string]interface{} { - id := uuid.New() baseURI := viper.GetString(cliflags.BaseURIFlag) var flags []string cmd.Flags().Visit(func(f *pflag.Flag) { @@ -21,7 +19,6 @@ func CmdRunEventProperties(cmd *cobra.Command, name string) map[string]interface "name": name, "action": cmd.CalledAs(), "flags": flags, - "id": id.String(), } if baseURI != cliflags.BaseURIDefault { properties["baseURI"] = baseURI From 0e98678582cc5b0639f925f9df7d5784b46f5c0f Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 11:21:58 -0700 Subject: [PATCH 16/40] got tracking for envs --help --- cmd/cmdtest.go | 7 +++++-- cmd/environments/environments.go | 12 ++++++++++++ cmd/environments/get_test.go | 24 ++++++++++++++++++++++++ cmd/root.go | 2 ++ 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/cmd/cmdtest.go b/cmd/cmdtest.go index 58b54fc4..2fa4119c 100644 --- a/cmd/cmdtest.go +++ b/cmd/cmdtest.go @@ -44,13 +44,16 @@ func CallCmd( ) return nil, err } - + outcome := analytics.SUCCESS + if _, isHelp := rootCmd.Annotations["help"]; isHelp { + outcome = analytics.HELP + } tracker.SendEvent( viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), "CLI Command Completed", map[string]interface{}{ - "outcome": analytics.SUCCESS, + "outcome": outcome, }, ) diff --git a/cmd/environments/environments.go b/cmd/environments/environments.go index b1bc485e..82d2654f 100644 --- a/cmd/environments/environments.go +++ b/cmd/environments/environments.go @@ -33,5 +33,17 @@ func NewEnvironmentsCmd( } cmd.AddCommand(getCmd) + for _, c := range cmd.Commands() { + c.SetHelpFunc(func(c *cobra.Command, args []string) { + analyticsTracker.SendEvent( + viper.GetString(cliflags.AccessTokenFlag), + viper.GetString(cliflags.BaseURIFlag), + "CLI Command Run", + analytics.CmdRunEventProperties(c, "environments"), + ) + c.Root().Annotations = map[string]string{"help": "environments get"} + }) + } + return cmd, nil } diff --git a/cmd/environments/get_test.go b/cmd/environments/get_test.go index 2b908dbe..67ed2db4 100644 --- a/cmd/environments/get_test.go +++ b/cmd/environments/get_test.go @@ -225,4 +225,28 @@ func TestGet(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.EqualError(t, err, "An error") }) + + t.Run("will track analytics when help flag received", func(t *testing.T) { + tracker := analytics.MockedTracker( + "environments", + "get", + []string{ + "access-token", + "base-uri", + "help", + }, analytics.HELP) + clients := cmd.APIClients{ + EnvironmentsClient: &environments.MockClient{}, + } + + args := []string{ + "environments", "get", + "--access-token", "testAccessToken", + "--base-uri", "http://test.com", + "--help", + } + + _, err := cmd.CallCmd(t, clients, tracker, args) + require.NoError(t, err) + }) } diff --git a/cmd/root.go b/cmd/root.go index 0f57ccbb..61b924f6 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -156,6 +156,8 @@ func Execute(analyticsTracker analytics.Tracker, version string) { if err != nil { outcome = analytics.ERROR fmt.Fprintln(os.Stderr, err.Error()) + } else if _, isHelp := rootCmd.Annotations["help"]; isHelp { + outcome = analytics.HELP } analyticsTracker.SendEvent( From 33d061e371cf94590bbae80e0bcd6e171f0ea726 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 11:22:20 -0700 Subject: [PATCH 17/40] remove unused function --- internal/analytics/events.go | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/internal/analytics/events.go b/internal/analytics/events.go index 68bf07ea..ca4d7cb3 100644 --- a/internal/analytics/events.go +++ b/internal/analytics/events.go @@ -58,16 +58,3 @@ func MockedTracker(name string, action string, flags []string, outcome string) * }...) return &tracker } - -func Outcome(cmd *cobra.Command) string { - outcome := SUCCESS - - if _, hasErr := cmd.Annotations["err"]; hasErr { - outcome = ERROR - } - if cmd.HasHelpSubCommands() { - outcome = HELP - } - - return outcome -} From 60d652fc6dd0cf8fdd8a4daa1aced6cbeb175ba5 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 11:23:57 -0700 Subject: [PATCH 18/40] change help key value --- cmd/environments/environments.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/environments/environments.go b/cmd/environments/environments.go index 82d2654f..5d027a3c 100644 --- a/cmd/environments/environments.go +++ b/cmd/environments/environments.go @@ -41,7 +41,7 @@ func NewEnvironmentsCmd( "CLI Command Run", analytics.CmdRunEventProperties(c, "environments"), ) - c.Root().Annotations = map[string]string{"help": "environments get"} + c.Root().Annotations = map[string]string{"help": "true"} }) } From 45921459dcd0f166657d185a804171db3ecd1ff4 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 11:32:42 -0700 Subject: [PATCH 19/40] use defer, also abstract sendEvent commands --- cmd/cmdtest.go | 26 +++++--------------------- cmd/environments/environments.go | 18 +++--------------- cmd/root.go | 13 +++---------- internal/analytics/events.go | 20 ++++++++++++++++++++ 4 files changed, 31 insertions(+), 46 deletions(-) diff --git a/cmd/cmdtest.go b/cmd/cmdtest.go index 2fa4119c..14b553a7 100644 --- a/cmd/cmdtest.go +++ b/cmd/cmdtest.go @@ -6,10 +6,8 @@ import ( "os" "testing" - "github.com/spf13/viper" "github.com/stretchr/testify/require" - "ldcli/cmd/cliflags" "ldcli/internal/analytics" ) @@ -21,6 +19,9 @@ func CallCmd( tracker analytics.Tracker, args []string, ) ([]byte, error) { + outcome := analytics.SUCCESS + defer analytics.SendCommandCompletedEvent(&outcome, tracker) + rootCmd, err := NewRootCommand( tracker, clients, @@ -34,28 +35,11 @@ func CallCmd( err = rootCmd.Execute() if err != nil { - tracker.SendEvent( - viper.GetString(cliflags.AccessTokenFlag), - viper.GetString(cliflags.BaseURIFlag), - "CLI Command Completed", - map[string]interface{}{ - "outcome": analytics.ERROR, - }, - ) + outcome = analytics.ERROR return nil, err - } - outcome := analytics.SUCCESS - if _, isHelp := rootCmd.Annotations["help"]; isHelp { + } else if _, isHelp := rootCmd.Annotations["help"]; isHelp { outcome = analytics.HELP } - tracker.SendEvent( - viper.GetString(cliflags.AccessTokenFlag), - viper.GetString(cliflags.BaseURIFlag), - "CLI Command Completed", - map[string]interface{}{ - "outcome": outcome, - }, - ) out, err := io.ReadAll(b) require.NoError(t, err) diff --git a/cmd/environments/environments.go b/cmd/environments/environments.go index 5d027a3c..d1b6b8e4 100644 --- a/cmd/environments/environments.go +++ b/cmd/environments/environments.go @@ -2,9 +2,7 @@ package environments import ( "github.com/spf13/cobra" - "github.com/spf13/viper" - "ldcli/cmd/cliflags" "ldcli/internal/analytics" "ldcli/internal/environments" ) @@ -17,13 +15,8 @@ func NewEnvironmentsCmd( Use: "environments", Short: "Make requests (list, create, etc.) on environments", Long: "Make requests (list, create, etc.) on environments", - PersistentPreRun: func(cmd *cobra.Command, args []string) { - analyticsTracker.SendEvent( - viper.GetString(cliflags.AccessTokenFlag), - viper.GetString(cliflags.BaseURIFlag), - "CLI Command Run", - analytics.CmdRunEventProperties(cmd, "environments"), - ) + PersistentPreRun: func(c *cobra.Command, args []string) { + analytics.SendCommandRunEvent("environments", c, analyticsTracker) }, } @@ -35,12 +28,7 @@ func NewEnvironmentsCmd( for _, c := range cmd.Commands() { c.SetHelpFunc(func(c *cobra.Command, args []string) { - analyticsTracker.SendEvent( - viper.GetString(cliflags.AccessTokenFlag), - viper.GetString(cliflags.BaseURIFlag), - "CLI Command Run", - analytics.CmdRunEventProperties(c, "environments"), - ) + analytics.SendCommandRunEvent("environments", c, analyticsTracker) c.Root().Annotations = map[string]string{"help": "true"} }) } diff --git a/cmd/root.go b/cmd/root.go index 61b924f6..fed14f8a 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -135,6 +135,9 @@ func NewRootCommand( } func Execute(analyticsTracker analytics.Tracker, version string) { + outcome := analytics.SUCCESS + defer analytics.SendCommandCompletedEvent(&outcome, analyticsTracker) + clients := APIClients{ EnvironmentsClient: environments.NewClient(version), FlagsClient: flags.NewClient(version), @@ -152,22 +155,12 @@ func Execute(analyticsTracker analytics.Tracker, version string) { } err = rootCmd.Execute() - outcome := analytics.SUCCESS if err != nil { outcome = analytics.ERROR fmt.Fprintln(os.Stderr, err.Error()) } else if _, isHelp := rootCmd.Annotations["help"]; isHelp { outcome = analytics.HELP } - - analyticsTracker.SendEvent( - viper.GetString(cliflags.AccessTokenFlag), - viper.GetString(cliflags.BaseURIFlag), - "CLI Command Completed", - map[string]interface{}{ - "outcome": outcome, - }, - ) } // setFlagsFromConfig reads in the config file if it exists and uses any flag values for commands. diff --git a/internal/analytics/events.go b/internal/analytics/events.go index ca4d7cb3..8c10aaa1 100644 --- a/internal/analytics/events.go +++ b/internal/analytics/events.go @@ -58,3 +58,23 @@ func MockedTracker(name string, action string, flags []string, outcome string) * }...) return &tracker } + +func SendCommandRunEvent(name string, cmd *cobra.Command, analyticsTracker Tracker) { + analyticsTracker.SendEvent( + viper.GetString(cliflags.AccessTokenFlag), + viper.GetString(cliflags.BaseURIFlag), + "CLI Command Run", + CmdRunEventProperties(cmd, name), + ) +} + +func SendCommandCompletedEvent(outcome *string, analyticsTracker Tracker) { + analyticsTracker.SendEvent( + viper.GetString(cliflags.AccessTokenFlag), + viper.GetString(cliflags.BaseURIFlag), + "CLI Command Completed", + map[string]interface{}{ + "outcome": *outcome, + }, + ) +} From ffe2919d1e86f5d086332153853557cca3a8de57 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 11:34:24 -0700 Subject: [PATCH 20/40] update flags --- cmd/flags/flags.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cmd/flags/flags.go b/cmd/flags/flags.go index 8eef9666..763ad7fc 100644 --- a/cmd/flags/flags.go +++ b/cmd/flags/flags.go @@ -2,9 +2,7 @@ package flags import ( "github.com/spf13/cobra" - "github.com/spf13/viper" - "ldcli/cmd/cliflags" "ldcli/internal/analytics" "ldcli/internal/flags" ) @@ -14,13 +12,8 @@ func NewFlagsCmd(analyticsTracker analytics.Tracker, client flags.Client) (*cobr Use: "flags", Short: "Make requests (list, create, etc.) on flags", Long: "Make requests (list, create, etc.) on flags", - PersistentPreRun: func(cmd *cobra.Command, args []string) { - analyticsTracker.SendEvent( - viper.GetString(cliflags.AccessTokenFlag), - viper.GetString(cliflags.BaseURIFlag), - "CLI Command Run", - analytics.CmdRunEventProperties(cmd, "flags"), - ) + PersistentPreRun: func(c *cobra.Command, args []string) { + analytics.SendCommandRunEvent("flags", c, analyticsTracker) }, } @@ -46,6 +39,13 @@ func NewFlagsCmd(analyticsTracker analytics.Tracker, client flags.Client) (*cobr return nil, err } + for _, c := range cmd.Commands() { + c.SetHelpFunc(func(c *cobra.Command, args []string) { + analytics.SendCommandRunEvent("flags", c, analyticsTracker) + c.Root().Annotations = map[string]string{"help": "true"} + }) + } + cmd.AddCommand(createCmd) cmd.AddCommand(getCmd) cmd.AddCommand(updateCmd) From d46e3e1d03fb3bba3d8a20d62fb89c82694b7de3 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 11:35:03 -0700 Subject: [PATCH 21/40] updated members --- cmd/members/members.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cmd/members/members.go b/cmd/members/members.go index dd1df51f..c9c41051 100644 --- a/cmd/members/members.go +++ b/cmd/members/members.go @@ -2,9 +2,7 @@ package members import ( "github.com/spf13/cobra" - "github.com/spf13/viper" - "ldcli/cmd/cliflags" "ldcli/internal/analytics" "ldcli/internal/members" ) @@ -14,13 +12,8 @@ func NewMembersCmd(analyticsTracker analytics.Tracker, client members.Client) (* Use: "members", Short: "Make requests (list, create, etc.) on members", Long: "Make requests (list, create, etc.) on members", - PersistentPreRun: func(cmd *cobra.Command, args []string) { - analyticsTracker.SendEvent( - viper.GetString(cliflags.AccessTokenFlag), - viper.GetString(cliflags.BaseURIFlag), - "CLI Command Run", - analytics.CmdRunEventProperties(cmd, "members"), - ) + PersistentPreRun: func(c *cobra.Command, args []string) { + analytics.SendCommandRunEvent("members", c, analyticsTracker) }, } @@ -37,6 +30,13 @@ func NewMembersCmd(analyticsTracker analytics.Tracker, client members.Client) (* cmd.AddCommand(createCmd) cmd.AddCommand(inviteCmd) + for _, c := range cmd.Commands() { + c.SetHelpFunc(func(c *cobra.Command, args []string) { + analytics.SendCommandRunEvent("members", c, analyticsTracker) + c.Root().Annotations = map[string]string{"help": "true"} + }) + } + return cmd, nil } From 8edc9fb036b1493f07b78daf92df295e579ec221 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 11:36:10 -0700 Subject: [PATCH 22/40] updated projects --- cmd/projects/projects.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cmd/projects/projects.go b/cmd/projects/projects.go index d5cf6703..51a7cc77 100644 --- a/cmd/projects/projects.go +++ b/cmd/projects/projects.go @@ -2,9 +2,7 @@ package projects import ( "github.com/spf13/cobra" - "github.com/spf13/viper" - "ldcli/cmd/cliflags" "ldcli/internal/analytics" "ldcli/internal/projects" ) @@ -14,13 +12,8 @@ func NewProjectsCmd(analyticsTracker analytics.Tracker, client projects.Client) Use: "projects", Short: "Make requests (list, create, etc.) on projects", Long: "Make requests (list, create, etc.) on projects", - PersistentPreRun: func(cmd *cobra.Command, args []string) { - analyticsTracker.SendEvent( - viper.GetString(cliflags.AccessTokenFlag), - viper.GetString(cliflags.BaseURIFlag), - "CLI Command Run", - analytics.CmdRunEventProperties(cmd, "projects"), - ) + PersistentPreRun: func(c *cobra.Command, args []string) { + analytics.SendCommandRunEvent("members", c, analyticsTracker) }, } @@ -33,5 +26,12 @@ func NewProjectsCmd(analyticsTracker analytics.Tracker, client projects.Client) cmd.AddCommand(createCmd) cmd.AddCommand(listCmd) + for _, c := range cmd.Commands() { + c.SetHelpFunc(func(c *cobra.Command, args []string) { + analytics.SendCommandRunEvent("members", c, analyticsTracker) + c.Root().Annotations = map[string]string{"help": "true"} + }) + } + return cmd, nil } From b5f52a67f9b559545d1ed2a295a01da54dd9a462 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 11:37:51 -0700 Subject: [PATCH 23/40] remove tests --- cmd/flags/create_test.go | 30 ------------------------------ cmd/flags/get_test.go | 32 -------------------------------- cmd/flags/update_test.go | 32 -------------------------------- cmd/members/create_test.go | 30 ------------------------------ cmd/members/invite_test.go | 30 ------------------------------ cmd/projects/create_test.go | 28 ---------------------------- cmd/projects/list_test.go | 26 -------------------------- 7 files changed, 208 deletions(-) diff --git a/cmd/flags/create_test.go b/cmd/flags/create_test.go index 29c340a8..ab3f523a 100644 --- a/cmd/flags/create_test.go +++ b/cmd/flags/create_test.go @@ -175,34 +175,4 @@ func TestCreate(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.NoError(t, err) }) - - t.Run("will track analytics for api error", func(t *testing.T) { - tracker := analytics.MockedTracker( - "flags", - "create", - []string{ - "access-token", - "base-uri", - "data", - "project", - }, analytics.ERROR) - client := flags.MockClient{} - client. - On("Create", mockArgs...). - Return([]byte(`{}`), errors.NewError("An error")) - clients := cmd.APIClients{ - FlagsClient: &client, - } - - args := []string{ - "flags", "create", - "--access-token", "testAccessToken", - "--base-uri", "http://test.com", - "-d", `{"key": "test-key", "name": "test-name"}`, - "--project", "test-proj-key", - } - - _, err := cmd.CallCmd(t, clients, tracker, args) - require.EqualError(t, err, "An error") - }) } diff --git a/cmd/flags/get_test.go b/cmd/flags/get_test.go index ce56717a..632ef265 100644 --- a/cmd/flags/get_test.go +++ b/cmd/flags/get_test.go @@ -152,36 +152,4 @@ func TestGet(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.NoError(t, err) }) - - t.Run("will track analytics for api error", func(t *testing.T) { - tracker := analytics.MockedTracker( - "flags", - "get", - []string{ - "access-token", - "base-uri", - "environment", - "flag", - "project", - }, analytics.ERROR) - client := flags.MockClient{} - client. - On("Get", mockArgs...). - Return([]byte(`{}`), errors.NewError("An error")) - clients := cmd.APIClients{ - FlagsClient: &client, - } - - args := []string{ - "flags", "get", - "--access-token", "testAccessToken", - "--base-uri", "http://test.com", - "--flag", "test-key", - "--project", "test-proj-key", - "--environment", "test-env-key", - } - - _, err := cmd.CallCmd(t, clients, tracker, args) - require.EqualError(t, err, "An error") - }) } diff --git a/cmd/flags/update_test.go b/cmd/flags/update_test.go index 144345d6..6ec1ff54 100644 --- a/cmd/flags/update_test.go +++ b/cmd/flags/update_test.go @@ -314,36 +314,4 @@ func TestToggle(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.NoError(t, err) }) - - t.Run("will track analytics for api error", func(t *testing.T) { - tracker := analytics.MockedTracker( - "flags", - "toggle-on", - []string{ - "access-token", - "base-uri", - "environment", - "flag", - "project", - }, analytics.ERROR) - client := flags.MockClient{} - client. - On("Update", mockArgs...). - Return([]byte(`{}`), errors.NewError("An error")) - clients := cmd.APIClients{ - FlagsClient: &client, - } - - args := []string{ - "flags", "toggle-on", - "--access-token", "testAccessToken", - "--base-uri", "http://test.com", - "--flag", "test-flag-key", - "--project", "test-proj-key", - "--environment", "test-env-key", - } - - _, err := cmd.CallCmd(t, clients, tracker, args) - require.EqualError(t, err, "An error") - }) } diff --git a/cmd/members/create_test.go b/cmd/members/create_test.go index f76c568a..b4923883 100644 --- a/cmd/members/create_test.go +++ b/cmd/members/create_test.go @@ -150,34 +150,4 @@ func TestCreate(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.NoError(t, err) }) - - t.Run("will track analytics for api error", func(t *testing.T) { - tracker := analytics.MockedTracker( - "members", - "create", - []string{ - "access-token", - "base-uri", - "data", - }, analytics.ERROR) - client := members.MockClient{} - client. - On("Create", mockArgs...). - Return([]byte(`{}`), errors.NewError("An error")) - clients := cmd.APIClients{ - MembersClient: &client, - } - - args := []string{ - "members", - "create", - "--access-token", "testAccessToken", - "--base-uri", "http://test.com", - "-d", - `[{"email": "testemail@test.com", "role": "writer"}]`, - } - - _, err := cmd.CallCmd(t, clients, tracker, args) - require.EqualError(t, err, "An error") - }) } diff --git a/cmd/members/invite_test.go b/cmd/members/invite_test.go index 6f71c3ca..54e1e94d 100644 --- a/cmd/members/invite_test.go +++ b/cmd/members/invite_test.go @@ -249,34 +249,4 @@ func TestInviteWithOptionalRole(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.NoError(t, err) }) - - t.Run("will track analytics for api error", func(t *testing.T) { - tracker := analytics.MockedTracker( - "members", - "invite", - []string{ - "access-token", - "base-uri", - "emails", - "role", - }, analytics.ERROR) - client := members.MockClient{} - client. - On("Create", mockArgs...). - Return([]byte(`{}`), errors.NewError("An error")) - clients := cmd.APIClients{ - MembersClient: &client, - } - - args := []string{ - "members", "invite", - "--access-token", "testAccessToken", - "--base-uri", "http://test.com", - "-e", `testemail1@test.com,testemail2@test.com`, - "--role", "writer", - } - - _, err := cmd.CallCmd(t, clients, tracker, args) - require.EqualError(t, err, "An error") - }) } diff --git a/cmd/projects/create_test.go b/cmd/projects/create_test.go index a4f6c1dd..ca6aad0c 100644 --- a/cmd/projects/create_test.go +++ b/cmd/projects/create_test.go @@ -175,32 +175,4 @@ func TestCreate(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.NoError(t, err) }) - - t.Run("will track analytics for api error", func(t *testing.T) { - tracker := analytics.MockedTracker( - "projects", - "create", - []string{ - "access-token", - "base-uri", - "data", - }, analytics.ERROR) - client := projects.MockClient{} - client. - On("Create", mockArgs...). - Return([]byte(`{}`), errors.NewError("An error")) - clients := cmd.APIClients{ - ProjectsClient: &client, - } - - args := []string{ - "projects", "create", - "--access-token", "testAccessToken", - "--base-uri", "http://test.com", - "-d", `{"key": "test-key", "name": "test-name"}`, - } - - _, err := cmd.CallCmd(t, clients, tracker, args) - require.EqualError(t, err, "An error") - }) } diff --git a/cmd/projects/list_test.go b/cmd/projects/list_test.go index 44ad596c..cbb2b348 100644 --- a/cmd/projects/list_test.go +++ b/cmd/projects/list_test.go @@ -156,30 +156,4 @@ func TestList(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.NoError(t, err) }) - - t.Run("will track analytics for api error", func(t *testing.T) { - tracker := analytics.MockedTracker( - "projects", - "list", - []string{ - "access-token", - "base-uri", - }, analytics.ERROR) - client := projects.MockClient{} - client. - On("List", mockArgs...). - Return([]byte(`{}`), errors.NewError("An error")) - clients := cmd.APIClients{ - ProjectsClient: &client, - } - - args := []string{ - "projects", "list", - "--access-token", "testAccessToken", - "--base-uri", "http://test.com", - } - - _, err := cmd.CallCmd(t, clients, tracker, args) - require.EqualError(t, err, "An error") - }) } From 39a9fce3c1681c78ccaa4268582481efd1f0d064 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 11:42:00 -0700 Subject: [PATCH 24/40] fix command name in tracking --- cmd/projects/projects.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/projects/projects.go b/cmd/projects/projects.go index 51a7cc77..39cdcb1d 100644 --- a/cmd/projects/projects.go +++ b/cmd/projects/projects.go @@ -13,7 +13,7 @@ func NewProjectsCmd(analyticsTracker analytics.Tracker, client projects.Client) Short: "Make requests (list, create, etc.) on projects", Long: "Make requests (list, create, etc.) on projects", PersistentPreRun: func(c *cobra.Command, args []string) { - analytics.SendCommandRunEvent("members", c, analyticsTracker) + analytics.SendCommandRunEvent("projects", c, analyticsTracker) }, } @@ -28,7 +28,7 @@ func NewProjectsCmd(analyticsTracker analytics.Tracker, client projects.Client) for _, c := range cmd.Commands() { c.SetHelpFunc(func(c *cobra.Command, args []string) { - analytics.SendCommandRunEvent("members", c, analyticsTracker) + analytics.SendCommandRunEvent("projects", c, analyticsTracker) c.Root().Annotations = map[string]string{"help": "true"} }) } From 3e33a41a8a4800cae47f767601e15d30241963bc Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 11:48:18 -0700 Subject: [PATCH 25/40] fix flags tracking and move envs get test to flags get --- cmd/environments/get_test.go | 54 ---------------------------------- cmd/flags/flags.go | 12 ++++---- cmd/flags/get_test.go | 56 ++++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 60 deletions(-) diff --git a/cmd/environments/get_test.go b/cmd/environments/get_test.go index 67ed2db4..d2788820 100644 --- a/cmd/environments/get_test.go +++ b/cmd/environments/get_test.go @@ -195,58 +195,4 @@ func TestGet(t *testing.T) { require.NoError(t, err) }) - - t.Run("will track analytics for api error", func(t *testing.T) { - tracker := analytics.MockedTracker( - "environments", - "get", - []string{ - "access-token", - "base-uri", - "environment", - "project", - }, analytics.ERROR) - client := environments.MockClient{} - client. - On("Get", mockArgs...). - Return([]byte(`{}`), errors.NewError("An error")) - clients := cmd.APIClients{ - EnvironmentsClient: &client, - } - - args := []string{ - "environments", "get", - "--access-token", "testAccessToken", - "--base-uri", "http://test.com", - "--environment", "test-env", - "--project", "test-proj", - } - - _, err := cmd.CallCmd(t, clients, tracker, args) - require.EqualError(t, err, "An error") - }) - - t.Run("will track analytics when help flag received", func(t *testing.T) { - tracker := analytics.MockedTracker( - "environments", - "get", - []string{ - "access-token", - "base-uri", - "help", - }, analytics.HELP) - clients := cmd.APIClients{ - EnvironmentsClient: &environments.MockClient{}, - } - - args := []string{ - "environments", "get", - "--access-token", "testAccessToken", - "--base-uri", "http://test.com", - "--help", - } - - _, err := cmd.CallCmd(t, clients, tracker, args) - require.NoError(t, err) - }) } diff --git a/cmd/flags/flags.go b/cmd/flags/flags.go index 763ad7fc..becd4fcf 100644 --- a/cmd/flags/flags.go +++ b/cmd/flags/flags.go @@ -39,6 +39,12 @@ func NewFlagsCmd(analyticsTracker analytics.Tracker, client flags.Client) (*cobr return nil, err } + cmd.AddCommand(createCmd) + cmd.AddCommand(getCmd) + cmd.AddCommand(updateCmd) + cmd.AddCommand(toggleOnUpdateCmd) + cmd.AddCommand(toggleOffUpdateCmd) + for _, c := range cmd.Commands() { c.SetHelpFunc(func(c *cobra.Command, args []string) { analytics.SendCommandRunEvent("flags", c, analyticsTracker) @@ -46,11 +52,5 @@ func NewFlagsCmd(analyticsTracker analytics.Tracker, client flags.Client) (*cobr }) } - cmd.AddCommand(createCmd) - cmd.AddCommand(getCmd) - cmd.AddCommand(updateCmd) - cmd.AddCommand(toggleOnUpdateCmd) - cmd.AddCommand(toggleOffUpdateCmd) - return cmd, nil } diff --git a/cmd/flags/get_test.go b/cmd/flags/get_test.go index 632ef265..9a157702 100644 --- a/cmd/flags/get_test.go +++ b/cmd/flags/get_test.go @@ -152,4 +152,60 @@ func TestGet(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.NoError(t, err) }) + + t.Run("will track analytics for api error", func(t *testing.T) { + tracker := analytics.MockedTracker( + "flags", + "get", + []string{ + "access-token", + "base-uri", + "environment", + "flag", + "project", + }, analytics.ERROR) + client := flags.MockClient{} + client. + On("Get", mockArgs...). + Return([]byte(`{}`), errors.NewError("An error")) + clients := cmd.APIClients{ + FlagsClient: &client, + } + + args := []string{ + "flags", "get", + "--access-token", "testAccessToken", + "--base-uri", "http://test.com", + "--flag", "test-key", + "--project", "test-proj-key", + "--environment", "test-env-key", + } + + _, err := cmd.CallCmd(t, clients, tracker, args) + require.EqualError(t, err, "An error") + }) + + t.Run("will track analytics when help flag received", func(t *testing.T) { + tracker := analytics.MockedTracker( + "flags", + "get", + []string{ + "access-token", + "base-uri", + "help", + }, analytics.HELP) + clients := cmd.APIClients{ + FlagsClient: &flags.MockClient{}, + } + + args := []string{ + "flags", "get", + "--access-token", "testAccessToken", + "--base-uri", "http://test.com", + "--help", + } + + _, err := cmd.CallCmd(t, clients, tracker, args) + require.NoError(t, err) + }) } From 2d79c3d666480084d94f89bb5dbc2a30c9c93bec Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 11:49:20 -0700 Subject: [PATCH 26/40] add config help func --- cmd/config/config.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/config/config.go b/cmd/config/config.go index f9779e62..2bc5326e 100644 --- a/cmd/config/config.go +++ b/cmd/config/config.go @@ -44,6 +44,11 @@ func NewConfigCmd(analyticsTracker analytics.Tracker) *cobra.Command { cmd.Flags().String(UnsetFlag, "", "Unset a config field") _ = viper.BindPFlag(UnsetFlag, cmd.Flags().Lookup(UnsetFlag)) + cmd.SetHelpFunc(func(c *cobra.Command, args []string) { + analytics.SendCommandRunEvent("config", c, analyticsTracker) + c.Root().Annotations = map[string]string{"help": "true"} + }) + // TODO: running config should show help return cmd From 9d0e16251775a904917f6a705f63896da7cd583e Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 12:09:55 -0700 Subject: [PATCH 27/40] remove help func modification --- cmd/config/config.go | 5 ----- cmd/environments/environments.go | 7 ------- cmd/flags/flags.go | 7 ------- cmd/members/members.go | 7 ------- cmd/projects/projects.go | 7 ------- 5 files changed, 33 deletions(-) diff --git a/cmd/config/config.go b/cmd/config/config.go index 2bc5326e..f9779e62 100644 --- a/cmd/config/config.go +++ b/cmd/config/config.go @@ -44,11 +44,6 @@ func NewConfigCmd(analyticsTracker analytics.Tracker) *cobra.Command { cmd.Flags().String(UnsetFlag, "", "Unset a config field") _ = viper.BindPFlag(UnsetFlag, cmd.Flags().Lookup(UnsetFlag)) - cmd.SetHelpFunc(func(c *cobra.Command, args []string) { - analytics.SendCommandRunEvent("config", c, analyticsTracker) - c.Root().Annotations = map[string]string{"help": "true"} - }) - // TODO: running config should show help return cmd diff --git a/cmd/environments/environments.go b/cmd/environments/environments.go index d1b6b8e4..6e86dea2 100644 --- a/cmd/environments/environments.go +++ b/cmd/environments/environments.go @@ -26,12 +26,5 @@ func NewEnvironmentsCmd( } cmd.AddCommand(getCmd) - for _, c := range cmd.Commands() { - c.SetHelpFunc(func(c *cobra.Command, args []string) { - analytics.SendCommandRunEvent("environments", c, analyticsTracker) - c.Root().Annotations = map[string]string{"help": "true"} - }) - } - return cmd, nil } diff --git a/cmd/flags/flags.go b/cmd/flags/flags.go index becd4fcf..d9f2825d 100644 --- a/cmd/flags/flags.go +++ b/cmd/flags/flags.go @@ -45,12 +45,5 @@ func NewFlagsCmd(analyticsTracker analytics.Tracker, client flags.Client) (*cobr cmd.AddCommand(toggleOnUpdateCmd) cmd.AddCommand(toggleOffUpdateCmd) - for _, c := range cmd.Commands() { - c.SetHelpFunc(func(c *cobra.Command, args []string) { - analytics.SendCommandRunEvent("flags", c, analyticsTracker) - c.Root().Annotations = map[string]string{"help": "true"} - }) - } - return cmd, nil } diff --git a/cmd/members/members.go b/cmd/members/members.go index c9c41051..daca36e0 100644 --- a/cmd/members/members.go +++ b/cmd/members/members.go @@ -30,13 +30,6 @@ func NewMembersCmd(analyticsTracker analytics.Tracker, client members.Client) (* cmd.AddCommand(createCmd) cmd.AddCommand(inviteCmd) - for _, c := range cmd.Commands() { - c.SetHelpFunc(func(c *cobra.Command, args []string) { - analytics.SendCommandRunEvent("members", c, analyticsTracker) - c.Root().Annotations = map[string]string{"help": "true"} - }) - } - return cmd, nil } diff --git a/cmd/projects/projects.go b/cmd/projects/projects.go index 39cdcb1d..ff67c57f 100644 --- a/cmd/projects/projects.go +++ b/cmd/projects/projects.go @@ -26,12 +26,5 @@ func NewProjectsCmd(analyticsTracker analytics.Tracker, client projects.Client) cmd.AddCommand(createCmd) cmd.AddCommand(listCmd) - for _, c := range cmd.Commands() { - c.SetHelpFunc(func(c *cobra.Command, args []string) { - analytics.SendCommandRunEvent("projects", c, analyticsTracker) - c.Root().Annotations = map[string]string{"help": "true"} - }) - } - return cmd, nil } From f5dba40960f27efe3574b7387b4740c7c915d08e Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 12:10:18 -0700 Subject: [PATCH 28/40] remove help test --- cmd/flags/get_test.go | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/cmd/flags/get_test.go b/cmd/flags/get_test.go index 9a157702..ce56717a 100644 --- a/cmd/flags/get_test.go +++ b/cmd/flags/get_test.go @@ -184,28 +184,4 @@ func TestGet(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.EqualError(t, err, "An error") }) - - t.Run("will track analytics when help flag received", func(t *testing.T) { - tracker := analytics.MockedTracker( - "flags", - "get", - []string{ - "access-token", - "base-uri", - "help", - }, analytics.HELP) - clients := cmd.APIClients{ - FlagsClient: &flags.MockClient{}, - } - - args := []string{ - "flags", "get", - "--access-token", "testAccessToken", - "--base-uri", "http://test.com", - "--help", - } - - _, err := cmd.CallCmd(t, clients, tracker, args) - require.NoError(t, err) - }) } From f3681bb62bc51e0a78c386a6a8ddb52967343f14 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 12:32:41 -0700 Subject: [PATCH 29/40] remove references to help --- cmd/cmdtest.go | 2 -- cmd/flags/get_test.go | 30 ++++++++++++++++++++++++++++++ cmd/root.go | 2 -- internal/analytics/events.go | 1 - 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/cmd/cmdtest.go b/cmd/cmdtest.go index 14b553a7..580145e1 100644 --- a/cmd/cmdtest.go +++ b/cmd/cmdtest.go @@ -37,8 +37,6 @@ func CallCmd( if err != nil { outcome = analytics.ERROR return nil, err - } else if _, isHelp := rootCmd.Annotations["help"]; isHelp { - outcome = analytics.HELP } out, err := io.ReadAll(b) diff --git a/cmd/flags/get_test.go b/cmd/flags/get_test.go index ce56717a..baf090a5 100644 --- a/cmd/flags/get_test.go +++ b/cmd/flags/get_test.go @@ -184,4 +184,34 @@ func TestGet(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.EqualError(t, err, "An error") }) + + t.Run("will track analytics help flag", func(t *testing.T) { + tracker := analytics.MockedTracker( + "flags", + "get", + []string{ + "access-token", + "base-uri", + "environment", + "flag", + "project", + }, analytics.ERROR) + client := flags.MockClient{} + client. + On("Get", mockArgs...). + Return([]byte(`{}`), errors.NewError("An error")) + clients := cmd.APIClients{ + FlagsClient: &client, + } + + args := []string{ + "flags", "get", + "--access-token", "testAccessToken", + "--base-uri", "http://test.com", + "--help", + } + + _, err := cmd.CallCmd(t, clients, tracker, args) + require.EqualError(t, err, "An error") + }) } diff --git a/cmd/root.go b/cmd/root.go index fed14f8a..c5dfd7da 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -158,8 +158,6 @@ func Execute(analyticsTracker analytics.Tracker, version string) { if err != nil { outcome = analytics.ERROR fmt.Fprintln(os.Stderr, err.Error()) - } else if _, isHelp := rootCmd.Annotations["help"]; isHelp { - outcome = analytics.HELP } } diff --git a/internal/analytics/events.go b/internal/analytics/events.go index 8c10aaa1..f4f126cc 100644 --- a/internal/analytics/events.go +++ b/internal/analytics/events.go @@ -29,7 +29,6 @@ func CmdRunEventProperties(cmd *cobra.Command, name string) map[string]interface const ( SUCCESS = "success" ERROR = "error" - HELP = "help" ) func MockedTracker(name string, action string, flags []string, outcome string) *MockTracker { From 92b541fa26893e6ef492afc57a81555ae01b6801 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 12:40:08 -0700 Subject: [PATCH 30/40] only post CLI Command Completed if RUN was run earlier --- cmd/root.go | 7 ++++--- internal/analytics/events.go | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index c5dfd7da..7ec05029 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -135,9 +135,6 @@ func NewRootCommand( } func Execute(analyticsTracker analytics.Tracker, version string) { - outcome := analytics.SUCCESS - defer analytics.SendCommandCompletedEvent(&outcome, analyticsTracker) - clients := APIClients{ EnvironmentsClient: environments.NewClient(version), FlagsClient: flags.NewClient(version), @@ -155,6 +152,10 @@ func Execute(analyticsTracker analytics.Tracker, version string) { } err = rootCmd.Execute() + outcome := analytics.SUCCESS + if _, tracking := rootCmd.Annotations["tracking"]; tracking { + defer analytics.SendCommandCompletedEvent(&outcome, analyticsTracker) + } if err != nil { outcome = analytics.ERROR fmt.Fprintln(os.Stderr, err.Error()) diff --git a/internal/analytics/events.go b/internal/analytics/events.go index f4f126cc..904529da 100644 --- a/internal/analytics/events.go +++ b/internal/analytics/events.go @@ -59,6 +59,7 @@ func MockedTracker(name string, action string, flags []string, outcome string) * } func SendCommandRunEvent(name string, cmd *cobra.Command, analyticsTracker Tracker) { + cmd.Root().Annotations = map[string]string{"tracking": "true"} analyticsTracker.SendEvent( viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), From c79eea3536a48a7efb46bbcea0f95b15ac0b6b05 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 12:40:08 -0700 Subject: [PATCH 31/40] only post CLI Command Completed if RUN was run earlier --- cmd/cmdtest.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cmd/cmdtest.go b/cmd/cmdtest.go index 580145e1..d31e5b6c 100644 --- a/cmd/cmdtest.go +++ b/cmd/cmdtest.go @@ -19,9 +19,6 @@ func CallCmd( tracker analytics.Tracker, args []string, ) ([]byte, error) { - outcome := analytics.SUCCESS - defer analytics.SendCommandCompletedEvent(&outcome, tracker) - rootCmd, err := NewRootCommand( tracker, clients, @@ -34,6 +31,10 @@ func CallCmd( rootCmd.SetArgs(args) err = rootCmd.Execute() + outcome := analytics.SUCCESS + if _, tracking := rootCmd.Annotations["tracking"]; tracking { + defer analytics.SendCommandCompletedEvent(&outcome, tracker) + } if err != nil { outcome = analytics.ERROR return nil, err From 6b46deedc443085155ceaa9741838116e1f0966e Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 12:46:53 -0700 Subject: [PATCH 32/40] remove help test --- cmd/flags/get_test.go | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/cmd/flags/get_test.go b/cmd/flags/get_test.go index baf090a5..ce56717a 100644 --- a/cmd/flags/get_test.go +++ b/cmd/flags/get_test.go @@ -184,34 +184,4 @@ func TestGet(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.EqualError(t, err, "An error") }) - - t.Run("will track analytics help flag", func(t *testing.T) { - tracker := analytics.MockedTracker( - "flags", - "get", - []string{ - "access-token", - "base-uri", - "environment", - "flag", - "project", - }, analytics.ERROR) - client := flags.MockClient{} - client. - On("Get", mockArgs...). - Return([]byte(`{}`), errors.NewError("An error")) - clients := cmd.APIClients{ - FlagsClient: &client, - } - - args := []string{ - "flags", "get", - "--access-token", "testAccessToken", - "--base-uri", "http://test.com", - "--help", - } - - _, err := cmd.CallCmd(t, clients, tracker, args) - require.EqualError(t, err, "An error") - }) } From 87fca5249510b77a732d3a704ab55438aa5e791c Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 14:39:11 -0700 Subject: [PATCH 33/40] refactor --- cmd/analytics/analytics.go | 27 ++++++++++++ cmd/cmdtest.go | 18 +++++--- cmd/config/config.go | 9 ++-- cmd/environments/environments.go | 10 ++++- cmd/flags/flags.go | 10 ++++- cmd/members/members.go | 10 ++++- cmd/projects/projects.go | 10 ++++- cmd/root.go | 9 ++-- internal/analytics/client.go | 70 ++++++++++++++++++++++++++++++++ internal/analytics/events.go | 47 --------------------- 10 files changed, 157 insertions(+), 63 deletions(-) create mode 100644 cmd/analytics/analytics.go diff --git a/cmd/analytics/analytics.go b/cmd/analytics/analytics.go new file mode 100644 index 00000000..81fab0d3 --- /dev/null +++ b/cmd/analytics/analytics.go @@ -0,0 +1,27 @@ +package analytics + +import ( + "ldcli/cmd/cliflags" + + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/spf13/viper" +) + +func CmdRunEventProperties(cmd *cobra.Command, name string) map[string]interface{} { + baseURI := viper.GetString(cliflags.BaseURIFlag) + var flags []string + cmd.Flags().Visit(func(f *pflag.Flag) { + flags = append(flags, f.Name) + }) + + properties := map[string]interface{}{ + "name": name, + "action": cmd.CalledAs(), + "flags": flags, + } + if baseURI != cliflags.BaseURIDefault { + properties["baseURI"] = baseURI + } + return properties +} diff --git a/cmd/cmdtest.go b/cmd/cmdtest.go index d31e5b6c..4945d96c 100644 --- a/cmd/cmdtest.go +++ b/cmd/cmdtest.go @@ -6,8 +6,10 @@ import ( "os" "testing" + "github.com/spf13/viper" "github.com/stretchr/testify/require" + "ldcli/cmd/cliflags" "ldcli/internal/analytics" ) @@ -31,15 +33,21 @@ func CallCmd( rootCmd.SetArgs(args) err = rootCmd.Execute() - outcome := analytics.SUCCESS - if _, tracking := rootCmd.Annotations["tracking"]; tracking { - defer analytics.SendCommandCompletedEvent(&outcome, tracker) - } if err != nil { - outcome = analytics.ERROR + tracker.SendCommandCompletedEvent( + analytics.ERROR, + viper.GetString(cliflags.AccessTokenFlag), + viper.GetString(cliflags.BaseURIDefault), + ) return nil, err } + tracker.SendCommandCompletedEvent( + analytics.SUCCESS, + viper.GetString(cliflags.AccessTokenFlag), + viper.GetString(cliflags.BaseURIDefault), + ) + out, err := io.ReadAll(b) require.NoError(t, err) diff --git a/cmd/config/config.go b/cmd/config/config.go index f9779e62..4ad3d076 100644 --- a/cmd/config/config.go +++ b/cmd/config/config.go @@ -10,6 +10,7 @@ import ( "github.com/spf13/viper" "gopkg.in/yaml.v3" + cmdAnalytics "ldcli/cmd/analytics" "ldcli/cmd/cliflags" "ldcli/internal/analytics" "ldcli/internal/config" @@ -27,12 +28,12 @@ func NewConfigCmd(analyticsTracker analytics.Tracker) *cobra.Command { RunE: run(), Short: "View and modify specific configuration values", Use: "config", - PreRun: func(cmd *cobra.Command, args []string) { - analyticsTracker.SendEvent( + PreRun: func(c *cobra.Command, args []string) { + analyticsTracker.SendCommandRunEvent( + "environments", viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), - "CLI Command Run", - analytics.CmdRunEventProperties(cmd, "config"), + cmdAnalytics.CmdRunEventProperties(c, "projects"), ) }, } diff --git a/cmd/environments/environments.go b/cmd/environments/environments.go index 6e86dea2..4353c30d 100644 --- a/cmd/environments/environments.go +++ b/cmd/environments/environments.go @@ -2,7 +2,10 @@ package environments import ( "github.com/spf13/cobra" + "github.com/spf13/viper" + cmdAnalytics "ldcli/cmd/analytics" + "ldcli/cmd/cliflags" "ldcli/internal/analytics" "ldcli/internal/environments" ) @@ -16,7 +19,12 @@ func NewEnvironmentsCmd( Short: "Make requests (list, create, etc.) on environments", Long: "Make requests (list, create, etc.) on environments", PersistentPreRun: func(c *cobra.Command, args []string) { - analytics.SendCommandRunEvent("environments", c, analyticsTracker) + analyticsTracker.SendCommandRunEvent( + "environments", + viper.GetString(cliflags.AccessTokenFlag), + viper.GetString(cliflags.BaseURIFlag), + cmdAnalytics.CmdRunEventProperties(c, "projects"), + ) }, } diff --git a/cmd/flags/flags.go b/cmd/flags/flags.go index d9f2825d..fd614abe 100644 --- a/cmd/flags/flags.go +++ b/cmd/flags/flags.go @@ -2,7 +2,10 @@ package flags import ( "github.com/spf13/cobra" + "github.com/spf13/viper" + cmdAnalytics "ldcli/cmd/analytics" + "ldcli/cmd/cliflags" "ldcli/internal/analytics" "ldcli/internal/flags" ) @@ -13,7 +16,12 @@ func NewFlagsCmd(analyticsTracker analytics.Tracker, client flags.Client) (*cobr Short: "Make requests (list, create, etc.) on flags", Long: "Make requests (list, create, etc.) on flags", PersistentPreRun: func(c *cobra.Command, args []string) { - analytics.SendCommandRunEvent("flags", c, analyticsTracker) + analyticsTracker.SendCommandRunEvent( + "projects", + viper.GetString(cliflags.AccessTokenFlag), + viper.GetString(cliflags.BaseURIFlag), + cmdAnalytics.CmdRunEventProperties(c, "projects"), + ) }, } diff --git a/cmd/members/members.go b/cmd/members/members.go index daca36e0..0d249408 100644 --- a/cmd/members/members.go +++ b/cmd/members/members.go @@ -2,7 +2,10 @@ package members import ( "github.com/spf13/cobra" + "github.com/spf13/viper" + cmdAnalytics "ldcli/cmd/analytics" + "ldcli/cmd/cliflags" "ldcli/internal/analytics" "ldcli/internal/members" ) @@ -13,7 +16,12 @@ func NewMembersCmd(analyticsTracker analytics.Tracker, client members.Client) (* Short: "Make requests (list, create, etc.) on members", Long: "Make requests (list, create, etc.) on members", PersistentPreRun: func(c *cobra.Command, args []string) { - analytics.SendCommandRunEvent("members", c, analyticsTracker) + analyticsTracker.SendCommandRunEvent( + "members", + viper.GetString(cliflags.AccessTokenFlag), + viper.GetString(cliflags.BaseURIFlag), + cmdAnalytics.CmdRunEventProperties(c, "projects"), + ) }, } diff --git a/cmd/projects/projects.go b/cmd/projects/projects.go index ff67c57f..f1f0ed4b 100644 --- a/cmd/projects/projects.go +++ b/cmd/projects/projects.go @@ -2,7 +2,10 @@ package projects import ( "github.com/spf13/cobra" + "github.com/spf13/viper" + cmdAnalytics "ldcli/cmd/analytics" + "ldcli/cmd/cliflags" "ldcli/internal/analytics" "ldcli/internal/projects" ) @@ -13,7 +16,12 @@ func NewProjectsCmd(analyticsTracker analytics.Tracker, client projects.Client) Short: "Make requests (list, create, etc.) on projects", Long: "Make requests (list, create, etc.) on projects", PersistentPreRun: func(c *cobra.Command, args []string) { - analytics.SendCommandRunEvent("projects", c, analyticsTracker) + analyticsTracker.SendCommandRunEvent( + "projects", + viper.GetString(cliflags.AccessTokenFlag), + viper.GetString(cliflags.BaseURIFlag), + cmdAnalytics.CmdRunEventProperties(c, "projects"), + ) }, } diff --git a/cmd/root.go b/cmd/root.go index 7ec05029..02623ea8 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -153,13 +153,16 @@ func Execute(analyticsTracker analytics.Tracker, version string) { err = rootCmd.Execute() outcome := analytics.SUCCESS - if _, tracking := rootCmd.Annotations["tracking"]; tracking { - defer analytics.SendCommandCompletedEvent(&outcome, analyticsTracker) - } if err != nil { outcome = analytics.ERROR fmt.Fprintln(os.Stderr, err.Error()) } + + analyticsTracker.SendCommandCompletedEvent( + outcome, + viper.GetString(cliflags.AccessTokenFlag), + viper.GetString(cliflags.BaseURIDefault), + ) } // setFlagsFromConfig reads in the config file if it exists and uses any flag values for commands. diff --git a/internal/analytics/client.go b/internal/analytics/client.go index f052d325..16efb042 100644 --- a/internal/analytics/client.go +++ b/internal/analytics/client.go @@ -18,6 +18,17 @@ type Tracker interface { eventName string, properties map[string]interface{}, ) + SendCommandRunEvent( + name, + accessToken, + baseURI string, + properties map[string]interface{}, + ) + SendCommandCompletedEvent( + outcome, + accessToken, + baseURI string, + ) } type Client struct { @@ -80,6 +91,31 @@ func (c *Client) SendEvent( }() } +func (c *Client) SendCommandRunEvent( + name, + accessToken, + baseURI string, + properties map[string]interface{}, +) { + c.SendEvent( + accessToken, + baseURI, + "CLI Command Run", + properties, + ) +} + +func (c *Client) SendCommandCompletedEvent(outcome, accessToken, baseURI string) { + c.SendEvent( + accessToken, + baseURI, + "CLI Command Completed", + map[string]interface{}{ + "outcome": outcome, + }, + ) +} + func (a *Client) Wait() { a.wg.Wait() } @@ -94,6 +130,16 @@ func (c *NoopClient) SendEvent( ) { } +func (c *NoopClient) SendCommandRunEvent(name, + accessToken, + baseURI string, + properties map[string]interface{}, +) { +} + +func (c *NoopClient) SendCommandCompletedEvent(outcome, accessToken, baseURI string) { +} + type MockTracker struct { mock.Mock ID string @@ -108,3 +154,27 @@ func (m *MockTracker) SendEvent( properties["id"] = m.ID m.Called(accessToken, baseURI, eventName, properties) } + +func (m *MockTracker) SendCommandRunEvent(name, + accessToken, + baseURI string, + properties map[string]interface{}, +) { + m.SendEvent( + accessToken, + baseURI, + "CLI Command Run", + properties, + ) +} + +func (m *MockTracker) SendCommandCompletedEvent(outcome, accessToken, baseURI string) { + m.SendEvent( + accessToken, + baseURI, + "CLI Command Completed", + map[string]interface{}{ + "outcome": outcome, + }, + ) +} diff --git a/internal/analytics/events.go b/internal/analytics/events.go index 904529da..5ef2fbda 100644 --- a/internal/analytics/events.go +++ b/internal/analytics/events.go @@ -1,31 +1,5 @@ package analytics -import ( - "ldcli/cmd/cliflags" - - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/spf13/viper" -) - -func CmdRunEventProperties(cmd *cobra.Command, name string) map[string]interface{} { - baseURI := viper.GetString(cliflags.BaseURIFlag) - var flags []string - cmd.Flags().Visit(func(f *pflag.Flag) { - flags = append(flags, f.Name) - }) - - properties := map[string]interface{}{ - "name": name, - "action": cmd.CalledAs(), - "flags": flags, - } - if baseURI != cliflags.BaseURIDefault { - properties["baseURI"] = baseURI - } - return properties -} - const ( SUCCESS = "success" ERROR = "error" @@ -57,24 +31,3 @@ func MockedTracker(name string, action string, flags []string, outcome string) * }...) return &tracker } - -func SendCommandRunEvent(name string, cmd *cobra.Command, analyticsTracker Tracker) { - cmd.Root().Annotations = map[string]string{"tracking": "true"} - analyticsTracker.SendEvent( - viper.GetString(cliflags.AccessTokenFlag), - viper.GetString(cliflags.BaseURIFlag), - "CLI Command Run", - CmdRunEventProperties(cmd, name), - ) -} - -func SendCommandCompletedEvent(outcome *string, analyticsTracker Tracker) { - analyticsTracker.SendEvent( - viper.GetString(cliflags.AccessTokenFlag), - viper.GetString(cliflags.BaseURIFlag), - "CLI Command Completed", - map[string]interface{}{ - "outcome": *outcome, - }, - ) -} From f72be075c0a0b37e97607f0c384a71d7ce3b8461 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 14:47:15 -0700 Subject: [PATCH 34/40] use right name and remove name from cmdrunevent --- cmd/config/config.go | 3 +-- cmd/environments/environments.go | 3 +-- cmd/flags/flags.go | 3 +-- cmd/members/members.go | 3 +-- cmd/projects/projects.go | 1 - internal/analytics/client.go | 6 ++---- 6 files changed, 6 insertions(+), 13 deletions(-) diff --git a/cmd/config/config.go b/cmd/config/config.go index 40b40799..91562b4f 100644 --- a/cmd/config/config.go +++ b/cmd/config/config.go @@ -31,10 +31,9 @@ func NewConfigCmd(analyticsTracker analytics.Tracker) *cobra.Command { Use: "config", PreRun: func(c *cobra.Command, args []string) { analyticsTracker.SendCommandRunEvent( - "environments", viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), - cmdAnalytics.CmdRunEventProperties(c, "projects"), + cmdAnalytics.CmdRunEventProperties(c, "config"), ) }, } diff --git a/cmd/environments/environments.go b/cmd/environments/environments.go index 4353c30d..906e6269 100644 --- a/cmd/environments/environments.go +++ b/cmd/environments/environments.go @@ -20,10 +20,9 @@ func NewEnvironmentsCmd( Long: "Make requests (list, create, etc.) on environments", PersistentPreRun: func(c *cobra.Command, args []string) { analyticsTracker.SendCommandRunEvent( - "environments", viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), - cmdAnalytics.CmdRunEventProperties(c, "projects"), + cmdAnalytics.CmdRunEventProperties(c, "environments"), ) }, } diff --git a/cmd/flags/flags.go b/cmd/flags/flags.go index fd614abe..e70f4636 100644 --- a/cmd/flags/flags.go +++ b/cmd/flags/flags.go @@ -17,10 +17,9 @@ func NewFlagsCmd(analyticsTracker analytics.Tracker, client flags.Client) (*cobr Long: "Make requests (list, create, etc.) on flags", PersistentPreRun: func(c *cobra.Command, args []string) { analyticsTracker.SendCommandRunEvent( - "projects", viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), - cmdAnalytics.CmdRunEventProperties(c, "projects"), + cmdAnalytics.CmdRunEventProperties(c, "flags"), ) }, } diff --git a/cmd/members/members.go b/cmd/members/members.go index 0d249408..aac0f06c 100644 --- a/cmd/members/members.go +++ b/cmd/members/members.go @@ -17,10 +17,9 @@ func NewMembersCmd(analyticsTracker analytics.Tracker, client members.Client) (* Long: "Make requests (list, create, etc.) on members", PersistentPreRun: func(c *cobra.Command, args []string) { analyticsTracker.SendCommandRunEvent( - "members", viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), - cmdAnalytics.CmdRunEventProperties(c, "projects"), + cmdAnalytics.CmdRunEventProperties(c, "members"), ) }, } diff --git a/cmd/projects/projects.go b/cmd/projects/projects.go index f1f0ed4b..ff327b2a 100644 --- a/cmd/projects/projects.go +++ b/cmd/projects/projects.go @@ -17,7 +17,6 @@ func NewProjectsCmd(analyticsTracker analytics.Tracker, client projects.Client) Long: "Make requests (list, create, etc.) on projects", PersistentPreRun: func(c *cobra.Command, args []string) { analyticsTracker.SendCommandRunEvent( - "projects", viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), cmdAnalytics.CmdRunEventProperties(c, "projects"), diff --git a/internal/analytics/client.go b/internal/analytics/client.go index 16efb042..b214e759 100644 --- a/internal/analytics/client.go +++ b/internal/analytics/client.go @@ -19,7 +19,6 @@ type Tracker interface { properties map[string]interface{}, ) SendCommandRunEvent( - name, accessToken, baseURI string, properties map[string]interface{}, @@ -92,7 +91,6 @@ func (c *Client) SendEvent( } func (c *Client) SendCommandRunEvent( - name, accessToken, baseURI string, properties map[string]interface{}, @@ -130,7 +128,7 @@ func (c *NoopClient) SendEvent( ) { } -func (c *NoopClient) SendCommandRunEvent(name, +func (c *NoopClient) SendCommandRunEvent( accessToken, baseURI string, properties map[string]interface{}, @@ -155,7 +153,7 @@ func (m *MockTracker) SendEvent( m.Called(accessToken, baseURI, eventName, properties) } -func (m *MockTracker) SendCommandRunEvent(name, +func (m *MockTracker) SendCommandRunEvent( accessToken, baseURI string, properties map[string]interface{}, From bb933751100e7275e2be5e83571176301726abf7 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 15:02:19 -0700 Subject: [PATCH 35/40] update test --- cmd/cmdtest.go | 4 ++-- cmd/flags/get_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/cmdtest.go b/cmd/cmdtest.go index b6fb723c..06ca9c6d 100644 --- a/cmd/cmdtest.go +++ b/cmd/cmdtest.go @@ -40,7 +40,7 @@ func CallCmd( tracker.SendCommandCompletedEvent( analytics.ERROR, viper.GetString(cliflags.AccessTokenFlag), - viper.GetString(cliflags.BaseURIDefault), + viper.GetString(cliflags.BaseURIFlag), ) return nil, err } @@ -48,7 +48,7 @@ func CallCmd( tracker.SendCommandCompletedEvent( analytics.SUCCESS, viper.GetString(cliflags.AccessTokenFlag), - viper.GetString(cliflags.BaseURIDefault), + viper.GetString(cliflags.BaseURIFlag), ) out, err := io.ReadAll(b) diff --git a/cmd/flags/get_test.go b/cmd/flags/get_test.go index cdbeca53..39320d63 100644 --- a/cmd/flags/get_test.go +++ b/cmd/flags/get_test.go @@ -171,7 +171,7 @@ func TestGet(t *testing.T) { client := flags.MockClient{} client. On("Get", mockArgs...). - Return([]byte(`{}`), errors.NewError("An error")) + Return([]byte(`{}`), errors.NewError(`{"message": "An error"}`)) clients := cmd.APIClients{ FlagsClient: &client, } From 6aaf5208b05056399eb6522e2cdd8e3c025eea14 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 15:07:56 -0700 Subject: [PATCH 36/40] remove update api error test --- cmd/flags/update_test.go | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/cmd/flags/update_test.go b/cmd/flags/update_test.go index 88836a36..a8e2c999 100644 --- a/cmd/flags/update_test.go +++ b/cmd/flags/update_test.go @@ -161,38 +161,6 @@ func TestUpdate(t *testing.T) { _, err := cmd.CallCmd(t, clients, tracker, args) require.NoError(t, err) }) - - t.Run("will track analytics for api error", func(t *testing.T) { - tracker := analytics.MockedTracker( - "flags", - "update", - []string{ - "access-token", - "base-uri", - "data", - "flag", - "project", - }, analytics.ERROR) - client := flags.MockClient{} - client. - On("Update", mockArgs...). - Return([]byte(`{}`), errors.NewError("An error")) - clients := cmd.APIClients{ - FlagsClient: &client, - } - - args := []string{ - "flags", "update", - "--access-token", "testAccessToken", - "--base-uri", "http://test.com", - "-d", `[{"op": "replace", "path": "/name", "value": "new-name"}]`, - "--flag", "test-key", - "--project", "test-proj-key", - } - - _, err := cmd.CallCmd(t, clients, tracker, args) - require.EqualError(t, err, "An error") - }) } func TestToggle(t *testing.T) { From f6e83dcb2217099c730a7034518a57a6c172f226 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 16:34:24 -0700 Subject: [PATCH 37/40] fixed everything after merging in main --- cmd/cmdtest.go | 6 ++-- cmd/flags/flags.go | 4 +-- cmd/members/members.go | 4 +-- cmd/projects/projects.go | 2 +- cmd/root.go | 3 +- internal/analytics/client.go | 62 +++++++++++++++++++----------------- internal/analytics/events.go | 4 +-- 7 files changed, 46 insertions(+), 39 deletions(-) diff --git a/cmd/cmdtest.go b/cmd/cmdtest.go index 06ca9c6d..a3999f9b 100644 --- a/cmd/cmdtest.go +++ b/cmd/cmdtest.go @@ -38,17 +38,19 @@ func CallCmd( err = rootCmd.Execute() if err != nil { tracker.SendCommandCompletedEvent( - analytics.ERROR, viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), + viper.GetBool(cliflags.AnalyticsOptOut), + analytics.ERROR, ) return nil, err } tracker.SendCommandCompletedEvent( - analytics.SUCCESS, viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), + viper.GetBool(cliflags.AnalyticsOptOut), + analytics.SUCCESS, ) out, err := io.ReadAll(b) diff --git a/cmd/flags/flags.go b/cmd/flags/flags.go index c8e286ae..a20c4954 100644 --- a/cmd/flags/flags.go +++ b/cmd/flags/flags.go @@ -19,8 +19,8 @@ func NewFlagsCmd(analyticsTracker analytics.Tracker, client flags.Client) (*cobr analyticsTracker.SendCommandRunEvent( viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), - viper.GetBool(cliflags.AnalyticsOptOut), - cmdAnalytics.CmdRunEventProperties(c, "flags"), + viper.GetBool(cliflags.AnalyticsOptOut), + cmdAnalytics.CmdRunEventProperties(c, "flags"), ) }, } diff --git a/cmd/members/members.go b/cmd/members/members.go index c3bdba55..1eccdcdc 100644 --- a/cmd/members/members.go +++ b/cmd/members/members.go @@ -19,8 +19,8 @@ func NewMembersCmd(analyticsTracker analytics.Tracker, client members.Client) (* analyticsTracker.SendCommandRunEvent( viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), - viper.GetBool(cliflags.AnalyticsOptOut), - cmdAnalytics.CmdRunEventProperties(c, "members"), + viper.GetBool(cliflags.AnalyticsOptOut), + cmdAnalytics.CmdRunEventProperties(c, "members"), ) }, } diff --git a/cmd/projects/projects.go b/cmd/projects/projects.go index f46abe4c..f4b54a95 100644 --- a/cmd/projects/projects.go +++ b/cmd/projects/projects.go @@ -19,7 +19,7 @@ func NewProjectsCmd(analyticsTracker analytics.Tracker, client projects.Client) analyticsTracker.SendCommandRunEvent( viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), - viper.GetBool(cliflags.AnalyticsOptOut), + viper.GetBool(cliflags.AnalyticsOptOut), cmdAnalytics.CmdRunEventProperties(c, "projects"), ) }, diff --git a/cmd/root.go b/cmd/root.go index b589a232..8339801a 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -175,9 +175,10 @@ func Execute(analyticsTracker analytics.Tracker, version string) { } analyticsTracker.SendCommandCompletedEvent( - outcome, viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIDefault), + viper.GetBool(cliflags.AnalyticsOptOut), + outcome, ) } diff --git a/internal/analytics/client.go b/internal/analytics/client.go index 92b132a7..2b13b459 100644 --- a/internal/analytics/client.go +++ b/internal/analytics/client.go @@ -12,22 +12,17 @@ import ( ) type Tracker interface { - SendEvent( - accessToken string, - baseURI string, - optOut bool, - eventName string, - properties map[string]interface{}, - ) SendCommandRunEvent( accessToken, baseURI string, + optOut bool, properties map[string]interface{}, ) SendCommandCompletedEvent( - outcome, accessToken, baseURI string, + optOut bool, + outcome string, ) } @@ -38,7 +33,7 @@ type Client struct { } // SendEvent makes an async request to track the given event with properties. -func (c *Client) SendEvent( +func (c *Client) sendEvent( accessToken string, baseURI string, optOut bool, @@ -48,7 +43,7 @@ func (c *Client) SendEvent( if optOut { return } - properties["id"] = c.ID + properties["id"] = c.ID input := struct { Event string `json:"event"` Properties map[string]interface{} `json:"properties"` @@ -98,22 +93,28 @@ func (c *Client) SendEvent( func (c *Client) SendCommandRunEvent( accessToken, baseURI string, + optOut bool, properties map[string]interface{}, ) { - c.SendEvent( + c.sendEvent( accessToken, baseURI, - false, + optOut, "CLI Command Run", properties, ) } -func (c *Client) SendCommandCompletedEvent(outcome, accessToken, baseURI string) { - c.SendEvent( +func (c *Client) SendCommandCompletedEvent( + accessToken, + baseURI string, + optOut bool, + outcome string, +) { + c.sendEvent( accessToken, baseURI, - false, + optOut, "CLI Command Completed", map[string]interface{}{ "outcome": outcome, @@ -127,31 +128,28 @@ func (a *Client) Wait() { type NoopClient struct{} -func (c *NoopClient) SendEvent( - accessToken string, +func (c *NoopClient) SendCommandRunEvent( + accessToken, baseURI string, optOut bool, - eventName string, properties map[string]interface{}, ) { } -func (c *NoopClient) SendCommandRunEvent( +func (c *NoopClient) SendCommandCompletedEvent( accessToken, baseURI string, - properties map[string]interface{}, + optOut bool, + outcome string, ) { } -func (c *NoopClient) SendCommandCompletedEvent(outcome, accessToken, baseURI string) { -} - type MockTracker struct { mock.Mock ID string } -func (m *MockTracker) SendEvent( +func (m *MockTracker) sendEvent( accessToken string, baseURI string, optOut bool, @@ -165,22 +163,28 @@ func (m *MockTracker) SendEvent( func (m *MockTracker) SendCommandRunEvent( accessToken, baseURI string, + optOut bool, properties map[string]interface{}, ) { - m.SendEvent( + m.sendEvent( accessToken, baseURI, - false, + optOut, "CLI Command Run", properties, ) } -func (m *MockTracker) SendCommandCompletedEvent(outcome, accessToken, baseURI string) { - m.SendEvent( +func (m *MockTracker) SendCommandCompletedEvent( + accessToken, + baseURI string, + optOut bool, + outcome string, +) { + m.sendEvent( accessToken, baseURI, - false, + optOut, "CLI Command Completed", map[string]interface{}{ "outcome": outcome, diff --git a/internal/analytics/events.go b/internal/analytics/events.go index 5ef2fbda..3f34440f 100644 --- a/internal/analytics/events.go +++ b/internal/analytics/events.go @@ -8,7 +8,7 @@ const ( func MockedTracker(name string, action string, flags []string, outcome string) *MockTracker { id := "test-id" tracker := MockTracker{ID: id} - tracker.On("SendEvent", []interface{}{ + tracker.On("sendEvent", []interface{}{ "testAccessToken", "http://test.com", "CLI Command Run", @@ -20,7 +20,7 @@ func MockedTracker(name string, action string, flags []string, outcome string) * "name": name, }, }...) - tracker.On("SendEvent", []interface{}{ + tracker.On("sendEvent", []interface{}{ "testAccessToken", "http://test.com", "CLI Command Completed", From 665ba91b6c65bd705ccfaaef03fbd458595cb1e1 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 16:35:40 -0700 Subject: [PATCH 38/40] c to cmd --- cmd/config/config.go | 4 ++-- cmd/flags/flags.go | 4 ++-- cmd/members/members.go | 4 ++-- cmd/projects/projects.go | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cmd/config/config.go b/cmd/config/config.go index 3fedfb2c..399db8b5 100644 --- a/cmd/config/config.go +++ b/cmd/config/config.go @@ -29,12 +29,12 @@ func NewConfigCmd(analyticsTracker analytics.Tracker) *cobra.Command { RunE: run(), Short: "View and modify specific configuration values", Use: "config", - PreRun: func(c *cobra.Command, args []string) { + PreRun: func(cmd *cobra.Command, args []string) { analyticsTracker.SendCommandRunEvent( viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), viper.GetBool(cliflags.AnalyticsOptOut), - cmdAnalytics.CmdRunEventProperties(c, "config"), + cmdAnalytics.CmdRunEventProperties(cmd, "config"), ) }, } diff --git a/cmd/flags/flags.go b/cmd/flags/flags.go index a20c4954..b50c56ce 100644 --- a/cmd/flags/flags.go +++ b/cmd/flags/flags.go @@ -15,12 +15,12 @@ func NewFlagsCmd(analyticsTracker analytics.Tracker, client flags.Client) (*cobr Use: "flags", Short: "Make requests (list, create, etc.) on flags", Long: "Make requests (list, create, etc.) on flags", - PersistentPreRun: func(c *cobra.Command, args []string) { + PersistentPreRun: func(cmd *cobra.Command, args []string) { analyticsTracker.SendCommandRunEvent( viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), viper.GetBool(cliflags.AnalyticsOptOut), - cmdAnalytics.CmdRunEventProperties(c, "flags"), + cmdAnalytics.CmdRunEventProperties(cmd, "flags"), ) }, } diff --git a/cmd/members/members.go b/cmd/members/members.go index 1eccdcdc..c8cbcdce 100644 --- a/cmd/members/members.go +++ b/cmd/members/members.go @@ -15,12 +15,12 @@ func NewMembersCmd(analyticsTracker analytics.Tracker, client members.Client) (* Use: "members", Short: "Make requests (list, create, etc.) on members", Long: "Make requests (list, create, etc.) on members", - PersistentPreRun: func(c *cobra.Command, args []string) { + PersistentPreRun: func(cmd *cobra.Command, args []string) { analyticsTracker.SendCommandRunEvent( viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), viper.GetBool(cliflags.AnalyticsOptOut), - cmdAnalytics.CmdRunEventProperties(c, "members"), + cmdAnalytics.CmdRunEventProperties(cmd, "members"), ) }, } diff --git a/cmd/projects/projects.go b/cmd/projects/projects.go index f4b54a95..d2df0757 100644 --- a/cmd/projects/projects.go +++ b/cmd/projects/projects.go @@ -15,12 +15,12 @@ func NewProjectsCmd(analyticsTracker analytics.Tracker, client projects.Client) Use: "projects", Short: "Make requests (list, create, etc.) on projects", Long: "Make requests (list, create, etc.) on projects", - PersistentPreRun: func(c *cobra.Command, args []string) { + PersistentPreRun: func(cmd *cobra.Command, args []string) { analyticsTracker.SendCommandRunEvent( viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), viper.GetBool(cliflags.AnalyticsOptOut), - cmdAnalytics.CmdRunEventProperties(c, "projects"), + cmdAnalytics.CmdRunEventProperties(cmd, "projects"), ) }, } From 9feeab665a1c7bc56d7f1a2b6aaeef70820d458d Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 16:35:40 -0700 Subject: [PATCH 39/40] c to cmd --- cmd/environments/environments.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/environments/environments.go b/cmd/environments/environments.go index fdce3ecf..04833832 100644 --- a/cmd/environments/environments.go +++ b/cmd/environments/environments.go @@ -18,12 +18,12 @@ func NewEnvironmentsCmd( Use: "environments", Short: "Make requests (list, create, etc.) on environments", Long: "Make requests (list, create, etc.) on environments", - PersistentPreRun: func(c *cobra.Command, args []string) { + PersistentPreRun: func(cmd *cobra.Command, args []string) { analyticsTracker.SendCommandRunEvent( viper.GetString(cliflags.AccessTokenFlag), viper.GetString(cliflags.BaseURIFlag), viper.GetBool(cliflags.AnalyticsOptOut), - cmdAnalytics.CmdRunEventProperties(c, "environments"), + cmdAnalytics.CmdRunEventProperties(cmd, "environments"), ) }, } From 2657418b98dfa8fa7b8e2c51601fbbcbedaa666a Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 24 Apr 2024 16:38:44 -0700 Subject: [PATCH 40/40] noop completed event if run wasn't sent before --- internal/analytics/client.go | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/internal/analytics/client.go b/internal/analytics/client.go index 2b13b459..0bce52c3 100644 --- a/internal/analytics/client.go +++ b/internal/analytics/client.go @@ -27,9 +27,10 @@ type Tracker interface { } type Client struct { - ID string - HTTPClient *http.Client - wg sync.WaitGroup + ID string + HTTPClient *http.Client + sentRunEvent bool + wg sync.WaitGroup } // SendEvent makes an async request to track the given event with properties. @@ -103,6 +104,9 @@ func (c *Client) SendCommandRunEvent( "CLI Command Run", properties, ) + if !optOut { + c.sentRunEvent = true + } } func (c *Client) SendCommandCompletedEvent( @@ -111,15 +115,17 @@ func (c *Client) SendCommandCompletedEvent( optOut bool, outcome string, ) { - c.sendEvent( - accessToken, - baseURI, - optOut, - "CLI Command Completed", - map[string]interface{}{ - "outcome": outcome, - }, - ) + if c.sentRunEvent { + c.sendEvent( + accessToken, + baseURI, + optOut, + "CLI Command Completed", + map[string]interface{}{ + "outcome": outcome, + }, + ) + } } func (a *Client) Wait() {