Extends supertest to test a GraphQL endpoint
npm install supertest-graphql
import request from 'supertest-graphql'
import gql from 'graphql-tag'
test('should get pets', async () => {
const { data } = await request(app)
.query(gql`
query {
pets {
name
petType
}
}
`)
.expectNoErrors()
expect(data.pets).toHaveLength(2)
})
expectNoErrors
will verify that the API response has no errors
in
its result payload.
await request(app)
.query('blooop')
.expectNoErrors()
// expected no errors but got 1 error(s) in GraphQL response: Syntax Error: Unexpected Name "blooop".
const { data } = await request(app)
.query(gql`
query GetPets($first: Int){
pets(first: $first) {
name
petType
}
}
`)
.variables({ first: 4 })
const { data } = await request(app)
.mutate(gql`
mutation PetAnimal($petId: ID!) {
petAnimal(petId: $petId) {
name
petType
}
}
`)
.variables({petId: 'my-cat' })
import { supertestWs } from 'supertest-graphql'
import gql from 'graphql-tag'
// for websocket the server needs to be started and stopped manually
beForeEach(() => server.listen(0, "localhost"))
afterEach(() => server.close())
test('should get pets', async () => {
const sub = await supertestWs(app)
.subscribe(gql`
subscription {
newPetAdded {
name
petType
}
}
`)
// will wait or pop the next value
const { data } = await sub.next().expectNoErrors()
expect(data.newPetAdded.name).toEqual('Fifi')
})
const { data } = await request(app)
.auth('username', 'password')
.query(...)
or via headers:
const { data } = await request(app)
.set('authorization', 'my token')
.query(...)
For WebSocket with connectionParams
:
import { supertestWs } from 'supertest-graphql'
const sub = await supertestWs(app)
.connectionParams({
token: 'my token'
})
.subscribe(...)
By default, the execution are sent to /graphql
.
You can change this with .path()
:
const { data } = await request(app)
.path('/new-graphql')
.query(...)
import { supertestWs, LEGACY_WEBSOCKET_PROTOCOL } from 'supertest-graphql'
const sub = await supertestWs(app)
.protocol(LEGACY_WEBSOCKET_PROTOCOL)
.subscribe(...)