Skip to content

Commit

Permalink
test(test,infra): changed e2e testing configuration implementation
Browse files Browse the repository at this point in the history
`vite.config.e2e.ts` changed to use `setup-e2e.ts`.
Changed e2e tests and created factories for user and solicitation.
Changed Prisma instance file to work with e2e configuration. Changed prisma repositories to receive prisma instance when constructor is called.
  • Loading branch information
ClaudionorOjr committed Nov 30, 2023
1 parent 37c62c2 commit 49b30d1
Show file tree
Hide file tree
Showing 23 changed files with 193 additions and 119 deletions.
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,7 @@

# jwt
private_key.pem
public_key.pem
public_key.pem

# vscode
/.vscode
2 changes: 1 addition & 1 deletion client.http
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Content-Type: application/json
"completeName": "John Doe",
"email": "[email protected]",
"password": "123456",
"phone": "(00) 98765-4321",
"phone": "(00) 98765-4321"
}

###
Expand Down
5 changes: 2 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,12 @@
"main": "index.js",
"scripts": {
"start:dev": "tsx watch src/server.ts",
"start:debug": "tsx --inspect src/server.ts",
"test": "vitest run --dir src/domain",
"test:watch": "vitest --dir src/domain",
"test:create-prisma-environment": "npm link ./prisma/vitest-environment-prisma",
"test:install-prisma-environment": "npm link vitest-environment-prisma",
"pretest:e2e": "run-s test:create-prisma-environment test:install-prisma-environment",
"test:e2e": "vitest run --config ./vitest.config.e2e.ts",
"test:e2e:watch": "vitest --config ./vitest.config.e2e.ts",
"test:e2e:debug": "vitest run --inspect-brk --inspect --logHeapUsage --threads=false --config ./vitest.config.e2e.ts",
"typecheck": "tsc --noEmit",
"lint": "eslint src --ext .ts",
"lint:fix": "eslint src --ext .ts --fix"
Expand Down
45 changes: 0 additions & 45 deletions prisma/vitest-environment-prisma/setup-e2e.ts

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import { PrismaStudentsRepository } from '../repositories/prisma-students-reposi
import { PrismaResponsiblesRepository } from '../repositories/prisma-responsibles-repository'

export function makeRegisterStudentUseCase() {
// ! Remover console.log
console.log('make register student: ' + process.env.DATABASE_URL)
const solicitationsRepository = new PrismaSolicitatitonsRepository()
const usersRepository = new PrismaUsersRepository()
const studentsRepository = new PrismaStudentsRepository()
Expand Down
13 changes: 13 additions & 0 deletions src/infra/database/prisma/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { PrismaClient } from '@prisma/client'

let prisma: PrismaClient

export function getPrisma() {
if (!prisma) {
prisma = new PrismaClient({
log: ['warn', 'error', 'query'],
})
}

return prisma
}
5 changes: 0 additions & 5 deletions src/infra/database/prisma/prisma.ts

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
import { ResponsiblesRepository } from '@account/application/repositories/responsibles-repository'
import { Responsible } from '@account/enterprise/entities/responsible'
import { PrismaResponsibleMapper } from '../mappers/prisma-responsible-mapper'
import { prisma } from '../prisma'
import { getPrisma } from '..'
import { PrismaClient } from '@prisma/client'

let prisma: PrismaClient

export class PrismaResponsiblesRepository implements ResponsiblesRepository {
constructor() {
console.log('PrismaResponsiblessRepository: ' + process.env.DATABASE_URL)
if (!prisma) {
prisma = getPrisma()
}
}

async create(responsible: Responsible): Promise<void> {
const data = PrismaResponsibleMapper.toPrisma(responsible)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,20 @@
import { SolicitationsRepository } from '@account/application/repositories/solicitations-repository'
import { Solicitation } from '@account/enterprise/entities/solicitation'
import { prisma } from '../prisma'
import { getPrisma } from '..'
import { PrismaSolicitationMapper } from '../mappers/prisma-solicitatiton-mapper'
import { PrismaClient } from '@prisma/client'

let prisma: PrismaClient

export class PrismaSolicitatitonsRepository implements SolicitationsRepository {
constructor() {
console.log('PrismaSolicitationsRepository: ' + process.env.DATABASE_URL)
// * Carregue o prisma apenas quando a classe for instanciada, para que assim utilize o schema randômico para os testes e2e.
if (!prisma) {
prisma = getPrisma()
}
}

async create(solicitation: Solicitation): Promise<void> {
const data = PrismaSolicitationMapper.toPrisma(solicitation)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
import { StudentsRepository } from '@account/application/repositories/students-repository'
import { Student } from '@account/enterprise/entities/student'
import { StudentProfile } from '@account/enterprise/entities/value-object/student-profile'
import { prisma } from '../prisma'
import { PrismaStudentMapper } from '../mappers/prisma-student-mapper'
import { PrismaClient } from '@prisma/client'
import { getPrisma } from '..'

let prisma: PrismaClient

export class PrismaStudentsRepository implements StudentsRepository {
constructor() {
console.log('PrismaStudentsRepository: ' + process.env.DATABASE_URL)
if (!prisma) {
prisma = getPrisma()
}
}

async create(student: Student): Promise<void> {
const data = PrismaStudentMapper.toPrisma(student)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
import { UsersRepository } from '@account/application/repositories/users-repository'
import { User } from '@core/entities/user'
import { PrismaUserMapper } from '../mappers/prisma-user-mapper'
import { prisma } from '../prisma'
import { PrismaClient } from '@prisma/client'
import { getPrisma } from '..'

let prisma: PrismaClient

export class PrismaUsersRepository implements UsersRepository {
constructor() {
console.log('PrismaUserRepository: ' + process.env.DATABASE_URL)
if (!prisma) {
prisma = getPrisma()
}
}

async create(user: User): Promise<void> {
const data = PrismaUserMapper.toPrisma(user)

Expand Down
10 changes: 8 additions & 2 deletions src/infra/http/controllers/authenticate-controller.e2e.spec.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
import { getPrisma } from '@infra/database/prisma'
import { PrismaClient } from '@prisma/client'
import { hash } from 'bcryptjs'
import { FastifyInstance } from 'fastify'
import request from 'supertest'
import { makePrismaUser } from 'test/factories/make-user'
import { UserFactory } from 'test/factories/make-user'

describe('Authenticate (e2e)', () => {
let app: FastifyInstance
let prisma: PrismaClient
let userFactory: UserFactory

beforeAll(async () => {
app = (await import('src/app')).app
prisma = getPrisma()
userFactory = new UserFactory(prisma)

await app.ready()
})
Expand All @@ -17,7 +23,7 @@ describe('Authenticate (e2e)', () => {
})

test('[POST] /sessions', async () => {
await makePrismaUser({
await userFactory.makePrismaUser({
email: '[email protected]',
passwordHash: await hash('123456', 8),
})
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
import { FastifyInstance } from 'fastify'
import request from 'supertest'
import { databaseE2ETests } from 'prisma/vitest-environment-prisma/setup-e2e'
import { makePrismaSolicitation } from 'test/factories/make-solicitation'
import { PrismaClient } from '@prisma/client'
import { getPrisma } from '@infra/database/prisma'
import { SolicitationFactory } from 'test/factories/make-solicitation'

describe('Fetch pending solicitations (e2e)', () => {
let app: FastifyInstance
let prisma: PrismaClient
let solicitationFactory: SolicitationFactory

beforeAll(async () => {
app = (await import('src/app')).app
prisma = getPrisma()
solicitationFactory = new SolicitationFactory(prisma)

await app.ready()
})
Expand All @@ -17,15 +22,14 @@ describe('Fetch pending solicitations (e2e)', () => {
})

test('[GET] /solicitations', async () => {
await makePrismaSolicitation()
await makePrismaSolicitation()
await solicitationFactory.makePrismaSolicitation()
await solicitationFactory.makePrismaSolicitation()

const response = await request(app.server).get('/solicitations').send()

expect(response.statusCode).toEqual(200)

const solicitationsOnDatabase =
await databaseE2ETests.solicitation.findMany()
const solicitationsOnDatabase = await prisma.solicitation.findMany()

expect(solicitationsOnDatabase).toHaveLength(2)
})
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import { getPrisma } from '@infra/database/prisma'
import { PrismaClient } from '@prisma/client'
import { FastifyInstance } from 'fastify'
import request from 'supertest'
import { databaseE2ETests } from 'prisma/vitest-environment-prisma/setup-e2e'

describe('Register Admin (e2e)', () => {
let app: FastifyInstance
let prisma: PrismaClient

beforeAll(async () => {
app = (await import('src/app')).app
prisma = getPrisma()

await app.ready()
})
Expand All @@ -25,7 +28,7 @@ describe('Register Admin (e2e)', () => {

expect(response.statusCode).toEqual(201)

const adminOnDatabase = await databaseE2ETests.user.findUnique({
const adminOnDatabase = await prisma.user.findUnique({
where: {
email: '[email protected]',
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import { getPrisma } from '@infra/database/prisma'
import { PrismaClient } from '@prisma/client'
import { FastifyInstance } from 'fastify'
import request from 'supertest'
import { databaseE2ETests } from 'prisma/vitest-environment-prisma/setup-e2e'

describe('Register driver (e2e)', () => {
let app: FastifyInstance
let prisma: PrismaClient

beforeAll(async () => {
app = (await import('src/app')).app
prisma = getPrisma()

await app.ready()
})
Expand All @@ -25,7 +28,7 @@ describe('Register driver (e2e)', () => {

expect(response.statusCode).toEqual(201)

const driverOnDatabase = await databaseE2ETests.user.findUnique({
const driverOnDatabase = await prisma.user.findUnique({
where: {
email: '[email protected]',
},
Expand Down
27 changes: 18 additions & 9 deletions src/infra/http/controllers/register-student-controller.e2e.spec.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,34 @@
import { FastifyInstance } from 'fastify'
import request from 'supertest'
import { databaseE2ETests } from 'prisma/vitest-environment-prisma/setup-e2e'
import { makePrismaSolicitation } from 'test/factories/make-solicitation'
import { FastifyInstance } from 'fastify'
import { PrismaClient } from '@prisma/client'
import { JwtEncrypter } from '@infra/cryptography/jwt-encrypter'
import { makePrismaUser } from 'test/factories/make-user'
import { UserFactory } from 'test/factories/make-user'
import { SolicitationFactory } from 'test/factories/make-solicitation'

describe('Register Student (e2e)', () => {
let app: FastifyInstance
let prisma: PrismaClient
let userFactory: UserFactory
let solicitationFactory: SolicitationFactory

beforeAll(async () => {
app = (await import('src/app')).app
prisma = (await import('@infra/database/prisma')).getPrisma()
userFactory = new UserFactory(prisma)
solicitationFactory = new SolicitationFactory(prisma)

// ! Remover console.log
console.log('beforeAll register-student: ' + process.env.DATABASE_URL)

await app.ready()
})

afterEach(async () => {
afterAll(async () => {
await app.close()
})

test('[POST] /solicitations/:solicitationId/register', async () => {
const user = await makePrismaUser({ role: 'ADMIN' })
const user = await userFactory.makePrismaUser({ role: 'ADMIN' })

const accessToken = await new JwtEncrypter().encrypt({
sub: user.id,
Expand All @@ -30,7 +39,7 @@ describe('Register Student (e2e)', () => {
// const invalidToken =
// 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.NHVaYe26MbtOYhSKkoKYdFVomg4i8ZJd8_-RU8VNbftc4TSMb4bXP3l3YlNWACwyXPGffz5aXHc6lty1Y2t4SWRqGteragsVdZufDn5BlnJl9pdR_kdVFUsra2rWKEofkZeIC4yWytE58sMIihvo9H1ScmmVwBcQP6XETqYd0aSHp1gOa9RdUPDvoXQ5oqygTqVtxaDr6wUFKrKItgBMzWIdNZ6y7O9E0DhEPTbE9rfBo6KTFsHAZnMg4k68CDp2woYIaXbmYTWcvbzIuHO7_37GT79XdIwkm95QJ7hYC9RiwrV7mesbY4PAahERJawntho0my942XheVLmGwLMB'

const solicitation = await makePrismaSolicitation()
const solicitation = await solicitationFactory.makePrismaSolicitation()

const response = await request(app.server)
.post(`/solicitations/${solicitation.id}/register`)
Expand All @@ -39,13 +48,13 @@ describe('Register Student (e2e)', () => {

expect(response.statusCode).toEqual(201)

const userOnDatabase = await databaseE2ETests.user.findUnique({
const userOnDatabase = await prisma.user.findUnique({
where: {
id: solicitation.id,
},
})

const studentOnDatabase = await databaseE2ETests.student.findUnique({
const studentOnDatabase = await prisma.student.findUnique({
where: {
userId: solicitation.id,
},
Expand Down
2 changes: 2 additions & 0 deletions src/infra/http/controllers/register-student-controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ export async function registerStudent(
const { solicitationId } = registerStudentParamsSchema.parse(request.params)

try {
// ! Remover console.log
console.log('register student controller: ' + process.env.DATABASE_URL)
const registerStudentUseCase = makeRegisterStudentUseCase()

const result = await registerStudentUseCase.execute({ solicitationId })
Expand Down
Loading

0 comments on commit 49b30d1

Please sign in to comment.