Skip to content

alexstrat/supertest-graphql

Repository files navigation

supertest-graphql

npm version License: ISC Auto Release

Extends supertest to test a GraphQL endpoint

Install

npm install supertest-graphql

Usage

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)
})

Set expectations

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".

Variables

const { data } = await request(app)
  .query(gql`
    query GetPets($first: Int){
      pets(first: $first) {
        name
        petType
      }
    }
  `)
  .variables({ first: 4 })

Mutation

const { data } = await request(app)
  .mutate(gql`
    mutation PetAnimal($petId: ID!) {
      petAnimal(petId: $petId) {
        name
        petType
      }
    }
  `)
  .variables({petId: 'my-cat' })

Subscriptions with WebScoket

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')
})

Authentication

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(...)

Change GraphQL endpoint path

By default, the execution are sent to /graphql.

You can change this with .path():

const { data } = await request(app)
  .path('/new-graphql')
  .query(...)

Use WebSocket legacy protocol

import { supertestWs, LEGACY_WEBSOCKET_PROTOCOL } from 'supertest-graphql'

const sub = await supertestWs(app)
  .protocol(LEGACY_WEBSOCKET_PROTOCOL)
  .subscribe(...)