From d6acec568f7ac3937537e67530322a207da2e8a8 Mon Sep 17 00:00:00 2001 From: joaobisi Date: Fri, 2 Aug 2024 02:16:27 -0300 Subject: [PATCH 1/2] feat(#71): Criacao de testes dos metodos de user service e correcoes Co-authored-by: Nanashii76 Co-authored-by: Neoprot --- .gitignore | 8 +- jest.config.ts | 16 ++-- package.json | 1 + src/app/services/apiService.ts | 24 ------ src/lib/enum/userRole.enum.ts | 2 +- src/services/user.service.ts | 2 - test/app/services/user.service.test.ts | 100 +++++++++++++++++++++++++ 7 files changed, 110 insertions(+), 43 deletions(-) delete mode 100644 src/app/services/apiService.ts create mode 100644 test/app/services/user.service.test.ts diff --git a/.gitignore b/.gitignore index 0611d2b..3dd86df 100644 --- a/.gitignore +++ b/.gitignore @@ -36,10 +36,6 @@ yarn-error.log* *.tsbuildinfo next-env.d.ts -package-lock.json +/package-lock.json -reports/* - -reports - -report \ No newline at end of file +/reports/*.xml \ No newline at end of file diff --git a/jest.config.ts b/jest.config.ts index 6e344d1..7378719 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -1,19 +1,16 @@ import type { Config } from 'jest'; +import nextJest from 'next/jest'; -import nextJest from 'next/jest.js' - const createJestConfig = nextJest({ dir: './src', -}) - +}); + const config: Config = { coverageProvider: 'v8', testEnvironment: 'jsdom', preset: 'ts-jest', moduleNameMapper: { - // ... - '^@/components/(.*)$': '/src/app/components/$1', - '^@/(.*)$': '/src/$1', + '^@/(.*)$': '/src/$1', }, reporters: [ 'default', @@ -25,7 +22,6 @@ const config: Config = { }, ], ], +}; -} - -export default createJestConfig(config) +export default createJestConfig(config); diff --git a/package.json b/package.json index e814d89..8b98d7b 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", + "@types/tough-cookie": "^4.0.5", "autoprefixer": "^10.4.19", "eslint": "^8", "eslint-config-next": "14.2.5", diff --git a/src/app/services/apiService.ts b/src/app/services/apiService.ts deleted file mode 100644 index 5e7e5a0..0000000 --- a/src/app/services/apiService.ts +++ /dev/null @@ -1,24 +0,0 @@ -import axios from 'axios'; - -const API_URL = process.env.NEXT_PUBLIC_API_URL; - -export const getUsers = async () => { - try { - const response = await axios.get(`${API_URL}/users`); - return response.data; - } catch (error) { - console.error('Failed to fetch users:', error); - throw error; - } -}; -export const updateUserRole = async (userId: string, newRole: string) => { - try { - const response = await axios.patch(`${API_URL}/users/${userId}/role`, { - role: newRole, - }); - return response.data; - } catch (error) { - console.error('Failed to update user role:', error); - throw error; - } -}; diff --git a/src/lib/enum/userRole.enum.ts b/src/lib/enum/userRole.enum.ts index 3f70aa1..b20f5b9 100644 --- a/src/lib/enum/userRole.enum.ts +++ b/src/lib/enum/userRole.enum.ts @@ -1,5 +1,5 @@ export enum UserRole { ADMIN = 'admin', PROFESSOR = 'professor', - USER = 'user', + ALUNO = 'aluno', } diff --git a/src/services/user.service.ts b/src/services/user.service.ts index c157b20..ffaa56a 100644 --- a/src/services/user.service.ts +++ b/src/services/user.service.ts @@ -2,8 +2,6 @@ import api from './api.service'; import { CalculusRequest } from '@/lib/interfaces/request.interface'; export const createUser = async (data: any): Promise => { - console.log(`Data: ${data}`); - try { const response = await api.post('users', data); return { diff --git a/test/app/services/user.service.test.ts b/test/app/services/user.service.test.ts new file mode 100644 index 0000000..ea2ad95 --- /dev/null +++ b/test/app/services/user.service.test.ts @@ -0,0 +1,100 @@ +import api from '@/services/api.service'; +import { createUser, loginWithEmailAndPassword, getUsers, updateUserRole } from '@/services/user.service'; +import { UserRole } from '@/lib/enum/userRole.enum'; + +jest.mock('@/services/api.service'); +const mockedApi = api as jest.Mocked; + +describe('User Service', () => { + describe('updateUserRole', () => { + it('should update the user role and return the updated user', async () => { + const userId = '1'; + const newRole: UserRole = UserRole.PROFESSOR; + const mockResponse = { data: { id: '1', role: newRole } }; + mockedApi.patch.mockResolvedValueOnce(mockResponse); + + const result = await updateUserRole(userId, newRole); + + expect(mockedApi.patch).toHaveBeenCalledWith(`/users/${userId}/role`, { role: newRole }); + expect(result).toEqual(mockResponse.data); + }); + + it('should throw an error when the API call fails', async () => { + const userId = '1'; + const newRole: UserRole = UserRole.PROFESSOR; + const mockError = new Error('Failed to update user role'); + mockedApi.patch.mockRejectedValueOnce(mockError); + + await expect(updateUserRole(userId, newRole)).rejects.toThrow('Failed to update user role'); + }); + }); + + describe('createUser', () => { + it('should create a user and return the user data', async () => { + const userData = { name: 'John Doe', email: 'john@example.com', username: 'johndoe', password: 'password123', role: UserRole.ALUNO }; + const mockResponse = { data: userData }; + mockedApi.post.mockResolvedValueOnce(mockResponse); + + const result = await createUser(userData); + + expect(mockedApi.post).toHaveBeenCalledWith('users', userData); + expect(result).toEqual({ data: mockResponse.data }); + }); + + it('should handle errors and return an error message', async () => { + const userData = { name: 'John Doe', email: 'john@example.com', username: 'johndoe', password: 'password123', role: UserRole.ALUNO }; + const mockError = { response: { data: { message: 'Error creating user' } } }; + mockedApi.post.mockRejectedValueOnce(mockError); + + const result = await createUser(userData); + + expect(mockedApi.post).toHaveBeenCalledWith('users', userData); + expect(result).toEqual({ error: 'Error creating user' }); + }); + }); + + describe('loginWithEmailAndPassword', () => { + it('should log in with email and password and return the response', async () => { + const email = 'john@example.com'; + const password = 'password123'; + const mockResponse = { data: { token: 'abc123' } }; + mockedApi.post.mockResolvedValueOnce(mockResponse); + + const result = await loginWithEmailAndPassword(email, password); + + expect(mockedApi.post).toHaveBeenCalledWith('auth/login', { email, password }); + expect(result).toEqual(mockResponse); + }); + + it('should handle errors and return null', async () => { + const email = 'john@example.com'; + const password = 'password123'; + const mockError = new Error('Login failed'); + mockedApi.post.mockRejectedValueOnce(mockError); + + const result = await loginWithEmailAndPassword(email, password); + + expect(mockedApi.post).toHaveBeenCalledWith('auth/login', { email, password }); + expect(result).toBeNull(); + }); + }); + + describe('getUsers', () => { + it('should fetch users and return the data', async () => { + const mockResponse = { data: [{ id: '1', name: 'John Doe' }] }; + mockedApi.get.mockResolvedValueOnce(mockResponse); + + const result = await getUsers(); + + expect(mockedApi.get).toHaveBeenCalledWith('/users'); + expect(result).toEqual(mockResponse.data); + }); + + it('should handle errors and throw an error', async () => { + const mockError = new Error('Failed to fetch users'); + mockedApi.get.mockRejectedValueOnce(mockError); + + await expect(getUsers()).rejects.toThrow('Failed to fetch users'); + }); + }); +}); From c2e762a6eb80fb59aed32ba0ccc9fa5bff2a09ae Mon Sep 17 00:00:00 2001 From: joaobisi Date: Fri, 2 Aug 2024 02:16:27 -0300 Subject: [PATCH 2/2] feat(#71): Criacao de testes dos metodos de user service e correcoes Co-authored-by: Nanashii76 Co-authored-by: Neoprot --- jest.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jest.config.ts b/jest.config.ts index 7378719..5e360d5 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -10,7 +10,7 @@ const config: Config = { testEnvironment: 'jsdom', preset: 'ts-jest', moduleNameMapper: { - '^@/(.*)$': '/src/$1', + '^@/(.*)$': '/src/$1', }, reporters: [ 'default',