MG-2426 - Replace generic Clients in Users service (#2436)

Signed-off-by: Musilah <nataleigh.nk@gmail.com>
Signed-off-by: Arvindh <arvindh91@gmail.com>
Signed-off-by: Felix Gateru <felix.gateru@gmail.com>
Signed-off-by: Dusan Borovcanin <borovcanindusan1@gmail.com>
Co-authored-by: Arvindh <arvindh91@gmail.com>
Co-authored-by: Felix Gateru <felix.gateru@gmail.com>
Co-authored-by: Dusan Borovcanin <borovcanindusan1@gmail.com>
This commit is contained in:
Nataly Musilah
2024-10-30 21:19:31 +03:00
committed by GitHub
parent 077882f672
commit 0019f71b46
75 changed files with 6231 additions and 4582 deletions
+5 -5
View File
@@ -135,9 +135,10 @@ var cmdProvision = []cobra.Command{
// Create test user
name := namesgenerator.Generate()
user := mgxsdk.User{
Name: name,
FirstName: name,
Email: fmt.Sprintf("%s@email.com", name),
Credentials: mgxsdk.Credentials{
Identity: fmt.Sprintf("%s@email.com", name),
Username: name,
Secret: "12345678",
},
Status: mgxsdk.EnabledStatus,
@@ -148,8 +149,7 @@ var cmdProvision = []cobra.Command{
return
}
user.Credentials.Secret = "12345678"
ut, err := sdk.CreateToken(mgxsdk.Login{Identity: user.Credentials.Identity, Secret: user.Credentials.Secret})
ut, err := sdk.CreateToken(mgxsdk.Login{Username: user.Username, Secret: user.Credentials.Secret})
if err != nil {
logErrorCmd(*cmd, err)
return
@@ -166,7 +166,7 @@ var cmdProvision = []cobra.Command{
return
}
ut, err = sdk.CreateToken(mgxsdk.Login{Identity: user.Credentials.Identity, Secret: user.Credentials.Secret})
ut, err = sdk.CreateToken(mgxsdk.Login{Email: user.Email, Secret: user.Credentials.Secret})
if err != nil {
logErrorCmd(*cmd, err)
return
+2 -2
View File
@@ -33,7 +33,7 @@ var (
var thing = sdk.Thing{
ID: testsutil.GenerateUUID(&testing.T{}),
Name: "testthing",
Credentials: sdk.Credentials{
Credentials: sdk.ClientCredentials{
Secret: "secret",
},
DomainID: testsutil.GenerateUUID(&testing.T{}),
@@ -385,7 +385,7 @@ func TestUpdateThingCmd(t *testing.T) {
ID: thing.ID,
DomainID: thing.DomainID,
Status: thing.Status,
Credentials: sdk.Credentials{
Credentials: sdk.ClientCredentials{
Secret: newSecret,
},
},
+41 -23
View File
@@ -9,36 +9,38 @@ import (
"net/url"
"strconv"
mgclients "github.com/absmach/magistrala/pkg/clients"
mgxsdk "github.com/absmach/magistrala/pkg/sdk/go"
"github.com/absmach/magistrala/users"
"github.com/spf13/cobra"
)
var cmdUsers = []cobra.Command{
{
Use: "create <name> <username> <password> <user_auth_token>",
Use: "create <first_name> <last_name> <email> <username> <password> <user_auth_token>",
Short: "Create user",
Long: "Create user with provided name, username and password. Token is optional\n" +
Long: "Create user with provided firstname, lastname, email, username and password. Token is optional\n" +
"For example:\n" +
"\tmagistrala-cli users create user user@example.com 12345678 $USER_AUTH_TOKEN\n",
"\tmagistrala-cli users create jane doe janedoe@example.com jane_doe 12345678 $USER_AUTH_TOKEN\n",
Run: func(cmd *cobra.Command, args []string) {
if len(args) < 3 || len(args) > 4 {
if len(args) < 5 || len(args) > 6 {
logUsageCmd(*cmd, cmd.Use)
return
}
if len(args) == 3 {
if len(args) == 5 {
args = append(args, "")
}
user := mgxsdk.User{
Name: args[0],
FirstName: args[0],
LastName: args[1],
Email: args[2],
Credentials: mgxsdk.Credentials{
Identity: args[1],
Secret: args[2],
Username: args[3],
Secret: args[4],
},
Status: mgclients.EnabledStatus.String(),
Status: users.EnabledStatus.String(),
}
user, err := sdk.CreateUser(user, args[3])
user, err := sdk.CreateUser(user, args[5])
if err != nil {
logErrorCmd(*cmd, err)
return
@@ -66,6 +68,7 @@ var cmdUsers = []cobra.Command{
return
}
pageMetadata := mgxsdk.PageMetadata{
Username: Username,
Identity: Identity,
Offset: Offset,
Limit: Limit,
@@ -93,21 +96,21 @@ var cmdUsers = []cobra.Command{
{
Use: "token <username> <password>",
Short: "Get token",
Long: "Generate new token from username and password\n" +
Long: "Generate a new token with username and password\n" +
"For example:\n" +
"\tmagistrala-cli users token user@example.com 12345678\n",
"\tmagistrala-cli users token jane.doe 12345678\n",
Run: func(cmd *cobra.Command, args []string) {
if len(args) != 2 {
logUsageCmd(*cmd, cmd.Use)
return
}
lg := mgxsdk.Login{
Identity: args[0],
loginReq := mgxsdk.Login{
Username: args[0],
Secret: args[1],
}
token, err := sdk.CreateToken(lg)
token, err := sdk.CreateToken(loginReq)
if err != nil {
logErrorCmd(*cmd, err)
return
@@ -116,6 +119,7 @@ var cmdUsers = []cobra.Command{
logJSONCmd(*cmd, token)
},
},
{
Use: "refreshtoken <token>",
Short: "Get token",
@@ -138,13 +142,15 @@ var cmdUsers = []cobra.Command{
},
},
{
Use: "update [<user_id> <JSON_string> | tags <user_id> <tags> | identity <user_id> <identity> ] <user_auth_token>",
Use: "update [<user_id> <JSON_string> | tags <user_id> <tags> | username <user_id> <username> | email <user_id> <email>] <user_auth_token>",
Short: "Update user",
Long: "Updates either user name and metadata or user tags or user identity\n" +
Long: "Updates either user name and metadata or user tags or user email\n" +
"Usage:\n" +
"\tmagistrala-cli users update <user_id> '{\"name\":\"new name\", \"metadata\":{\"key\": \"value\"}}' $USERTOKEN - updates user name and metadata\n" +
"\tmagistrala-cli users update <user_id> '{\"first_name\":\"new first_name\", \"metadata\":{\"key\": \"value\"}}' $USERTOKEN - updates user first and lastname and metadata\n" +
"\tmagistrala-cli users update tags <user_id> '[\"tag1\", \"tag2\"]' $USERTOKEN - updates user tags\n" +
"\tmagistrala-cli users update identity <user_id> newidentity@example.com $USERTOKEN - updates user identity\n",
"\tmagistrala-cli users update username <user_id> newusername $USERTOKEN - updates user name\n" +
"\tmagistrala-cli users update email <user_id> newemail@example.com $USERTOKEN - updates user email\n",
Run: func(cmd *cobra.Command, args []string) {
if len(args) != 4 && len(args) != 3 {
logUsageCmd(*cmd, cmd.Use)
@@ -168,10 +174,22 @@ var cmdUsers = []cobra.Command{
return
}
if args[0] == "identity" {
if args[0] == "email" {
user.ID = args[1]
user.Credentials.Identity = args[2]
user, err := sdk.UpdateUserIdentity(user, args[3])
user.Email = args[2]
user, err := sdk.UpdateUserEmail(user, args[3])
if err != nil {
logErrorCmd(*cmd, err)
return
}
logJSONCmd(*cmd, user)
return
}
if args[0] == "username" {
user.ID = args[1]
user.Credentials.Username = args[2]
user, err := sdk.UpdateUser(user, args[3])
if err != nil {
logErrorCmd(*cmd, err)
return
+41 -32
View File
@@ -22,11 +22,12 @@ import (
)
var user = mgsdk.User{
ID: testsutil.GenerateUUID(&testing.T{}),
Name: "testuser",
ID: testsutil.GenerateUUID(&testing.T{}),
FirstName: "testuserfirstname",
LastName: "testuserfirstname",
Credentials: mgsdk.Credentials{
Secret: "testpassword",
Identity: "identity@example.com",
Username: "testusername",
},
Status: mgclients.EnabledStatus.String(),
}
@@ -57,9 +58,11 @@ func TestCreateUsersCmd(t *testing.T) {
{
desc: "create user successfully with token",
args: []string{
user.Name,
user.Credentials.Identity,
user.FirstName,
user.LastName,
user.Email,
user.Credentials.Secret,
user.Credentials.Username,
validToken,
},
user: user,
@@ -68,9 +71,11 @@ func TestCreateUsersCmd(t *testing.T) {
{
desc: "create user successfully without token",
args: []string{
user.Name,
user.Credentials.Identity,
user.FirstName,
user.LastName,
user.Email,
user.Credentials.Secret,
user.Credentials.Username,
},
user: user,
logType: entityLog,
@@ -78,9 +83,12 @@ func TestCreateUsersCmd(t *testing.T) {
{
desc: "failed to create user",
args: []string{
user.Name,
user.Credentials.Identity,
user.FirstName,
user.LastName,
user.Email,
user.Credentials.Secret,
user.Credentials.Username,
validToken,
},
sdkerr: errors.NewSDKErrorWithStatus(svcerr.ErrCreateEntity, http.StatusUnprocessableEntity),
errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrCreateEntity, http.StatusUnprocessableEntity).Error()),
@@ -88,7 +96,7 @@ func TestCreateUsersCmd(t *testing.T) {
},
{
desc: "create user with invalid args",
args: []string{user.Name, user.Credentials.Identity},
args: []string{user.FirstName, user.Credentials.Username},
logType: usageLog,
},
}
@@ -96,12 +104,13 @@ func TestCreateUsersCmd(t *testing.T) {
for _, tc := range cases {
t.Run(tc.desc, func(t *testing.T) {
sdkCall := sdkMock.On("CreateUser", mock.Anything, mock.Anything).Return(tc.user, tc.sdkerr)
if len(tc.args) == 3 {
if len(tc.args) == 4 {
sdkUser := mgsdk.User{
Name: tc.args[0],
FirstName: tc.args[0],
LastName: tc.args[1],
Email: tc.args[2],
Credentials: mgsdk.Credentials{
Identity: tc.args[1],
Secret: tc.args[2],
Secret: tc.args[3],
},
}
sdkCall = sdkMock.On("CreateUser", mock.Anything, sdkUser).Return(tc.user, tc.sdkerr)
@@ -297,7 +306,7 @@ func TestIssueTokenCmd(t *testing.T) {
{
desc: "issue token successfully",
args: []string{
user.Credentials.Identity,
user.Email,
user.Credentials.Secret,
},
sdkerr: nil,
@@ -307,7 +316,7 @@ func TestIssueTokenCmd(t *testing.T) {
{
desc: "issue token with failed authentication",
args: []string{
user.Credentials.Identity,
user.Email,
invalidPassword,
},
sdkerr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
@@ -318,7 +327,7 @@ func TestIssueTokenCmd(t *testing.T) {
{
desc: "issue token with invalid args",
args: []string{
user.Credentials.Identity,
user.Email,
user.Credentials.Secret,
extraArg,
},
@@ -329,8 +338,8 @@ func TestIssueTokenCmd(t *testing.T) {
for _, tc := range cases {
t.Run(tc.desc, func(t *testing.T) {
lg := mgsdk.Login{
Identity: tc.args[0],
Secret: tc.args[1],
Email: tc.args[0],
Secret: tc.args[1],
}
sdkCall := sdkMock.On("CreateToken", lg).Return(tc.token, tc.sdkerr)
@@ -391,7 +400,7 @@ func TestRefreshIssueTokenCmd(t *testing.T) {
logType: usageLog,
},
{
desc: "issue refresh token with invalid identity",
desc: "issue refresh token with invalid Username",
args: []string{
"invalidToken",
},
@@ -435,9 +444,9 @@ func TestUpdateUserCmd(t *testing.T) {
userID := testsutil.GenerateUUID(t)
tagUpdateType := "tags"
identityUpdateType := "identity"
emailUpdateType := "email"
roleUpdateType := "role"
newIdentity := "newidentity@example.com"
newEmail := "newemail@example.com"
newRole := "administrator"
newTagsJSON := "[\"tag1\", \"tag2\"]"
newNameMetadataJSON := "{\"name\":\"new name\", \"metadata\":{\"key\": \"value\"}}"
@@ -487,22 +496,22 @@ func TestUpdateUserCmd(t *testing.T) {
errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden)),
},
{
desc: "update user identity successfully",
desc: "update user email successfully",
args: []string{
identityUpdateType,
emailUpdateType,
userID,
newIdentity,
newEmail,
validToken,
},
logType: entityLog,
user: user,
},
{
desc: "update user identity with invalid token",
desc: "update user email with invalid token",
args: []string{
identityUpdateType,
emailUpdateType,
userID,
newIdentity,
newEmail,
invalidToken,
},
logType: errLog,
@@ -590,19 +599,19 @@ func TestUpdateUserCmd(t *testing.T) {
u.ID = tc.args[1]
sdkCall1 = sdkMock.On("UpdateUserTags", u, tc.args[3]).Return(tc.user, tc.sdkerr)
case tc.args[0] == identityUpdateType:
case tc.args[0] == emailUpdateType:
var u mgsdk.User
u.Credentials.Identity = tc.args[2]
u.Email = tc.args[2]
u.ID = tc.args[1]
sdkCall2 = sdkMock.On("UpdateUserIdentity", u, tc.args[3]).Return(tc.user, tc.sdkerr)
sdkCall2 = sdkMock.On("UpdateUserEmail", u, tc.args[3]).Return(tc.user, tc.sdkerr)
case tc.args[0] == roleUpdateType && len(tc.args) == 4:
sdkCall3 = sdkMock.On("UpdateUserRole", mgsdk.User{
Role: tc.args[2],
}, tc.args[3]).Return(tc.user, tc.sdkerr)
case tc.args[0] == userID:
sdkCall = sdkMock.On("UpdateUser", mgsdk.User{
Name: "new name",
FirstName: "new name",
Metadata: mgsdk.Metadata{
"key": "value",
},
+6
View File
@@ -36,6 +36,12 @@ var (
Contact string = ""
// RawOutput raw output mode.
RawOutput bool = false
// Username query parameter.
Username string = ""
// FirstName query parameter.
FirstName string = ""
// LastName query parameter.
LastName string = ""
)
func logJSONCmd(cmd cobra.Command, iList ...interface{}) {