Skip to content

Instantly share code, notes, and snippets.

@firxworx
Created June 29, 2020 16:24
Show Gist options
  • 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 [email protected] 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: '[email protected]', 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: '[email protected]', password: 'wrong' })
.expect(401)
expect(response.body.accessToken).not.toBeDefined()
})
// assume test data does not include a [email protected] user
it('fails to authenticate user that does not exist', async () => {
const response = await request(app.getHttpServer())
.post('/auth/login')
.send({ email: '[email protected]', 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)
})
})
})
})
@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