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); }
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)); }
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); }
// [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); }
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"); }
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); }
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); }
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); }
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"); }
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" }); }
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); }
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)); }
// [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"]); }
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); }
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); }
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); }