fixes: PromoteAsync (retry path) does not create clinical entities + Patient deduplication by exact name + DOB is fragile + Batch assignment creates inconsistent interim state
This commit is contained in:
@@ -72,7 +72,7 @@ public class PromotionTests : IAsyncLifetime
|
||||
var patient = await db.Patients.FirstOrDefaultAsync(p => p.Id == promotion.PatientId);
|
||||
patient.Should().NotBeNull();
|
||||
patient!.Mrn.Should().Be(promotion.Mrn);
|
||||
patient.FullName.Should().Be("Test Patient");
|
||||
patient.FullName.Should().Be("TEST PATIENT");
|
||||
patient.DateOfBirth.Should().Be(new DateOnly(1990, 5, 15));
|
||||
|
||||
// Encounter exists
|
||||
|
||||
@@ -386,15 +386,19 @@ public class VerificationTests : IAsyncLifetime
|
||||
|
||||
var olderBatch = await BatchSeedHelper.SeedBatchInPendingVerificationAsync(
|
||||
db, (await BatchSeedHelper.UserIdAsync(db, "entry1")));
|
||||
|
||||
// Make the second batch newer by updating its timestamp
|
||||
await Task.Delay(100); // Ensure different timestamps
|
||||
var trackedOlder = await db.DigitizationBatches.FindAsync(olderBatch.Id);
|
||||
trackedOlder!.UpdatedAt = DateTimeOffset.UtcNow.AddHours(-2);
|
||||
await db.SaveChangesAsync();
|
||||
|
||||
var newerBatch = await BatchSeedHelper.SeedBatchInPendingVerificationAsync(
|
||||
db, (await BatchSeedHelper.UserIdAsync(db, "entry2")));
|
||||
var trackedNewer = await db.DigitizationBatches.FindAsync(newerBatch.Id);
|
||||
trackedNewer!.UpdatedAt = DateTimeOffset.UtcNow.AddHours(-1);
|
||||
await db.SaveChangesAsync();
|
||||
|
||||
// Also seed a rejected batch — should NOT appear in verification queue
|
||||
await BatchSeedHelper.SeedBatchInRejectedAsync(db, (await BatchSeedHelper.UserIdAsync(db, "entry1")));
|
||||
var rejectedBatch = await BatchSeedHelper.SeedBatchInRejectedAsync(
|
||||
db, (await BatchSeedHelper.UserIdAsync(db, "entry1")));
|
||||
|
||||
// Act
|
||||
var client = await AuthHelper.LoginAsync(_fixture, "verifier1");
|
||||
@@ -410,11 +414,23 @@ public class VerificationTests : IAsyncLifetime
|
||||
.GetProperty("data")
|
||||
.GetProperty("items");
|
||||
|
||||
items.GetArrayLength().Should().Be(2); // Only PendingVerification batches
|
||||
var batchIds = Enumerable.Range(0, items.GetArrayLength())
|
||||
.Select(i => items[i].GetProperty("batchId").GetString())
|
||||
.ToList();
|
||||
|
||||
// First item should be the older batch (FIFO)
|
||||
var firstBatchId = items[0].GetProperty("batchId").GetString();
|
||||
firstBatchId.Should().Be(olderBatch.Id.ToString());
|
||||
batchIds.Should().Contain(olderBatch.Id.ToString());
|
||||
batchIds.Should().Contain(newerBatch.Id.ToString());
|
||||
batchIds.Should().NotContain(rejectedBatch.Id.ToString());
|
||||
|
||||
foreach (var i in Enumerable.Range(0, items.GetArrayLength()))
|
||||
{
|
||||
items[i].GetProperty("status").GetString()
|
||||
.Should().Be(BatchStatus.PendingVerification.ToDbString());
|
||||
}
|
||||
|
||||
// Older batch should appear before newer batch (FIFO by UpdatedAt)
|
||||
batchIds.IndexOf(olderBatch.Id.ToString())
|
||||
.Should().BeLessThan(batchIds.IndexOf(newerBatch.Id.ToString()));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -432,7 +448,7 @@ public class VerificationTests : IAsyncLifetime
|
||||
db, (await BatchSeedHelper.UserIdAsync(db, "entry1")));
|
||||
|
||||
// Seed a PendingVerification batch (should NOT appear in entry queue)
|
||||
await BatchSeedHelper.SeedBatchInPendingVerificationAsync(
|
||||
var pendingBatch = await BatchSeedHelper.SeedBatchInPendingVerificationAsync(
|
||||
db, (await BatchSeedHelper.UserIdAsync(db, "entry2")));
|
||||
|
||||
// Seed an Uploaded batch directly
|
||||
@@ -474,15 +490,25 @@ public class VerificationTests : IAsyncLifetime
|
||||
.GetProperty("data")
|
||||
.GetProperty("items");
|
||||
|
||||
// Should contain the rejected batch and uploaded batch, but NOT the PendingVerification batch
|
||||
items.GetArrayLength().Should().Be(2);
|
||||
|
||||
var batchIds = Enumerable.Range(0, items.GetArrayLength())
|
||||
.Select(i => items[i].GetProperty("batchId").GetString())
|
||||
.ToList();
|
||||
|
||||
batchIds.Should().Contain(rejectedBatch.Id.ToString());
|
||||
batchIds.Should().Contain(uploadedBatchId.ToString());
|
||||
batchIds.Should().NotContain(pendingBatch.Id.ToString());
|
||||
|
||||
var entryStatuses = new[]
|
||||
{
|
||||
BatchStatus.Uploaded.ToDbString(),
|
||||
BatchStatus.InEntry.ToDbString(),
|
||||
BatchStatus.Rejected.ToDbString()
|
||||
};
|
||||
|
||||
foreach (var i in Enumerable.Range(0, items.GetArrayLength()))
|
||||
{
|
||||
entryStatuses.Should().Contain(items[i].GetProperty("status").GetString());
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user