From b1527e7782f7b9fa575b6048118bd9106d599f49 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Fri, 13 Sep 2024 17:21:22 -0700 Subject: [PATCH] Fixing all the tests to pass --- src/lib/server/api/databases/seeds/roles.ts | 2 +- .../api/databases/tables/roles.table.ts | 7 + src/lib/server/api/services/iam.service.ts | 4 +- src/lib/server/api/tests/iam.service.test.ts | 115 ++++++---- .../server/api/tests/tokens.service.test.ts | 32 ++- .../api/tests/user_roles.service.test.ts | 105 +++++---- .../server/api/tests/users.service.test.ts | 211 +++++++----------- 7 files changed, 227 insertions(+), 249 deletions(-) diff --git a/src/lib/server/api/databases/seeds/roles.ts b/src/lib/server/api/databases/seeds/roles.ts index 35cefcd..a299a94 100644 --- a/src/lib/server/api/databases/seeds/roles.ts +++ b/src/lib/server/api/databases/seeds/roles.ts @@ -1,5 +1,5 @@ import * as schema from '$lib/server/api/databases/tables' -import { type db } from '$lib/server/api/packages/drizzle' +import type { db } from '$lib/server/api/packages/drizzle' import roles from './data/roles.json' export default async function seed(db: db) { diff --git a/src/lib/server/api/databases/tables/roles.table.ts b/src/lib/server/api/databases/tables/roles.table.ts index 1dfcfc2..e9f036f 100644 --- a/src/lib/server/api/databases/tables/roles.table.ts +++ b/src/lib/server/api/databases/tables/roles.table.ts @@ -4,6 +4,13 @@ import { pgTable, text, uuid } from 'drizzle-orm/pg-core' import { timestamps } from '../../common/utils/table' import { user_roles } from './userRoles.table' +export enum RoleName { + ADMIN = 'admin', + EDITOR = 'editor', + MODERATOR = 'moderator', + USER = 'user', +} + export const rolesTable = pgTable('roles', { id: uuid('id').primaryKey().defaultRandom(), cuid: text('cuid') diff --git a/src/lib/server/api/services/iam.service.ts b/src/lib/server/api/services/iam.service.ts index a70e8c3..7d93a5f 100644 --- a/src/lib/server/api/services/iam.service.ts +++ b/src/lib/server/api/services/iam.service.ts @@ -44,13 +44,13 @@ export class IamService { } const existingUserForNewUsername = await this.usersService.findOneByUsername(data.username) - if (existingUserForNewUsername && existingUserForNewUsername.id !== userId) { + if (existingUserForNewUsername && existingUserForNewUsername.id !== user.id) { return { error: 'Username already in use', } } - return this.usersService.updateUser(userId, { + return this.usersService.updateUser(user.id, { first_name: data.firstName, last_name: data.lastName, username: data.username !== user.username ? data.username : user.username, diff --git a/src/lib/server/api/tests/iam.service.test.ts b/src/lib/server/api/tests/iam.service.test.ts index 96d3174..40b0bae 100644 --- a/src/lib/server/api/tests/iam.service.test.ts +++ b/src/lib/server/api/tests/iam.service.test.ts @@ -2,6 +2,7 @@ import 'reflect-metadata' import { IamService } from '$lib/server/api/services/iam.service' import { LuciaService } from '$lib/server/api/services/lucia.service' import { UsersService } from '$lib/server/api/services/users.service' +import { faker } from '@faker-js/faker' import { container } from 'tsyringe' import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest' @@ -25,60 +26,36 @@ describe('IamService', () => { vi.resetAllMocks() }) + const timeStampDate = new Date() + const dbUser = { + id: faker.string.uuid(), + cuid: 'ciglo1j8q0000t9j4xq8d6p5e', + first_name: faker.person.firstName(), + last_name: faker.person.lastName(), + email: faker.internet.email(), + username: faker.internet.userName(), + verified: false, + receive_email: false, + mfa_enabled: false, + theme: 'system', + createdAt: timeStampDate, + updatedAt: timeStampDate, + } + describe('Update Profile', () => { - it('should resolve', async () => { - const timeStampDate = new Date() - userService.findOneById = vi.fn().mockResolvedValueOnce({ - id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - cuid: 'ciglo1j8q0000t9j4xq8d6p5e', - first_name: 'test', - last_name: 'test', - email: 'test@example.com', - username: 'test', - verified: false, - receive_email: false, - mfa_enabled: false, - theme: 'system', - createdAt: timeStampDate, - updatedAt: timeStampDate, - }) + it('should update user', async () => { + userService.findOneById = vi.fn().mockResolvedValueOnce(dbUser) userService.findOneByUsername = vi.fn().mockResolvedValue(undefined) - userService.updateUser = vi.fn().mockResolvedValue({ - id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - cuid: 'ciglo1j8q0000t9j4xq8d6p5e', - first_name: 'test', - last_name: 'test', - email: 'test@example.com', - username: 'test', - verified: false, - receive_email: false, - mfa_enabled: false, - theme: 'system', - createdAt: timeStampDate, - updatedAt: timeStampDate, - }) + userService.updateUser = vi.fn().mockResolvedValue(dbUser) const spy_userService_findOneById = vi.spyOn(userService, 'findOneById') const spy_userService_findOneByUsername = vi.spyOn(userService, 'findOneByUsername') const spy_userService_updateUser = vi.spyOn(userService, 'updateUser') await expect( - service.updateProfile('3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', { - username: 'test', + service.updateProfile(faker.string.uuid(), { + username: faker.internet.userName(), }), - ).resolves.toEqual({ - id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - cuid: 'ciglo1j8q0000t9j4xq8d6p5e', - first_name: 'test', - last_name: 'test', - email: 'test@example.com', - username: 'test', - verified: false, - receive_email: false, - mfa_enabled: false, - theme: 'system', - createdAt: timeStampDate, - updatedAt: timeStampDate, - }) + ).resolves.toEqual(dbUser) expect(spy_userService_findOneById).toBeCalledTimes(1) expect(spy_userService_findOneByUsername).toBeCalledTimes(1) expect(spy_userService_updateUser).toBeCalledTimes(1) @@ -91,8 +68,8 @@ describe('IamService', () => { const spy_userService_findOneByUsername = vi.spyOn(userService, 'findOneByUsername') const spy_userService_updateUser = vi.spyOn(userService, 'updateUser') await expect( - service.updateProfile('3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', { - username: 'test', + service.updateProfile(faker.string.uuid(), { + username: faker.internet.userName(), }), ).resolves.toEqual({ error: 'User not found', @@ -101,5 +78,47 @@ describe('IamService', () => { expect(spy_userService_findOneByUsername).toBeCalledTimes(0) expect(spy_userService_updateUser).toBeCalledTimes(0) }) + + it('should error on duplicate username', async () => { + userService.findOneById = vi.fn().mockResolvedValueOnce(dbUser) + userService.findOneByUsername = vi.fn().mockResolvedValue({ + id: faker.string.uuid(), + }) + userService.updateUser = vi.fn().mockResolvedValue(dbUser) + + const spy_userService_findOneById = vi.spyOn(userService, 'findOneById') + const spy_userService_findOneByUsername = vi.spyOn(userService, 'findOneByUsername') + const spy_userService_updateUser = vi.spyOn(userService, 'updateUser') + await expect( + service.updateProfile(faker.string.uuid(), { + username: faker.internet.userName(), + }), + ).resolves.toEqual({ + error: 'Username already in use', + }) + expect(spy_userService_findOneById).toBeCalledTimes(1) + expect(spy_userService_findOneByUsername).toBeCalledTimes(1) + expect(spy_userService_updateUser).toBeCalledTimes(0) + }) + }) + + it('should not error if the user id of new username is the current user id', async () => { + userService.findOneById = vi.fn().mockResolvedValueOnce(dbUser) + userService.findOneByUsername = vi.fn().mockResolvedValue({ + id: dbUser.id, + }) + userService.updateUser = vi.fn().mockResolvedValue(dbUser) + + const spy_userService_findOneById = vi.spyOn(userService, 'findOneById') + const spy_userService_findOneByUsername = vi.spyOn(userService, 'findOneByUsername') + const spy_userService_updateUser = vi.spyOn(userService, 'updateUser') + await expect( + service.updateProfile(dbUser.id, { + username: dbUser.id, + }), + ).resolves.toEqual(dbUser) + expect(spy_userService_findOneById).toBeCalledTimes(1) + expect(spy_userService_findOneByUsername).toBeCalledTimes(1) + expect(spy_userService_updateUser).toBeCalledTimes(1) }) }) diff --git a/src/lib/server/api/tests/tokens.service.test.ts b/src/lib/server/api/tests/tokens.service.test.ts index ad0aa3b..cff2574 100644 --- a/src/lib/server/api/tests/tokens.service.test.ts +++ b/src/lib/server/api/tests/tokens.service.test.ts @@ -1,7 +1,7 @@ import 'reflect-metadata' import { Argon2id } from 'oslo/password' import { container } from 'tsyringe' -import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest' +import { afterAll, beforeAll, describe, expect, expectTypeOf, it, vi } from 'vitest' import { HashingService } from '../services/hashing.service' import { TokensService } from '../services/tokens.service' @@ -18,30 +18,28 @@ describe('TokensService', () => { }) describe('Generate Token', () => { - const hashedPassword = new Argon2id().hash('111') - - hashingService.hash = vi.fn().mockResolvedValue(hashedPassword) - hashingService.verify = vi.fn().mockResolvedValue(true) - - const spy_hashingService_hash = vi.spyOn(hashingService, 'hash') - const spy_hashingService_verify = vi.spyOn(hashingService, 'verify') - it('should resolve', async () => { - expect(service.createHashedToken('111')).resolves.string + const hashedPassword = await new Argon2id().hash('111') + hashingService.hash = vi.fn().mockResolvedValue(hashedPassword) + const spy_hashingService_hash = vi.spyOn(hashingService, 'hash') + const spy_hashingService_verify = vi.spyOn(hashingService, 'verify') + await expectTypeOf(service.createHashedToken('111')).resolves.toBeString() + expect(spy_hashingService_hash).toBeCalledTimes(1) + expect(spy_hashingService_verify).toBeCalledTimes(0) }) it('should generate a token that is verifiable', async () => { + hashingService.hash = vi.fn().mockResolvedValue(await new Argon2id().hash('111')) + hashingService.verify = vi.fn().mockResolvedValue(true) + const spy_hashingService_hash = vi.spyOn(hashingService, 'hash') + const spy_hashingService_verify = vi.spyOn(hashingService, 'verify') const token = await service.createHashedToken('111') + expect(token).not.toBeNaN() expect(token).not.toBeUndefined() expect(token).not.toBeNull() const verifiable = await service.verifyHashedToken(token, '111') expect(verifiable).toBeTruthy() - }) - - it('should generate a hashed token', async () => { - expect(spy_hashingService_hash).toHaveBeenCalledTimes(2) - }) - it('should verify a hashed token', async () => { - expect(spy_hashingService_verify).toHaveBeenCalledTimes(1) + expect(spy_hashingService_hash).toBeCalledTimes(1) + expect(spy_hashingService_verify).toBeCalledTimes(1) }) }) }) diff --git a/src/lib/server/api/tests/user_roles.service.test.ts b/src/lib/server/api/tests/user_roles.service.test.ts index dfd47d2..89cde2a 100644 --- a/src/lib/server/api/tests/user_roles.service.test.ts +++ b/src/lib/server/api/tests/user_roles.service.test.ts @@ -1,62 +1,75 @@ -import 'reflect-metadata'; -import { container } from 'tsyringe'; -import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest'; -import { UserRolesService } from '../services/user_roles.service'; -import { UserRolesRepository } from '../repositories/user_roles.repository'; -import { RolesService } from '../services/roles.service'; +import 'reflect-metadata' +import { RoleName } from '$lib/server/api/databases/tables' +import { faker } from '@faker-js/faker' +import { container } from 'tsyringe' +import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest' +import { UserRolesRepository } from '../repositories/user_roles.repository' +import { RolesService } from '../services/roles.service' +import { UserRolesService } from '../services/user_roles.service' describe('UserRolesService', () => { - let service: UserRolesService; - const userRolesRepository = vi.mocked(UserRolesRepository.prototype); - const rolesService = vi.mocked(RolesService.prototype); + let service: UserRolesService + const userRolesRepository = vi.mocked(UserRolesRepository.prototype) + const rolesService = vi.mocked(RolesService.prototype) beforeAll(() => { service = container .register(UserRolesRepository, { useValue: userRolesRepository }) .register(RolesService, { useValue: rolesService }) - .resolve(UserRolesService); - }); + .resolve(UserRolesService) + }) afterAll(() => { vi.resetAllMocks() - }); + }) + + const timeStampDate = new Date() + const roleUUID = faker.string.uuid() + const userUUID = faker.string.uuid() + const dbRole = { + id: roleUUID, + cuid: 'ciglo1j8q0000t9j4xq8d6p5e', + name: RoleName.ADMIN, + createdAt: timeStampDate, + updatedAt: timeStampDate, + } + + const dbUserRole = { + id: faker.string.uuid(), + cuid: 'ciglo1j8q0000t9j4xq8d6p5e', + role_id: roleUUID, + user_id: userUUID, + primary: true, + createdAt: timeStampDate, + updatedAt: timeStampDate, + } describe('Create User Role', () => { - rolesService.findOneByNameOrThrow = vi.fn().mockResolvedValue({ - id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - cuid: 'ciglo1j8q0000t9j4xq8d6p5e', - name: 'user', - createdAt: new Date(), - updatedAt: new Date() - } satisfies Awaited>); - - userRolesRepository.create = vi.fn().mockResolvedValue({ - id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - cuid: 'ciglo1j8q0000t9j4xq8d6p5e', - user_id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8fff', - role_id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - primary: true, - createdAt: new Date(), - updatedAt: new Date() - } satisfies Awaited>); - - const spy_rolesService_findOneByNameOrThrow = vi.spyOn(rolesService, 'findOneByNameOrThrow'); - const spy_userRolesRepository_create = vi.spyOn(userRolesRepository, 'create'); - it('should resolve', async () => { - await expect(service.addRoleToUser('3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8fff', 'user', true)).resolves.not.toThrowError(); - }) - it('should call rolesService.findOneByNameOrThrow', async () => { - expect(spy_rolesService_findOneByNameOrThrow).toBeCalledWith('user'); - expect(spy_rolesService_findOneByNameOrThrow).toBeCalledTimes(1); - }) - it('should call userRolesRepository.create', async () => { + rolesService.findOneByNameOrThrow = vi.fn().mockResolvedValue(dbRole satisfies Awaited>) + + userRolesRepository.create = vi.fn().mockResolvedValue(dbUserRole satisfies Awaited>) + + const spy_rolesService_findOneByNameOrThrow = vi.spyOn(rolesService, 'findOneByNameOrThrow') + const spy_userRolesRepository_create = vi.spyOn(userRolesRepository, 'create') + + await expect(service.addRoleToUser(userUUID, RoleName.ADMIN, true)).resolves.not.toThrowError() + expect(spy_rolesService_findOneByNameOrThrow).toBeCalledWith(RoleName.ADMIN) + expect(spy_rolesService_findOneByNameOrThrow).toBeCalledTimes(1) expect(spy_userRolesRepository_create).toBeCalledWith({ - user_id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8fff', - role_id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - primary: true - }); - expect(spy_userRolesRepository_create).toBeCalledTimes(1); + user_id: userUUID, + role_id: dbRole.id, + primary: true, + }) + expect(spy_userRolesRepository_create).toBeCalledTimes(1) + }) + it('should error on no role found', async () => { + rolesService.findOneByNameOrThrow = vi.fn().mockResolvedValue(undefined) + + const spy_rolesService_findOneByNameOrThrow = vi.spyOn(rolesService, 'findOneByNameOrThrow') + await expect(service.addRoleToUser(userUUID, RoleName.ADMIN, true)).rejects.toThrowError(`Role with name ${RoleName.ADMIN} not found`) + expect(spy_rolesService_findOneByNameOrThrow).toBeCalledWith(RoleName.ADMIN) + expect(spy_rolesService_findOneByNameOrThrow).toBeCalledTimes(1) }) }) -}); \ No newline at end of file +}) diff --git a/src/lib/server/api/tests/users.service.test.ts b/src/lib/server/api/tests/users.service.test.ts index ec551a2..ca916e2 100644 --- a/src/lib/server/api/tests/users.service.test.ts +++ b/src/lib/server/api/tests/users.service.test.ts @@ -1,8 +1,9 @@ import 'reflect-metadata' import { CredentialsType } from '$lib/server/api/databases/tables' +import { faker } from '@faker-js/faker' import { Argon2id } from 'oslo/password' import { container } from 'tsyringe' -import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest' +import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest' import { CredentialsRepository } from '../repositories/credentials.repository' import { UsersRepository } from '../repositories/users.repository' import { CollectionsService } from '../services/collections.service' @@ -35,154 +36,94 @@ describe('UsersService', () => { vi.resetAllMocks() }) + const timeStampDate = new Date() + const dbUser = { + id: faker.string.uuid(), + cuid: 'ciglo1j8q0000t9j4xq8d6p5e', + first_name: faker.person.firstName(), + last_name: faker.person.lastName(), + email: faker.internet.email(), + username: faker.internet.userName(), + verified: false, + receive_email: false, + mfa_enabled: false, + theme: 'system', + createdAt: timeStampDate, + updatedAt: timeStampDate, + } + const dbCredentials = { + id: faker.string.uuid(), + user_id: dbUser.id, + type: CredentialsType.PASSWORD, + secret_data: 'hashedPassword', + createdAt: timeStampDate, + updatedAt: timeStampDate, + } + describe('Create User', () => { - const date = new Date() - - const hashedPassword = new Argon2id().hash('111') - tokensService.createHashedToken = vi.fn().mockResolvedValue(hashedPassword) - - usersRepository.create = vi.fn().mockResolvedValue({ - id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - cuid: 'ciglo1j8q0000t9j4xq8d6p5e', - first_name: 'test', - last_name: 'test', - email: 'test@example.com', - username: 'test', - verified: false, - receive_email: false, - mfa_enabled: false, - theme: 'system', - createdAt: date, - updatedAt: date, - } satisfies Awaited>) - - credentialsRepository.create = vi.fn().mockResolvedValue({ - id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - user_id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - type: CredentialsType.PASSWORD, - secret_data: hashedPassword, - }) satisfies Awaited> - - userRolesService.addRoleToUser = vi.fn().mockResolvedValue(undefined) - - wishlistsService.createEmptyNoName = vi.fn().mockResolvedValue(undefined) - - collectionsService.createEmptyNoName = vi.fn().mockResolvedValue(undefined) - - const spy_tokensService_createHashToken = vi.spyOn(tokensService, 'createHashedToken') - const spy_usersRepository_create = vi.spyOn(usersRepository, 'create') - const spy_credentialsRepository_create = vi.spyOn(credentialsRepository, 'create') - const spy_userRolesService_addRoleToUser = vi.spyOn(userRolesService, 'addRoleToUser') - const spy_wishlistsService_createEmptyNoName = vi.spyOn(wishlistsService, 'createEmptyNoName') - const spy_collectionsService_createEmptyNoName = vi.spyOn(collectionsService, 'createEmptyNoName') - it('should resolve', async () => { + const hashedPassword = new Argon2id().hash('111') + tokensService.createHashedToken = vi.fn().mockResolvedValue(hashedPassword) + usersRepository.create = vi.fn().mockResolvedValue(dbUser satisfies Awaited>) + credentialsRepository.create = vi.fn().mockResolvedValue(dbCredentials satisfies Awaited>) + userRolesService.addRoleToUser = vi.fn().mockResolvedValue(undefined) + wishlistsService.createEmptyNoName = vi.fn().mockResolvedValue(undefined) + collectionsService.createEmptyNoName = vi.fn().mockResolvedValue(undefined) + + const spy_tokensService_createHashToken = vi.spyOn(tokensService, 'createHashedToken') + const spy_usersRepository_create = vi.spyOn(usersRepository, 'create') + const spy_credentialsRepository_create = vi.spyOn(credentialsRepository, 'create') + const spy_userRolesService_addRoleToUser = vi.spyOn(userRolesService, 'addRoleToUser') + const spy_wishlistsService_createEmptyNoName = vi.spyOn(wishlistsService, 'createEmptyNoName') + const spy_collectionsService_createEmptyNoName = vi.spyOn(collectionsService, 'createEmptyNoName') await expect( service.create({ - firstName: 'test', - lastName: 'test', - email: 'test@example.com', - username: 'test', - password: '111', - confirm_password: '111', + firstName: faker.person.firstName(), + lastName: faker.person.lastName(), + email: faker.internet.email(), + username: faker.internet.userName(), + password: faker.string.alphanumeric(10), + confirm_password: faker.string.alphanumeric(10), }), - ).resolves.toEqual({ - id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - cuid: 'ciglo1j8q0000t9j4xq8d6p5e', - first_name: 'test', - last_name: 'test', - email: 'test@example.com', - username: 'test', - verified: false, - receive_email: false, - mfa_enabled: false, - theme: 'system', - createdAt: date, - updatedAt: date, - }) - }) - // it('should generate a hashed token', async () => { - // expect(spy_tokensService_createHashToken).toBeCalledTimes(1) - // }) - // it('should create a new user', async () => { - // expect(spy_usersRepository_create).toBeCalledTimes(1) - // }) - // it('should create a new credential', async () => { - // expect(spy_credentialsRepository_create).toBeCalledTimes(1) - // }) - // it('should add role to user', async () => { - // expect(spy_userRolesService_addRoleToUser).toBeCalledTimes(1) - // }) - // it('should create a new wishlist', async () => { - // expect(spy_wishlistsService_createEmptyNoName).toBeCalledTimes(1) - // }) - // it('should create a new collection', async () => { - // expect(spy_collectionsService_createEmptyNoName).toBeCalledTimes(1) - // }) - }) - describe('Update User Password Exiting Credentials', () => { - const hashedPassword = new Argon2id().hash('111') - tokensService.createHashedToken = vi.fn().mockResolvedValue(hashedPassword) satisfies Awaited> - credentialsRepository.update = vi.fn().mockResolvedValue({ - id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - user_id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - type: 'PASSWORD', - secret_data: hashedPassword, - }) satisfies Awaited> - credentialsRepository.findPasswordCredentialsByUserId = vi.fn().mockResolvedValue({ - id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - user_id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - type: 'PASSWORD', - secret_data: hashedPassword, - }) satisfies Awaited> - - const spy_tokensService_createHashToken = vi.spyOn(tokensService, 'createHashedToken') - const spy_credentialsRepository_findPasswordCredentialsByUserId = vi.spyOn(credentialsRepository, 'findPasswordCredentialsByUserId') - const spy_credentialsRepository_update = vi.spyOn(credentialsRepository, 'update') - - it('should resolve', async () => { - await expect(service.updatePassword('3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', '111')).resolves.toBeUndefined() - }) - console.log(spy_tokensService_createHashToken.mock.calls) - it('should generate a hashed token', async () => { + ).resolves.toEqual(dbUser) expect(spy_tokensService_createHashToken).toBeCalledTimes(1) + expect(spy_usersRepository_create).toBeCalledTimes(1) + expect(spy_credentialsRepository_create).toBeCalledTimes(1) + expect(spy_userRolesService_addRoleToUser).toBeCalledTimes(1) + expect(spy_wishlistsService_createEmptyNoName).toBeCalledTimes(1) + expect(spy_collectionsService_createEmptyNoName).toBeCalledTimes(1) }) - console.log(spy_credentialsRepository_findPasswordCredentialsByUserId.mock.calls) - it('should call find password credentials by user id', async () => { + }) + describe('Update User', () => { + it('should resolve Password Exiting Credentials', async () => { + const hashedPassword = new Argon2id().hash('111') + tokensService.createHashedToken = vi.fn().mockResolvedValue(hashedPassword) + credentialsRepository.update = vi.fn().mockResolvedValue(dbCredentials satisfies Awaited>) + credentialsRepository.findPasswordCredentialsByUserId = vi + .fn() + .mockResolvedValue(dbCredentials satisfies Awaited>) + + const spy_tokensService_createHashToken = vi.spyOn(tokensService, 'createHashedToken') + const spy_credentialsRepository_findPasswordCredentialsByUserId = vi.spyOn(credentialsRepository, 'findPasswordCredentialsByUserId') + const spy_credentialsRepository_update = vi.spyOn(credentialsRepository, 'update') + await expect(service.updatePassword(dbUser.id, faker.string.alphanumeric(10))).resolves.toBeUndefined() + expect(spy_tokensService_createHashToken).toBeCalledTimes(1) expect(spy_credentialsRepository_findPasswordCredentialsByUserId).toBeCalledTimes(1) - }) - console.log(spy_credentialsRepository_update.mock.calls) - it('should update the credential when user has credential', async () => { expect(spy_credentialsRepository_update).toBeCalledTimes(1) }) - }) - describe('Update User Password No Existing Credentials', () => { - const hashedPassword = new Argon2id().hash('111') - tokensService.createHashedToken = vi.fn().mockResolvedValue(hashedPassword) satisfies Awaited> - credentialsRepository.findPasswordCredentialsByUserId = vi.fn().mockResolvedValue(null) satisfies Awaited< - ReturnType - > - credentialsRepository.create = vi.fn().mockResolvedValue({ - id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - user_id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - type: 'PASSWORD', - secret_data: hashedPassword, - }) satisfies Awaited> + it('Should Create User Password No Existing Credentials', async () => { + const hashedPassword = new Argon2id().hash('111') + tokensService.createHashedToken = vi.fn().mockResolvedValue(hashedPassword) + credentialsRepository.findPasswordCredentialsByUserId = vi.fn().mockResolvedValue(null) + credentialsRepository.create = vi.fn().mockResolvedValue(dbCredentials satisfies Awaited>) - const spy_tokensService_createHashToken = vi.spyOn(tokensService, 'createHashedToken') - const spy_credentialsRepository_create = vi.spyOn(credentialsRepository, 'create') - const spy_credentialsRepository_findPasswordCredentialsByUserId = vi.spyOn(credentialsRepository, 'findPasswordCredentialsByUserId') + const spy_tokensService_createHashToken = vi.spyOn(tokensService, 'createHashedToken') + const spy_credentialsRepository_create = vi.spyOn(credentialsRepository, 'create') + const spy_credentialsRepository_findPasswordCredentialsByUserId = vi.spyOn(credentialsRepository, 'findPasswordCredentialsByUserId') - it('should resolve with no current credential for user', async () => { - await expect(service.updatePassword('3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', '111')).resolves.not.toThrow() - }) - it('should generate a hashed token', async () => { + await expect(service.updatePassword(dbUser.id, faker.string.alphanumeric(10))).resolves.not.toThrow() expect(spy_tokensService_createHashToken).toBeCalledTimes(1) - }) - it('should call find password credentials by user id', async () => { expect(spy_credentialsRepository_findPasswordCredentialsByUserId).toBeCalledTimes(1) - }) - it('should create a new credential when user has no credential', async () => { expect(spy_credentialsRepository_create).toHaveBeenCalledTimes(1) }) })