diff --git a/packages/backend/src/graphql/queries/get-user.test.ts b/packages/backend/src/graphql/queries/get-user.test.ts index 818d0baf..01f8c6e8 100644 --- a/packages/backend/src/graphql/queries/get-user.test.ts +++ b/packages/backend/src/graphql/queries/get-user.test.ts @@ -2,6 +2,9 @@ import request from 'supertest'; import app from '../../app'; import createAuthTokenByUserId from '../../helpers/create-auth-token-by-user-id'; import Crypto from 'crypto'; +import createRole from '../../../test/fixtures/role'; +import createPermission from '../../../test/fixtures/permission'; +import createUser from '../../../test/fixtures/user'; describe('getUser', () => { describe('with unauthorized user', () => { @@ -29,41 +32,32 @@ describe('getUser', () => { }); describe('with authorized user', () => { - it('should return user data for a valid user id', async () => { - const [role] = await knex - .table('roles') - .insert({ - key: 'sample', - name: 'sample', - }) - .returning('*'); + let role: any, currentUser: any, anotherUser: any, token: any; - await knex.table('permissions').insert({ - action: 'read', - subject: 'User', - role_id: role.id, + beforeEach(async () => { + role = await createRole({ + key: 'sample', + name: 'sample', }); - const [currentUser] = await knex - .table('users') - .insert({ - full_name: 'Test User', - email: 'sample@sample.com', - password: 'secret', - role_id: role.id, - }) - .returning('*'); + await createPermission({ + action: 'read', + subject: 'User', + roleId: role.id, + }); - const [anotherUser] = await global.knex - .table('users') - .insert({ - full_name: 'Another User', - email: 'another@sample.com', - password: 'secret', - role_id: role.id, - }) - .returning('*'); + currentUser = await createUser({ + roleId: role.id, + }); + anotherUser = await createUser({ + roleId: role.id, + }); + + token = createAuthTokenByUserId(currentUser.id); + }); + + it('should return user data for a valid user id', async () => { const query = ` query { getUser(id: "${anotherUser.id}") { @@ -81,8 +75,6 @@ describe('getUser', () => { } `; - const token = createAuthTokenByUserId(currentUser.id); - const response = await request(app) .post('/graphql') .set('Authorization', `${token}`) @@ -106,49 +98,24 @@ describe('getUser', () => { }); it('should return not found for invalid user id', async () => { - const [role] = await knex('roles') - .insert({ - key: 'sample', - name: 'sample', - }) - .returning('*'); - - await knex.table('permissions').insert({ - action: 'read', - subject: 'User', - role_id: role.id, - }); - - const [currentUser] = await knex - .table('users') - .insert({ - full_name: 'Test User', - email: 'sample@sample.com', - password: 'secret', - role_id: role.id, - }) - .returning('*'); - const invalidUserId = Crypto.randomUUID(); const query = ` - query { - getUser(id: "${invalidUserId}") { + query { + getUser(id: "${invalidUserId}") { + id + email + fullName + email + createdAt + updatedAt + role { id - email - fullName - email - createdAt - updatedAt - role { - id - name - } + name } } - `; - - const token = createAuthTokenByUserId(currentUser.id); + } + `; const response = await request(app) .post('/graphql') diff --git a/packages/backend/test/fixtures/permission.ts b/packages/backend/test/fixtures/permission.ts new file mode 100644 index 00000000..398dd31a --- /dev/null +++ b/packages/backend/test/fixtures/permission.ts @@ -0,0 +1,24 @@ +import createRole from './role'; + +type PermissionParams = { + roleId?: string; + action?: string; + subject?: string; +}; + +const createPermission = async (params: PermissionParams = {}) => { + const permissionData = { + role_id: params?.roleId || (await createRole()).id, + action: params?.action || 'read', + subject: params?.subject || 'User', + }; + + const [permission] = await global.knex + .table('permissions') + .insert(permissionData) + .returning('*'); + + return permission; +}; + +export default createPermission; diff --git a/packages/backend/test/fixtures/role.ts b/packages/backend/test/fixtures/role.ts new file mode 100644 index 00000000..b6124116 --- /dev/null +++ b/packages/backend/test/fixtures/role.ts @@ -0,0 +1,15 @@ +type RoleParams = { + name?: string; + key?: string; +}; + +const createRole = async (params: RoleParams = {}) => { + params.name = params?.name || 'Viewer'; + params.key = params?.key || 'viewer'; + + const [role] = await knex.table('roles').insert(params).returning('*'); + + return role; +}; + +export default createRole; diff --git a/packages/backend/test/fixtures/user.ts b/packages/backend/test/fixtures/user.ts new file mode 100644 index 00000000..7bb9bd03 --- /dev/null +++ b/packages/backend/test/fixtures/user.ts @@ -0,0 +1,27 @@ +import createRole from './role'; +import { faker } from '@faker-js/faker'; + +type UserParams = { + roleId?: string; + fullName?: string; + email?: string; + password?: string; +}; + +const createUser = async (params: UserParams = {}) => { + const userData = { + role_id: params?.roleId || (await createRole()).id, + full_name: params?.fullName || faker.person.fullName(), + email: params?.email || faker.internet.email(), + password: params?.password || faker.internet.password(), + }; + + const [user] = await global.knex + .table('users') + .insert(userData) + .returning('*'); + + return user; +}; + +export default createUser;