Example #1
0
        public async Task <GraphQLOutput> Query(GraphQLQuery query)
        {
            GraphQLOutput output = null;

            try
            {
                var executionOptions = new ExecutionOptions()
                {
                    Schema = Schema,
                    Query  = query.Query,
                    Inputs = query.GetInputs()
                };
                var executionResult = await Executer.ExecuteAsync(executionOptions);

                output = new GraphQLOutput(executionResult.Data, executionResult.Errors?.ToArray());
            }
            catch (Exception ex)
            {
                output = new GraphQLOutput(null, new[] { new ExecutionError("Controller exception", ex), });
            }
            if (!DisplayStackTrace && output.Errors != null)
            {
                foreach (var error in output.Errors)
                {
                    error.StackTrace = null;
                }
            }
            return(output);
        }
Example #2
0
        private string RunOperation(string query, Inputs inputs)
        {
            var executionResult = Executer.ExecuteAsync(Schema, null, query, null, inputs: inputs).Result;
            var output          = new GraphQLOutput(executionResult.Data, executionResult.Errors?.ToArray());

            return(JsonConvert.SerializeObject(output, SerializerSettings));
        }
Example #3
0
        public ExecutionResult AssertQueryIgnoreErrors(
            string query,
            ExecutionResult expectedExecutionResult,
            Inputs inputs,
            object root,
            object userContext = null,
            CancellationToken cancellationToken = default(CancellationToken),
            int expectedErrorCount = 0)
        {
            var runResult = Executer.ExecuteAsync(Schema, root, query, null, inputs, userContext, cancellationToken).Result;

            var writtenResult = Writer.Write(new ExecutionResult {
                Data = runResult.Data
            });
            var expectedResult = Writer.Write(expectedExecutionResult);

            // #if DEBUG
            //             Console.WriteLine(writtenResult);
            // #endif

            writtenResult.ShouldBe(expectedResult);

            var errors = runResult.Errors ?? new ExecutionErrors();

            errors.Count().ShouldBe(expectedErrorCount);

            return(runResult);
        }
Example #4
0
        // [Fact]
        public void Executes_IsQuickerThanTotalTaskTime()
        {
            var query = @"
                query HeroNameAndFriendsQuery {
                  halfSecond,
                  quarterSecond
                }
            ";

            var smallListTimer = new Stopwatch();

            smallListTimer.Start();

            var runResult2 = Executer.ExecuteAsync(_ =>
            {
                _.EnableMetrics      = false;
                _.SetFieldMiddleware = false;
                _.Schema             = Schema;
                _.Query = query;
            }).GetAwaiter().GetResult();

            smallListTimer.Stop();

            runResult2.Errors.ShouldBeNull();
            smallListTimer.ElapsedMilliseconds.ShouldBeLessThan(900);
        }
        public void Executes_IsQuickerThanTotalTaskTime()
        {
            var query = @"
                query HeroNameAndFriendsQuery {
                  halfSecond,
                  quarterSecond
                }
            ";

            var             smallListTimer = new Stopwatch();
            ExecutionResult runResult2     = null;

            smallListTimer.Start();

            runResult2 = Executer.ExecuteAsync(_ =>
            {
                _.EnableMetrics      = false;
                _.SetFieldMiddleware = false;
                _.Schema             = Schema;
                _.Query              = query;
                _.Root               = null;
                _.Inputs             = null;
                _.UserContext        = null;
                _.CancellationToken  = default(CancellationToken);
                _.ValidationRules    = null;
                _.FieldNameConverter = new CamelCaseFieldNameConverter();
            }).GetAwaiter().GetResult();

            smallListTimer.Stop();

            Assert.Null(runResult2.Errors);

            Assert.True(smallListTimer.ElapsedMilliseconds < 900);
        }
Example #6
0
        public async Task Mutations_RunSyncronously()
        {
            var query = @"
                mutation Multiple {
                  m1:setFive
                  m2:setFive
                  m3:setOne
                  m4:setOne
                  m5:setOne
                  m6:setFive
                  m7:setFive
                  m8:setFive
                  m9:setFive
                  m10:setOne
                  m11:setFive
                  m12:setOne
                  m13:setFive
                  m14:setOne
                  m15:setFive
                  m16:setOne
                  m17:setFive
                }
            ";

            var runResult2 = await Executer.ExecuteAsync(_ =>
            {
                _.Schema = Schema;
                _.Query  = query;
            });

            var result = runResult2.Data as dynamic;

            runResult2.Errors.ShouldBeNull();
            ((string)result["m17"]).ShouldBe("5,5,1,1,1,5,5,5,5,1,5,1,5,1,5,1,5");
        }
        // [Fact]
        public async Task Executes_SimpleLists_Are_Performant()
        {
            var query = @"
                query AQuery {
                    people{
                        name
                    }
                }
            ";

            var smallListTimer = new Stopwatch();

            smallListTimer.Start();

            var runResult2 = await Executer.ExecuteAsync(_ =>
            {
                _.SetFieldMiddleware = false;
                _.EnableMetrics      = false;
                _.Schema             = Schema;
                _.Query              = query;
                _.Root               = PeopleList;
                _.Inputs             = null;
                _.UserContext        = null;
                _.CancellationToken  = default(CancellationToken);
                _.ValidationRules    = null;
                _.FieldNameConverter = new CamelCaseFieldNameConverter();
            });

            smallListTimer.Stop();

            _output.WriteLine($"Total Milliseconds: {smallListTimer.ElapsedMilliseconds}");

            Assert.Null(runResult2.Errors);
            Assert.True(smallListTimer.ElapsedMilliseconds < 700 * 2); //machine specific data with a buffer
        }
    public async Task Mutations_RunSynchronously()
    {
        var query = @"
                mutation Multiple {
                  m1:setFive
                  m2:setFive
                  m3:setOne
                  m4:setOne
                  m5:setOne
                  m6:setFive
                  m7:setFive
                  m8:setFive
                  m9:setFive
                  m10:setOne
                  m11:setFive
                  m12:setOne
                  m13:setFive
                  m14:setOne
                  m15:setFive
                  m16:setOne
                  m17:setFive
                }
            ";

        var result = await Executer.ExecuteAsync(_ =>
        {
            _.Schema = Schema;
            _.Query  = query;
        }).ConfigureAwait(false);

        result.Errors.ShouldBeNull();
        ((string)result.Data.ToDict()["m17"]).ShouldBe("5,5,1,1,1,5,5,5,5,1,5,1,5,1,5,1,5");
    }
Example #9
0
        public void input_types_and_types_without_key_directive_are_not_added_to_entities_union()
        {
            var definitions = @"
                input UserInput {
                    limit: Int!
                    offset: Int
                }

                type Comment {
                    id: ID!
                }

                type User @key(fields: ""id"") {
                    id: ID! @external
                }
            ";

            var query = "{ __schema { types { name kind possibleTypes { name } } } }";

            var data = JObject.FromObject(Executer.ExecuteAsync(_ =>
            {
                _.Schema = Builder.Build(definitions);
                _.Query  = query;
            }).Result.Data).SelectToken("$.__schema.types[?(@.name == '_Entity')].possibleTypes..name");

            Assert.Equal("User", data.ToString());
        }
        public void input_types_and_types_without_key_directive_are_not_added_to_entities_union()
        {
            var definitions = @"
                input UserInput {
                    limit: Int!
                    offset: Int
                }

                type Comment {
                    id: ID!
                }

                type User @key(fields: ""id"") {
                    id: ID! @external
                }
            ";

            var query = "{ __schema { types { name kind possibleTypes { name } } } }";

            var executionResult = Executer.ExecuteAsync(_ =>
            {
                _.Schema = Builder.Build(definitions);
                _.Query  = query;
            }).GetAwaiter().GetResult();

            var data          = executionResult.Data.ToDict();
            var schema        = data["__schema"].ToDict();
            var types         = (IEnumerable <object>)schema["types"];
            var entityType    = types.Single(t => (string)t.ToDict()["name"] == "_Entity").ToDict();
            var possibleTypes = (IEnumerable <object>)entityType["possibleTypes"];
            var possibleType  = possibleTypes.First().ToDict();
            var name          = (string)possibleType["name"];

            Assert.Equal("User", name);
        }
Example #11
0
        public void Executes_MultipleProperties_Are_Performant()
        {
            var query = @"
                query AQuery {
                    people{
                        name
                        name1:name
                        name2:name
                        name3:name
                        name4:name
                        name5:name
                        name6:name
                        name7:name
                        name8:name
                        name9:name
                        name10:name
                        name11:name
                        name12:name
                        name13:name
                        name14:name
                        name15:name
                        name16:name
                        name17:name
                        name18:name
                        name19:name
                    }
                }
            ";

            var smallListTimer = new Stopwatch();

            smallListTimer.Start();

            var runResult2 = Executer.ExecuteAsync(_ =>
            {
                _.EnableMetrics      = false;
                _.SetFieldMiddleware = false;
                _.Schema             = Schema;
                _.Query              = query;
                _.Root               = PeopleList;
                _.Inputs             = null;
                _.UserContext        = null;
                _.CancellationToken  = default(CancellationToken);
                _.ValidationRules    = null;
                _.FieldNameConverter = new CamelCaseFieldNameConverter();
            }).GetAwaiter().GetResult();

            smallListTimer.Stop();

            _output.WriteLine($"Total Milliseconds: {smallListTimer.ElapsedMilliseconds}");

            Assert.Null(runResult2.Errors);
            Assert.True(smallListTimer.ElapsedMilliseconds < 6000 * 2); //machine specific data with a buffer
        }
        public async Task NodeQuery_ShouldReturnNodeForId(string query, string expected)
        {
            var result = await Executer.ExecuteAsync(options =>
            {
                options.Schema = Schema;
                options.Query  = query;
            });

            var writtenResult = Serializer.Serialize(result);

            writtenResult.ShouldBe(expected);
        }
Example #13
0
        public SimpleQueryFixture()
        {
            var builder = new ContainerBuilder();

            builder.RegisterCqrs(new[] { GetType().Assembly });

            Container = builder.Build();

            Executer = Container.Resolve <IHandlerExecutor>();
            Query    = new SimpleQuery();
            Result   = Executer.ExecuteAsync(Query).GetAwaiter().GetResult();
        }
        public async Task should_show_code_when_exception_thrown_with_async_field(string query, string code)
        {
            var result = await Executer.ExecuteAsync(_ =>
            {
                _.Schema = Schema;
                _.Query  = query;
            });

            result.Errors.Count.ShouldBe(1);
            var error = result.Errors.First();

            error.Code.ShouldBe(code);
        }
Example #15
0
    public async Task should_include_path()
    {
        var result = await Executer.ExecuteAsync(_ =>
        {
            _.Schema = Schema;
            _.Query  = @"{ testSub { one two } }";
        }).ConfigureAwait(false);

        result.Errors.Count.ShouldBe(1);
        var error = result.Errors.First();

        error.Path.ShouldBe(new[] { "testSub", "two" });
    }
        public async Task should_propagate_exception_data_when_exception_is_thrown_in_field_resolver()
        {
            var result = await Executer.ExecuteAsync(_ =>
            {
                _.Schema = Schema;
                _.Query  = @"{ secondSync }";
            });

            result.Errors.Count.ShouldBe(1);
            var error = result.Errors.First();

            error.Data["Foo"].ShouldBe("Bar");
        }
Example #17
0
        public async Task should_include_path_with_list_index()
        {
            var result = await Executer.ExecuteAsync(_ =>
            {
                _.Schema = Schema;
                _.Query  = @"{ testSubList { one two } }";
            });

            result.Errors.Count.ShouldBe(1);
            var error = result.Errors.First();

            error.Path.ShouldBe(new[] { "testSubList", "0", "two" });
        }
Example #18
0
        public async Task should_show_location_when_exception_thrown_with_async_field(string query, int line, int column)
        {
            var result = await Executer.ExecuteAsync(_ =>
            {
                _.Schema = Schema;
                _.Query  = query;
            });

            result.Errors.Count.ShouldBe(1);
            var error = result.Errors.First();

            error.Locations.Count().ShouldBe(1);
            var location = error.Locations.First();

            location.Line.ShouldBe(line);
            location.Column.ShouldBe(column);
        }
Example #19
0
        public async Task <IActionResult> PostAsync([FromBody] GraphQuery query)
        {
            TokenManager.Token = ExtractAccessToken();
            var result = await Executer.ExecuteAsync(options =>
            {
                options.Schema = Schema;
                options.Query  = query.Query;
                options.Listeners.Add(DocumentListener);
            }).ConfigureAwait(false);

            if (result.Errors?.Count > 0)
            {
                return(BadRequest(result));
            }

            return(Ok(result));
        }
Example #20
0
        // [Fact]
        public void Executes_StarWarsBasicQuery_Performant()
        {
            var query = @"
                query HeroNameAndFriendsQuery {
                  hero {
                    id
                    name
                    appearsIn
                    friends {
                      name
                      appearsIn
                    }
                  }
                }
            ";

            var             smallListTimer = new Stopwatch();
            ExecutionResult runResult2     = null;

            smallListTimer.Start();

            //Note: Implementing a custom IDocumentValidator would increase speeds 600%
            for (var x = 0; x < 10000; x++)
            {
                runResult2 = Executer.ExecuteAsync(_ =>
                {
                    _.SetFieldMiddleware = false;
                    _.EnableMetrics      = false;
                    _.Schema             = Schema;
                    _.Query              = query;
                    _.Root               = null;
                    _.Inputs             = null;
                    _.UserContext        = null;
                    _.CancellationToken  = default(CancellationToken);
                    _.ValidationRules    = null;
                    _.FieldNameConverter = new CamelCaseFieldNameConverter();
                }).GetAwaiter().GetResult();
            }

            smallListTimer.Stop();

            _output.WriteLine($"Milliseconds: {smallListTimer.ElapsedMilliseconds}");

            Assert.Null(runResult2.Errors);
            Assert.True(smallListTimer.ElapsedMilliseconds < 9400 * 2); //machine specific data with a buffer
        }
        public async Task should_show_location_when_exception_thrown(string body, int line, int column)
        {
            var result = await Executer.ExecuteAsync(
                Schema,
                null,
                body,
                null
                );

            result.Errors.Count.ShouldBe(1);
            var error = result.Errors.First();

            error.Locations.Count().ShouldBe(1);
            var location = error.Locations.First();

            location.Line.ShouldBe(line);
            location.Column.ShouldBe(column);
        }
        public void Mutations_RunSyncronously()
        {
            var query = @"
                mutation Multiple {
                  m1:setFive
                  m2:setFive
                  m3:setOne
                  m4:setOne
                  m5:setOne
                  m6:setFive
                  m7:setFive
                  m8:setFive
                  m9:setFive
                  m10:setOne
                  m11:setFive
                  m12:setOne
                  m13:setFive
                  m14:setOne
                  m15:setFive
                  m16:setOne
                  m17:setFive
                }
            ";

            ExecutionResult runResult2 = null;

            runResult2 = Executer.ExecuteAsync(_ =>
            {
                _.Schema             = Schema;
                _.Query              = query;
                _.Root               = null;
                _.Inputs             = null;
                _.UserContext        = null;
                _.CancellationToken  = default(CancellationToken);
                _.ValidationRules    = null;
                _.FieldNameConverter = new CamelCaseFieldNameConverter();
            }).GetAwaiter().GetResult();

            var result = runResult2.Data as dynamic;

            Assert.Null(runResult2.Errors);
            Assert.Equal("5,5,1,1,1,5,5,5,5,1,5,1,5,1,5,1,5", result["m17"]);
        }
Example #23
0
        public async Task parsing_error_for_bad_query(string query, int errorLine, int errorColumn)
        {
            var result = await Executer.ExecuteAsync(_ =>
            {
                _.Schema = Schema;
                _.Query  = query;
            });

            result.Errors.Count.ShouldBe(1);
            var error = result.Errors.First();

            error.Code.ShouldBe("SYNTAX_ERROR");
            error.Locations.ShouldNotBeNull();
            error.Locations.Count().ShouldBe(1);
            error.Locations.First().Line.ShouldBe(errorLine);
            error.Locations.First().Column.ShouldBe(errorColumn);
            error.Message.ShouldStartWith("Error parsing query:");
            error.InnerException.ShouldBeOfType <GraphQLParser.Exceptions.GraphQLSyntaxErrorException>();
        }
        public async Task should_not_add_extension_object_when_exception_is_thrown_without_error_code()
        {
            string query = "{ uncodedSync }";

            var result = await Executer.ExecuteAsync(_ =>
            {
                _.Schema = Schema;
                _.Query  = query;
            });

            var errors = new ExecutionErrors();
            var error  = new ExecutionError("Error trying to resolve uncodedSync.");

            error.AddLocation(1, 3);
            error.Path = new[] { "uncodedSync" };
            errors.Add(error);

            var expectedResult = "{uncodedSync: null}";

            AssertQuery(query, CreateQueryResult(expectedResult, errors), null, null);
        }
Example #25
0
        public ExecutionResult AssertQuery(
            string query,
            ExecutionResult expectedExecutionResult,
            Inputs inputs,
            object root,
            object userContext = null,
            CancellationToken cancellationToken = default(CancellationToken),
            IEnumerable <IValidationRule> rules = null)
        {
            var runResult = Executer.ExecuteAsync(
                Schema,
                root,
                query,
                null,
                inputs,
                userContext,
                cancellationToken,
                rules
                ).Result;

            var writtenResult  = Writer.Write(runResult);
            var expectedResult = Writer.Write(expectedExecutionResult);

            // #if DEBUG
            //             Console.WriteLine(writtenResult);
            // #endif

            string additionalInfo = null;

            if (runResult.Errors?.Any() == true)
            {
                additionalInfo = string.Join(Environment.NewLine, runResult.Errors
                                             .Where(x => x.InnerException is GraphQLSyntaxErrorException)
                                             .Select(x => x.InnerException.Message));
            }

            writtenResult.ShouldBe(expectedResult, additionalInfo);

            return(runResult);
        }
        public async Task should_add_extension_object_when_exception_is_thrown_with_error_code()
        {
            string query = "{ firstSync }";
            string code  = "FIRST";

            var result = await Executer.ExecuteAsync(_ =>
            {
                _.Schema = Schema;
                _.Query  = query;
            });

            var errors = new ExecutionErrors();
            var error  = new ValidationError(query, code, "Error trying to resolve firstSync.", new SystemException("Just inner exception 1", new DllNotFoundException("just inner exception 2")));

            error.AddLocation(1, 3);
            error.Path = new[] { "firstSync" };
            errors.Add(error);

            var expectedResult = @"{ ""firstSync"": null}";

            AssertQuery(query, CreateQueryResult(expectedResult, errors), null, null);
        }
Example #27
0
        public ExecutionResult ExecuteQuery(
            string query,
            Inputs inputs,
            object root,
            object userContext = null,
            CancellationToken cancellationToken       = default(CancellationToken),
            IEnumerable <IPluginValidationRule> rules = null)
        {
            var fixedRules = rules != null?rules.ToList() : new List <IPluginValidationRule>();

            var newRules  = fixedRules.Concat(DocumentValidator.CoreRules());
            var runResult = Executer.ExecuteAsync(
                Schema,
                root,
                query,
                null,
                inputs,
                userContext,
                cancellationToken,
                newRules
                ).Result;

            var writtenResult = Writer.Write(runResult);

            // #if DEBUG
            //             Console.WriteLine(writtenResult);
            // #endif

            string additionalInfo = null;

            if (runResult.Errors?.Any() == true)
            {
                additionalInfo = string.Join(Environment.NewLine, runResult.Errors
                                             .Where(x => x.InnerException is GraphQLSyntaxErrorException)
                                             .Select(x => x.InnerException.Message));
            }

            return(runResult);
        }
        public void extension_has_expected_format()
        {
            var query = @"
query {
  hero {
    name
    friends {
      name
    }
  }
}";

            var start  = DateTime.UtcNow;
            var result = Executer.ExecuteAsync(_ =>
            {
                _.Schema        = Schema;
                _.Query         = query;
                _.EnableMetrics = true;
                _.FieldMiddleware.Use <InstrumentFieldsMiddleware>();
            }).Result;

            result.EnrichWithApolloTracing(start);
            var trace = (ApolloTrace)result.Extensions["tracing"];

            trace.Version.ShouldBe(1);
            trace.Parsing.StartOffset.ShouldNotBe(0);
            trace.Parsing.Duration.ShouldNotBe(0);
            trace.Validation.StartOffset.ShouldNotBe(0);
            trace.Validation.Duration.ShouldNotBe(0);
            trace.Validation.StartOffset.ShouldNotBeSameAs(trace.Parsing.StartOffset);
            trace.Validation.Duration.ShouldNotBeSameAs(trace.Parsing.Duration);

            var expectedPaths = new HashSet <List <object> >
            {
                new List <object> {
                    "hero"
                },
                new List <object> {
                    "hero", "name"
                },
                new List <object> {
                    "hero", "friends"
                },
                new List <object> {
                    "hero", "friends", 0, "name"
                },
                new List <object> {
                    "hero", "friends", 1, "name"
                },
            };

            var paths = new List <List <object> >();

            foreach (var resolver in trace.Execution.Resolvers)
            {
                resolver.StartOffset.ShouldNotBe(0);
                resolver.Duration.ShouldNotBe(0);
                resolver.ParentType.ShouldNotBeNull();
                resolver.ReturnType.ShouldNotBeNull();
                resolver.FieldName.ShouldBe((string)resolver.Path.Last());
                paths.Add(resolver.Path);
            }
            paths.Count.ShouldBe(expectedPaths.Count);
            new HashSet <List <object> >(paths).ShouldBe(expectedPaths);
        }