// This method extracts the relevant data from a merged result for a specific result. private static QueryResultBuilder ExtractResult( IDictionary <string, string> aliases, IQueryResult mergedResult, ICollection <IError> handledErrors) { var result = QueryResultBuilder.New(); // We first try to identify and copy data segments that belong to our specific result. ExtractData(aliases, mergedResult, result); // After extracting the data, we will try to find errors that can be associated with // our specific request for which we are trying to branch out the result. ExtractErrors(aliases, mergedResult, handledErrors, result); // Last but not least we will copy all extensions and contextData over // to the specific responses. if (mergedResult.Extensions is not null) { result.SetExtensions(mergedResult.Extensions); } if (mergedResult.ContextData is not null) { foreach (KeyValuePair <string, object?> item in mergedResult.ContextData) { result.SetContextData(item.Key, item.Value); } } return(result); }
public async Task DeserializeQueryResultWithErrors() { // arrange var qux = new OrderedDictionary { { "quux", 123 } }; var baz = new OrderedDictionary { { "qux", qux } }; var objectList = new List <object> { baz }; var scalarList = new List <object> { 123 }; var result = QueryResultBuilder.New(); var data = new OrderedDictionary(); data["foo"] = objectList; data["bar"] = scalarList; data["baz"] = baz; result.SetData(data); result.AddError(ErrorBuilder.New() .SetMessage("foo") .SetPath(Path.New("root").Append("child")) .AddLocation(new Location(15, 16)) .SetExtension("bar", "baz") .Build()); result.AddError(ErrorBuilder.New() .SetMessage("qux") .SetExtension("bar", "baz") .Build()); result.AddError(ErrorBuilder.New() .SetMessage("quux") .Build()); var stream = new MemoryStream(); var serializer = new JsonQueryResultSerializer(); await serializer.SerializeAsync(result.Create(), stream); byte[] buffer = stream.ToArray(); var serializedResult = Utf8GraphQLRequestParser.ParseJson(buffer); // act IReadOnlyQueryResult deserializedResult = HttpResponseDeserializer.Deserialize( (IReadOnlyDictionary <string, object>)serializedResult); // assert Snapshot.Match(deserializedResult); }
public async Task DispatchMultipleQueriesAndRewriteErrors() { // arrange string query = null; int count = 0; var result = QueryResultBuilder.New(); var data = new OrderedDictionary(); data["__0__a"] = "a"; data["__1__a"] = "b"; data["__1__b"] = "c"; result.SetData(data); result.AddError(ErrorBuilder.New() .SetMessage("foo") .SetPath(Path.New("__1__b")) .Build()); var executor = new Mock <IQueryExecutor>(); executor.Setup(t => t.ExecuteAsync( It.IsAny <IReadOnlyQueryRequest>(), It.IsAny <CancellationToken>())) .Returns(new Func <IReadOnlyQueryRequest, CancellationToken, Task <IExecutionResult> >((r, ct) => { count++; query = r.Query.ToString(); return(Task.FromResult <IExecutionResult>(result.Create())); })); var request_a = QueryRequestBuilder.Create("query a { a }"); var request_b = QueryRequestBuilder.Create("query b { a b }"); var client = new RemoteQueryClient( new EmptyServiceProvider(), executor.Object); // act Task <IExecutionResult> task_a = client.ExecuteAsync(request_a); Task <IExecutionResult> task_b = client.ExecuteAsync(request_b); await client.DispatchAsync(CancellationToken.None); // assert Assert.Equal(1, count); IExecutionResult result_a = await task_a; result_a.MatchSnapshot("DispatchMultipleQueriesAndRewriteErrors_A"); IExecutionResult result_b = await task_b; result_b.MatchSnapshot("DispatchMultipleQueriesAndRewriteErrors_B"); }
private static QueryResultBuilder ExtractResult( IDictionary <string, string> aliases, IQueryResult mergedResult, ICollection <IError> handledErrors) { var result = QueryResultBuilder.New(); if (mergedResult.Data is not null) { var data = new ResultMap(); data.EnsureCapacity(aliases.Count); var i = 0; foreach (KeyValuePair <string, string> alias in aliases) { if (mergedResult.Data.TryGetValue(alias.Key, out object?o)) { data.SetValue(i++, alias.Value, o); } } result.SetData(data); } if (mergedResult.Errors is not null) { foreach (IError error in mergedResult.Errors) { if (TryResolveField(error, aliases, out string?responseName)) { handledErrors.Add(error); result.AddError(RewriteError(error, responseName)); } } } if (mergedResult.Extensions is not null) { result.SetExtensions(mergedResult.Extensions); } if (mergedResult.ContextData is not null) { foreach (KeyValuePair <string, object?> item in mergedResult.ContextData) { result.SetContextData(item.Key, item.Value); } } return(result); }
public async Task DeserializeQueryResultWithExtensions() { // arrange var qux = new OrderedDictionary { { "quux", 123 } }; var baz = new OrderedDictionary { { "qux", qux } }; var objectList = new List <object> { baz }; var scalarList = new List <object> { 123 }; var result = QueryResultBuilder.New(); var data = new OrderedDictionary(); data["foo"] = objectList; data["bar"] = scalarList; data["baz"] = baz; result.SetData(data); var extensionData = new ExtensionData(); extensionData["foo"] = objectList; extensionData["bar"] = scalarList; extensionData["baz"] = baz; result.SetExtensions(extensionData); var stream = new MemoryStream(); var serializer = new JsonQueryResultSerializer(); await serializer.SerializeAsync(result.Create(), stream); byte[] buffer = stream.ToArray(); var serializedResult = Utf8GraphQLRequestParser.ParseJson(buffer); // act IReadOnlyQueryResult deserializedResult = HttpResponseDeserializer.Deserialize( (IReadOnlyDictionary <string, object>)serializedResult); // assert deserializedResult.MatchSnapshot(m => m.Ignore(c => c.Field <JObject>("Extensions"))); deserializedResult.Extensions.OrderBy(t => t.Key) .MatchSnapshot(new SnapshotNameExtension("extensions")); }
private static QueryResultBuilder ExtractResult( IDictionary <string, string> aliases, IReadOnlyQueryResult mergedResult, ICollection <IError> handledErrors) { var result = QueryResultBuilder.New(); var data = new OrderedDictionary(); foreach (KeyValuePair <string, string> alias in aliases) { if (mergedResult.Data.TryGetValue(alias.Key, out object o)) { data.Add(alias.Value, o); } } result.SetData(data); if (mergedResult.Errors is { })
public async Task DeserializeQueryResult(object value, string type) { // arrange var qux = new OrderedDictionary { { "quux", value } }; var baz = new OrderedDictionary { { "qux", qux } }; var objectList = new List <object> { baz }; var scalarList = new List <object> { value }; var result = QueryResultBuilder.New(); var data = new OrderedDictionary(); data["foo"] = objectList; data["bar"] = scalarList; data["baz"] = baz; result.SetData(data); var stream = new MemoryStream(); var serializer = new JsonQueryResultSerializer(); await serializer.SerializeAsync(result.Create(), stream); byte[] buffer = stream.ToArray(); var serializedResult = Utf8GraphQLRequestParser.ParseJson(buffer); // act IReadOnlyQueryResult deserializedResult = HttpResponseDeserializer.Deserialize( (IReadOnlyDictionary <string, object>)serializedResult); // assert Snapshot.Match(deserializedResult, "DeserializeQueryResult_" + type); }
public async Task DispatchMultipleQueriesWithVariables() { // arrange IReadOnlyQueryRequest mergedRequest = null; int count = 0; var result = QueryResultBuilder.New(); var data = new OrderedDictionary(); data["__0__a"] = "a"; data["__1__a"] = "b"; data["__1__b"] = "c"; result.SetData(data); var schema = SchemaBuilder.New() .AddDocumentFromString("type Query { foo: String }") .AddResolver("Query", "foo", c => "bar") .Create(); var executor = new Mock <IQueryExecutor>(); executor.Setup(t => t.ExecuteAsync( It.IsAny <IReadOnlyQueryRequest>(), It.IsAny <CancellationToken>())) .Returns(new Func <IReadOnlyQueryRequest, CancellationToken, Task <IExecutionResult> >((r, ct) => { count++; mergedRequest = r; return(Task.FromResult <IExecutionResult>(result.Create())); })); executor.Setup(t => t.Schema).Returns(schema); var request_a = QueryRequestBuilder.New() .SetQuery("query a($a: String) { a(b: $a) }") .SetVariableValue("a", "foo") .Create(); var request_b = QueryRequestBuilder.Create( "query b { a b }"); var client = new RemoteQueryClient( new EmptyServiceProvider(), executor.Object); // act Task <IExecutionResult> task_a = client.ExecuteAsync(request_a); Task <IExecutionResult> task_b = client.ExecuteAsync(request_b); await client.DispatchAsync(CancellationToken.None); // assert await task_a; await task_b; Assert.Equal(1, count); new { Query = mergedRequest.Query.ToString(), QueryName = mergedRequest.QueryName, QueryHash = mergedRequest.QueryHash, OperationName = mergedRequest.OperationName, Varables = mergedRequest.VariableValues, Extensions = mergedRequest.Extensions, }.MatchSnapshot(); }