using System.Text.Json.Nodes;
namespace MoShiro.Backend.Tests;
/// Agent local policy validation has its own Backend fixture so task overrides from line-session tests cannot leak into it.
[Trait("Category", "Slow")]
public sealed class AgentLimitsTests : IClassFixture
{
private readonly BackendFixture _backend;
public AgentLimitsTests(BackendFixture backend)
{
_backend = backend;
}
private async Task AgentViewAsync(AgentHarness agent) => await _backend.GetJsonAsync(_backend.Admin, "/api/admin/agents/" + agent.Id);
[Fact]
public async Task LocalLimits_RejectTasksOutsideTheAllowedPorts_AndTheReasonReachesTheAdmin()
{
// The default task ports (7443/7444) do not match this Agent's actual listeners, so policy rejects them.
await using AgentHarness agent = await AgentHarness.StartAsync(_backend);
await BackendFixture.EventuallyAsync(async () => (await AgentViewAsync(agent))["rejected"]!.AsArray().Count == Defaults.TaskCount);
JsonNode rejected = (await AgentViewAsync(agent))["rejected"]!;
Assert.All(rejected.AsArray(), item => Assert.Equal("policy_denied", item!["reason"]!.GetValue()));
// Override the task ports to match the actual listeners and verify recovery.
await agent.OverrideLineTasksAsync();
await BackendFixture.EventuallyAsync(async () => (await AgentViewAsync(agent))["rejected"]!.AsArray().Count == 0);
}
}