Ejemplo n.º 1
0
        // 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");
        }
Ejemplo n.º 4
0
        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"));
        }
Ejemplo n.º 6
0
        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();
        }