diff --git a/backend/jest.config.js b/backend/jest.config.js index 14fdd5e..76c1b57 100644 --- a/backend/jest.config.js +++ b/backend/jest.config.js @@ -8,7 +8,7 @@ module.exports = { // automock: false, // Stop running tests after `n` failures - // bail: 0, + bail: 1, // The directory where Jest should store its cached dependency information // cacheDirectory: "/tmp/jest_rs", diff --git a/backend/src/__tests__/unit/CreateUserService.spec.ts b/backend/src/__tests__/unit/CreateUserService.spec.ts deleted file mode 100644 index bb9b858..0000000 --- a/backend/src/__tests__/unit/CreateUserService.spec.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { disconnect, truncate } from "../utils/database"; -// import User from "../../models/User"; -// import app from "../../app"; -import CreateUserService from "../../services/UserServices/CreateUserService"; -import AppError from "../../errors/AppError"; - -describe("User", () => { - beforeEach(async () => { - await truncate(); - }); - - afterAll(async () => { - await disconnect(); - }); - - it("should be able to create a new user", async () => { - const user = await CreateUserService({ - name: "dasdas", - email: "tesssst@test.com", - password: "passwo22221131rd" - }); - - expect(user).toHaveProperty("id"); - }); - - it("should not be able to create a user with duplicated email", async () => { - await CreateUserService({ - name: "dasdas", - email: "tesssst@test.com", - password: "passwo22221131rd" - }); - - expect( - CreateUserService({ - name: "dasdas", - email: "tesssst@test.com", - password: "passwo22221131rd" - }) - ).rejects.toBeInstanceOf(AppError); - }); -}); diff --git a/backend/src/__tests__/unit/User/AuthUserService.spec.ts b/backend/src/__tests__/unit/User/AuthUserService.spec.ts new file mode 100644 index 0000000..180af23 --- /dev/null +++ b/backend/src/__tests__/unit/User/AuthUserService.spec.ts @@ -0,0 +1,66 @@ +import faker from "faker"; +import AppError from "../../../errors/AppError"; +import AuthUserService from "../../../services/UserServices/AuthUserSerice"; +import CreateUserService from "../../../services/UserServices/CreateUserService"; +import { disconnect, truncate } from "../../utils/database"; + +describe("Auth", () => { + beforeEach(async () => { + await truncate(); + }); + + afterEach(async () => { + await truncate(); + }); + + afterAll(async () => { + await disconnect(); + }); + + it("should be able to login with an existing user", async () => { + await CreateUserService({ + name: faker.name.findName(), + email: "mail@test.com", + password: "hardpassword" + }); + + const response = await AuthUserService({ + email: "mail@test.com", + password: "hardpassword" + }); + + expect(response).toHaveProperty("token"); + }); + + it("should not be able to login with not registered email", async () => { + try { + await AuthUserService({ + email: faker.internet.email(), + password: faker.internet.password() + }); + } catch (err) { + expect(err).toBeInstanceOf(AppError); + expect(err.statusCode).toBe(401); + expect(err.message).toBe("ERR_INVALID_CREDENTIALS"); + } + }); + + it("should not be able to login with incorret password", async () => { + await CreateUserService({ + name: faker.name.findName(), + email: "mail@test.com", + password: "hardpassword" + }); + + try { + await AuthUserService({ + email: "mail@test.com", + password: faker.internet.password() + }); + } catch (err) { + expect(err).toBeInstanceOf(AppError); + expect(err.statusCode).toBe(401); + expect(err.message).toBe("ERR_INVALID_CREDENTIALS"); + } + }); +}); diff --git a/backend/src/__tests__/unit/User/CreateUserService.spec.ts b/backend/src/__tests__/unit/User/CreateUserService.spec.ts new file mode 100644 index 0000000..d6721bc --- /dev/null +++ b/backend/src/__tests__/unit/User/CreateUserService.spec.ts @@ -0,0 +1,47 @@ +import faker from "faker"; +import AppError from "../../../errors/AppError"; +import CreateUserService from "../../../services/UserServices/CreateUserService"; +import { disconnect, truncate } from "../../utils/database"; + +describe("User", () => { + beforeEach(async () => { + await truncate(); + }); + + afterEach(async () => { + await truncate(); + }); + + afterAll(async () => { + await disconnect(); + }); + + it("should be able to create a new user", async () => { + const user = await CreateUserService({ + name: faker.name.findName(), + email: faker.internet.email(), + password: faker.internet.password() + }); + + expect(user).toHaveProperty("id"); + }); + + it("should not be able to create a user with duplicated email", async () => { + await CreateUserService({ + name: faker.name.findName(), + email: "teste@sameemail.com", + password: faker.internet.password() + }); + + try { + await CreateUserService({ + name: faker.name.findName(), + email: "teste@sameemail.com", + password: faker.internet.password() + }); + } catch (err) { + expect(err).toBeInstanceOf(AppError); + expect(err.statusCode).toBe(400); + } + }); +}); diff --git a/backend/src/__tests__/unit/User/DeleteUserService.spec.ts b/backend/src/__tests__/unit/User/DeleteUserService.spec.ts new file mode 100644 index 0000000..3fc8372 --- /dev/null +++ b/backend/src/__tests__/unit/User/DeleteUserService.spec.ts @@ -0,0 +1,35 @@ +import faker from "faker"; +import AppError from "../../../errors/AppError"; +import CreateUserService from "../../../services/UserServices/CreateUserService"; +import DeleteUserService from "../../../services/UserServices/DeleteUserService"; +import { disconnect, truncate } from "../../utils/database"; + +describe("User", () => { + beforeEach(async () => { + await truncate(); + }); + + afterEach(async () => { + await truncate(); + }); + + afterAll(async () => { + await disconnect(); + }); + + it("should be delete a existing user", async () => { + const { id } = await CreateUserService({ + name: faker.name.findName(), + email: faker.internet.email(), + password: faker.internet.password() + }); + + expect(DeleteUserService(id)).resolves.not.toThrow(); + }); + + it("to throw an error if tries to delete a non existing user", async () => { + expect(DeleteUserService(faker.random.number())).rejects.toBeInstanceOf( + AppError + ); + }); +}); diff --git a/backend/src/__tests__/unit/User/ListUserService.spec.ts b/backend/src/__tests__/unit/User/ListUserService.spec.ts new file mode 100644 index 0000000..4fa777f --- /dev/null +++ b/backend/src/__tests__/unit/User/ListUserService.spec.ts @@ -0,0 +1,34 @@ +import faker from "faker"; +import User from "../../../models/User"; +import CreateUserService from "../../../services/UserServices/CreateUserService"; +import ListUsersService from "../../../services/UserServices/ListUsersService"; +import { disconnect, truncate } from "../../utils/database"; + +describe("User", () => { + beforeEach(async () => { + await truncate(); + }); + + afterEach(async () => { + await truncate(); + }); + + afterAll(async () => { + await disconnect(); + }); + + it("should be able to list users", async () => { + await CreateUserService({ + name: faker.name.findName(), + email: faker.internet.email(), + password: faker.internet.password() + }); + + const response = await ListUsersService({ + pageNumber: 1 + }); + + expect(response).toHaveProperty("users"); + expect(response.users[0]).toBeInstanceOf(User); + }); +}); diff --git a/backend/src/__tests__/unit/User/ShowUserService.spec.ts b/backend/src/__tests__/unit/User/ShowUserService.spec.ts new file mode 100644 index 0000000..2883180 --- /dev/null +++ b/backend/src/__tests__/unit/User/ShowUserService.spec.ts @@ -0,0 +1,39 @@ +import faker from "faker"; +import AppError from "../../../errors/AppError"; +import User from "../../../models/User"; +import CreateUserService from "../../../services/UserServices/CreateUserService"; +import ShowUserService from "../../../services/UserServices/ShowUserService"; +import { disconnect, truncate } from "../../utils/database"; + +describe("User", () => { + beforeEach(async () => { + await truncate(); + }); + + afterEach(async () => { + await truncate(); + }); + + afterAll(async () => { + await disconnect(); + }); + + it("should be able to find a user", async () => { + const newUser = await CreateUserService({ + name: faker.name.findName(), + email: faker.internet.email(), + password: faker.internet.password() + }); + + const user = await ShowUserService(newUser.id); + + expect(user).toHaveProperty("id"); + expect(user).toBeInstanceOf(User); + }); + + it("should not be able to find a inexisting user", async () => { + expect(ShowUserService(faker.random.number())).rejects.toBeInstanceOf( + AppError + ); + }); +}); diff --git a/backend/src/__tests__/unit/User/UpdateUserService.spec.ts b/backend/src/__tests__/unit/User/UpdateUserService.spec.ts new file mode 100644 index 0000000..496926d --- /dev/null +++ b/backend/src/__tests__/unit/User/UpdateUserService.spec.ts @@ -0,0 +1,68 @@ +import faker from "faker"; +import AppError from "../../../errors/AppError"; +import CreateUserService from "../../../services/UserServices/CreateUserService"; +import UpdateUserService from "../../../services/UserServices/UpdateUserService"; +import { disconnect, truncate } from "../../utils/database"; + +describe("User", () => { + beforeEach(async () => { + await truncate(); + }); + + afterEach(async () => { + await truncate(); + }); + + afterAll(async () => { + await disconnect(); + }); + + it("should be able to find a user", async () => { + const newUser = await CreateUserService({ + name: faker.name.findName(), + email: faker.internet.email(), + password: faker.internet.password() + }); + + const updatedUser = await UpdateUserService({ + userId: newUser.id, + userData: { + name: "New name", + email: "newmail@email.com" + } + }); + + expect(updatedUser).toHaveProperty("name", "New name"); + expect(updatedUser).toHaveProperty("email", "newmail@email.com"); + }); + + it("should not be able to updated a inexisting user", async () => { + const userId = faker.random.number(); + const userData = { + name: faker.name.findName(), + email: faker.internet.email() + }; + + expect(UpdateUserService({ userId, userData })).rejects.toBeInstanceOf( + AppError + ); + }); + + it("should not be able to updated an user with invalid data", async () => { + const newUser = await CreateUserService({ + name: faker.name.findName(), + email: faker.internet.email(), + password: faker.internet.password() + }); + + const userId = newUser.id; + const userData = { + name: faker.name.findName(), + email: "test.worgn.email" + }; + + expect(UpdateUserService({ userId, userData })).rejects.toBeInstanceOf( + AppError + ); + }); +}); diff --git a/backend/src/__tests__/utils/database.ts b/backend/src/__tests__/utils/database.ts index 0332c63..34645fa 100644 --- a/backend/src/__tests__/utils/database.ts +++ b/backend/src/__tests__/utils/database.ts @@ -1,7 +1,7 @@ import database from "../../database"; const truncate = async (): Promise => { - await database.sync({ force: true }); + await database.truncate({ force: true, cascade: true }); }; const disconnect = async (): Promise => { diff --git a/backend/src/services/UserServices/DeleteUserService.ts b/backend/src/services/UserServices/DeleteUserService.ts index dcd945a..ffaf5f0 100644 --- a/backend/src/services/UserServices/DeleteUserService.ts +++ b/backend/src/services/UserServices/DeleteUserService.ts @@ -3,7 +3,7 @@ import AppError from "../../errors/AppError"; import Ticket from "../../models/Ticket"; import UpdateDeletedUserOpenTicketsStatus from "../../helpers/UpdateDeletedUserOpenTicketsStatus"; -const DeleteUserService = async (id: string): Promise => { +const DeleteUserService = async (id: string | number): Promise => { const user = await User.findOne({ where: { id } }); diff --git a/backend/src/services/UserServices/ListUsersService.ts b/backend/src/services/UserServices/ListUsersService.ts index 233b5c3..24bd8f0 100644 --- a/backend/src/services/UserServices/ListUsersService.ts +++ b/backend/src/services/UserServices/ListUsersService.ts @@ -3,7 +3,7 @@ import User from "../../models/User"; interface Request { searchParam?: string; - pageNumber?: string; + pageNumber?: string | number; } interface Response { diff --git a/backend/src/services/UserServices/UpdateUserService.ts b/backend/src/services/UserServices/UpdateUserService.ts index 65a33fb..b0c497b 100644 --- a/backend/src/services/UserServices/UpdateUserService.ts +++ b/backend/src/services/UserServices/UpdateUserService.ts @@ -12,7 +12,7 @@ interface UserData { interface Request { userData: UserData; - userId: string; + userId: string | number; } interface Response {