diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c903f53436..0ca91ac2e6 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -92,6 +92,11 @@ jobs: - "auth/**" - "pkg/sdk/**" + cli: + - "cli/**" + - "cmd/cli/**" + - "pkg/sdk/**" + coap: - "coap/**" - "cmd/coap/**" @@ -296,6 +301,11 @@ jobs: run: | go test --race -v -count=1 -coverprofile=coverage/certs.out ./certs/... + - name: Run cli tests + if: steps.changes.outputs.cli == 'true' || steps.changes.outputs.workflow == 'true' + run: | + go test --race -v -count=1 -coverprofile=coverage/cli.out ./cli/... + - name: Run CoAP tests if: steps.changes.outputs.coap == 'true' || steps.changes.outputs.workflow == 'true' run: | diff --git a/cli/bootstrap.go b/cli/bootstrap.go index aa446a7917..dff326cad2 100644 --- a/cli/bootstrap.go +++ b/cli/bootstrap.go @@ -17,23 +17,23 @@ var cmdBootstrap = []cobra.Command{ Long: `Create new Thing Bootstrap Config to the user identified by the provided key`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } var cfg mgxsdk.BootstrapConfig if err := json.Unmarshal([]byte(args[0]), &cfg); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } id, err := sdk.AddBootstrap(cfg, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logCreated(id) + logCreatedCmd(*cmd, id) }, }, { @@ -44,7 +44,7 @@ var cmdBootstrap = []cobra.Command{ - view config of `, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } pageMetadata := mgxsdk.PageMetadata{ @@ -56,20 +56,20 @@ var cmdBootstrap = []cobra.Command{ if args[0] == "all" { l, err := sdk.Bootstraps(pageMetadata, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(l) + logJSONCmd(*cmd, l) return } c, err := sdk.ViewBootstrap(args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(c) + logJSONCmd(*cmd, c) }, }, { @@ -82,49 +82,49 @@ var cmdBootstrap = []cobra.Command{ certs - Update bootstrap config certificates.`, Run: func(cmd *cobra.Command, args []string) { if len(args) < 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if args[0] == "config" { var cfg mgxsdk.BootstrapConfig if err := json.Unmarshal([]byte(args[0]), &cfg); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } if err := sdk.UpdateBootstrap(cfg, args[1]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) return } if args[0] == "connection" { var ids []string if err := json.Unmarshal([]byte(args[1]), &ids); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } if err := sdk.UpdateBootstrapConnection(args[0], ids, args[2]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) return } if args[0] == "certs" { cfg, err := sdk.UpdateBootstrapCerts(args[0], args[1], args[2], args[3], args[4]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(cfg) + logJSONCmd(*cmd, cfg) return } - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) }, }, { @@ -133,16 +133,16 @@ var cmdBootstrap = []cobra.Command{ Long: `Removes Config with specified key that belongs to the user identified by the given key`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if err := sdk.RemoveBootstrap(args[0], args[1]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, { @@ -152,26 +152,26 @@ var cmdBootstrap = []cobra.Command{ secure - Retrieves a configuration with given external ID and encrypted external key.`, Run: func(cmd *cobra.Command, args []string) { if len(args) < 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if args[0] == "secure" { c, err := sdk.BootstrapSecure(args[1], args[2], args[3]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(c) + logJSONCmd(*cmd, c) return } c, err := sdk.Bootstrap(args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(c) + logJSONCmd(*cmd, c) }, }, { @@ -180,22 +180,22 @@ var cmdBootstrap = []cobra.Command{ Long: `Whitelist updates thing state config with given id from the authenticated user`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } var cfg mgxsdk.BootstrapConfig if err := json.Unmarshal([]byte(args[0]), &cfg); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } if err := sdk.Whitelist(cfg.ThingID, cfg.State, args[1]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, } diff --git a/cli/certs.go b/cli/certs.go index 262203c953..bd38a36aa5 100644 --- a/cli/certs.go +++ b/cli/certs.go @@ -14,24 +14,24 @@ var cmdCerts = []cobra.Command{ Long: `Gets a certificate for a given cert ID.`, Run: func(cmd *cobra.Command, args []string) { if len(args) < 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if args[0] == "thing" { cert, err := sdk.ViewCertByThing(args[1], args[2]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(cert) + logJSONCmd(*cmd, cert) return } cert, err := sdk.ViewCert(args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(cert) + logJSONCmd(*cmd, cert) }, }, { @@ -40,15 +40,15 @@ var cmdCerts = []cobra.Command{ Long: `Revokes a certificate for a given thing ID.`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } rtime, err := sdk.RevokeCert(args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logRevokedTime(rtime) + logRevokedTimeCmd(*cmd, rtime) }, }, } @@ -63,7 +63,7 @@ func NewCertsCmd() *cobra.Command { Long: `Issues new certificate for a thing`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } @@ -71,10 +71,10 @@ func NewCertsCmd() *cobra.Command { c, err := sdk.IssueCert(thingID, ttl, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(c) + logJSONCmd(*cmd, c) }, } diff --git a/cli/channels.go b/cli/channels.go index 4e86f7ee04..83ea3e2ef5 100644 --- a/cli/channels.go +++ b/cli/channels.go @@ -19,23 +19,23 @@ var cmdChannels = []cobra.Command{ Long: `Creates new channel and generates it's UUID`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } var channel mgxsdk.Channel if err := json.Unmarshal([]byte(args[0]), &channel); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } channel, err := sdk.CreateChannel(channel, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(channel) + logJSONCmd(*cmd, channel) }, }, { @@ -47,12 +47,12 @@ var cmdChannels = []cobra.Command{ Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } metadata, err := convertMetadata(Metadata) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } pageMetadata := mgxsdk.PageMetadata{ @@ -65,20 +65,20 @@ var cmdChannels = []cobra.Command{ if args[0] == all { l, err := sdk.Channels(pageMetadata, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(l) + logJSONCmd(*cmd, l) return } c, err := sdk.Channel(args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(c) + logJSONCmd(*cmd, c) }, }, { @@ -89,14 +89,14 @@ var cmdChannels = []cobra.Command{ "\tmagistrala-cli channels delete $USERTOKEN - delete the given channel ID\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if err := sdk.DeleteChannel(args[0], args[1]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, { @@ -105,23 +105,23 @@ var cmdChannels = []cobra.Command{ Long: `Updates channel record`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } var channel mgxsdk.Channel if err := json.Unmarshal([]byte(args[1]), &channel); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } channel.ID = args[0] channel, err := sdk.UpdateChannel(channel, args[2]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(channel) + logJSONCmd(*cmd, channel) }, }, { @@ -130,7 +130,7 @@ var cmdChannels = []cobra.Command{ Long: `List of Things connected to a Channel`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } pm := mgxsdk.PageMetadata{ @@ -139,11 +139,11 @@ var cmdChannels = []cobra.Command{ } cl, err := sdk.ThingsByChannel(args[0], pm, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(cl) + logJSONCmd(*cmd, cl) }, }, { @@ -152,17 +152,17 @@ var cmdChannels = []cobra.Command{ Long: `Change channel status to enabled`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } channel, err := sdk.EnableChannel(args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(channel) + logJSONCmd(*cmd, channel) }, }, { @@ -171,17 +171,17 @@ var cmdChannels = []cobra.Command{ Long: `Change channel status to disabled`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } channel, err := sdk.DisableChannel(args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(channel) + logJSONCmd(*cmd, channel) }, }, { @@ -192,7 +192,7 @@ var cmdChannels = []cobra.Command{ "\tmagistrala-cli channels users $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } pm := mgxsdk.PageMetadata{ @@ -201,11 +201,11 @@ var cmdChannels = []cobra.Command{ } ul, err := sdk.ListChannelUsers(args[0], pm, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(ul) + logJSONCmd(*cmd, ul) }, }, { @@ -216,7 +216,7 @@ var cmdChannels = []cobra.Command{ "\tmagistrala-cli channels groups $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } pm := mgxsdk.PageMetadata{ @@ -225,11 +225,11 @@ var cmdChannels = []cobra.Command{ } ul, err := sdk.ListChannelUserGroups(args[0], pm, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(ul) + logJSONCmd(*cmd, ul) }, }, } @@ -243,19 +243,19 @@ var channelAssignCmds = []cobra.Command{ "\tmagistrala-cli channels assign users '[\"\", \"\"]' $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 4 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } var userIDs []string if err := json.Unmarshal([]byte(args[1]), &userIDs); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } if err := sdk.AddUserToChannel(args[2], mgxsdk.UsersRelationRequest{Relation: args[0], UserIDs: userIDs}, args[3]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, { @@ -267,19 +267,19 @@ var channelAssignCmds = []cobra.Command{ Run: func(cmd *cobra.Command, args []string) { if len(args) != 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } var groupIDs []string if err := json.Unmarshal([]byte(args[0]), &groupIDs); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } if err := sdk.AddUserGroupToChannel(args[1], mgxsdk.UserGroupsRequest{UserGroupIDs: groupIDs}, args[2]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, } @@ -293,19 +293,19 @@ var channelUnassignCmds = []cobra.Command{ "\tmagistrala-cli channels unassign groups '[\"\", \"\"]' $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } var groupIDs []string if err := json.Unmarshal([]byte(args[0]), &groupIDs); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } if err := sdk.RemoveUserGroupFromChannel(args[1], mgxsdk.UserGroupsRequest{UserGroupIDs: groupIDs}, args[2]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, @@ -317,19 +317,19 @@ var channelUnassignCmds = []cobra.Command{ "\tmagistrala-cli channels unassign users '[\"\", \"\"]' $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 4 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } var userIDs []string if err := json.Unmarshal([]byte(args[1]), &userIDs); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } if err := sdk.RemoveUserFromChannel(args[2], mgxsdk.UsersRelationRequest{Relation: args[0], UserIDs: userIDs}, args[3]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, } diff --git a/cli/config.go b/cli/config.go index 48317663ec..e3910aaa6d 100644 --- a/cli/config.go +++ b/cli/config.go @@ -224,16 +224,16 @@ func NewConfigCmd() *cobra.Command { Long: "Local param storage to prevent repetitive passing of keys", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if err := setConfigValue(args[0], args[1]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, } } diff --git a/cli/consumers.go b/cli/consumers.go index 3ac74a7a97..d6b363e32a 100644 --- a/cli/consumers.go +++ b/cli/consumers.go @@ -15,17 +15,17 @@ var cmdSubscription = []cobra.Command{ Long: `Create new subscription`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } id, err := sdk.CreateSubscription(args[0], args[1], args[2]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logCreated(id) + logCreatedCmd(*cmd, id) }, }, { @@ -36,7 +36,7 @@ var cmdSubscription = []cobra.Command{ - view subscription of `, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } pageMetadata := mgxsdk.PageMetadata{ @@ -48,20 +48,20 @@ var cmdSubscription = []cobra.Command{ if args[0] == "all" { sub, err := sdk.ListSubscriptions(pageMetadata, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(sub) + logJSONCmd(*cmd, sub) return } c, err := sdk.ViewSubscription(args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(c) + logJSONCmd(*cmd, c) }, }, { @@ -70,16 +70,16 @@ var cmdSubscription = []cobra.Command{ Long: `Removes removes a subscription with the provided id`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if err := sdk.DeleteSubscription(args[0], args[1]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, } diff --git a/cli/domains.go b/cli/domains.go index cc3ad14430..4e2737e52f 100644 --- a/cli/domains.go +++ b/cli/domains.go @@ -19,7 +19,7 @@ var cmdDomains = []cobra.Command{ "\tmagistrala-cli domains create domain_1 domain_1_alias $TOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } @@ -29,10 +29,10 @@ var cmdDomains = []cobra.Command{ } user, err := sdk.CreateDomain(user, args[2]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(user) + logJSONCmd(*cmd, user) }, }, { @@ -41,12 +41,12 @@ var cmdDomains = []cobra.Command{ Long: "Get all domains. Users can be filtered by name or metadata or status", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } metadata, err := convertMetadata(Metadata) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } pageMetadata := mgxsdk.PageMetadata{ @@ -59,19 +59,19 @@ var cmdDomains = []cobra.Command{ if args[0] == all { l, err := sdk.Domains(pageMetadata, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(l) + logJSONCmd(*cmd, l) return } d, err := sdk.Domain(args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(d) + logJSONCmd(*cmd, d) }, }, @@ -81,12 +81,12 @@ var cmdDomains = []cobra.Command{ Long: "List Domain users", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } metadata, err := convertMetadata(Metadata) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } pageMetadata := mgxsdk.PageMetadata{ @@ -98,10 +98,10 @@ var cmdDomains = []cobra.Command{ l, err := sdk.ListDomainUsers(args[0], pageMetadata, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(l) + logJSONCmd(*cmd, l) }, }, @@ -113,23 +113,23 @@ var cmdDomains = []cobra.Command{ "\tmagistrala-cli domains update '{\"name\":\"new name\", \"alias\":\"new_alias\", \"metadata\":{\"key\": \"value\"}}' $TOKEN \n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 4 && len(args) != 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } var d mgxsdk.Domain if err := json.Unmarshal([]byte(args[1]), &d); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } d.ID = args[0] d, err := sdk.UpdateDomain(d, args[2]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(d) + logJSONCmd(*cmd, d) }, }, @@ -141,15 +141,15 @@ var cmdDomains = []cobra.Command{ "\tmagistrala-cli domains enable \n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if err := sdk.EnableDomain(args[0], args[1]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, { @@ -160,15 +160,15 @@ var cmdDomains = []cobra.Command{ "\tmagistrala-cli domains disable \n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if err := sdk.DisableDomain(args[0], args[1]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, } @@ -182,19 +182,19 @@ var domainAssignCmds = []cobra.Command{ "\tmagistrala-cli domains assign users '[\"\", \"\"]' $TOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 4 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } var userIDs []string if err := json.Unmarshal([]byte(args[1]), &userIDs); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } if err := sdk.AddUserToDomain(args[2], mgxsdk.UsersRelationRequest{Relation: args[0], UserIDs: userIDs}, args[3]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, } @@ -208,15 +208,15 @@ var domainUnassignCmds = []cobra.Command{ "\tmagistrala-cli domains unassign users $TOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if err := sdk.RemoveUserFromDomain(args[1], args[0], args[2]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, } diff --git a/cli/groups.go b/cli/groups.go index 294f9e9d15..aff1475d89 100644 --- a/cli/groups.go +++ b/cli/groups.go @@ -20,21 +20,21 @@ var cmdGroups = []cobra.Command{ "\tmagistrala-cli groups create '{\"name\":\"new group\", \"description\":\"new group description\", \"metadata\":{\"key\": \"value\"}}' $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } var group mgxsdk.Group if err := json.Unmarshal([]byte(args[0]), &group); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } group.Status = mgclients.EnabledStatus.String() group, err := sdk.CreateGroup(group, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(group) + logJSONCmd(*cmd, group) }, }, { @@ -45,23 +45,23 @@ var cmdGroups = []cobra.Command{ "\tmagistrala-cli groups update '{\"id\":\"\", \"name\":\"new group\", \"description\":\"new group description\", \"metadata\":{\"key\": \"value\"}}' $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } var group mgxsdk.Group if err := json.Unmarshal([]byte(args[0]), &group); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } group, err := sdk.UpdateGroup(group, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(group) + logJSONCmd(*cmd, group) }, }, { @@ -75,12 +75,12 @@ var cmdGroups = []cobra.Command{ "\tmagistrala-cli groups get $USERTOKEN - shows group with provided group ID\n", Run: func(cmd *cobra.Command, args []string) { if len(args) < 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if args[0] == all { if len(args) > 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } pm := mgxsdk.PageMetadata{ @@ -89,15 +89,15 @@ var cmdGroups = []cobra.Command{ } l, err := sdk.Groups(pm, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(l) + logJSONCmd(*cmd, l) return } if args[0] == "children" { if len(args) > 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } pm := mgxsdk.PageMetadata{ @@ -106,15 +106,15 @@ var cmdGroups = []cobra.Command{ } l, err := sdk.Children(args[1], pm, args[2]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(l) + logJSONCmd(*cmd, l) return } if args[0] == "parents" { if len(args) > 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } pm := mgxsdk.PageMetadata{ @@ -123,22 +123,22 @@ var cmdGroups = []cobra.Command{ } l, err := sdk.Parents(args[1], pm, args[2]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(l) + logJSONCmd(*cmd, l) return } if len(args) > 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } t, err := sdk.Group(args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(t) + logJSONCmd(*cmd, t) }, }, { @@ -149,14 +149,14 @@ var cmdGroups = []cobra.Command{ "\tmagistrala-cli groups delete $USERTOKEN - delete the given group ID\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if err := sdk.DeleteGroup(args[0], args[1]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, { @@ -167,7 +167,7 @@ var cmdGroups = []cobra.Command{ "\tmagistrala-cli groups users $USERTOKEN", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } pm := mgxsdk.PageMetadata{ @@ -177,10 +177,10 @@ var cmdGroups = []cobra.Command{ } users, err := sdk.ListGroupUsers(args[0], pm, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(users) + logJSONCmd(*cmd, users) }, }, { @@ -191,7 +191,7 @@ var cmdGroups = []cobra.Command{ "\tmagistrala-cli groups channels $USERTOKEN", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } pm := mgxsdk.PageMetadata{ @@ -201,10 +201,10 @@ var cmdGroups = []cobra.Command{ } channels, err := sdk.ListGroupChannels(args[0], pm, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(channels) + logJSONCmd(*cmd, channels) }, }, { @@ -215,17 +215,17 @@ var cmdGroups = []cobra.Command{ "\tmagistrala-cli groups enable $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } group, err := sdk.EnableGroup(args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(group) + logJSONCmd(*cmd, group) }, }, { @@ -236,17 +236,17 @@ var cmdGroups = []cobra.Command{ "\tmagistrala-cli groups disable $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } group, err := sdk.DisableGroup(args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(group) + logJSONCmd(*cmd, group) }, }, } @@ -260,19 +260,19 @@ var groupAssignCmds = []cobra.Command{ "\tmagistrala-cli groups assign users '[\"\", \"\"]' $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 4 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } var userIDs []string if err := json.Unmarshal([]byte(args[1]), &userIDs); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } if err := sdk.AddUserToGroup(args[2], mgxsdk.UsersRelationRequest{Relation: args[0], UserIDs: userIDs}, args[3]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, } @@ -286,19 +286,19 @@ var groupUnassignCmds = []cobra.Command{ "\tmagistrala-cli groups unassign users '[\"\", \"\"]' $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 4 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } var userIDs []string if err := json.Unmarshal([]byte(args[1]), &userIDs); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } if err := sdk.RemoveUserFromGroup(args[2], mgxsdk.UsersRelationRequest{Relation: args[0], UserIDs: userIDs}, args[3]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, } diff --git a/cli/health.go b/cli/health.go index 4df7f836c2..b66d8be336 100644 --- a/cli/health.go +++ b/cli/health.go @@ -15,16 +15,16 @@ func NewHealthCmd() *cobra.Command { "\tmagistrala-cli health ", Run: func(cmd *cobra.Command, args []string) { if len(args) != 1 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } v, err := sdk.Health(args[0]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(v) + logJSONCmd(*cmd, v) }, } } diff --git a/cli/invitations.go b/cli/invitations.go index eefedd7d39..38cf67f4bb 100644 --- a/cli/invitations.go +++ b/cli/invitations.go @@ -17,7 +17,7 @@ var cmdInvitations = []cobra.Command{ "\tmagistrala-cli invitations send 39f97daf-d6b6-40f4-b229-2697be8006ef 4ef09eff-d500-4d56-b04f-d23a512d6f2a administrator $USER_AUTH_TOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 4 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } inv := mgxsdk.Invitation{ @@ -26,11 +26,11 @@ var cmdInvitations = []cobra.Command{ Relation: args[2], } if err := sdk.SendInvitation(inv, args[3]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, { @@ -43,7 +43,7 @@ var cmdInvitations = []cobra.Command{ "\tmagistrala-cli invitations get - shows invitation by user id and domain id\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 && len(args) != 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } @@ -55,19 +55,19 @@ var cmdInvitations = []cobra.Command{ if args[0] == all { l, err := sdk.Invitations(pageMetadata, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(l) + logJSONCmd(*cmd, l) return } u, err := sdk.Invitation(args[0], args[1], args[2]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(u) + logJSONCmd(*cmd, u) }, }, { @@ -78,16 +78,16 @@ var cmdInvitations = []cobra.Command{ "\tmagistrala-cli invitations accept 39f97daf-d6b6-40f4-b229-2697be8006ef $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if err := sdk.AcceptInvitation(args[0], args[1]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, { @@ -98,16 +98,16 @@ var cmdInvitations = []cobra.Command{ "\tmagistrala-cli invitations delete 39f97daf-d6b6-40f4-b229-2697be8006ef 4ef09eff-d500-4d56-b04f-d23a512d6f2a $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if err := sdk.DeleteInvitation(args[0], args[1], args[2]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, } diff --git a/cli/journal.go b/cli/journal.go index fa659ca4c3..1b7ca1477d 100644 --- a/cli/journal.go +++ b/cli/journal.go @@ -17,7 +17,7 @@ var cmdJournal = cobra.Command{ "\tmagistrala-cli journal get --offset --limit - lists journal logs with provided offset and limit\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } @@ -28,11 +28,11 @@ var cmdJournal = cobra.Command{ journal, err := sdk.Journal(args[0], args[1], pageMetadata, args[2]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(journal) + logJSONCmd(*cmd, journal) }, } diff --git a/cli/message.go b/cli/message.go index 538b51bc80..252f701d71 100644 --- a/cli/message.go +++ b/cli/message.go @@ -15,16 +15,16 @@ var cmdMessages = []cobra.Command{ Long: `Sends message on the channel`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if err := sdk.SendMessage(args[0], args[1], args[2]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, { @@ -35,7 +35,7 @@ var cmdMessages = []cobra.Command{ "\tmagistrala-cli messages read --offset --limit - lists all messages with provided offset and limit\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } pageMetadata := mgxsdk.MessagePageMetadata{ @@ -47,11 +47,11 @@ var cmdMessages = []cobra.Command{ m, err := sdk.ReadMessages(pageMetadata, args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(m) + logJSONCmd(*cmd, m) }, }, } diff --git a/cli/provision.go b/cli/provision.go index 59ad80cad9..b7156ae35d 100644 --- a/cli/provision.go +++ b/cli/provision.go @@ -36,28 +36,28 @@ var cmdProvision = []cobra.Command{ Long: `Bulk create things`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if _, err := os.Stat(args[0]); os.IsNotExist(err) { - logError(err) + logErrorCmd(*cmd, err) return } things, err := thingsFromFile(args[0]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } things, err = sdk.CreateThings(things, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(things) + logJSONCmd(*cmd, things) }, }, { @@ -66,13 +66,13 @@ var cmdProvision = []cobra.Command{ Long: `Bulk create channels`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } channels, err := channelsFromFile(args[0]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } @@ -80,14 +80,14 @@ var cmdProvision = []cobra.Command{ for _, c := range channels { c, err = sdk.CreateChannel(c, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } chs = append(chs, c) } channels = chs - logJSON(channels) + logJSONCmd(*cmd, channels) }, }, { @@ -96,23 +96,23 @@ var cmdProvision = []cobra.Command{ Long: `Bulk connect things to channels`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } connIDs, err := connectionsFromFile(args[0]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } for _, conn := range connIDs { if err := sdk.Connect(conn, args[1]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } } - logOK() + logOKCmd(*cmd) }, }, { @@ -128,7 +128,7 @@ var cmdProvision = []cobra.Command{ channels := []mgxsdk.Channel{} if len(args) != 0 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } @@ -144,14 +144,14 @@ var cmdProvision = []cobra.Command{ } user, err := sdk.CreateUser(user, "") if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } user.Credentials.Secret = "12345678" ut, err := sdk.CreateToken(mgxsdk.Login{Identity: user.Credentials.Identity, Secret: user.Credentials.Secret}) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } @@ -162,14 +162,14 @@ var cmdProvision = []cobra.Command{ } domain, err = sdk.CreateDomain(domain, ut.AccessToken) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } // domain login ut, err = sdk.CreateToken(mgxsdk.Login{Identity: user.Credentials.Identity, Secret: user.Credentials.Secret, DomainID: domain.ID}) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } @@ -184,7 +184,7 @@ var cmdProvision = []cobra.Command{ } things, err = sdk.CreateThings(things, ut.AccessToken) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } @@ -196,7 +196,7 @@ var cmdProvision = []cobra.Command{ } c, err = sdk.CreateChannel(c, ut.AccessToken) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } @@ -209,7 +209,7 @@ var cmdProvision = []cobra.Command{ ThingID: things[0].ID, } if err := sdk.Connect(conIDs, ut.AccessToken); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } @@ -218,7 +218,7 @@ var cmdProvision = []cobra.Command{ ThingID: things[0].ID, } if err := sdk.Connect(conIDs, ut.AccessToken); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } @@ -227,25 +227,25 @@ var cmdProvision = []cobra.Command{ ThingID: things[1].ID, } if err := sdk.Connect(conIDs, ut.AccessToken); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } // send message to test connectivity if err := sdk.SendMessage(channels[0].ID, fmt.Sprintf(msgFormat, time.Now().Unix(), rand.Int()), things[0].Credentials.Secret); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } if err := sdk.SendMessage(channels[0].ID, fmt.Sprintf(msgFormat, time.Now().Unix(), rand.Int()), things[1].Credentials.Secret); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } if err := sdk.SendMessage(channels[1].ID, fmt.Sprintf(msgFormat, time.Now().Unix(), rand.Int()), things[0].Credentials.Secret); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(user, ut, things, channels) + logJSONCmd(*cmd, user, ut, things, channels) }, }, } diff --git a/cli/setup_test.go b/cli/setup_test.go new file mode 100644 index 0000000000..4a00f572df --- /dev/null +++ b/cli/setup_test.go @@ -0,0 +1,118 @@ +// Copyright (c) Abstract Machines +// SPDX-License-Identifier: Apache-2.0 + +package cli_test + +import ( + "bytes" + "testing" + + "github.com/absmach/magistrala/cli" + "github.com/spf13/cobra" + "github.com/stretchr/testify/assert" +) + +type outputLog uint8 + +const ( + usageLog outputLog = iota + errLog + entityLog + okLog +) + +func executeCommand(t *testing.T, root *cobra.Command, args ...string) string { + buffer := new(bytes.Buffer) + root.SetOut(buffer) + root.SetErr(buffer) + root.SetArgs(args) + err := root.Execute() + assert.NoError(t, err, "Error executing command") + return buffer.String() +} + +func setFlags(rootCmd *cobra.Command) *cobra.Command { + // Root Flags + rootCmd.PersistentFlags().BoolVarP( + &cli.RawOutput, + "raw", + "r", + cli.RawOutput, + "Enables raw output mode for easier parsing of output", + ) + + // Client and Channels Flags + rootCmd.PersistentFlags().Uint64VarP( + &cli.Limit, + "limit", + "l", + 10, + "Limit query parameter", + ) + + rootCmd.PersistentFlags().Uint64VarP( + &cli.Offset, + "offset", + "o", + 0, + "Offset query parameter", + ) + + rootCmd.PersistentFlags().StringVarP( + &cli.Name, + "name", + "n", + "", + "Name query parameter", + ) + + rootCmd.PersistentFlags().StringVarP( + &cli.Identity, + "identity", + "I", + "", + "User identity query parameter", + ) + + rootCmd.PersistentFlags().StringVarP( + &cli.Metadata, + "metadata", + "m", + "", + "Metadata query parameter", + ) + + rootCmd.PersistentFlags().StringVarP( + &cli.Status, + "status", + "S", + "", + "User status query parameter", + ) + + rootCmd.PersistentFlags().StringVarP( + &cli.State, + "state", + "z", + "", + "Bootstrap state query parameter", + ) + + rootCmd.PersistentFlags().StringVarP( + &cli.Topic, + "topic", + "T", + "", + "Subscription topic query parameter", + ) + + rootCmd.PersistentFlags().StringVarP( + &cli.Contact, + "contact", + "C", + "", + "Subscription contact query parameter", + ) + + return rootCmd +} diff --git a/cli/things.go b/cli/things.go index fe9cef3ce0..e37e6f24b3 100644 --- a/cli/things.go +++ b/cli/things.go @@ -20,23 +20,23 @@ var cmdThings = []cobra.Command{ "\tmagistrala-cli things create '{\"name\":\"new thing\", \"metadata\":{\"key\": \"value\"}}' $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } var thing mgxsdk.Thing if err := json.Unmarshal([]byte(args[0]), &thing); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } thing.Status = mgclients.EnabledStatus.String() thing, err := sdk.CreateThing(thing, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(thing) + logJSONCmd(*cmd, thing) }, }, { @@ -49,12 +49,12 @@ var cmdThings = []cobra.Command{ "\tmagistrala-cli things get $USERTOKEN - shows thing with provided \n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } metadata, err := convertMetadata(Metadata) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } pageMetadata := mgxsdk.PageMetadata{ @@ -66,19 +66,19 @@ var cmdThings = []cobra.Command{ if args[0] == all { l, err := sdk.Things(pageMetadata, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(l) + logJSONCmd(*cmd, l) return } t, err := sdk.Thing(args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(t) + logJSONCmd(*cmd, t) }, }, { @@ -89,14 +89,14 @@ var cmdThings = []cobra.Command{ "\tmagistrala-cli things delete $USERTOKEN - delete thing with \n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if err := sdk.DeleteThing(args[0], args[1]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, { @@ -109,50 +109,50 @@ var cmdThings = []cobra.Command{ "\tmagistrala-cli things update secret $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 4 && len(args) != 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } var thing mgxsdk.Thing if args[0] == "tags" { if err := json.Unmarshal([]byte(args[2]), &thing.Tags); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } thing.ID = args[1] thing, err := sdk.UpdateThingTags(thing, args[3]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(thing) + logJSONCmd(*cmd, thing) return } if args[0] == "secret" { thing, err := sdk.UpdateThingSecret(args[1], args[2], args[3]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(thing) + logJSONCmd(*cmd, thing) return } if err := json.Unmarshal([]byte(args[1]), &thing); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } thing.ID = args[0] thing, err := sdk.UpdateThing(thing, args[2]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(thing) + logJSONCmd(*cmd, thing) }, }, { @@ -163,17 +163,17 @@ var cmdThings = []cobra.Command{ "\tmagistrala-cli things enable $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } thing, err := sdk.EnableThing(args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(thing) + logJSONCmd(*cmd, thing) }, }, { @@ -184,17 +184,17 @@ var cmdThings = []cobra.Command{ "\tmagistrala-cli things disable $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } thing, err := sdk.DisableThing(args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(thing) + logJSONCmd(*cmd, thing) }, }, { @@ -205,7 +205,7 @@ var cmdThings = []cobra.Command{ "\tmagistrala-cli things share $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 4 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } req := mgxsdk.UsersRelationRequest{ @@ -214,11 +214,11 @@ var cmdThings = []cobra.Command{ } err := sdk.ShareThing(args[0], req, args[3]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, { @@ -229,7 +229,7 @@ var cmdThings = []cobra.Command{ "\tmagistrala-cli things share $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 4 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } req := mgxsdk.UsersRelationRequest{ @@ -238,11 +238,11 @@ var cmdThings = []cobra.Command{ } err := sdk.UnshareThing(args[0], req, args[3]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, { @@ -253,7 +253,7 @@ var cmdThings = []cobra.Command{ "\tmagistrala-cli things connect $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } @@ -262,11 +262,11 @@ var cmdThings = []cobra.Command{ ThingID: args[0], } if err := sdk.Connect(connIDs, args[2]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, { @@ -277,7 +277,7 @@ var cmdThings = []cobra.Command{ "\tmagistrala-cli things disconnect $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } @@ -286,11 +286,11 @@ var cmdThings = []cobra.Command{ ChannelID: args[1], } if err := sdk.Disconnect(connIDs, args[2]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, { @@ -301,7 +301,7 @@ var cmdThings = []cobra.Command{ "\tmagistrala-cli connections $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } pm := mgxsdk.PageMetadata{ @@ -310,11 +310,11 @@ var cmdThings = []cobra.Command{ } cl, err := sdk.ChannelsByThing(args[0], pm, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(cl) + logJSONCmd(*cmd, cl) }, }, { @@ -325,7 +325,7 @@ var cmdThings = []cobra.Command{ "\tmagistrala-cli things users $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } pm := mgxsdk.PageMetadata{ @@ -334,11 +334,11 @@ var cmdThings = []cobra.Command{ } ul, err := sdk.ListThingUsers(args[0], pm, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(ul) + logJSONCmd(*cmd, ul) }, }, } diff --git a/cli/users.go b/cli/users.go index 82c4ffcf54..01283fb29c 100644 --- a/cli/users.go +++ b/cli/users.go @@ -20,7 +20,7 @@ var cmdUsers = []cobra.Command{ "\tmagistrala-cli users create user user@example.com 12345678 $USER_AUTH_TOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) < 3 || len(args) > 4 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if len(args) == 3 { @@ -37,11 +37,11 @@ var cmdUsers = []cobra.Command{ } user, err := sdk.CreateUser(user, args[3]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(user) + logJSONCmd(*cmd, user) }, }, { @@ -54,12 +54,12 @@ var cmdUsers = []cobra.Command{ "\tmagistrala-cli users get - shows user with provided \n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } metadata, err := convertMetadata(Metadata) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } pageMetadata := mgxsdk.PageMetadata{ @@ -72,19 +72,19 @@ var cmdUsers = []cobra.Command{ if args[0] == all { l, err := sdk.Users(pageMetadata, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(l) + logJSONCmd(*cmd, l) return } u, err := sdk.User(args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(u) + logJSONCmd(*cmd, u) }, }, { @@ -95,7 +95,7 @@ var cmdUsers = []cobra.Command{ "\tmagistrala-cli users token user@example.com 12345678\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 3 && len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } @@ -109,11 +109,11 @@ var cmdUsers = []cobra.Command{ token, err := sdk.CreateToken(lg) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(token) + logJSONCmd(*cmd, token) }, }, { @@ -124,7 +124,7 @@ var cmdUsers = []cobra.Command{ "\tmagistrala-cli users refreshtoken \n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 && len(args) != 1 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } @@ -134,11 +134,11 @@ var cmdUsers = []cobra.Command{ } token, err := sdk.RefreshToken(lg, args[0]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(token) + logJSONCmd(*cmd, token) }, }, { @@ -151,24 +151,24 @@ var cmdUsers = []cobra.Command{ "\tmagistrala-cli users update identity newidentity@example.com $USERTOKEN - updates user identity\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 4 && len(args) != 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } var user mgxsdk.User if args[0] == "tags" { if err := json.Unmarshal([]byte(args[2]), &user.Tags); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } user.ID = args[1] user, err := sdk.UpdateUserTags(user, args[3]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(user) + logJSONCmd(*cmd, user) return } @@ -177,11 +177,11 @@ var cmdUsers = []cobra.Command{ user.Credentials.Identity = args[2] user, err := sdk.UpdateUserIdentity(user, args[3]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(user) + logJSONCmd(*cmd, user) return } @@ -191,27 +191,27 @@ var cmdUsers = []cobra.Command{ user.Role = args[2] user, err := sdk.UpdateUserRole(user, args[3]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(user) + logJSONCmd(*cmd, user) return } if err := json.Unmarshal([]byte(args[1]), &user); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } user.ID = args[0] user, err := sdk.UpdateUser(user, args[2]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(user) + logJSONCmd(*cmd, user) }, }, { @@ -222,17 +222,17 @@ var cmdUsers = []cobra.Command{ "\tmagistrala-cli users profile $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 1 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } user, err := sdk.UserProfile(args[0]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(user) + logJSONCmd(*cmd, user) }, }, { @@ -243,16 +243,16 @@ var cmdUsers = []cobra.Command{ "\tmagistrala-cli users resetpasswordrequest example@mail.com\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 1 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if err := sdk.ResetPasswordRequest(args[0]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, { @@ -263,16 +263,16 @@ var cmdUsers = []cobra.Command{ "\tmagistrala-cli users resetpassword 12345678 12345678 $REQUESTTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if err := sdk.ResetPassword(args[0], args[1], args[2]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, { @@ -283,17 +283,17 @@ var cmdUsers = []cobra.Command{ "\tmagistrala-cli users password old_password new_password $USERTOKEN\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 3 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } user, err := sdk.UpdatePassword(args[0], args[1], args[2]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(user) + logJSONCmd(*cmd, user) }, }, { @@ -304,17 +304,17 @@ var cmdUsers = []cobra.Command{ "\tmagistrala-cli users enable \n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } user, err := sdk.EnableUser(args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(user) + logJSONCmd(*cmd, user) }, }, { @@ -325,17 +325,17 @@ var cmdUsers = []cobra.Command{ "\tmagistrala-cli users disable \n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } user, err := sdk.DisableUser(args[0], args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(user) + logJSONCmd(*cmd, user) }, }, { @@ -346,14 +346,14 @@ var cmdUsers = []cobra.Command{ "\tmagistrala-cli users delete $USERTOKEN - delete user with \n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } if err := sdk.DeleteUser(args[0], args[1]); err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logOK() + logOKCmd(*cmd) }, }, { @@ -364,7 +364,7 @@ var cmdUsers = []cobra.Command{ "\tmagistrala-cli users channels \n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } @@ -375,11 +375,11 @@ var cmdUsers = []cobra.Command{ cp, err := sdk.ListUserChannels(args[0], pm, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(cp) + logJSONCmd(*cmd, cp) }, }, @@ -391,7 +391,7 @@ var cmdUsers = []cobra.Command{ "\tmagistrala-cli users things \n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } @@ -402,11 +402,11 @@ var cmdUsers = []cobra.Command{ tp, err := sdk.ListUserThings(args[0], pm, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(tp) + logJSONCmd(*cmd, tp) }, }, @@ -418,7 +418,7 @@ var cmdUsers = []cobra.Command{ "\tmagistrala-cli users domains \n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } @@ -429,11 +429,11 @@ var cmdUsers = []cobra.Command{ dp, err := sdk.ListUserDomains(args[0], pm, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(dp) + logJSONCmd(*cmd, dp) }, }, @@ -445,7 +445,7 @@ var cmdUsers = []cobra.Command{ "\tmagistrala-cli users groups \n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { - logUsage(cmd.Use) + logUsageCmd(*cmd, cmd.Use) return } @@ -456,11 +456,11 @@ var cmdUsers = []cobra.Command{ users, err := sdk.ListUserGroups(args[0], pm, args[1]) if err != nil { - logError(err) + logErrorCmd(*cmd, err) return } - logJSON(users) + logJSONCmd(*cmd, users) }, }, } diff --git a/cli/users_test.go b/cli/users_test.go new file mode 100644 index 0000000000..643c1820c2 --- /dev/null +++ b/cli/users_test.go @@ -0,0 +1,1336 @@ +// Copyright (c) Abstract Machines +// SPDX-License-Identifier: Apache-2.0 + +package cli_test + +import ( + "encoding/json" + "fmt" + "net/http" + "strings" + "testing" + + "github.com/absmach/magistrala/cli" + "github.com/absmach/magistrala/internal/testsutil" + mgclients "github.com/absmach/magistrala/pkg/clients" + "github.com/absmach/magistrala/pkg/errors" + svcerr "github.com/absmach/magistrala/pkg/errors/service" + mgsdk "github.com/absmach/magistrala/pkg/sdk/go" + sdkmocks "github.com/absmach/magistrala/pkg/sdk/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +var user = mgsdk.User{ + Name: "testuser", + Credentials: mgsdk.Credentials{ + Secret: "testpassword", + Identity: "identity@example.com", + }, + Status: mgclients.EnabledStatus.String(), +} + +var ( + validToken = "valid" + invalidToken = "" + invalidID = "invalidID" + extraArg = "extra-arg" +) + +func TestCreateUsersCmd(t *testing.T) { + sdkMock := new(sdkmocks.SDK) + cli.SetSDK(sdkMock) + createCommand := "create" + usersCmd := cli.NewUsersCmd() + rootCmd := setFlags(usersCmd) + + var usr mgsdk.User + + cases := []struct { + desc string + args []string + sdkerr errors.SDKError + errLogMessage string + user mgsdk.User + logType outputLog + }{ + { + desc: "create user successfully with token", + args: []string{ + createCommand, + user.Name, + user.Credentials.Identity, + user.Credentials.Secret, + validToken, + }, + user: user, + logType: entityLog, + }, + { + desc: "create user successfully without token", + args: []string{ + createCommand, + user.Name, + user.Credentials.Identity, + user.Credentials.Secret, + }, + user: user, + logType: entityLog, + }, + { + desc: "failed to create user", + args: []string{ + createCommand, + user.Name, + user.Credentials.Identity, + user.Credentials.Secret, + }, + sdkerr: errors.NewSDKErrorWithStatus(svcerr.ErrCreateEntity, http.StatusUnprocessableEntity), + errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrCreateEntity, http.StatusUnprocessableEntity).Error()), + logType: errLog, + }, + { + desc: "create user with invalid args", + args: []string{createCommand, user.Name, user.Credentials.Identity}, + logType: usageLog, + }, + } + + for _, tc := range cases { + sdkCall := sdkMock.On("CreateUser", mock.Anything, mock.Anything).Return(tc.user, tc.sdkerr) + if len(tc.args) == 3 { + sdkUser := mgsdk.User{ + Name: tc.args[0], + Credentials: mgsdk.Credentials{ + Identity: tc.args[1], + Secret: tc.args[2], + }, + } + sdkCall = sdkMock.On("CreateUser", mock.Anything, sdkUser).Return(tc.user, tc.sdkerr) + } + out := executeCommand(t, rootCmd, tc.args...) + + switch tc.logType { + case entityLog: + err := json.Unmarshal([]byte(out), &usr) + assert.Nil(t, err) + assert.Equal(t, tc.user, usr, fmt.Sprintf("%s unexpected response: expected: %v, got: %v", tc.desc, tc.user, usr)) + case errLog: + assert.Equal(t, tc.errLogMessage, out, fmt.Sprintf("%s unexpected error response: expected %s got errLogMessage:%s", tc.desc, tc.errLogMessage, out)) + case usageLog: + assert.False(t, strings.Contains(out, rootCmd.Use), fmt.Sprintf("%s invalid usage: %s", tc.desc, out)) + } + + sdkCall.Unset() + } +} + +func TestGetUsersCmd(t *testing.T) { + sdkMock := new(sdkmocks.SDK) + cli.SetSDK(sdkMock) + getCommand := "get" + all := "all" + usersCmd := cli.NewUsersCmd() + rootCmd := setFlags(usersCmd) + + var page mgsdk.UsersPage + var usr mgsdk.User + out := "" + userID := testsutil.GenerateUUID(t) + + cases := []struct { + desc string + args []string + sdkerr errors.SDKError + errLogMessage string + user mgsdk.User + page mgsdk.UsersPage + logType outputLog + }{ + { + desc: "get users successfully", + args: []string{ + getCommand, + all, + validToken, + }, + sdkerr: nil, + page: mgsdk.UsersPage{ + Users: []mgsdk.User{user}, + }, + logType: entityLog, + }, + { + desc: "get user successfully with id", + args: []string{ + getCommand, + userID, + validToken, + }, + sdkerr: nil, + user: user, + logType: entityLog, + }, + { + desc: "get user with invalid id", + args: []string{ + getCommand, + invalidID, + validToken, + }, + sdkerr: errors.NewSDKErrorWithStatus(svcerr.ErrViewEntity, http.StatusBadRequest), + errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrViewEntity, http.StatusBadRequest).Error()), + user: mgsdk.User{}, + logType: errLog, + }, + { + desc: "get users successfully with offset and limit", + args: []string{ + getCommand, + all, + validToken, + "--offset=2", + "--limit=5", + }, + sdkerr: nil, + page: mgsdk.UsersPage{ + Users: []mgsdk.User{user}, + }, + logType: entityLog, + }, + { + desc: "get users with invalid token", + args: []string{ + getCommand, + all, + invalidToken, + }, + sdkerr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden), + errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden).Error()), + page: mgsdk.UsersPage{}, + logType: errLog, + }, + { + desc: "get users with invalid args", + args: []string{ + getCommand, + all, + invalidToken, + all, + invalidToken, + all, + invalidToken, + all, + invalidToken, + }, + logType: usageLog, + }, + { + desc: "get user with failed get operation", + args: []string{ + getCommand, + userID, + validToken, + }, + sdkerr: errors.NewSDKErrorWithStatus(svcerr.ErrViewEntity, http.StatusInternalServerError), + errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrViewEntity, http.StatusInternalServerError).Error()), + user: mgsdk.User{}, + logType: errLog, + }, + } + + for _, tc := range cases { + sdkCall := sdkMock.On("Users", mock.Anything, mock.Anything).Return(tc.page, tc.sdkerr) + sdkCall1 := sdkMock.On("User", tc.args[1], tc.args[2]).Return(tc.user, tc.sdkerr) + + out = executeCommand(t, rootCmd, tc.args...) + fmt.Println("out: ", out) + + if tc.logType == entityLog { + switch { + case tc.args[1] == all: + err := json.Unmarshal([]byte(out), &page) + if err != nil { + t.Fatalf("Failed to unmarshal JSON: %v", err) + } + default: + err := json.Unmarshal([]byte(out), &usr) + if err != nil { + t.Fatalf("Failed to unmarshal JSON: %v", err) + } + } + } + + switch tc.logType { + case errLog: + assert.Equal(t, tc.errLogMessage, out, fmt.Sprintf("%s unexpected error response: expected %s got errLogMessage:%s", tc.desc, tc.errLogMessage, out)) + case usageLog: + assert.False(t, strings.Contains(out, rootCmd.Use), fmt.Sprintf("%s invalid usage: %s", tc.desc, out)) + } + + if tc.logType == entityLog { + if tc.args[1] != all { + assert.Equal(t, tc.user, usr, fmt.Sprintf("%v unexpected response, expected: %v, got: %v", tc.desc, tc.user, usr)) + } else { + assert.Equal(t, tc.page, page, fmt.Sprintf("%v unexpected response, expected: %v, got: %v", tc.desc, tc.page, page)) + } + } + + sdkCall.Unset() + sdkCall1.Unset() + } +} + +func TestIssueTokenCmd(t *testing.T) { + sdkMock := new(sdkmocks.SDK) + cli.SetSDK(sdkMock) + tokenCommand := "token" + usersCmd := cli.NewUsersCmd() + rootCmd := setFlags(usersCmd) + + var tkn mgsdk.Token + domainID := testsutil.GenerateUUID(t) + invalidPassword := "" + + token := mgsdk.Token{ + AccessToken: testsutil.GenerateUUID(t), + RefreshToken: testsutil.GenerateUUID(t), + } + + cases := []struct { + desc string + args []string + sdkerr errors.SDKError + errLogMessage string + token mgsdk.Token + logType outputLog + }{ + { + desc: "issue token successfully without domain id", + args: []string{ + tokenCommand, + user.Credentials.Identity, + user.Credentials.Secret, + }, + sdkerr: nil, + logType: entityLog, + token: token, + }, + { + desc: "issue token successfully with domain id", + args: []string{ + tokenCommand, + user.Credentials.Identity, + user.Credentials.Secret, + domainID, + }, + sdkerr: nil, + logType: entityLog, + token: token, + }, + { + desc: "issue token with failed authentication", + args: []string{ + tokenCommand, + user.Credentials.Identity, + invalidPassword, + }, + sdkerr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden), + errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden).Error()), + logType: errLog, + token: mgsdk.Token{}, + }, + { + desc: "issue token with invalid args", + args: []string{ + tokenCommand, + user.Credentials.Identity, + }, + logType: usageLog, + }, + } + + for _, tc := range cases { + sdkCall := sdkMock.On("CreateToken", mock.Anything).Return(tc.token, tc.sdkerr) + switch len(tc.args) { + case 3: + lg := mgsdk.Login{ + Identity: tc.args[1], + Secret: tc.args[2], + } + sdkCall = sdkMock.On("CreateToken", lg).Return(tc.token, tc.sdkerr) + case 4: + lg := mgsdk.Login{ + Identity: tc.args[1], + Secret: tc.args[2], + DomainID: tc.args[3], + } + sdkCall = sdkMock.On("CreateToken", lg).Return(tc.token, tc.sdkerr) + } + out := executeCommand(t, rootCmd, tc.args...) + + switch tc.logType { + case entityLog: + err := json.Unmarshal([]byte(out), &tkn) + assert.Nil(t, err) + assert.Equal(t, tc.token, tkn, fmt.Sprintf("%s unexpected response: expected: %v, got: %v", tc.desc, tc.token, tkn)) + case errLog: + assert.Equal(t, tc.errLogMessage, out, fmt.Sprintf("%s unexpected error response: expected %s got errLogMessage:%s", tc.desc, tc.errLogMessage, out)) + case usageLog: + assert.False(t, strings.Contains(out, rootCmd.Use), fmt.Sprintf("%s invalid usage: %s", tc.desc, out)) + } + + sdkCall.Unset() + } +} + +func TestRefreshIssueTokenCmd(t *testing.T) { + sdkMock := new(sdkmocks.SDK) + cli.SetSDK(sdkMock) + tokenCommand := "refreshtoken" + usersCmd := cli.NewUsersCmd() + rootCmd := setFlags(usersCmd) + + var tkn mgsdk.Token + domainID := testsutil.GenerateUUID(t) + invalidIdentity := "invalidIdentity" + + token := mgsdk.Token{ + AccessToken: testsutil.GenerateUUID(t), + RefreshToken: testsutil.GenerateUUID(t), + } + + cases := []struct { + desc string + args []string + sdkerr errors.SDKError + errLogMessage string + token mgsdk.Token + logType outputLog + }{ + { + desc: "issue refresh token successfully without domain id", + args: []string{ + tokenCommand, + user.Credentials.Identity, + }, + sdkerr: nil, + logType: entityLog, + token: token, + }, + { + desc: "issue refresh token successfully with domain id", + args: []string{ + tokenCommand, + user.Credentials.Identity, + domainID, + }, + sdkerr: nil, + logType: entityLog, + token: token, + }, + { + desc: "issue refresh token with invalid args", + args: []string{ + tokenCommand, + user.Credentials.Identity, + domainID, + extraArg, + }, + logType: usageLog, + }, + { + desc: "issue refresh token with invalid identity", + args: []string{ + tokenCommand, + invalidIdentity, + }, + sdkerr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden), + errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden).Error()), + logType: errLog, + token: mgsdk.Token{}, + }, + } + + for _, tc := range cases { + sdkCall := sdkMock.On("RefreshToken", mock.Anything, mock.Anything).Return(tc.token, tc.sdkerr) + switch len(tc.args) { + case 2: + lg := mgsdk.Login{ + Identity: tc.args[1], + } + sdkCall = sdkMock.On("RefreshToken", lg).Return(tc.token, tc.sdkerr) + case 3: + lg := mgsdk.Login{ + Identity: tc.args[1], + DomainID: tc.args[2], + } + sdkCall = sdkMock.On("RefreshToken", lg).Return(tc.token, tc.sdkerr) + } + out := executeCommand(t, rootCmd, tc.args...) + + switch tc.logType { + case entityLog: + err := json.Unmarshal([]byte(out), &tkn) + assert.Nil(t, err) + assert.Equal(t, tc.token, tkn, fmt.Sprintf("%s unexpected response: expected: %v, got: %v", tc.desc, tc.token, tkn)) + case errLog: + assert.Equal(t, tc.errLogMessage, out, fmt.Sprintf("%s unexpected error response: expected %s got errLogMessage:%s", tc.desc, tc.errLogMessage, out)) + case usageLog: + assert.False(t, strings.Contains(out, rootCmd.Use), fmt.Sprintf("%s invalid usage: %s", tc.desc, out)) + } + + sdkCall.Unset() + } +} + +func TestUpdateUserCmd(t *testing.T) { + sdkMock := new(sdkmocks.SDK) + cli.SetSDK(sdkMock) + updateCommand := "update" + usersCmd := cli.NewUsersCmd() + rootCmd := setFlags(usersCmd) + + var usr mgsdk.User + + userID := testsutil.GenerateUUID(t) + + tagUpdateType := "tags" + identityUpdateType := "identity" + roleUpdateType := "role" + newIdentity := "newidentity@example.com" + newRole := "administrator" + newTagsJSON := "[\"tag1\", \"tag2\"]" + newNameMetadataJSON := "{\"name\":\"new name\", \"metadata\":{\"key\": \"value\"}}" + + cases := []struct { + desc string + args []string + sdkerr errors.SDKError + errLogMessage string + user mgsdk.User + logType outputLog + }{ + { + desc: "update user tags successfully", + args: []string{ + updateCommand, + tagUpdateType, + userID, + newTagsJSON, + validToken, + }, + sdkerr: nil, + logType: entityLog, + user: user, + }, + { + desc: "update user identity successfully", + args: []string{ + updateCommand, + identityUpdateType, + userID, + newIdentity, + validToken, + }, + logType: entityLog, + user: user, + }, + { + desc: "update user successfully", + args: []string{ + updateCommand, + userID, + newNameMetadataJSON, + validToken, + }, + logType: entityLog, + user: user, + }, + { + desc: "update user role successfully", + args: []string{ + updateCommand, + roleUpdateType, + userID, + newRole, + validToken, + }, + logType: entityLog, + user: user, + }, + { + desc: "update user with invalid args", + args: []string{ + updateCommand, + roleUpdateType, + userID, + newRole, + validToken, + extraArg, + }, + logType: usageLog, + }, + } + + for _, tc := range cases { + sdkCall := sdkMock.On("UpdateUser", mock.Anything, mock.Anything).Return(tc.user, tc.sdkerr) + sdkCall1 := sdkMock.On("UpdateUserTags", mock.Anything, mock.Anything).Return(tc.user, tc.sdkerr) + sdkCall2 := sdkMock.On("UpdateUserIdentity", mock.Anything, mock.Anything).Return(tc.user, tc.sdkerr) + sdkCall3 := sdkMock.On("UpdateUserRole", mock.Anything, mock.Anything).Return(tc.user, tc.sdkerr) + switch { + case tc.args[1] == tagUpdateType: + var u mgsdk.User + u.Tags = []string{"tag1", "tag2"} + u.ID = tc.args[2] + + sdkCall1 = sdkMock.On("UpdateUserTags", u, tc.args[4]).Return(tc.user, tc.sdkerr) + case tc.args[1] == identityUpdateType: + var u mgsdk.User + u.Credentials.Identity = tc.args[3] + u.ID = tc.args[2] + + sdkCall2 = sdkMock.On("UpdateUserIdentity", u, tc.args[4]).Return(tc.user, tc.sdkerr) + case tc.args[1] == roleUpdateType && len(tc.args) == 5: + sdkCall3 = sdkMock.On("UpdateUserRole", mgsdk.User{ + Role: tc.args[3], + }, tc.args[4]).Return(tc.user, tc.sdkerr) + case tc.args[1] == userID: + sdkCall = sdkMock.On("UpdateUser", mgsdk.User{ + Name: "new name", + Metadata: mgsdk.Metadata{ + "key": "value", + }, + }, tc.args[3]).Return(tc.user, tc.sdkerr) + } + out := executeCommand(t, rootCmd, tc.args...) + fmt.Println(out) + + switch tc.logType { + case entityLog: + err := json.Unmarshal([]byte(out), &usr) + assert.Nil(t, err) + assert.Equal(t, tc.user, usr, fmt.Sprintf("%s unexpected response: expected: %v, got: %v", tc.desc, tc.user, usr)) + case errLog: + assert.Equal(t, tc.errLogMessage, out, fmt.Sprintf("%s unexpected error response: expected %s got errLogMessage:%s", tc.desc, tc.errLogMessage, out)) + case usageLog: + assert.False(t, strings.Contains(out, rootCmd.Use), fmt.Sprintf("%s invalid usage: %s", tc.desc, out)) + } + + sdkCall.Unset() + sdkCall1.Unset() + sdkCall2.Unset() + sdkCall3.Unset() + } +} + +func TestGetUserProfileCmd(t *testing.T) { + sdkMock := new(sdkmocks.SDK) + cli.SetSDK(sdkMock) + profileCommand := "profile" + usersCmd := cli.NewUsersCmd() + rootCmd := setFlags(usersCmd) + + var usr mgsdk.User + + cases := []struct { + desc string + args []string + sdkerr errors.SDKError + errLogMessage string + user mgsdk.User + logType outputLog + }{ + { + desc: "get user profile successfully", + args: []string{ + profileCommand, + validToken, + }, + sdkerr: nil, + logType: entityLog, + }, + { + desc: "get user profile with invalid args", + args: []string{ + profileCommand, + validToken, + extraArg, + }, + logType: usageLog, + }, + } + + for _, tc := range cases { + sdkCall := sdkMock.On("UserProfile", tc.args[1]).Return(tc.user, tc.sdkerr) + out := executeCommand(t, rootCmd, tc.args...) + + switch tc.logType { + case errLog: + assert.Equal(t, tc.errLogMessage, out, fmt.Sprintf("%s unexpected error response: expected %s got errLogMessage:%s", tc.desc, tc.errLogMessage, out)) + case usageLog: + assert.False(t, strings.Contains(out, rootCmd.Use), fmt.Sprintf("%s invalid usage: %s", tc.desc, out)) + case entityLog: + err := json.Unmarshal([]byte(out), &usr) + assert.Nil(t, err) + assert.Equal(t, tc.user, usr, fmt.Sprintf("%s unexpected response: expected: %v, got: %v", tc.desc, tc.user, usr)) + } + sdkCall.Unset() + } +} + +func TestResetPasswordRequestCmd(t *testing.T) { + sdkMock := new(sdkmocks.SDK) + cli.SetSDK(sdkMock) + usersCmd := cli.NewUsersCmd() + rootCmd := setFlags(usersCmd) + resetPasswordCommand := "resetpasswordrequest" + exampleEmail := "example@mail.com" + + cases := []struct { + desc string + args []string + sdkerr errors.SDKError + errLogMessage string + logType outputLog + }{ + { + desc: "request password reset successfully", + args: []string{ + resetPasswordCommand, + exampleEmail, + }, + sdkerr: nil, + logType: okLog, + }, + { + desc: "request password reset with invalid args", + args: []string{ + resetPasswordCommand, + exampleEmail, + extraArg, + }, + logType: usageLog, + }, + } + + for _, tc := range cases { + sdkCall := sdkMock.On("ResetPasswordRequest", tc.args[1]).Return(tc.sdkerr) + out := executeCommand(t, rootCmd, tc.args...) + + switch tc.logType { + case errLog: + assert.Equal(t, tc.errLogMessage, out, fmt.Sprintf("%s unexpected error response: expected %s got errLogMessage:%s", tc.desc, tc.errLogMessage, out)) + case usageLog: + assert.False(t, strings.Contains(out, rootCmd.Use), fmt.Sprintf("%s invalid usage: %s", tc.desc, out)) + } + sdkCall.Unset() + } +} + +func TestResetPasswordCmd(t *testing.T) { + sdkMock := new(sdkmocks.SDK) + cli.SetSDK(sdkMock) + usersCmd := cli.NewUsersCmd() + rootCmd := setFlags(usersCmd) + resetPasswordCommand := "resetpassword" + newPassword := "new-password" + + cases := []struct { + desc string + args []string + sdkerr errors.SDKError + errLogMessage string + logType outputLog + }{ + { + desc: "reset password successfully", + args: []string{ + resetPasswordCommand, + newPassword, + newPassword, + validToken, + }, + sdkerr: nil, + logType: okLog, + }, + { + desc: "reset password with invalid args", + args: []string{ + resetPasswordCommand, + newPassword, + newPassword, + validToken, + extraArg, + }, + logType: usageLog, + }, + } + + for _, tc := range cases { + sdkCall := sdkMock.On("ResetPassword", tc.args[1], tc.args[2], tc.args[3]).Return(tc.sdkerr) + out := executeCommand(t, rootCmd, tc.args...) + + switch tc.logType { + case errLog: + assert.Equal(t, tc.errLogMessage, out, fmt.Sprintf("%s unexpected error response: expected %s got errLogMessage:%s", tc.desc, tc.errLogMessage, out)) + case usageLog: + assert.False(t, strings.Contains(out, rootCmd.Use), fmt.Sprintf("%s invalid usage: %s", tc.desc, out)) + } + + sdkCall.Unset() + } +} + +func TestUpdatePasswordCmd(t *testing.T) { + sdkMock := new(sdkmocks.SDK) + cli.SetSDK(sdkMock) + usersCmd := cli.NewUsersCmd() + rootCmd := setFlags(usersCmd) + passwordCommand := "password" + oldPassword := "old-password" + newPassword := "new-password" + + var usr mgsdk.User + var err error + + cases := []struct { + desc string + args []string + sdkerr errors.SDKError + errLogMessage string + user mgsdk.User + logType outputLog + }{ + { + desc: "update password successfully", + args: []string{ + passwordCommand, + oldPassword, + newPassword, + validToken, + }, + sdkerr: nil, + logType: entityLog, + user: user, + }, + { + desc: "reset password with invalid args", + args: []string{ + passwordCommand, + oldPassword, + newPassword, + validToken, + extraArg, + }, + sdkerr: nil, + logType: usageLog, + user: user, + }, + } + + for _, tc := range cases { + sdkCall := sdkMock.On("UpdatePassword", tc.args[1], tc.args[2], tc.args[3]).Return(tc.user, tc.sdkerr) + out := executeCommand(t, rootCmd, tc.args...) + + switch tc.logType { + case errLog: + assert.Equal(t, tc.errLogMessage, out, fmt.Sprintf("%s unexpected error response: expected %s got errLogMessage:%s", tc.desc, tc.errLogMessage, out)) + case usageLog: + assert.False(t, strings.Contains(out, rootCmd.Use), fmt.Sprintf("%s invalid usage: %s", tc.desc, out)) + case entityLog: + err = json.Unmarshal([]byte(out), &usr) + assert.Nil(t, err) + assert.Equal(t, tc.user, usr, fmt.Sprintf("%s user mismatch: expected %+v got %+v", tc.desc, tc.user, usr)) + } + + sdkCall.Unset() + } +} + +func TestEnableUserCmd(t *testing.T) { + sdkMock := new(sdkmocks.SDK) + cli.SetSDK(sdkMock) + enableCommand := "enable" + usersCmd := cli.NewUsersCmd() + rootCmd := setFlags(usersCmd) + var usr mgsdk.User + + cases := []struct { + desc string + args []string + sdkerr errors.SDKError + errLogMessage string + user mgsdk.User + logType outputLog + }{ + { + desc: "enable user successfully", + args: []string{ + enableCommand, + user.ID, + validToken, + }, + sdkerr: nil, + user: user, + logType: entityLog, + }, + { + desc: "enable user with invalid args", + args: []string{ + enableCommand, + user.ID, + validToken, + extraArg, + }, + logType: usageLog, + }, + } + + for _, tc := range cases { + sdkCall := sdkMock.On("EnableUser", tc.args[1], tc.args[2]).Return(tc.user, tc.sdkerr) + out := executeCommand(t, rootCmd, tc.args...) + + switch tc.logType { + case errLog: + assert.Equal(t, tc.errLogMessage, out, fmt.Sprintf("%s unexpected error response: expected %s got errLogMessage:%s", tc.desc, tc.errLogMessage, out)) + case usageLog: + assert.False(t, strings.Contains(out, rootCmd.Use), fmt.Sprintf("%s invalid usage: %s", tc.desc, out)) + case entityLog: + err := json.Unmarshal([]byte(out), &usr) + assert.Nil(t, err) + assert.Equal(t, tc.user, usr, fmt.Sprintf("%s unexpected response: expected: %v, got: %v", tc.desc, tc.user, usr)) + } + + sdkCall.Unset() + } +} + +func TestDisableUserCmd(t *testing.T) { + sdkMock := new(sdkmocks.SDK) + cli.SetSDK(sdkMock) + disableCommand := "disable" + usersCmd := cli.NewUsersCmd() + rootCmd := setFlags(usersCmd) + + var usr mgsdk.User + + cases := []struct { + desc string + args []string + sdkerr errors.SDKError + errLogMessage string + user mgsdk.User + logType outputLog + }{ + { + desc: "disable user successfully", + args: []string{ + disableCommand, + user.ID, + validToken, + }, + sdkerr: nil, + logType: entityLog, + user: user, + }, + { + desc: "disable user with invalid args", + args: []string{ + disableCommand, + user.ID, + validToken, + extraArg, + }, + logType: usageLog, + }, + } + + for _, tc := range cases { + sdkCall := sdkMock.On("DisableUser", tc.args[1], tc.args[2]).Return(tc.user, tc.sdkerr) + out := executeCommand(t, rootCmd, tc.args...) + + switch tc.logType { + case errLog: + assert.Equal(t, tc.errLogMessage, out, fmt.Sprintf("%s unexpected error response: expected %s got errLogMessage:%s", tc.desc, tc.errLogMessage, out)) + case usageLog: + assert.False(t, strings.Contains(out, rootCmd.Use), fmt.Sprintf("%s invalid usage: %s", tc.desc, out)) + case entityLog: + err := json.Unmarshal([]byte(out), &usr) + if err != nil { + t.Fatalf("json.Unmarshal failed: %v", err) + } + assert.Equal(t, tc.user, usr, fmt.Sprintf("%s unexpected response: expected: %v, got: %v", tc.desc, tc.user, usr)) + } + + sdkCall.Unset() + } +} + +func TestDeleteUserCmd(t *testing.T) { + sdkMock := new(sdkmocks.SDK) + cli.SetSDK(sdkMock) + deleteCommand := "delete" + usersCmd := cli.NewUsersCmd() + rootCmd := setFlags(usersCmd) + + cases := []struct { + desc string + args []string + sdkerr errors.SDKError + errLogMessage string + logType outputLog + }{ + { + desc: "delete user successfully", + args: []string{ + deleteCommand, + user.ID, + validToken, + }, + logType: okLog, + }, + { + desc: "delete user with invalid token", + args: []string{ + deleteCommand, + user.ID, + invalidToken, + }, + sdkerr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden), + errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden).Error()), + logType: errLog, + }, + { + desc: "delete user with invalid user ID", + args: []string{ + deleteCommand, + invalidID, + validToken, + }, + sdkerr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden), + errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden).Error()), + logType: errLog, + }, + { + desc: "delete user with failed to delete", + args: []string{ + deleteCommand, + user.ID, + validToken, + }, + sdkerr: errors.NewSDKErrorWithStatus(svcerr.ErrUpdateEntity, http.StatusUnprocessableEntity), + errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrUpdateEntity, http.StatusUnprocessableEntity).Error()), + logType: errLog, + }, + { + desc: "delete user with invalid args", + args: []string{ + deleteCommand, + user.ID, + extraArg, + }, + logType: usageLog, + }, + } + + for _, tc := range cases { + sdkCall := sdkMock.On("DeleteUser", mock.Anything, mock.Anything).Return(tc.sdkerr) + out := executeCommand(t, rootCmd, tc.args...) + + switch tc.logType { + case entityLog: + assert.True(t, strings.Contains(out, "OK"), fmt.Sprintf("%s unexpected response: expected success message, got: %v", tc.desc, out)) + case errLog: + assert.Equal(t, tc.errLogMessage, out, fmt.Sprintf("%s unexpected error response: expected %s got errLogMessage:%s", tc.desc, tc.errLogMessage, out)) + case usageLog: + assert.False(t, strings.Contains(out, rootCmd.Use), fmt.Sprintf("%s invalid usage: %s", tc.desc, out)) + } + + sdkCall.Unset() + } +} + +func TestListUserChannelsCmd(t *testing.T) { + sdkMock := new(sdkmocks.SDK) + cli.SetSDK(sdkMock) + channelsCommand := "channels" + usersCmd := cli.NewUsersCmd() + rootCmd := setFlags(usersCmd) + ch := mgsdk.Channel{ + ID: testsutil.GenerateUUID(t), + Name: "testchannel", + } + + var pg mgsdk.ChannelsPage + + cases := []struct { + desc string + args []string + sdkerr errors.SDKError + errLogMessage string + channel mgsdk.Channel + page mgsdk.ChannelsPage + output bool + logType outputLog + }{ + { + desc: "list user channels successfully", + args: []string{ + channelsCommand, + user.ID, + validToken, + }, + sdkerr: nil, + logType: entityLog, + page: mgsdk.ChannelsPage{ + Channels: []mgsdk.Channel{ch}, + }, + }, + { + desc: "list user channels successfully with flags", + args: []string{ + channelsCommand, + user.ID, + validToken, + "--offset=0", + "--limit=5", + }, + sdkerr: nil, + logType: entityLog, + page: mgsdk.ChannelsPage{ + Channels: []mgsdk.Channel{ch}, + }, + }, + { + desc: "list user channels with invalid args", + args: []string{ + channelsCommand, + user.ID, + validToken, + extraArg, + }, + logType: usageLog, + }, + } + + for _, tc := range cases { + sdkCall := sdkMock.On("ListUserChannels", tc.args[1], mock.Anything, tc.args[2]).Return(tc.page, tc.sdkerr) + out := executeCommand(t, rootCmd, tc.args...) + + switch tc.logType { + case errLog: + assert.Equal(t, tc.errLogMessage, out, fmt.Sprintf("%s unexpected error response: expected %s got errLogMessage:%s", tc.desc, tc.errLogMessage, out)) + case usageLog: + assert.False(t, strings.Contains(out, rootCmd.Use), fmt.Sprintf("%s invalid usage: %s", tc.desc, out)) + case entityLog: + err := json.Unmarshal([]byte(out), &pg) + if err != nil { + t.Fatalf("json.Unmarshal failed: %v", err) + } + assert.Equal(t, tc.page, pg, fmt.Sprintf("%s unexpected response: expected: %v, got: %v", tc.desc, tc.page, pg)) + } + + sdkCall.Unset() + } +} + +func TestListUserThingsCmd(t *testing.T) { + sdkMock := new(sdkmocks.SDK) + cli.SetSDK(sdkMock) + thingsCommand := "things" + usersCmd := cli.NewUsersCmd() + rootCmd := setFlags(usersCmd) + th := mgsdk.Thing{ + ID: testsutil.GenerateUUID(t), + Name: "testthing", + } + + var pg mgsdk.ThingsPage + + cases := []struct { + desc string + args []string + sdkerr errors.SDKError + errLogMessage string + thing mgsdk.Thing + page mgsdk.ThingsPage + logType outputLog + }{ + { + desc: "list user things successfully", + args: []string{ + thingsCommand, + user.ID, + validToken, + }, + sdkerr: nil, + logType: entityLog, + page: mgsdk.ThingsPage{ + Things: []mgsdk.Thing{th}, + }, + }, + { + desc: "list user things with invalid args", + args: []string{ + thingsCommand, + user.ID, + validToken, + extraArg, + }, + logType: usageLog, + }, + } + + for _, tc := range cases { + sdkCall := sdkMock.On("ListUserThings", tc.args[1], mock.Anything, tc.args[2]).Return(tc.page, tc.sdkerr) + out := executeCommand(t, rootCmd, tc.args...) + + switch tc.logType { + case errLog: + assert.Equal(t, tc.errLogMessage, out, fmt.Sprintf("%s unexpected error response: expected %s got errLogMessage:%s", tc.desc, tc.errLogMessage, out)) + case usageLog: + assert.False(t, strings.Contains(out, rootCmd.Use), fmt.Sprintf("%s invalid usage: %s", tc.desc, out)) + case entityLog: + err := json.Unmarshal([]byte(out), &pg) + if err != nil { + t.Fatalf("json.Unmarshal failed: %v", err) + } + assert.Equal(t, tc.page, pg, fmt.Sprintf("%s unexpected response: expected: %v, got: %v", tc.desc, tc.page, pg)) + } + + sdkCall.Unset() + } +} + +func TestListUserDomainsCmd(t *testing.T) { + sdkMock := new(sdkmocks.SDK) + cli.SetSDK(sdkMock) + domainsCommand := "domains" + usersCmd := cli.NewUsersCmd() + rootCmd := setFlags(usersCmd) + d := mgsdk.Domain{ + ID: testsutil.GenerateUUID(t), + Name: "testdomain", + } + + cases := []struct { + desc string + args []string + sdkerr errors.SDKError + errLogMessage string + logType outputLog + page mgsdk.DomainsPage + }{ + { + desc: "list user domains successfully", + args: []string{ + domainsCommand, + user.ID, + validToken, + }, + sdkerr: nil, + logType: entityLog, + page: mgsdk.DomainsPage{ + Domains: []mgsdk.Domain{d}, + }, + }, + { + desc: "list user domains with invalid args", + args: []string{ + domainsCommand, + user.ID, + validToken, + extraArg, + }, + logType: usageLog, + }, + } + + for _, tc := range cases { + var pg mgsdk.DomainsPage + sdkCall := sdkMock.On("ListUserDomains", tc.args[1], mock.Anything, tc.args[2]).Return(tc.page, tc.sdkerr) + out := executeCommand(t, rootCmd, tc.args...) + + switch tc.logType { + case errLog: + assert.Equal(t, tc.errLogMessage, out, fmt.Sprintf("%s unexpected error response: expected %s got errLogMessage:%s", tc.desc, tc.errLogMessage, out)) + case usageLog: + assert.False(t, strings.Contains(out, rootCmd.Use), fmt.Sprintf("%s invalid usage: %s", tc.desc, out)) + case entityLog: + err := json.Unmarshal([]byte(out), &pg) + if err != nil { + t.Fatalf("json.Unmarshal failed: %v", err) + } + assert.Equal(t, tc.page, pg, fmt.Sprintf("%s unexpected response: expected: %v, got: %v", tc.desc, tc.page, pg)) + } + + sdkCall.Unset() + } +} + +func TestListUserGroupsCmd(t *testing.T) { + sdkMock := new(sdkmocks.SDK) + cli.SetSDK(sdkMock) + domainsCommand := "groups" + usersCmd := cli.NewUsersCmd() + rootCmd := setFlags(usersCmd) + g := mgsdk.Group{ + ID: testsutil.GenerateUUID(t), + Name: "testgroup", + } + + cases := []struct { + desc string + args []string + sdkerr errors.SDKError + errLogMessage string + logType outputLog + page mgsdk.GroupsPage + }{ + { + desc: "list user groups successfully", + args: []string{ + domainsCommand, + user.ID, + validToken, + }, + sdkerr: nil, + logType: entityLog, + page: mgsdk.GroupsPage{ + Groups: []mgsdk.Group{g}, + }, + }, + { + desc: "list user groups with invalid args", + args: []string{ + domainsCommand, + user.ID, + validToken, + extraArg, + }, + logType: usageLog, + }, + } + + for _, tc := range cases { + var pg mgsdk.GroupsPage + sdkCall := sdkMock.On("ListUserGroups", tc.args[1], mock.Anything, tc.args[2]).Return(tc.page, tc.sdkerr) + out := executeCommand(t, rootCmd, tc.args...) + + switch tc.logType { + case errLog: + assert.Equal(t, tc.errLogMessage, out, fmt.Sprintf("%s unexpected error response: expected %s got errLogMessage:%s", tc.desc, tc.errLogMessage, out)) + case usageLog: + assert.False(t, strings.Contains(out, rootCmd.Use), fmt.Sprintf("%s invalid usage: %s", tc.desc, out)) + case entityLog: + err := json.Unmarshal([]byte(out), &pg) + if err != nil { + t.Fatalf("json.Unmarshal failed: %v", err) + } + assert.Equal(t, tc.page, pg, fmt.Sprintf("%s unexpected response: expected: %v, got: %v", tc.desc, tc.page, pg)) + } + + sdkCall.Unset() + } +} diff --git a/cli/utils.go b/cli/utils.go index f18c28b088..66fe1236ac 100644 --- a/cli/utils.go +++ b/cli/utils.go @@ -6,11 +6,11 @@ package cli import ( "encoding/json" "fmt" - "os" "time" "github.com/fatih/color" "github.com/hokaccha/go-prettyjson" + "github.com/spf13/cobra" ) var ( @@ -38,52 +38,52 @@ var ( RawOutput bool = false ) -func logJSON(iList ...interface{}) { +func logJSONCmd(cmd cobra.Command, iList ...interface{}) { for _, i := range iList { m, err := json.Marshal(i) if err != nil { - logError(err) + logErrorCmd(cmd, err) return } pj, err := prettyjson.Format(m) if err != nil { - logError(err) + logErrorCmd(cmd, err) return } - fmt.Fprintf(os.Stdout, "\n%s\n\n", string(pj)) + fmt.Fprintf(cmd.OutOrStdout(), "\n%s\n\n", string(pj)) } } -func logUsage(u string) { - fmt.Fprintf(os.Stdout, color.YellowString("\nusage: %s\n\n"), u) +func logUsageCmd(cmd cobra.Command, u string) { + fmt.Fprintf(cmd.OutOrStdout(), color.YellowString("\nusage: %s\n\n"), u) } -func logError(err error) { +func logErrorCmd(cmd cobra.Command, err error) { boldRed := color.New(color.FgRed, color.Bold) - boldRed.Fprintf(os.Stderr, "\nerror: ") + boldRed.Fprintf(cmd.ErrOrStderr(), "\nerror: ") - fmt.Fprintf(os.Stderr, "%s\n\n", color.RedString(err.Error())) + fmt.Fprintf(cmd.ErrOrStderr(), "%s\n\n", color.RedString(err.Error())) } -func logOK() { - fmt.Fprintf(os.Stdout, "\n%s\n\n", color.BlueString("ok")) +func logOKCmd(cmd cobra.Command) { + fmt.Fprintf(cmd.OutOrStdout(), "\n%s\n\n", color.BlueString("ok")) } -func logCreated(e string) { +func logCreatedCmd(cmd cobra.Command, e string) { if RawOutput { - fmt.Fprintln(os.Stdout, e) + fmt.Fprintln(cmd.OutOrStdout(), e) } else { - fmt.Fprintf(os.Stdout, color.BlueString("\ncreated: %s\n\n"), e) + fmt.Fprintf(cmd.OutOrStdout(), color.BlueString("\ncreated: %s\n\n"), e) } } -func logRevokedTime(t time.Time) { +func logRevokedTimeCmd(cmd cobra.Command, t time.Time) { if RawOutput { - fmt.Fprintln(os.Stdout, t) + fmt.Fprintln(cmd.OutOrStdout(), t) } else { - fmt.Fprintf(os.Stdout, color.BlueString("\nrevoked: %v\n\n"), t) + fmt.Fprintf(cmd.OutOrStdout(), color.BlueString("\nrevoked: %v\n\n"), t) } }