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:
voltsrage
2026-06-27 14:15:40 +08:00
parent 66ae95956a
commit 46c3492bb9
8 changed files with 1195 additions and 1107 deletions
+1 -1
View File
@@ -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
+38 -12
View File
@@ -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());
}
}
// ---------------------------------------------------------------