using Api.SeaHavenIndustries.Controllers; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using SeaHaven.Services.Interfaces; using System.Security.Claims; using Xunit; namespace Api.SeaHavenIndustries.Tests; public sealed class WorkOrderReconciliationControllerTests { [Fact] public async Task Admin_trigger_returns_durable_run_and_status_is_queryable() { var runId = Guid.NewGuid(); var service = new StubService(runId); var controller = new WorkOrderReconciliationController(service); var trigger = Assert.IsType( await controller.Trigger(CancellationToken.None)); Assert.Equal(StatusCodes.Status202Accepted, trigger.StatusCode); Assert.Equal(runId, service.LastRunId); var status = Assert.IsType( await controller.Status(CancellationToken.None)); Assert.IsType(status.Value); } [Fact] public async Task Disabled_trigger_returns_sanitized_unavailable_response() { var controller = new WorkOrderReconciliationController(new StubService(Guid.Empty)); var result = Assert.IsType( await controller.Trigger(CancellationToken.None)); Assert.Equal(StatusCodes.Status503ServiceUnavailable, result.StatusCode); Assert.DoesNotContain("exception", result.Value!.ToString(), StringComparison.OrdinalIgnoreCase); } private sealed class StubService : IWorkOrderReconciliationService { private readonly Guid _runId; public StubService(Guid runId) => _runId = runId; public Guid LastRunId { get; private set; } public Task TriggerAsync( ClaimsPrincipal user, string reason, CancellationToken cancellationToken) { LastRunId = _runId; return Task.FromResult(new WorkOrderReconciliationTriggerResult( _runId != Guid.Empty, _runId)); } public Task GetStatusAsync( ClaimsPrincipal user, CancellationToken cancellationToken) => Task.FromResult(new WorkOrderReconciliationStatus( _runId, "Pending", "admin", DateTimeOffset.UtcNow, null, null, 0, 0, null)); } }