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

add additional runtime errors for pre-coercion OneOf errors #4195

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

yaacovCR
Copy link
Contributor

This changes the implementation to match the specification.

Adds additional tests as well.

@yaacovCR yaacovCR requested a review from a team as a code owner September 18, 2024 13:00
Copy link

netlify bot commented Sep 18, 2024

Deploy Preview for compassionate-pike-271cb3 ready!

Name Link
🔨 Latest commit 5feb200
🔍 Latest deploy log https://app.netlify.com/sites/compassionate-pike-271cb3/deploys/66eb32a228af7b0008abe77e
😎 Deploy Preview https://deploy-preview-4195--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 configuration.

Copy link

Hi @yaacovCR, I'm @github-actions bot happy to help you with this PR 👋

Supported commands

Please post this commands in separate comments and only one per comment:

  • @github-actions run-benchmark - Run benchmark comparing base and merge commits for this PR
  • @github-actions publish-pr-on-npm - Build package from this PR and publish it on NPM

@yaacovCR yaacovCR added the PR: bug fix 🐞 requires increase of "patch" version number label Sep 18, 2024
Copy link
Member

@benjie benjie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for your work on this! It seems right; but let's improve the error messages

// A nullable variable in a oneOf field position would be caught at validation-time
// hence the vague error message here.
message:
'Argument "input" of type "TestInputObject!" has invalid value { a: $a, b: $b }.',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand the errors are vague and why; but the { a: $a } error messages below are confusing. Maybe it would be better to replace all the errors with:

Argument "input" of type "TestInputObject!" has invalid value - exactly one field must be specified, and the value for that field must not be `null`.

Copy link
Contributor Author

@yaacovCR yaacovCR Sep 18, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I updated the OneOf error messages to something uniform, but the vague ones are a result of the uniform behavior within getArgumentValues()

const coercedValue = coerceInputLiteral(
valueNode,
argType,
variableValues,
fragmentVariables,
);
if (coercedValue === undefined) {
// Note: ValuesOfCorrectTypeRule validation should catch this before
// execution. This is a runtime check to ensure execution does not
// continue with an invalid argument value.
throw new GraphQLError(
`Argument "${name}" of type "${inspect(
argType,
)}" has invalid value ${print(valueNode)}.`,
{ nodes: valueNode },
);
}
which does not transmit the original error (but would be caught at validation time).

Within #3813 , part of the rebased Default Value Coercion/Validation stack, @leebyron has fixed this to provide more informative errors.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think another way of saying what I am saying that all of the tests within the oneOf test file, including the new ones, actually belong within the tests for coerceInputValue() and coerceInputLiteral() (formerly known as valueFromAST()).

I'll set about to do that. Then these tests won't have opaque error messages in our test files that make it difficult to understand what exactly is being tested, although users who choose not to validate will still get opaque errors, at least until #3813 lands.

src/execution/__tests__/oneof-test.ts Show resolved Hide resolved
Copy link
Member

@benjie benjie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just being picky over capitalisation now...

Do we generally capitalise Object Type / Interface Type and so on in error messages? If so, the suggestions to reduce capitalization should be dismissed.

@@ -193,7 +193,7 @@ function validateOneOfInputObject(
if (isNotExactlyOneField) {
context.reportError(
new GraphQLError(
`OneOf Input Object "${type}" must specify exactly one key.`,
`Within OneOf Input Object Type "${type}", exactly one field must be specified, and the value for that field must be non-null.`,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
`Within OneOf Input Object Type "${type}", exactly one field must be specified, and the value for that field must be non-null.`,
`Within OneOf Input Object type "${type}", exactly one field must be specified, and the value for that field must be non-null.`,

nodes: [node],
}),
new GraphQLError(
`Within OneOf Input Object Type "${type}", exactly one field must be specified, and the value for that field must be non-null.`,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
`Within OneOf Input Object Type "${type}", exactly one field must be specified, and the value for that field must be non-null.`,
`Within OneOf input object type "${type}", exactly one field must be specified, and the value for that field must be non-null.`,

@@ -221,7 +224,7 @@ function validateOneOfInputObject(
if (isNullableVariable) {
context.reportError(
new GraphQLError(
`Variable "$${variableName}" must be non-nullable to be used for OneOf Input Object "${type}".`,
`Variable "$${variableName}" must be non-nullable to be used for Within OneOf Input Object Type "${type}".`,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
`Variable "$${variableName}" must be non-nullable to be used for Within OneOf Input Object Type "${type}".`,
`Variable "$${variableName}" must be non-nullable to be used for within OneOf input object type "${type}".`,

@@ -152,13 +157,13 @@ describe('Execute: Handles OneOf Input Objects', () => {
{
locations: [{ column: 16, line: 2 }],
message:
'Variable "$input" got invalid value { a: "abc", b: 123 }; Exactly one key must be specified for OneOf type "TestInputObject".',
'Variable "$input" got invalid value { a: "abc", b: 123 }; Within OneOf Input Object Type "TestInputObject", exactly one field must be specified, and the value for that field must be non-null.',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error seems to be a combination of two errors; ideally this Within should not have a capital letter since it's in the middle of a sentence. Alternatively; can the preceding semicolon be changed to a fullstop?

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.

2 participants