2024-09-13 19:11:41 +00:00
|
|
|
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'
|
2024-09-14 00:21:22 +00:00
|
|
|
import { faker } from '@faker-js/faker'
|
2024-09-13 19:11:41 +00:00
|
|
|
import { container } from 'tsyringe'
|
|
|
|
|
import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'
|
|
|
|
|
|
|
|
|
|
describe('IamService', () => {
|
|
|
|
|
let service: IamService
|
|
|
|
|
const luciaService = vi.mocked(LuciaService.prototype)
|
|
|
|
|
const userService = vi.mocked(UsersService.prototype)
|
|
|
|
|
|
|
|
|
|
beforeAll(() => {
|
|
|
|
|
service = container
|
|
|
|
|
.register<LuciaService>(LuciaService, { useValue: luciaService })
|
|
|
|
|
.register<UsersService>(UsersService, { useValue: userService })
|
|
|
|
|
.resolve(IamService)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
|
vi.resetAllMocks()
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
afterAll(() => {
|
|
|
|
|
vi.resetAllMocks()
|
|
|
|
|
})
|
|
|
|
|
|
2024-09-14 00:21:22 +00:00
|
|
|
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,
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-13 19:11:41 +00:00
|
|
|
describe('Update Profile', () => {
|
2024-09-14 00:21:22 +00:00
|
|
|
it('should update user', async () => {
|
|
|
|
|
userService.findOneById = vi.fn().mockResolvedValueOnce(dbUser)
|
2024-09-13 19:11:41 +00:00
|
|
|
userService.findOneByUsername = vi.fn().mockResolvedValue(undefined)
|
2024-09-14 00:21:22 +00:00
|
|
|
userService.updateUser = vi.fn().mockResolvedValue(dbUser)
|
2024-09-13 19:11:41 +00:00
|
|
|
|
|
|
|
|
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(
|
2024-09-14 00:21:22 +00:00
|
|
|
service.updateProfile(faker.string.uuid(), {
|
|
|
|
|
username: faker.internet.userName(),
|
2024-09-13 19:11:41 +00:00
|
|
|
}),
|
2024-09-14 00:21:22 +00:00
|
|
|
).resolves.toEqual(dbUser)
|
2024-09-13 19:11:41 +00:00
|
|
|
expect(spy_userService_findOneById).toBeCalledTimes(1)
|
|
|
|
|
expect(spy_userService_findOneByUsername).toBeCalledTimes(1)
|
|
|
|
|
expect(spy_userService_updateUser).toBeCalledTimes(1)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it('should error on no user found', async () => {
|
|
|
|
|
userService.findOneById = vi.fn().mockResolvedValueOnce(undefined)
|
|
|
|
|
|
|
|
|
|
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(
|
2024-09-14 00:21:22 +00:00
|
|
|
service.updateProfile(faker.string.uuid(), {
|
|
|
|
|
username: faker.internet.userName(),
|
2024-09-13 19:11:41 +00:00
|
|
|
}),
|
|
|
|
|
).resolves.toEqual({
|
|
|
|
|
error: 'User not found',
|
|
|
|
|
})
|
|
|
|
|
expect(spy_userService_findOneById).toBeCalledTimes(1)
|
|
|
|
|
expect(spy_userService_findOneByUsername).toBeCalledTimes(0)
|
|
|
|
|
expect(spy_userService_updateUser).toBeCalledTimes(0)
|
|
|
|
|
})
|
2024-09-14 00:21:22 +00:00
|
|
|
|
|
|
|
|
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)
|
2024-09-13 19:11:41 +00:00
|
|
|
})
|
|
|
|
|
})
|