Skip to content

Commit

Permalink
Subscriptions: Test source errors and execution errors.
Browse files Browse the repository at this point in the history
After discussion in #868, decided that errors emitted from a source event stream should be considered "internal" errors and pass through.

However errors encountered during GraphQL execution on a source event should be considered "field" or "query" errors and be represented within that Response.
  • Loading branch information
leebyron committed May 30, 2017
1 parent 02ded50 commit 1d937d2
Showing 1 changed file with 130 additions and 0 deletions.
130 changes: 130 additions & 0 deletions src/subscription/__tests__/subscribe-test.js
Expand Up @@ -714,4 +714,134 @@ describe('Subscribe', () => {
await subscription.next()
).to.deep.equal({ value: undefined, done: true });
});

it('should handle error during execuction of source event', async () => {
const erroringEmailSchema = emailSchemaWithResolvers(
async function* () {
yield { email: { subject: 'Hello' } };
yield { email: { subject: 'Goodbye' } };
yield { email: { subject: 'Bonjour' } };
},
event => {
if (event.email.subject === 'Goodbye') {
throw new Error('Never leave.');
}
return event;
}
);

const subscription = subscribe(
erroringEmailSchema,
parse(`
subscription {
importantEmail {
email {
subject
}
}
}
`)
);

const payload1 = await subscription.next();
expect(payload1).to.deep.equal({
done: false,
value: {
data: {
importantEmail: {
email: {
subject: 'Hello'
}
}
}
}
});

// An error in execution is presented as such.
const payload2 = await subscription.next();
expect(payload2).to.deep.equal({
done: false,
value: {
errors: [
{
message: 'Never leave.',
locations: [ { line: 3, column: 11 } ],
path: [ 'importantEmail' ],
}
],
data: {
importantEmail: null,
}
}
});

// However that does not close the response event stream. Subsequent
// events are still executed.
const payload3 = await subscription.next();
expect(payload3).to.deep.equal({
done: false,
value: {
data: {
importantEmail: {
email: {
subject: 'Bonjour'
}
}
}
}
});

});

it('should pass through error thrown in source event stream', async () => {
const erroringEmailSchema = emailSchemaWithResolvers(
async function* () {
yield { email: { subject: 'Hello' } };
throw new Error('test error');
},
email => email
);

const subscription = subscribe(
erroringEmailSchema,
parse(`
subscription {
importantEmail {
email {
subject
}
}
}
`)
);

const payload1 = await subscription.next();
expect(payload1).to.deep.equal({
done: false,
value: {
data: {
importantEmail: {
email: {
subject: 'Hello'
}
}
}
}
});

let expectedError;
try {
await subscription.next();
} catch (error) {
expectedError = error;
}

expect(expectedError).to.deep.equal(new Error('test error'));

const payload2 = await subscription.next();
expect(payload2).to.deep.equal({
done: true,
value: undefined
});
});
});

0 comments on commit 1d937d2

Please sign in to comment.