Skip to content

Commit 3c040f2

Browse files
committed
fix json renderer test isolation
1 parent 2dac205 commit 3c040f2

2 files changed

Lines changed: 28 additions & 39 deletions

File tree

src/SharpClaw.Code.Cli/Rendering/JsonOutputRenderer.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,13 @@ namespace SharpClaw.Code.Cli.Rendering;
1212
/// <summary>
1313
/// Renders command and prompt results as JSON.
1414
/// </summary>
15-
public sealed class JsonOutputRenderer(ILogger<JsonOutputRenderer>? logger = null) : IOutputRenderer
15+
public sealed class JsonOutputRenderer(
16+
ILogger<JsonOutputRenderer>? logger = null,
17+
TextWriter? outputWriter = null) : IOutputRenderer
1618
{
1719
private readonly ILogger<JsonOutputRenderer> _logger = logger ?? NullLogger<JsonOutputRenderer>.Instance;
20+
private readonly TextWriter? _outputWriter = outputWriter;
21+
1822
/// <inheritdoc />
1923
public OutputFormat Format => OutputFormat.Json;
2024

@@ -47,15 +51,18 @@ public Task RenderCommandResultAsync(CommandResult result, CancellationToken can
4751
dataRaw),
4852
JsonOutputJsonContext.Default.JsonCommandEnvelope);
4953

50-
return Console.Out.WriteLineAsync(json.AsMemory(), cancellationToken);
54+
return WriteLineAsync(json, cancellationToken);
5155
}
5256

5357
/// <inheritdoc />
5458
public Task RenderTurnExecutionResultAsync(TurnExecutionResult result, CancellationToken cancellationToken)
5559
{
5660
var json = JsonSerializer.Serialize(result, ProtocolJsonContext.Default.TurnExecutionResult);
57-
return Console.Out.WriteLineAsync(json.AsMemory(), cancellationToken);
61+
return WriteLineAsync(json, cancellationToken);
5862
}
63+
64+
private Task WriteLineAsync(string json, CancellationToken cancellationToken)
65+
=> (_outputWriter ?? Console.Out).WriteLineAsync(json.AsMemory(), cancellationToken);
5966
}
6067

6168
internal sealed record JsonCommandEnvelope(

tests/SharpClaw.Code.IntegrationTests/Smoke/JsonOutputRendererTests.cs

Lines changed: 18 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,17 @@ public sealed class JsonOutputRendererTests
1717
[Fact]
1818
public async Task RenderCommandResultAsync_should_wrap_data_payload_in_stable_envelope()
1919
{
20-
var renderer = new JsonOutputRenderer();
2120
using var writer = new StringWriter();
22-
var originalOut = Console.Out;
23-
Console.SetOut(writer);
21+
var renderer = new JsonOutputRenderer(outputWriter: writer);
2422

25-
try
26-
{
27-
await renderer.RenderCommandResultAsync(
28-
new CommandResult(
29-
Succeeded: true,
30-
ExitCode: 0,
31-
OutputFormat: OutputFormat.Text,
32-
Message: "ok",
33-
DataJson: """{"version":"1.2.3"}"""),
34-
CancellationToken.None);
35-
}
36-
finally
37-
{
38-
Console.SetOut(originalOut);
39-
}
23+
await renderer.RenderCommandResultAsync(
24+
new CommandResult(
25+
Succeeded: true,
26+
ExitCode: 0,
27+
OutputFormat: OutputFormat.Text,
28+
Message: "ok",
29+
DataJson: """{"version":"1.2.3"}"""),
30+
CancellationToken.None);
4031

4132
using var document = JsonDocument.Parse(writer.ToString());
4233
var root = document.RootElement;
@@ -54,26 +45,17 @@ await renderer.RenderCommandResultAsync(
5445
[Fact]
5546
public async Task RenderCommandResultAsync_should_fall_back_to_data_raw_for_invalid_payloads()
5647
{
57-
var renderer = new JsonOutputRenderer();
5848
using var writer = new StringWriter();
59-
var originalOut = Console.Out;
60-
Console.SetOut(writer);
49+
var renderer = new JsonOutputRenderer(outputWriter: writer);
6150

62-
try
63-
{
64-
await renderer.RenderCommandResultAsync(
65-
new CommandResult(
66-
Succeeded: false,
67-
ExitCode: 1,
68-
OutputFormat: OutputFormat.Text,
69-
Message: "bad",
70-
DataJson: "{not-json"),
71-
CancellationToken.None);
72-
}
73-
finally
74-
{
75-
Console.SetOut(originalOut);
76-
}
51+
await renderer.RenderCommandResultAsync(
52+
new CommandResult(
53+
Succeeded: false,
54+
ExitCode: 1,
55+
OutputFormat: OutputFormat.Text,
56+
Message: "bad",
57+
DataJson: "{not-json"),
58+
CancellationToken.None);
7759

7860
using var document = JsonDocument.Parse(writer.ToString());
7961
var root = document.RootElement;

0 commit comments

Comments
 (0)