feat: complete legacy UI and playout parity migration

This commit is contained in:
2026-07-15 13:11:38 +09:00
parent f14800656b
commit 6e0c275fdd
108 changed files with 43738 additions and 560 deletions

View File

@@ -0,0 +1,144 @@
#nullable enable
using MBN_STOCK_WEBVIEW.DbWriteSmoke;
namespace MBN_STOCK_WEBVIEW.DbWriteSmoke.Tests;
public sealed class DevelopmentDatabaseSmokeScenarioTests
{
[Fact]
public async Task SuccessfulScenario_InvokesEachOperationExactlyOnceInOrder()
{
var calls = new List<string>();
var scenario = CreateScenario(calls);
var result = await scenario.RunAsync();
Assert.True(result.Passed);
Assert.True(result.CleanupAttempted);
Assert.True(result.CleanupVerified);
Assert.Equal(
["preflight", "create", "create-readback", "save", "save-readback", "cleanup", "absent"],
calls);
}
[Fact]
public async Task UnknownCreate_DoesNotRetryCleanupOrContinue()
{
var calls = new List<string>();
var scenario = CreateScenario(
calls,
create: _ =>
{
calls.Add("create");
return Task.FromException(new UnknownTestException());
});
var result = await scenario.RunAsync();
Assert.False(result.Passed);
Assert.True(result.OutcomeUnknown);
Assert.Equal(nameof(UnknownTestException), result.FailureClass);
Assert.True(result.ManualCleanupMayBeRequired);
Assert.False(result.CleanupAttempted);
Assert.Equal(["preflight", "create"], calls);
}
[Fact]
public async Task UnknownSave_DoesNotIssueReadbackOrCleanupMutation()
{
var calls = new List<string>();
var scenario = CreateScenario(
calls,
save: _ =>
{
calls.Add("save");
return Task.FromException(new UnknownTestException());
});
var result = await scenario.RunAsync();
Assert.False(result.Passed);
Assert.True(result.OutcomeUnknown);
Assert.True(result.ManualCleanupMayBeRequired);
Assert.False(result.CleanupAttempted);
Assert.Equal(["preflight", "create", "create-readback", "save"], calls);
}
[Fact]
public async Task KnownReadbackFailure_StillCleansKnownCreatedRecordInFinally()
{
var calls = new List<string>();
var scenario = CreateScenario(
calls,
verifyCreate: _ =>
{
calls.Add("create-readback");
return Task.FromException(new InvalidOperationException("bad readback"));
});
var result = await scenario.RunAsync();
Assert.False(result.Passed);
Assert.False(result.OutcomeUnknown);
Assert.Equal(nameof(InvalidOperationException), result.FailureClass);
Assert.Equal(DevelopmentDatabaseSmokeStage.CreateReadback, result.FailureStage);
Assert.True(result.CleanupAttempted);
Assert.True(result.CleanupVerified);
Assert.Equal(
["preflight", "create", "create-readback", "cleanup", "absent"],
calls);
}
[Fact]
public async Task UnknownCleanup_IsNotRetriedAndSkipsAbsenceRead()
{
var calls = new List<string>();
var scenario = CreateScenario(
calls,
cleanup: _ =>
{
calls.Add("cleanup");
return Task.FromException(new UnknownTestException());
});
var result = await scenario.RunAsync();
Assert.False(result.Passed);
Assert.True(result.OutcomeUnknown);
Assert.Equal(DevelopmentDatabaseSmokeStage.Cleanup, result.FailureStage);
Assert.True(result.CleanupAttempted);
Assert.False(result.CleanupVerified);
Assert.Equal(
["preflight", "create", "create-readback", "save", "save-readback", "cleanup"],
calls);
}
private static DevelopmentDatabaseSmokeScenario CreateScenario(
List<string> calls,
Func<CancellationToken, Task>? create = null,
Func<CancellationToken, Task>? verifyCreate = null,
Func<CancellationToken, Task>? save = null,
Func<CancellationToken, Task>? cleanup = null) =>
new(
"fake production workflow",
Record(calls, "preflight"),
create ?? Record(calls, "create"),
verifyCreate ?? Record(calls, "create-readback"),
save ?? Record(calls, "save"),
Record(calls, "save-readback"),
cleanup ?? Record(calls, "cleanup"),
Record(calls, "absent"),
exception => exception is UnknownTestException);
private static Func<CancellationToken, Task> Record(
ICollection<string> calls,
string value) =>
_ =>
{
calls.Add(value);
return Task.CompletedTask;
};
private sealed class UnknownTestException : Exception;
}