Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
NestJS Integration/E2E Testing Example with TypeORM, Postgres, JWT
import { Test, TestingModule } from '@nestjs/testing'
import { INestApplication, LoggerService } from '@nestjs/common'
import * as request from 'supertest'
import { AppModule } from './../src/app.module'
class TestLogger implements LoggerService {
log(message: string) {}
error(message: string, trace: string) {}
warn(message: string) {}
debug(message: string) {}
verbose(message: string) {}
}
describe('AppController (e2e)', () => {
let app: INestApplication
beforeAll(async () => {
const moduleFixture: TestingModule = await Test.createTestingModule({
imports: [AppModule],
}).compile()
app = moduleFixture.createNestApplication()
app.useLogger(new TestLogger())
await app.init()
// tip: access the database connection via
// const connection = app.get(Connection)
// const a = connection.manager
})
afterAll(async () => {
await Promise.all([
app.close(),
])
})
it('/ (GET)', () => {
return request(app.getHttpServer())
.get('/')
.expect(200)
.expect('Hello World!')
})
describe('Authentication', () => {
let jwtToken: string
describe('AuthModule', () => {
// assume test data includes user test@example.com with password 'password'
it('authenticates user with valid credentials and provides a jwt token', async () => {
const response = await request(app.getHttpServer())
.post('/auth/login')
.send({ email: 'test@example.com', password: 'password' })
.expect(200)
// set jwt token for use in subsequent tests
jwtToken = response.body.accessToken
expect(jwtToken).toMatch(/^[A-Za-z0-9-_=]+\.[A-Za-z0-9-_=]+\.?[A-Za-z0-9-_.+/=]*$/) // jwt regex
})
it('fails to authenticate user with an incorrect password', async () => {
const response = await request(app.getHttpServer())
.post('/auth/login')
.send({ email: 'test@example.com', password: 'wrong' })
.expect(401)
expect(response.body.accessToken).not.toBeDefined()
})
// assume test data does not include a nobody@example.com user
it('fails to authenticate user that does not exist', async () => {
const response = await request(app.getHttpServer())
.post('/auth/login')
.send({ email: 'nobody@example.com', password: 'test' })
.expect(401)
expect(response.body.accessToken).not.toBeDefined()
})
})
describe('Protected', () => {
it('gets protected resource with jwt authenticated request', async () => {
const response = await request(app.getHttpServer())
.get('/protected')
.set('Authorization', `Bearer ${jwtToken}`)
.expect(200)
const data = response.body.data
// add assertions that reflect your test data
// expect(data).toHaveLength(3)
})
})
})
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.