Esempio n. 1
0
        public void DirectFieldSelectionOnUnion()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                query {
                    catOrDog {
                        ... directFieldSelectionOnUnion
                    }
                }

                fragment directFieldSelectionOnUnion on CatOrDog {
                    name
                    barkVolume
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Collection(context.Errors,
                              t => Assert.Equal(
                                  "A union type cannot declare a field directly. " +
                                  "Use inline fragments or fragments instead", t.Message));
            context.Errors.First().MatchSnapshot();
        }
Esempio n. 2
0
        public void InDirectFieldSelectionOnUnion()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                query {
                    dog {
                        ... inDirectFieldSelectionOnUnion
                    }
                }

                fragment inDirectFieldSelectionOnUnion on CatOrDog {
                    __typename
                    ... on Pet {
                        name
                    }
                    ... on Dog {
                        barkVolume
                    }
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Empty(context.Errors);
        }
Esempio n. 3
0
        public void DefinedOnImplementorsButNotInterfaceOnPet()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                query {
                    dog {
                        ... definedOnImplementorsButNotInterface
                    }
                }

                fragment definedOnImplementorsButNotInterface on Pet {
                    nickname
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Collection(context.Errors,
                              t => Assert.Equal(
                                  "The field `nickname` does not exist " +
                                  "on the type `Pet`.", t.Message));
            context.Errors.First().MatchSnapshot();
        }
        public void NotOnExistingTypeOnFragment()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                {
                    dog {
                        ...notOnExistingType
                    }
                }

                fragment notOnExistingType on NotInSchema {
                    name
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Collection(context.Errors,
                              t =>
            {
                Assert.Equal(
                    "Unknown type `NotInSchema`.",
                    t.Message);
            });
            context.Errors.MatchSnapshot();
        }
Esempio n. 5
0
        public static void ExpectValid(
            ISchema schema,
            Action <IValidationBuilder> configure,
            string sourceText)
        {
            // arrange
            var serviceCollection = new ServiceCollection();

            IValidationBuilder builder = serviceCollection
                                         .AddValidation()
                                         .ConfigureValidation(c => c.Modifiers.Add(o => o.Rules.Clear()));

            configure(builder);

            IServiceProvider services = serviceCollection.BuildServiceProvider();
            var rule = services.GetRequiredService <IValidationConfiguration>()
                       .GetRules("Default").First();

            IDocumentValidatorContext context = ValidationUtils.CreateContext(schema);
            DocumentNode query = Utf8GraphQLParser.Parse(sourceText);

            context.Prepare(query);

            // act
            rule.Validate(context, query);

            // assert
            Assert.False(context.UnexpectedErrorsDetected);
            Assert.Empty(context.Errors);
        }
        public void TwoOperationsThatShareVariableName()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                query A($atOtherHomes: Boolean) {
                  ...HouseTrainedFragment
                }

                query B($atOtherHomes: Boolean) {
                  ...HouseTrainedFragment
                }

                fragment HouseTrainedFragment on Query {
                  dog {
                    isHousetrained(atOtherHomes: $atOtherHomes)
                  }
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Empty(context.Errors);
        }
        public void QueriesWithValidVariableTypes()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                query takesBoolean($atOtherHomes: Boolean) {
                    dog {
                        isHouseTrained(atOtherHomes: $atOtherHomes)
                    }
                }

                query takesComplexInput($complexInput: ComplexInput) {
                    findDog(complex: $complexInput) {
                        name
                    }
                }

                query TakesListOfBooleanBang($booleans: [Boolean!]) {
                    booleanList(booleanListArg: $booleans)
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Empty(context.Errors);
        }
        public void VariableNotUsedWithinFragment()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                query variableNotUsedWithinFragment($atOtherHomes: Boolean) {
                    dog {
                        ...isHousetrainedWithoutVariableFragment
                    }
                }

                fragment isHousetrainedWithoutVariableFragment on Dog {
                    isHousetrained
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Collection(context.Errors,
                              t => Assert.Equal(
                                  "The following variables were not used: " +
                                  "atOtherHomes.", t.Message));
        }
        public void VariableUsedInSecondLevelFragment()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                query variableUsedInFragment($atOtherHomes: Boolean) {
                    dog {
                        ...isHousetrainedFragment
                    }
                }

                fragment isHousetrainedFragment on Dog {
                    ...isHousetrainedFragmentLevel2
                }

                fragment isHousetrainedFragmentLevel2 on Dog {
                    isHousetrained(atOtherHomes: $atOtherHomes)
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.False(context.Errors.Count > 0);
        }
        public void VarsMustBeDefinedInAllOperationsInWhichAFragmentIsUsedErr()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                query variableIsNotDefinedUsedInNestedFragment {
                    dog {
                        ...outerHousetrainedFragment
                    }
                }

                fragment outerHousetrainedFragment on Dog {
                    ...isHousetrainedFragment
                }

                fragment isHousetrainedFragment on Dog {
                    isHousetrained(atOtherHomes: $atOtherHomes)
                }");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.True(context.Errors.Count > 0);
            Assert.Collection(context.Errors,
                              t => Assert.Equal(
                                  "The following variables were not declared: " +
                                  "atOtherHomes.", t.Message));
        }
        public void QueryWithExtraVar()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                query queryWithUsedVar($atOtherHomes: Boolean) {
                    dog {
                        ...isHousetrainedFragment
                    }
                }

                query queryWithExtraVar($atOtherHomes: Boolean, $extra: Int) {
                    dog {
                        ...isHousetrainedFragment
                    }
                }

                fragment isHousetrainedFragment on Dog {
                    isHousetrained(atOtherHomes: $atOtherHomes)
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.True(context.Errors.Count > 0);
            Assert.Collection(context.Errors,
                              t => Assert.Equal(
                                  "The following variables were not used: " +
                                  "extra.", t.Message));
        }
Esempio n. 12
0
        public void DuplicateFragments()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                {
                    dog {
                        ...fragmentOne
                    }
                }

                fragment fragmentOne on Dog {
                    name
                }

                fragment fragmentOne on Dog {
                    owner {
                        name
                    }
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Collection(context.Errors,
                              t => Assert.Equal(
                                  "There are multiple fragments with the name `fragmentOne`.",
                                  t.Message));
            context.Errors.First().MatchSnapshot();
        }
        public void QueryWithSideBySideFragSpreads()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                {
                    dog {
                        ...dogFragment
                        ...dogFragment
                        ...dogFragment
                        ...dogFragment
                        ...dogFragment
                        ...dogFragment
                        ...dogFragment
                    }
                }

                fragment dogFragment on Dog {
                    name
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Empty(context.Errors);
        }
Esempio n. 14
0
        public void FragOnScalar()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                {
                    dog {
                       ... fragOnScalar
                    }
                }

                fragment fragOnScalar on Int {
                    something
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Collection(context.Errors,
                              t => Assert.Equal(t.Message,
                                                "Fragments can only be declared on unions, interfaces, " +
                                                "and objects."));
            context.Errors.MatchSnapshot();
        }
Esempio n. 15
0
        public void UniqueFragments()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                {
                    dog {
                        ...fragmentOne
                        ...fragmentTwo
                    }
                }

                fragment fragmentOne on Dog {
                    name
                }

                fragment fragmentTwo on Dog {
                    owner {
                        name
                    }
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Empty(context.Errors);
        }
Esempio n. 16
0
        public void UsedNestedFragment()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                fragment nameFragment on Dog {
                    name
                    ... nestedNameFragment
                }

                fragment nestedNameFragment on Dog {
                    name
                }

                {
                    dog {
                        name
                        ... nameFragment
                    }
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Empty(context.Errors);
        }
Esempio n. 17
0
        public void FragOnUnion()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                {
                    dog {
                       ... fragOnUnion
                    }
                }

                fragment fragOnUnion on CatOrDog {
                    ... on Dog {
                        name
                    }
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Empty(context.Errors);
        }
        public void VarsMustBeDefinedInAllOperationsInWhichAFragmentIsUsed()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                query housetrainedQueryOne($atOtherHomes: Boolean) {
                    dog {
                        ...isHousetrainedFragment
                    }
                }

                query housetrainedQueryTwo($atOtherHomes: Boolean) {
                    dog {
                        ...isHousetrainedFragment
                    }
                }

                query housetrainedQueryThree {
                    dog {
                        isHousetrained(atOtherHomes: true)
                    }
                }

                fragment isHousetrainedFragment on Dog {
                    isHousetrained(atOtherHomes: $atOtherHomes)
                }");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.False(context.Errors.Count > 0);
        }
Esempio n. 19
0
        public void UnusedFragment()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                fragment nameFragment on Dog { # unused
                    name
                }

                {
                    dog {
                        name
                    }
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Collection(context.Errors,
                              t => Assert.Equal(
                                  "The specified fragment `nameFragment` " +
                                  "is not used within the current document.", t.Message));
            context.Errors.MatchSnapshot();
        }
        public void DefinedFragment()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                {
                    dog {
                        ...definedFragment
                    }
                }

                fragment definedFragment on Dog
                {
                    barkVolume
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Empty(context.Errors);
        }
        public void OperationWithTwoVariablesThatHaveTheSameName()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                query houseTrainedQuery($atOtherHomes: Boolean, $atOtherHomes: Boolean) {
                    dog {
                        isHousetrained(atOtherHomes: $atOtherHomes)
                    }
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Single(context.Errors);
            Assert.Collection(context.Errors,
                              t => Assert.Equal(
                                  "A document containing operations that " +
                                  "define more than one variable with the same " +
                                  "name is invalid for execution.", t.Message));
        }
        public void UndefinedFragment()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                {
                    dog {
                        ...undefinedFragment
                    }
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Collection(context.Errors,
                              t => Assert.Equal(
                                  "The specified fragment `undefinedFragment` " +
                                  "does not exist.",
                                  t.Message));
            context.Errors.MatchSnapshot();
        }
        public void CorrectTypeOnInlineFragment2()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                {
                    dog {
                        ...inlineFragment2
                    }
                }

                fragment inlineFragment2 on Dog {
                    ... @include(if: true) {
                        name
                    }
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Empty(context.Errors);
        }
Esempio n. 24
0
        public void FragmentDoesNotMatchType()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                {
                    dog {
                        ...fragmentDoesNotMatchType
                    }
                }

                fragment fragmentDoesNotMatchType on Human {
                    name
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Collection(context.Errors,
                              t => Assert.Equal(t.Message,
                                                "The parent type does not match the type condition on " +
                                                "the fragment."));
            context.Errors.MatchSnapshot();
        }
        public void VariableUsedInDirective()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query_a = Utf8GraphQLParser.Parse(@"
                query variableUsedInFragment($atOtherHomes: Boolean) {
                    dog {
                        ...isHousetrainedFragment
                    }
                }

                fragment isHousetrainedFragment on Dog {
                    isHousetrained @skip(if: $atOtherHomes)
                }
            ");

            DocumentNode query_b = Utf8GraphQLParser.Parse(@"
                query variableUsedInFragment($atOtherHomes: Boolean) {
                    dog {
                        ...isHousetrainedFragment @skip(if: $atOtherHomes)
                    }
                }

                fragment isHousetrainedFragment on Dog {
                    isHousetrained
                }
            ");

            // act
            context.Prepare(query_a);
            Rule.Validate(context, query_a);

            context.Prepare(query_b);
            Rule.Validate(context, query_b);

            // assert
            Assert.Empty(context.Errors);
        }
        protected void ExpectValid(ISchema schema, string sourceText)
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext(schema);
            DocumentNode query = Utf8GraphQLParser.Parse(sourceText);

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.False(context.UnexpectedErrorsDetected);
            Assert.Empty(context.Errors);
        }
Esempio n. 27
0
        public static void ExpectErrors(
            ISchema schema,
            Action <IValidationBuilder> configure,
            string sourceText,
            IEnumerable <KeyValuePair <string, object> > contextData = null,
            params Action <IError>[] elementInspectors)
        {
            // arrange
            var serviceCollection = new ServiceCollection();

            IValidationBuilder builder = serviceCollection
                                         .AddValidation()
                                         .ConfigureValidation(c => c.Modifiers.Add(o => o.Rules.Clear()));

            configure(builder);

            IServiceProvider services = serviceCollection.BuildServiceProvider();
            var rule = services.GetRequiredService <IValidationConfiguration>()
                       .GetRules(Schema.DefaultName).First();

            IDocumentValidatorContext context = ValidationUtils.CreateContext(schema);
            DocumentNode query = Utf8GraphQLParser.Parse(sourceText);

            context.Prepare(query);

            if (contextData is not null)
            {
                foreach ((var key, object value) in contextData)
                {
                    context.ContextData[key] = value;
                }
            }

            // act
            rule.Validate(context, query);

            // assert
            Assert.NotEmpty(context.Errors);

            if (elementInspectors.Length > 0)
            {
                Assert.Collection(context.Errors, elementInspectors);
            }

            context.Errors.MatchSnapshot();
        }
        public void FragmentCycle2()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                {
                    dog {
                        ...nameFragment
                    }
                }

                fragment nameFragment on Dog {
                    name
                    ...barkVolumeFragment
                }

                fragment barkVolumeFragment on Dog {
                    barkVolume
                    ...barkVolumeFragment1
                }

                fragment barkVolumeFragment1 on Dog {
                    barkVolume
                    ...barkVolumeFragment2
                }

                fragment barkVolumeFragment2 on Dog {
                    barkVolume
                    ...nameFragment
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.Collection(context.Errors,
                              t => Assert.Equal(t.Message,
                                                "The graph of fragment spreads must not form any " +
                                                "cycles including spreading itself. Otherwise an " +
                                                "operation could infinitely spread or infinitely " +
                                                "execute on cycles in the underlying data."));
            context.Errors.MatchSnapshot();
        }
        public void VariableUsedInListInput()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                query queryWithListInput($value: Bool)
                {
                    booleanList(booleanListArg: [ $value ])
                }");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.False(context.Errors.Count > 0);
        }
        public void QueriesWithInvalidVariableTypes()
        {
            // arrange
            IDocumentValidatorContext context = ValidationUtils.CreateContext();
            DocumentNode query = Utf8GraphQLParser.Parse(@"
                query takesCat($cat: Cat) {
                    # ...
                }

                query takesDogBang($dog: Dog!) {
                    # ...
                }

                query takesListOfPet($pets: [Pet]) {
                    # ...
                }

                query takesCatOrDog($catOrDog: CatOrDog) {
                    # ...
                }
            ");

            context.Prepare(query);

            // act
            Rule.Validate(context, query);

            // assert
            Assert.NotEmpty(context.Errors);
            Assert.Collection(context.Errors,
                              t => Assert.Equal(
                                  "The type of variable `cat` is not an input type.",
                                  t.Message),
                              t => Assert.Equal(
                                  "The type of variable `dog` is not an input type.",
                                  t.Message),
                              t => Assert.Equal(
                                  "The type of variable `pets` is not an input type.",
                                  t.Message),
                              t => Assert.Equal(
                                  "The type of variable `catOrDog` is not an input type.",
                                  t.Message));
        }