Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(incrementalDelivery): fix null bubbling with async iterables #3760

Merged
merged 2 commits into from
Oct 27, 2022

Conversation

yaacovCR
Copy link
Contributor

extracted from #3754

This is actually more than a simple refactoring, as it includes a bug fix.

When a non-null list is streamed and completeValue for a list item fails, the error should bubble up to the list itself and no further payloads should be sent.

Previously, this was case only when the field resolver for the list returned an iterable, but not when it returned an async iterable. In the latter case, the null correctly bubbles to the list itself for the given payload (items: null rather than items: [null), but further payloads would still be sent. This PR aligns async iterables to the behavior of iterables where further payloads will not be sent.

When a non-null list is streamed and completeValue for a list item
fails, the error should bubble up to the list itself and no further
payloads should be sent.

Addition of tests within this change demonstrates that this is currently
the case only when the field resolver for the list returns an iterable,
but not when it returns an async iterable. In the latter case, the null
correctly bubbles to the list itself for the given payload (`items:
null` rather than `items: [null`), but further payloads are sent.
when a null bubbles up, no further payloads should be sent.
@yaacovCR yaacovCR added the PR: bug fix 🐞 requires increase of "patch" version number label Oct 18, 2022
@yaacovCR yaacovCR requested review from robrichard, IvanGoncharov and a team October 18, 2022 09:22
@netlify
Copy link

netlify bot commented Oct 18, 2022

Deploy Preview for compassionate-pike-271cb3 ready!

Name Link
🔨 Latest commit b020207
🔍 Latest deploy log https://app.netlify.com/sites/compassionate-pike-271cb3/deploys/634e70558cd83500080780a4
😎 Deploy Preview https://deploy-preview-3760--compassionate-pike-271cb3.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify site settings.

@IvanGoncharov IvanGoncharov merged commit 0b7daed into graphql:main Oct 27, 2022
@yaacovCR yaacovCR deleted the less branch October 30, 2022 02:10
yaacovCR added a commit to yaacovCR/graphql-js that referenced this pull request Jan 5, 2023
I introduced use of expect.fail() in graphql#3760 mistakenly believing that expect.fail() will always cause the test to fail.

Actually, expect.fail() just throws an error, and that error is wrapped is wrapped by GraphQL and then filtered, so the lines are reached.

Fortunately, it's not a problem that the line is reached, as long as it is filtered correctly. The number of calls to next() may be more than 1 (in our case it is 2) depending on the # of ticks that it takes for the deferred fragment to resolve.

So the test as written is intending to be overly strict, but is broken and so functions as desires. This commit makes no change to the test semantics, but changes the comment, the coverage ignore statement, and removes the confusing use of expect.fail, so that the test semantics are more clearly apparent.
yaacovCR added a commit that referenced this pull request Jan 6, 2023
`expect.fail()` was mistakenly introduced in #3760 under the assumption that expect.fail() will always cause the test to fail, and that `.next()` should be called at most once.

Actually, thought, `expect.fail()` just throws an error, `.next()` is called more than once, the error is produced and wrapped by GraphQL, but then it is filtered, so the test ultimately passes.

Fortunately, that's actually the desired behavior! It's ok if the number of calls to `.next()` is more than 1 (in our case it is 2). The exact number of calls to `.next()` depends on the # of ticks that it takes for the erroring deferred fragment to resolve, which should be as low as possible, but that is a separate objective (with other PRs in the mix already aimed at reducing).

So the test as written is intending to be overly strict, but is not actually meeting that goal and so functions as desires. This PR makes no change to the test semantics, but changes the comment, the coverage ignore statement, and removes the potentially confusing use of `expect.fail`, so that the test semantics are more clearly apparent.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
PR: bug fix 🐞 requires increase of "patch" version number
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants