diff --git a/src/HotChocolate/Core/test/Execution.Tests/RequestExecutorTests.cs b/src/HotChocolate/Core/test/Execution.Tests/RequestExecutorTests.cs index 8d9c67b7733..f0ca0819d73 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/RequestExecutorTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/RequestExecutorTests.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Tests; using HotChocolate.Types; using Microsoft.Extensions.DependencyInjection; @@ -94,6 +95,37 @@ public async Task CancellationToken_Is_Passed_Correctly() Assert.True(tokenWasCorrectlyPassedToResolver); } + [Fact] + public async Task StringInput_WithControlCharacters_IsHandledCorrectly() + { + var schema = SchemaBuilder.New() + .AddQueryType(t => t + .Name("Query") + .Field("echo") + .Argument("arg", arg => arg.Type()) + .Resolve(x => x.ArgumentValue("arg"))) + .Create(); + + var escapedControlChars = JsonSerializer.Serialize(new string( + Enumerable.Range(0, char.MaxValue) + .Select(i => (char)i) + .Where(char.IsControl) + .ToArray())); + + // act + var executor = schema.MakeExecutable(); + var result = await executor.ExecuteAsync( + $$""" + { + delChar: echo(arg: "Hello\u007FWorld") + allControlChars: echo(arg:{{escapedControlChars}}) + } + """); + + // assert + result.MatchSnapshot(); + } + [Fact] public async Task Ensure_Errors_Do_Not_Result_In_Timeouts() { diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/RequestExecutorTests.StringInput_WithControlCharacters_IsHandledCorrectly.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/RequestExecutorTests.StringInput_WithControlCharacters_IsHandledCorrectly.snap new file mode 100644 index 00000000000..603b4bf0b07 --- /dev/null +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/RequestExecutorTests.StringInput_WithControlCharacters_IsHandledCorrectly.snap @@ -0,0 +1,6 @@ +{ + "data": { + "delChar": "Hello\u007FWorld", + "allControlChars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000B\f\r\u000E\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F\u007F\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F" + } +}