diff --git a/backend-tests/ToxiproxyAgentProvisioningIntegrationTests.cs b/backend-tests/ToxiproxyAgentProvisioningIntegrationTests.cs index 9862405..2e14ca7 100644 --- a/backend-tests/ToxiproxyAgentProvisioningIntegrationTests.cs +++ b/backend-tests/ToxiproxyAgentProvisioningIntegrationTests.cs @@ -1,4 +1,5 @@ using System.Net.Http.Json; +using System.Text; using System.Text.Json; using System.Text.Json.Nodes; using DotNet.Testcontainers.Builders; @@ -17,6 +18,23 @@ public sealed class ToxiproxyAgentProvisioningIntegrationTests private const ushort ToxiproxyAdminPort = 8474; private const ushort OpenClawProxyPort = 8666; + [Fact] + public void Http_fixture_preserves_json_node_request_payload() + { + var payload = ToxiproxyHttpGatewayConnector.SerializeParameters( + new JsonObject + { + ["name"] = "Release Analyst", + ["workspace"] = "/tmp/workspace-release-analyst" + }); + var json = JsonNode.Parse(payload)!.AsObject(); + + Assert.Equal("Release Analyst", json["name"]!.GetValue()); + Assert.Equal( + "/tmp/workspace-release-analyst", + json["workspace"]!.GetValue()); + } + [ToxiproxyIntegrationFact] [Trait("Category", "DockerIntegration")] [Trait("Category", "ToxiproxyIntegration")] @@ -292,12 +310,19 @@ internal sealed class ToxiproxyHttpGatewayConnector(Uri endpoint) timeoutSource.Token); break; case "agents.create": + { Interlocked.Increment(ref createCalls); - response = await client.PostAsJsonAsync( + var body = SerializeParameters(parameters); + using var content = new StringContent( + body, + Encoding.UTF8, + "application/json"); + response = await client.PostAsync( "/agents/create", - JsonSerializer.SerializeToNode(parameters), + content, timeoutSource.Token); break; + } default: throw new OpenClawGatewayRpcException( "METHOD_NOT_FOUND", @@ -334,5 +359,12 @@ internal sealed class ToxiproxyHttpGatewayConnector(Uri endpoint) public IReadOnlyList GetRecentEvents(int limit = 100) => []; + internal static string SerializeParameters(object? parameters) + => parameters is JsonNode jsonNode + ? jsonNode.ToJsonString() + : JsonSerializer.Serialize( + parameters, + parameters?.GetType() ?? typeof(object)); + public void Dispose() => client.Dispose(); }