Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@firxworx
Created June 29, 2020 16:24
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save firxworx/575f019c5ebd67976da164f48c2f4375 to your computer and use it in GitHub Desktop.
Save firxworx/575f019c5ebd67976da164f48c2f4375 to your computer and use it in GitHub Desktop.
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)
})
})
})
})
@damiankim1
Copy link

@firxworx Haha, sorry it is a new github account from the company I just joined a few days ago. I was looking into configuring integration test on existing project, but I am new to nestjs so I came across your blog post. cypress is also a good tool I agree, my previous company used stoplight for API e2e test. While I agree supertest is a very handy tool, I still think it is more suitable for integration test. Again, thank you for the code example, will help me a lot :)

@eugene0928
Copy link

What about if we want to create another special database for e2e test itself before beginning of the test(namely should create new database if not exists) and drop database after the test

@DiegoVega19
Copy link

DiegoVega19 commented Oct 25, 2022

Hello im new using nest js, how can i share my token that i get in auth-e2e.spect.ts beetween anothers e2e.spect.ts that i have endpoints protected with jwt? any solution? because here we use the token in the same test suite.
thanks for the snippet was very useful for my project but i want to do some refactor in my code :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment