diff --git a/nestjs-BE/server/src/users/dto/create-user.dto.ts b/nestjs-BE/server/src/users/dto/create-user.dto.ts index 800cad26..9e8fe879 100644 --- a/nestjs-BE/server/src/users/dto/create-user.dto.ts +++ b/nestjs-BE/server/src/users/dto/create-user.dto.ts @@ -1,3 +1,3 @@ -export class CreateUserDto { +export class CreateUserPrismaDto { readonly email: string; } diff --git a/nestjs-BE/server/src/users/users.service.spec.ts b/nestjs-BE/server/src/users/users.service.spec.ts index 59fae04a..81f58428 100644 --- a/nestjs-BE/server/src/users/users.service.spec.ts +++ b/nestjs-BE/server/src/users/users.service.spec.ts @@ -2,6 +2,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { UsersService } from './users.service'; import { PrismaService } from '../prisma/prisma.service'; import { v4 as uuid } from 'uuid'; +import { KakaoUser, User } from '@prisma/client'; describe('UsersService', () => { let usersService: UsersService; @@ -9,40 +10,63 @@ describe('UsersService', () => { beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ - providers: [UsersService, PrismaService], + providers: [ + UsersService, + { + provide: PrismaService, + useValue: { + $transaction: jest.fn(), + user: { create: jest.fn(), findUnique: jest.fn() }, + kakaoUser: { create: jest.fn(), findUnique: jest.fn() }, + }, + }, + ], }).compile(); usersService = module.get(UsersService); prisma = module.get(PrismaService); - - await prisma.kakaoUser.deleteMany({}); - await prisma.user.deleteMany({}); }); - it('getOrCreateUser', async () => { - const testUserUuid = uuid(); - const testEmail = 'test@email.com'; - const testUser = { uuid: testUserUuid }; - await prisma.user.create({ - data: { uuid: testUserUuid }, - }); - await prisma.kakaoUser.create({ - data: { - email: testEmail, - userUuid: testUserUuid, - }, - }); - - const user = usersService.getOrCreateUser({ email: testEmail }); + it('getOrCreateUser user exist', async () => { + const testUser: User = { uuid: uuid() }; + const testKakaoUser: KakaoUser = { + id: 0, + email: 'test@email.com', + userUuid: testUser.uuid, + }; + + jest + .spyOn(prisma, '$transaction') + .mockImplementation(async (callback) => callback(prisma)); + jest.spyOn(prisma.kakaoUser, 'findUnique').mockResolvedValue(testKakaoUser); + jest.spyOn(prisma.user, 'findUnique').mockResolvedValue(testUser); + + const user = usersService.getOrCreateUser({ email: testKakaoUser.email }); + await expect(user).resolves.toEqual(testUser); + expect(prisma.user.create).not.toHaveBeenCalled(); + expect(prisma.user.findUnique).toHaveBeenCalled(); }); it("getOrCreateUser user doesn't exist", async () => { - const testEmail = 'test@email.com'; + const newUser: User = { uuid: uuid() }; + const newKakaoUser: KakaoUser = { + id: 0, + email: 'test@email.com', + userUuid: newUser.uuid, + }; + + jest + .spyOn(prisma, '$transaction') + .mockImplementation(async (callback) => callback(prisma)); + jest.spyOn(prisma.kakaoUser, 'findUnique').mockResolvedValue(null); + jest.spyOn(prisma.kakaoUser, 'create').mockResolvedValue(newKakaoUser); + jest.spyOn(prisma.user, 'create').mockResolvedValue(newUser); + + const user = usersService.getOrCreateUser({ email: newKakaoUser.email }); - const user = await usersService.getOrCreateUser({ email: testEmail }); - expect(user.uuid).toMatch( - /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/, - ); + await expect(user).resolves.toEqual(newUser); + expect(prisma.user.create).toHaveBeenCalled(); + expect(prisma.user.findUnique).not.toHaveBeenCalled(); }); }); diff --git a/nestjs-BE/server/src/users/users.service.ts b/nestjs-BE/server/src/users/users.service.ts index e04bd8d1..72f28a0a 100644 --- a/nestjs-BE/server/src/users/users.service.ts +++ b/nestjs-BE/server/src/users/users.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; import { PrismaService } from '../prisma/prisma.service'; -import { CreateUserDto } from './dto/create-user.dto'; +import { CreateUserPrismaDto } from './dto/create-user.dto'; import { User } from '@prisma/client'; import { v4 as uuid } from 'uuid'; @@ -8,7 +8,7 @@ import { v4 as uuid } from 'uuid'; export class UsersService { constructor(private prisma: PrismaService) {} - async getOrCreateUser(data: CreateUserDto): Promise { + async getOrCreateUser(data: CreateUserPrismaDto): Promise { return this.prisma.$transaction(async () => { const kakaoUser = await this.prisma.kakaoUser.findUnique({ where: { email: data.email },