test(work-orders): fix sync/webhook/recon fixtures for AccountId stamp [SH-221]

Seed resolvable Customer accounts and mock account resolution so create-path CI tests match fail-closed account scope.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Arthur Bassi 2026-08-11 10:54:23 -03:00
parent 1edcf479ae
commit bca2e0d50d
3 changed files with 19 additions and 7 deletions

View file

@ -55,7 +55,7 @@ public class SyncServiceBehaviorTests
var accountResolver = new Mock<IWorkOrderAccountResolver>(); var accountResolver = new Mock<IWorkOrderAccountResolver>();
accountResolver accountResolver
.Setup(r => r.TryResolveFromCustomerAsync(It.IsAny<string?>(), It.IsAny<CancellationToken>())) .Setup(r => r.TryResolveFromCustomerAsync(It.IsAny<string?>(), It.IsAny<CancellationToken>()))
.ReturnsAsync((int?)null); .ReturnsAsync(1);
var service = new SyncService(data.Object, external.Object, accountResolver.Object); var service = new SyncService(data.Object, external.Object, accountResolver.Object);
var result = await service.SyncWorkOrdersAsync(CancellationToken.None); var result = await service.SyncWorkOrdersAsync(CancellationToken.None);
@ -65,7 +65,7 @@ public class SyncServiceBehaviorTests
Assert.Equal(3, result.LocationsCreated); Assert.Equal(3, result.LocationsCreated);
Assert.Equal("Updated Title", existingWO.WorkerOrderTitle); Assert.Equal("Updated Title", existingWO.WorkerOrderTitle);
Assert.Equal("In Progress", existingWO.Status); Assert.Equal("In Progress", existingWO.Status);
data.Verify(d => d.EnqueueWorkOrder(It.Is<WorkOrder>(w => w.ExternalWorkOrderId == "EXT-2")), Times.Once); data.Verify(d => d.EnqueueWorkOrder(It.Is<WorkOrder>(w => w.ExternalWorkOrderId == "EXT-2" && w.AccountId == 1)), Times.Once);
} }
[Fact] [Fact]
@ -81,17 +81,18 @@ public class SyncServiceBehaviorTests
var items = new List<Dictionary<string, string?>> var items = new List<Dictionary<string, string?>>
{ {
new() { ["work_order_id"] = "W1", ["wo_status"] = "completed", ["severity"] = "2" } new() { ["work_order_id"] = "W1", ["wo_status"] = "completed", ["severity"] = "2", ["customer"] = "Acme" }
}; };
external.Setup(e => e.ScanWorkOrdersAsync(It.IsAny<CancellationToken>())).Returns(items.ToAsyncEnumerable()); external.Setup(e => e.ScanWorkOrdersAsync(It.IsAny<CancellationToken>())).Returns(items.ToAsyncEnumerable());
var accountResolver = new Mock<IWorkOrderAccountResolver>(); var accountResolver = new Mock<IWorkOrderAccountResolver>();
accountResolver accountResolver
.Setup(r => r.TryResolveFromCustomerAsync(It.IsAny<string?>(), It.IsAny<CancellationToken>())) .Setup(r => r.TryResolveFromCustomerAsync("Acme", It.IsAny<CancellationToken>()))
.ReturnsAsync((int?)null); .ReturnsAsync(42);
await new SyncService(data.Object, external.Object, accountResolver.Object).SyncWorkOrdersAsync(CancellationToken.None); await new SyncService(data.Object, external.Object, accountResolver.Object).SyncWorkOrdersAsync(CancellationToken.None);
data.Verify(d => d.EnqueueWorkOrder(It.Is<WorkOrder>(w => w.Status == "Done" && w.Priority == "Sev 2" && w.Severity == "2")), Times.Once); data.Verify(d => d.EnqueueWorkOrder(It.Is<WorkOrder>(w =>
w.Status == "Done" && w.Priority == "Sev 2" && w.Severity == "2" && w.AccountId == 42)), Times.Once);
} }
[Fact] [Fact]

View file

@ -204,6 +204,8 @@ public sealed class WorkOrderReconciliationTests
.UseInMemoryDatabase($"convergence-{Guid.NewGuid()}") .UseInMemoryDatabase($"convergence-{Guid.NewGuid()}")
.Options; .Options;
await using var context = new ApplicationDbContext(options); await using var context = new ApplicationDbContext(options);
context.Accounts.Add(new Accounts { Id = 1, Name = "Recon Customer", IsDeleted = false });
await context.SaveChangesAsync();
var data = new WorkOrderWebhookDataService(context); var data = new WorkOrderWebhookDataService(context);
var time = DateTimeOffset.Parse("2026-07-24T12:00:00Z"); var time = DateTimeOffset.Parse("2026-07-24T12:00:00Z");
@ -268,7 +270,8 @@ public sealed class WorkOrderReconciliationTests
WorkerOrderNumber = "123", WorkerOrderNumber = "123",
Source = "procurement", Source = "procurement",
IsStateEvent = true, IsStateEvent = true,
Title = title Title = title,
Customer = "Recon Customer"
}; };
private sealed class MockClient : IProcurementWorkOrderClient private sealed class MockClient : IProcurementWorkOrderClient

View file

@ -252,6 +252,9 @@ public sealed class WorkOrderWebhookDataServiceTests
.Options; .Options;
await using var context = new CountingDbContext(options); await using var context = new CountingDbContext(options);
await context.Database.EnsureCreatedAsync(); await context.Database.EnsureCreatedAsync();
context.Accounts.Add(new Accounts { Id = 1, Name = "Webhook Customer", IsDeleted = false });
await context.SaveChangesAsync();
context.ResetSaveCount();
var data = new WorkOrderWebhookDataService(context); var data = new WorkOrderWebhookDataService(context);
var comment = Mutation( var comment = Mutation(
@ -309,6 +312,8 @@ public sealed class WorkOrderWebhookDataServiceTests
.Options; .Options;
await using var context = new ApplicationDbContext(options); await using var context = new ApplicationDbContext(options);
await context.Database.EnsureCreatedAsync(); await context.Database.EnsureCreatedAsync();
context.Accounts.Add(new Accounts { Id = 1, Name = "Webhook Customer", IsDeleted = false });
await context.SaveChangesAsync();
var data = new WorkOrderWebhookDataService(context); var data = new WorkOrderWebhookDataService(context);
var mutation = Mutation( var mutation = Mutation(
"cancel-delivery", "cancel-delivery",
@ -377,6 +382,7 @@ public sealed class WorkOrderWebhookDataServiceTests
Source = "procurement", Source = "procurement",
IsStateEvent = eventType != "work_order.comment_added", IsStateEvent = eventType != "work_order.comment_added",
Title = title, Title = title,
Customer = "Webhook Customer",
Status = "Open", Status = "Open",
CommentId = commentId, CommentId = commentId,
CommentText = commentId == null ? null : "A comment" CommentText = commentId == null ? null : "A comment"
@ -391,6 +397,8 @@ public sealed class WorkOrderWebhookDataServiceTests
public int SaveCount { get; private set; } public int SaveCount { get; private set; }
public void ResetSaveCount() => SaveCount = 0;
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default) public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
{ {
SaveCount++; SaveCount++;