public async Task ExceptionOnMessage_RendersAsExpected()
        {
            var fixedDate = DateTimeOffset.UtcNow.UtcDateTime;

            var builder = new TestServerBuilder()
                          .AddGraphType <SimpleExecutionController>();

            builder.AddGraphQL(o =>
            {
                o.ResponseOptions.TimeStampLocalizer = (_) => fixedDate;
            });

            var server       = builder.Build();
            var queryBuilder = server.CreateQueryContextBuilder();

            queryBuilder.AddQueryText("query Operation1{  simple  {  throwsException  } }");

            var response = await server.ExecuteQuery(queryBuilder);

            var writer = new DefaultResponseWriter <GraphSchema>(server.Schema);
            var result = await this.WriteResponse(writer, response);

            var exceptionStackTrace = JsonEncodedText.Encode(response.Messages[0].Exception.StackTrace, JavaScriptEncoder.UnsafeRelaxedJsonEscaping).ToString();

            var expectedData = @"
                                {
                                  ""errors"": [
                                    {
                                      ""message"": ""Operation failed."",
                                      ""locations"": [
                                        {
                                          ""line"": 1,
                                          ""column"": 31
                                        }
                                      ],
                                      ""path"": [
                                        ""simple"",
                                        ""throwsException""
                                      ],
                                      ""extensions"": {
                                        ""code"": ""UNHANDLED_EXCEPTION"",
                                        ""timestamp"": """ + fixedDate.ToRfc3339String() + @""",
                                        ""severity"": ""CRITICAL"",
                                        ""exception"": {
                                          ""type"": ""InvalidOperationException"",
                                          ""message"": ""This is an invalid message"",
                                          ""stacktrace"": """ + exceptionStackTrace + @""",
                                        }
                                      }
                                    }
                                  ]
                                }";

            CommonAssertions.AreEqualJsonStrings(
                expectedData,
                result);
        }
        public async Task MetaDataOnMessage_RendersAsExpected()
        {
            var fixedDate = DateTimeOffset.UtcNow.UtcDateTime;

            var builder = new TestServerBuilder()
                          .AddGraphType <SimpleExecutionController>();

            builder.AddGraphQL(o =>
            {
                o.ResponseOptions.TimeStampLocalizer = (_) => fixedDate;
            });

            var server       = builder.Build();
            var queryBuilder = server.CreateQueryContextBuilder();

            queryBuilder.AddQueryText("query Operation1{  simple  {  customMessage  } }");

            var response = await server.ExecuteQuery(queryBuilder);

            var writer = new DefaultResponseWriter <GraphSchema>(server.Schema);
            var result = await this.WriteResponse(writer, response);

            var expectedData = @"
                {
                  ""errors"": [
                    {
                      ""message"": ""fail text"",
                      ""extensions"": {
                        ""code"": ""fail code"",
                        ""timestamp"": """ + fixedDate.ToRfc3339String() + @""",

                        ""severity"": ""CRITICAL"",
                        ""metaData"" : {
                            ""customKey1"": ""customValue1""
                        }
                      }
                    }
                  ]
                }";

            // no errors collection generated because no errors occured.
            CommonAssertions.AreEqualJsonStrings(
                expectedData,
                result);
        }
        public async Task DefaultWriteOperation_InvalidSyntax_RendersJsonWithError()
        {
            var fixedDate = DateTimeOffset.UtcNow.UtcDateTime;

            var serverBuilder = new TestServerBuilder()
                                .AddGraphType <SimpleExecutionController>();

            serverBuilder.AddGraphQL(o =>
            {
                o.ResponseOptions.TimeStampLocalizer = (_) => fixedDate;
            });

            var server       = serverBuilder.Build();
            var queryBuilder = server.CreateQueryContextBuilder();

            queryBuilder.AddQueryText("query Operation1{  simple \n {{  simpleQueryMethod { property1} } }");

            var response = await server.ExecuteQuery(queryBuilder);

            var writer = new DefaultResponseWriter <GraphSchema>(server.Schema);
            var result = await this.WriteResponse(writer, response);

            var expectedData = @"
                {
                  ""errors"": [
                            {
                                ""message"": ""Invalid query. Expected 'NameToken' but received 'ControlToken'"",
                                ""locations"": [
                                {
                                    ""line"": 2,
                                    ""column"": 3
                                }],
                                ""extensions"": {
                                    ""code"": ""SYNTAX_ERROR"",
                                    ""timestamp"": """ + fixedDate.ToRfc3339String() + @""",
                                    ""severity"": ""CRITICAL""
                                }
                            }]
                }";

            // no errors collection generated because no errors occured.
            CommonAssertions.AreEqualJsonStrings(
                expectedData,
                result);
        }
        public async Task EnsureProperStringEscapement(string testValue, string expectedValue)
        {
            var fixedDate = DateTimeOffset.UtcNow.UtcDateTime;

            var builder = new TestServerBuilder()
                          .AddGraphType <SimpleExecutionController>();

            builder.AddGraphQL(o =>
            {
                o.ResponseOptions.TimeStampLocalizer = (_) => fixedDate;
            });

            var server       = builder.Build();
            var queryBuilder = server.CreateQueryContextBuilder();

            var dic = new ResponseFieldSet();

            dic.Add("testKey", new ResponseSingleValue(testValue));

            var mockResult = new Mock <IGraphOperationResult>();

            mockResult.Setup(x => x.Data).Returns(dic);
            mockResult.Setup(x => x.Messages).Returns(new GraphMessageCollection());
            mockResult.Setup(x => x.Request).Returns(queryBuilder.OperationRequest);

            var writer = new DefaultResponseWriter <GraphSchema>(server.Schema);
            var result = await this.WriteResponse(writer, mockResult.Object);

            var expected = @"
                            {
                                ""data"" : {
                                    ""testKey"" : """ + expectedValue + @""",
                                }
                            }";

            CommonAssertions.AreEqualJsonStrings(expected, result);
        }