From fe14f0563c7ab30593ec59ebb60d3d7b29e7223d Mon Sep 17 00:00:00 2001 From: wangsijie Date: Wed, 11 Jan 2023 15:34:39 +0800 Subject: [PATCH] test: add it for admin-user roles (#2881) --- packages/core/src/queries/users-roles.ts | 9 +++- packages/core/src/routes/admin-user.test.ts | 3 ++ .../integration-tests/src/api/admin-user.ts | 11 ++++- .../src/tests/api/admin-user.roles.test.ts | 41 +++++++++++++++++++ 4 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 packages/integration-tests/src/tests/api/admin-user.roles.test.ts diff --git a/packages/core/src/queries/users-roles.ts b/packages/core/src/queries/users-roles.ts index aded82d1a..6c92b5ad4 100644 --- a/packages/core/src/queries/users-roles.ts +++ b/packages/core/src/queries/users-roles.ts @@ -1,10 +1,11 @@ import type { UsersRole } from '@logto/schemas'; -import { UsersRoles } from '@logto/schemas'; +import { RolesScopes, UsersRoles } from '@logto/schemas'; import { conditionalSql, convertToIdentifiers } from '@logto/shared'; import type { CommonQueryMethods } from 'slonik'; import { sql } from 'slonik'; import envSet from '#src/env-set/index.js'; +import { DeletionError } from '#src/errors/SlonikError/index.js'; const { table, fields } = convertToIdentifiers(UsersRoles); @@ -52,10 +53,14 @@ export const createUsersRolesQueries = (pool: CommonQueryMethods) => { `); const deleteUsersRolesByUserIdAndRoleId = async (userId: string, roleId: string) => { - await pool.query(sql` + const { rowCount } = await pool.query(sql` delete from ${table} where ${fields.userId} = ${userId} and ${fields.roleId} = ${roleId} `); + + if (rowCount < 1) { + throw new DeletionError(RolesScopes.table); + } }; return { diff --git a/packages/core/src/routes/admin-user.test.ts b/packages/core/src/routes/admin-user.test.ts index eccd90836..2f43f761d 100644 --- a/packages/core/src/routes/admin-user.test.ts +++ b/packages/core/src/routes/admin-user.test.ts @@ -70,6 +70,9 @@ const mockedQueries = { async (): Promise => [{ id: 'role_id', name: 'admin', description: 'none' }] ), }, + usersRoles: { + deleteUsersRolesByUserIdAndRoleId: jest.fn(), + }, } satisfies Partial2; const mockHasUser = jest.fn(async () => false); diff --git a/packages/integration-tests/src/api/admin-user.ts b/packages/integration-tests/src/api/admin-user.ts index 54c778297..91f8e065a 100644 --- a/packages/integration-tests/src/api/admin-user.ts +++ b/packages/integration-tests/src/api/admin-user.ts @@ -1,4 +1,4 @@ -import type { User } from '@logto/schemas'; +import type { Role, User } from '@logto/schemas'; import { authedAdminApi } from './api.js'; @@ -42,3 +42,12 @@ export const updateUserPassword = (userId: string, password: string) => export const deleteUserIdentity = (userId: string, connectorTarget: string) => authedAdminApi.delete(`users/${userId}/identities/${connectorTarget}`); + +export const assignRolesToUser = (userId: string, roleIds: string[]) => + authedAdminApi.post(`users/${userId}/roles`, { json: { roleIds } }); + +export const getUserRoles = (userId: string) => + authedAdminApi.get(`users/${userId}/roles`).json(); + +export const deleteRoleFromUser = (userId: string, roleId: string) => + authedAdminApi.delete(`users/${userId}/roles/${roleId}`); diff --git a/packages/integration-tests/src/tests/api/admin-user.roles.test.ts b/packages/integration-tests/src/tests/api/admin-user.roles.test.ts new file mode 100644 index 000000000..c8075b9b0 --- /dev/null +++ b/packages/integration-tests/src/tests/api/admin-user.roles.test.ts @@ -0,0 +1,41 @@ +import { adminConsoleAdminRoleId } from '@logto/schemas'; +import { HTTPError } from 'got'; + +import { assignRolesToUser, getUserRoles, deleteRoleFromUser } from '#src/api/index.js'; +import { createUserByAdmin } from '#src/helpers.js'; + +describe('admin console user management (roles)', () => { + it('should get empty list successfully', async () => { + const user = await createUserByAdmin(); + + const roles = await getUserRoles(user.id); + expect(roles.length).toBe(0); + }); + + it('should assign role to user and get list successfully', async () => { + const user = await createUserByAdmin(); + + await assignRolesToUser(user.id, [adminConsoleAdminRoleId]); + const roles = await getUserRoles(user.id); + expect(roles[0]).toHaveProperty('id', adminConsoleAdminRoleId); + }); + + it('should delete role from user successfully', async () => { + const user = await createUserByAdmin(); + + await assignRolesToUser(user.id, [adminConsoleAdminRoleId]); + await deleteRoleFromUser(user.id, adminConsoleAdminRoleId); + + const roles = await getUserRoles(user.id); + expect(roles.length).toBe(0); + }); + + it('should delete non-exist-role from user failed', async () => { + const user = await createUserByAdmin(); + + const response = await deleteRoleFromUser(user.id, adminConsoleAdminRoleId).catch( + (error: unknown) => error + ); + expect(response instanceof HTTPError && response.response.statusCode === 404).toBe(true); + }); +});