Skip to content

Commit

Permalink
Add tests for defer/stream termination
Browse files Browse the repository at this point in the history
  • Loading branch information
ardatan committed Nov 9, 2022
1 parent 11729d5 commit 6db3a16
Showing 1 changed file with 37 additions and 29 deletions.
66 changes: 37 additions & 29 deletions packages/graphql-yoga/__integration-tests__/browser.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,25 @@ import 'json-bigint-patch'
import { AddressInfo } from 'net'
import { useDeferStream } from '@graphql-yoga/plugin-defer-stream'

let resolveOnReturn: VoidFunction
const timeouts = new Set<NodeJS.Timeout>()

let charCode = 'A'.charCodeAt(0)
const fakeAsyncIterable = {
[Symbol.asyncIterator]() {
return this
},
next: () =>
sleep(300, (timeout) => timeouts.add(timeout)).then(() => ({
value: String.fromCharCode(charCode++),
done: false,
})),
return: () => {
resolveOnReturn()
timeouts.forEach(clearTimeout)
return Promise.resolve({ done: true })
},
}
export function createTestSchema() {
let liveQueryCounter = 0

Expand Down Expand Up @@ -56,13 +75,7 @@ export function createTestSchema() {
},
stream: {
type: new GraphQLList(GraphQLString),
async *resolve() {
yield 'A'
await new Promise((resolve) => setTimeout(resolve, 1000))
yield 'B'
await new Promise((resolve) => setTimeout(resolve, 1000))
yield 'C'
},
resolve: () => fakeAsyncIterable,
},
bigint: {
type: GraphQLBigInt,
Expand Down Expand Up @@ -254,11 +267,12 @@ describe('browser', () => {
await page.goto(
`http://localhost:${port}${endpoint}?query={ stream @stream }`,
)
const returnPromise$ = new Promise<void>((resolve) => {
resolveOnReturn = resolve
})
await page.click('.graphiql-execute-button')

await new Promise((res) => setTimeout(res, 100))

const [resultContents, isShowingStopButton] = await page.evaluate(
await sleep(900)
const [resultContents1, isShowingStopButton] = await page.evaluate(
(stopButtonSelector) => {
return [
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
Expand All @@ -269,30 +283,15 @@ describe('browser', () => {
},
stopButtonSelector,
)
expect(JSON.parse(resultContents)).toEqual({
data: {
stream: ['A'],
},
})
expect(isShowingStopButton).toEqual(true)
await new Promise((resolve) => setTimeout(resolve, 2200))
const [resultContents1, isShowingPlayButton] = await page.evaluate(
(playButtonSelector) => {
return [
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
window.g.resultComponent.viewer.getValue(),
!!window.document.querySelector(playButtonSelector),
]
},
playButtonSelector,
)
expect(JSON.parse(resultContents1)).toEqual({
data: {
stream: ['A', 'B', 'C'],
},
})
expect(isShowingPlayButton).toEqual(true)
await page.click(stopButtonSelector)
await returnPromise$
expect(isShowingStopButton).toEqual(true)
})

test('execute SSE (subscription) operation', async () => {
Expand Down Expand Up @@ -537,3 +536,12 @@ describe('browser', () => {
})
})
})

function sleep<T = void>(
ms: number,
onTimeout: (timeout: NodeJS.Timeout) => T = () => {
return undefined as T
},
) {
return new Promise((resolve) => onTimeout(setTimeout(resolve, ms)))
}

0 comments on commit 6db3a16

Please sign in to comment.