Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/alexstrat/supertest-graphql

Extends supertest to test a GraphQL endpoint
https://github.com/alexstrat/supertest-graphql

Last synced: 2 months ago
JSON representation

Extends supertest to test a GraphQL endpoint

Awesome Lists containing this project

README

        

# supertest-graphql


npm version

License: ISC

Auto Release

> Extends [supertest](https://www.npmjs.com/package/supertest) to test a GraphQL endpoint

## Install

```sh
npm install supertest-graphql
```

## Usage

```ts
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.

```ts
await request(app)
.query('blooop')
.expectNoErrors()
// expected no errors but got 1 error(s) in GraphQL response: Syntax Error: Unexpected Name "blooop".
```
### Variables
```ts
const { data } = await request(app)
.query(gql`
query GetPets($first: Int){
pets(first: $first) {
name
petType
}
}
`)
.variables({ first: 4 })
```

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

### Subscriptions with WebScoket
```ts
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
```ts
const { data } = await request(app)
.auth('username', 'password')
.query(...)
```

or via headers:
```ts
const { data } = await request(app)
.set('authorization', 'my token')
.query(...)
```

For WebSocket with `connectionParams`:
```ts
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()`:

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

### Use WebSocket legacy protocol

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

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