Skip to content

Commit

Permalink
fix(users): enable to change your status
Browse files Browse the repository at this point in the history
Signed-off-by: Rodney Osodo <socials@rodneyosodo.com>
  • Loading branch information
rodneyosodo committed Jun 12, 2024
1 parent 88da90e commit 29f36af
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 132 deletions.
6 changes: 0 additions & 6 deletions pkg/sdk/go/setup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,6 @@ func generateUUID(t *testing.T) string {
return ulid
}

func convertClientsPage(cp sdk.UsersPage) mgclients.ClientsPage {
return mgclients.ClientsPage{
Clients: convertClients(cp.Users),
}
}

func convertThingsPage(cp sdk.ThingsPage) mgclients.ClientsPage {
return mgclients.ClientsPage{
Clients: convertThings(cp.Things...),
Expand Down
181 changes: 57 additions & 124 deletions pkg/sdk/go/users_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1051,59 +1051,6 @@ func TestEnableClient(t *testing.T) {
repoCall2.Unset()
repoCall3.Unset()
}

cases2 := []struct {
desc string
token string
status string
metadata sdk.Metadata
response sdk.UsersPage
size uint64
}{
{
desc: "list enabled clients",
status: mgclients.EnabledStatus.String(),
size: 2,
response: sdk.UsersPage{
Users: []sdk.User{enabledClient1, endisabledClient1},
},
},
{
desc: "list disabled clients",
status: mgclients.DisabledStatus.String(),
size: 1,
response: sdk.UsersPage{
Users: []sdk.User{disabledClient1},
},
},
{
desc: "list enabled and disabled clients",
status: mgclients.AllStatus.String(),
size: 3,
response: sdk.UsersPage{
Users: []sdk.User{enabledClient1, disabledClient1, endisabledClient1},
},
},
}

for _, tc := range cases2 {
pm := sdk.PageMetadata{
Total: 100,
Offset: 0,
Limit: 100,
Status: tc.status,
}
repoCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: validToken}).Return(&magistrala.IdentityRes{UserId: validID}, nil)
repoCall1 := auth.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: true}, nil)
repoCall2 := crepo.On("RetrieveAll", mock.Anything, mock.Anything).Return(convertClientsPage(tc.response), nil)
clientsPage, err := mgsdk.Users(pm, validToken)
assert.Nil(t, err, fmt.Sprintf("unexpected error: %s", err))
size := uint64(len(clientsPage.Users))
assert.Equal(t, tc.size, size, fmt.Sprintf("%s: expected size %d got %d\n", tc.desc, tc.size, size))
repoCall.Unset()
repoCall1.Unset()
repoCall2.Unset()
}
}

func TestDisableClient(t *testing.T) {
Expand Down Expand Up @@ -1180,93 +1127,79 @@ func TestDisableClient(t *testing.T) {
repoCall2.Unset()
repoCall3.Unset()
}
}

func TestDeleteUser(t *testing.T) {
ts, crepo, _, auth := setupUsers()
defer ts.Close()

conf := sdk.Config{
UsersURL: ts.URL,
}
mgsdk := sdk.NewSDK(conf)

cases2 := []struct {
enabledClient1 := sdk.User{ID: testsutil.GenerateUUID(t), Credentials: sdk.Credentials{Identity: "client1@example.com", Secret: "password"}, Status: mgclients.EnabledStatus.String()}
deletedClient1 := sdk.User{ID: testsutil.GenerateUUID(t), Credentials: sdk.Credentials{Identity: "client3@example.com", Secret: "password"}, Status: mgclients.DeletedStatus.String()}
deletedenabledClient1 := enabledClient1
deletedenabledClient1.Status = mgclients.DisabledStatus.String()
deletedenabledClient1.ID = testsutil.GenerateUUID(t)

cases := []struct {
desc string
id string
token string
status string
metadata sdk.Metadata
response sdk.UsersPage
size uint64
client sdk.User
response sdk.User
repoErr error
err errors.SDKError
}{
{
desc: "list enabled clients",
status: mgclients.EnabledStatus.String(),
size: 2,
response: sdk.UsersPage{
Users: []sdk.User{enabledClient1, disenabledClient1},
},
desc: "delete enabled client",
id: enabledClient1.ID,
token: validToken,
client: enabledClient1,
response: deletedenabledClient1,
err: nil,
repoErr: nil,
},
{
desc: "list disabled clients",
status: mgclients.DisabledStatus.String(),
size: 1,
response: sdk.UsersPage{
Users: []sdk.User{disabledClient1},
},
desc: "delete disabled client",
id: deletedClient1.ID,
token: validToken,
client: deletedClient1,
response: sdk.User{},
repoErr: sdk.ErrFailedDisable,
err: errors.NewSDKErrorWithStatus(svcerr.ErrViewEntity, http.StatusBadRequest),
},
{
desc: "list enabled and disabled clients",
status: mgclients.AllStatus.String(),
size: 3,
response: sdk.UsersPage{
Users: []sdk.User{enabledClient1, disabledClient1, disenabledClient1},
},
desc: "delete non-existing client",
id: wrongID,
client: sdk.User{},
token: validToken,
response: sdk.User{},
repoErr: sdk.ErrFailedDisable,
err: errors.NewSDKErrorWithStatus(svcerr.ErrViewEntity, http.StatusBadRequest),
},
}

for _, tc := range cases2 {
pm := sdk.PageMetadata{
Total: 100,
Offset: 0,
Limit: 100,
Status: tc.status,
}
for _, tc := range cases {
repoCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: validToken}).Return(&magistrala.IdentityRes{UserId: validID}, nil)
repoCall1 := auth.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: true}, nil)
repoCall2 := crepo.On("RetrieveAll", mock.Anything, mock.Anything).Return(convertClientsPage(tc.response), nil)
page, err := mgsdk.Users(pm, validToken)
assert.Nil(t, err, fmt.Sprintf("unexpected error: %s", err))
size := uint64(len(page.Users))
assert.Equal(t, tc.size, size, fmt.Sprintf("%s: expected size %d got %d\n", tc.desc, tc.size, size))
repoCall2 := crepo.On("RetrieveByID", mock.Anything, tc.id).Return(convertClient(tc.client), tc.repoErr)
repoCall3 := crepo.On("ChangeStatus", mock.Anything, mock.Anything).Return(convertClient(tc.response), tc.repoErr)
err := mgsdk.DeleteUser(tc.id, tc.token)
assert.Equal(t, tc.err, err, fmt.Sprintf("%s: expected error %s, got %s", tc.desc, tc.err, err))
if tc.err == nil {
ok := repoCall.Parent.AssertCalled(t, "Identify", mock.Anything, mock.Anything)
assert.True(t, ok, fmt.Sprintf("Identify was not called on %s", tc.desc))
ok = repoCall2.Parent.AssertCalled(t, "RetrieveByID", mock.Anything, tc.id)
assert.True(t, ok, fmt.Sprintf("RetrieveByID was not called on %s", tc.desc))
ok = repoCall3.Parent.AssertCalled(t, "ChangeStatus", mock.Anything, mock.Anything)
assert.True(t, ok, fmt.Sprintf("ChangeStatus was not called on %s", tc.desc))
}
repoCall.Unset()
repoCall1.Unset()
repoCall2.Unset()
repoCall3.Unset()
}
}

func TestDeleteUser(t *testing.T) {
ts, crepo, _, auth := setupUsers()
defer ts.Close()

conf := sdk.Config{
UsersURL: ts.URL,
}
mgsdk := sdk.NewSDK(conf)

repoCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: validToken}).Return(&magistrala.IdentityRes{Id: validID, DomainId: testsutil.GenerateUUID(t)}, nil)
repoCall1 := auth.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: false}, nil)
repoCall2 := crepo.On("CheckSuperAdmin", mock.Anything, mock.Anything).Return(nil)
repoCall3 := crepo.On("Delete", mock.Anything, mock.Anything).Return(nil)
err := mgsdk.DeleteUser("wrongID", validToken)
assert.Equal(t, err, errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden), fmt.Sprintf("Delete user with wrong id: expected %v got %v", svcerr.ErrNotFound, err))
repoCall.Unset()
repoCall1.Unset()
repoCall2.Unset()
repoCall3.Unset()

repoCall = auth.On("DeleteEntityPolicies", mock.Anything, mock.Anything, mock.Anything).Return(&magistrala.DeletePolicyRes{Deleted: true}, nil)
repoCall1 = auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: validToken}).Return(&magistrala.IdentityRes{Id: validID, DomainId: testsutil.GenerateUUID(t)}, nil)
repoCall2 = auth.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: true}, nil)
repoCall3 = crepo.On("CheckSuperAdmin", mock.Anything, mock.Anything).Return(nil)
repoCall4 := crepo.On("Delete", mock.Anything, mock.Anything).Return(nil)
err = mgsdk.DeleteUser(validID, validToken)
assert.Nil(t, err, fmt.Sprintf("Delete user with correct id: expected %v got %v", nil, err))
ok := repoCall4.Parent.AssertCalled(t, "Delete", mock.Anything, mock.Anything)
assert.True(t, ok, "Delete was not called on deleting user with correct id")
repoCall.Unset()
repoCall1.Unset()
repoCall2.Unset()
repoCall3.Unset()
repoCall4.Unset()
}
6 changes: 4 additions & 2 deletions users/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -430,8 +430,10 @@ func (svc service) changeClientStatus(ctx context.Context, token string, client
if err != nil {
return mgclients.Client{}, err
}
if err := svc.checkSuperAdmin(ctx, tokenUserID); err != nil {
return mgclients.Client{}, err
if tokenUserID != client.ID {
if err := svc.checkSuperAdmin(ctx, tokenUserID); err != nil {
return mgclients.Client{}, err
}
}
dbClient, err := svc.clients.RetrieveByID(ctx, client.ID)
if err != nil {
Expand Down

0 comments on commit 29f36af

Please sign in to comment.