mirror of
https://github.com/Sea-Haven-Industries/shoc-backend.git
synced 2026-10-06 20:32:10 +00:00
test(uplifts): cover escalation audit on a dispatch without an owning work order
This commit is contained in:
parent
c5d82a996a
commit
b2b9fc3588
1 changed files with 62 additions and 3 deletions
|
|
@ -162,10 +162,61 @@ public sealed class UpliftDecisionAuditRelationalTests
|
||||||
Assert.Empty(audits);
|
Assert.Empty(audits);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[InlineData(Ownership.Linked)]
|
||||||
|
[InlineData(Ownership.Unresolvable)]
|
||||||
|
public async Task Escalation_CommitsAndAuditsResolvedWorkOrder(Ownership ownership)
|
||||||
|
{
|
||||||
|
await using var connection = new SqliteConnection("Data Source=:memory:;Foreign Keys=True");
|
||||||
|
await connection.OpenAsync();
|
||||||
|
var options = new DbContextOptionsBuilder<ApplicationDbContext>().UseSqlite(connection).Options;
|
||||||
|
|
||||||
|
int upliftId;
|
||||||
|
int? expectedWorkOrderId;
|
||||||
|
await using (var seed = new SqliteUpliftDecisionTestDbContext(options))
|
||||||
|
{
|
||||||
|
await seed.Database.EnsureCreatedAsync();
|
||||||
|
(upliftId, expectedWorkOrderId) = await SeedAsync(
|
||||||
|
seed,
|
||||||
|
ownership,
|
||||||
|
expiresAt: null,
|
||||||
|
initialNotificationSentAt: DateTime.UtcNow.AddDays(-3));
|
||||||
|
}
|
||||||
|
|
||||||
|
var emailSender = new NoEmailSender();
|
||||||
|
await using (var context = new SqliteUpliftDecisionTestDbContext(options))
|
||||||
|
{
|
||||||
|
var lifecycle = new UpliftLifecycleService(
|
||||||
|
new UpliftDataService(context),
|
||||||
|
new DispatchDataService(context),
|
||||||
|
null!,
|
||||||
|
emailSender,
|
||||||
|
Options.Create(new FrontendOptions()),
|
||||||
|
Options.Create(new ApprovalsOptions { EscalationRecipients = new[] { "escalate@test.local" } }),
|
||||||
|
TimeProvider.System,
|
||||||
|
NullLogger<UpliftLifecycleService>.Instance);
|
||||||
|
|
||||||
|
Assert.Equal(1, await lifecycle.EscalateDueAsync(CancellationToken.None));
|
||||||
|
}
|
||||||
|
|
||||||
|
await using var verify = new SqliteUpliftDecisionTestDbContext(options);
|
||||||
|
var saved = await verify.DispatchUpliftRequests.AsNoTracking().SingleAsync(u => u.Id == upliftId);
|
||||||
|
Assert.NotNull(saved.EscalatedAt);
|
||||||
|
Assert.Equal(1, emailSender.Calls);
|
||||||
|
|
||||||
|
var audits = await verify.WorkOrderAuditLogs.AsNoTracking().ToListAsync();
|
||||||
|
Assert.DoesNotContain(audits, a => a.WorkOrderId == 0);
|
||||||
|
if (expectedWorkOrderId is int workOrderId)
|
||||||
|
Assert.Equal(workOrderId, Assert.Single(audits).WorkOrderId);
|
||||||
|
else
|
||||||
|
Assert.Empty(audits);
|
||||||
|
}
|
||||||
|
|
||||||
private static async Task<(int UpliftId, int? ExpectedWorkOrderId)> SeedAsync(
|
private static async Task<(int UpliftId, int? ExpectedWorkOrderId)> SeedAsync(
|
||||||
ApplicationDbContext context,
|
ApplicationDbContext context,
|
||||||
Ownership ownership,
|
Ownership ownership,
|
||||||
DateTime? expiresAt)
|
DateTime? expiresAt,
|
||||||
|
DateTime? initialNotificationSentAt = null)
|
||||||
{
|
{
|
||||||
context.Users.Add(new ApplicationUser
|
context.Users.Add(new ApplicationUser
|
||||||
{
|
{
|
||||||
|
|
@ -218,7 +269,8 @@ public sealed class UpliftDecisionAuditRelationalTests
|
||||||
RequiredTier = 2,
|
RequiredTier = 2,
|
||||||
CreatedDate = DateTime.UtcNow.AddDays(-4),
|
CreatedDate = DateTime.UtcNow.AddDays(-4),
|
||||||
ExpiresAt = expiresAt,
|
ExpiresAt = expiresAt,
|
||||||
NotificationStatus = "Pending"
|
InitialNotificationSentAt = initialNotificationSentAt,
|
||||||
|
NotificationStatus = initialNotificationSentAt == null ? "Pending" : "Sent"
|
||||||
};
|
};
|
||||||
context.DispatchUpliftRequests.Add(request);
|
context.DispatchUpliftRequests.Add(request);
|
||||||
await context.SaveChangesAsync();
|
await context.SaveChangesAsync();
|
||||||
|
|
@ -238,9 +290,16 @@ public sealed class UpliftDecisionAuditRelationalTests
|
||||||
=> throw new NotSupportedException();
|
=> throw new NotSupportedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Records sends without delivering anything.
|
||||||
private sealed class NoEmailSender : IEmailSender
|
private sealed class NoEmailSender : IEmailSender
|
||||||
{
|
{
|
||||||
public Task<bool> SendEmailAsync(string emailTo, string subject, string body) => Task.FromResult(true);
|
public int Calls;
|
||||||
|
|
||||||
|
public Task<bool> SendEmailAsync(string emailTo, string subject, string body)
|
||||||
|
{
|
||||||
|
Calls++;
|
||||||
|
return Task.FromResult(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private sealed class SqliteUpliftDecisionTestDbContext : ApplicationDbContext
|
private sealed class SqliteUpliftDecisionTestDbContext : ApplicationDbContext
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue