Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,62 @@ public async Task App_Should_WriteNamedSchemaToOutput_When_SchemaNameIsSpecified
output.ToString().MatchSnapshot();
}

[Fact]
public async Task App_Should_PreserveUnescapedAngleBrackets_When_UpdatingExistingSettingsFile()
{
// arrange
var services = new ServiceCollection();
services.AddGraphQL()
.AddQueryType(x => x.Name("Query").Field("foo").Resolve("bar"));

var hostMock = new Mock<IHost>();
hostMock
.Setup(x => x.Services)
.Returns(services.BuildServiceProvider());

var host = hostMock.Object;
var output = new StringWriter();
var app = new App(host);
var tempFile = CreateSchemaFileName();
var settingsFile = tempFile + "-settings.json";

const string existingSettings =
"""
{
"name": "default",
"satisfiability": {
"ignoredNonAccessibleFields": {
"Foo.bar": [
"Schema1:Query.foo<Bar>"
]
}
}
}
""";

await File.WriteAllTextAsync(settingsFile, existingSettings);

// act
await app.InvokeAsync($"schema export --output {tempFile}", output);

// assert
var actual = await File.ReadAllTextAsync(settingsFile);
actual.ReplaceLineEndings("\n").MatchInlineSnapshot(
"""
{
"name": "_Default",
"satisfiability": {
"ignoredNonAccessibleFields": {
"Foo.bar": [
"Schema1:Query.foo<Bar>"
]
}
}
}

""");
}

[Fact]
public async Task App_Should_Return_ExitCode_1_If_Schema_Is_Invalid()
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Text;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Json.Nodes;
using HotChocolate.Serialization;
Expand All @@ -7,6 +8,12 @@ namespace HotChocolate.Execution.Internal;

internal static class SchemaFileExporter
{
private static readonly JsonWriterOptions s_writerOptions = new()
{
Indented = true,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};

public static async Task<SchemaFileInfo> Export(
string schemaFileName,
IRequestExecutor executor,
Expand Down Expand Up @@ -84,7 +91,7 @@ private static async Task<bool> TryUpdateSettingsFile(
obj["name"] = schemaName;

await using var writeStream = File.Create(fileName);
await using var writer = new Utf8JsonWriter(writeStream, new JsonWriterOptions { Indented = true });
await using var writer = new Utf8JsonWriter(writeStream, s_writerOptions);
root.WriteTo(writer);
await writer.FlushAsync(cancellationToken);
await writeStream.WriteAsync(Encoding.UTF8.GetBytes(Environment.NewLine), cancellationToken);
Expand All @@ -105,7 +112,7 @@ private static async Task CreateNewSettingsFile(
CancellationToken cancellationToken)
{
await using var settingsFileStream = File.Create(fileName);
await using var jsonWriter = new Utf8JsonWriter(settingsFileStream, new JsonWriterOptions { Indented = true });
await using var jsonWriter = new Utf8JsonWriter(settingsFileStream, s_writerOptions);

jsonWriter.WriteStartObject();

Expand Down
Loading