78 lines
2.8 KiB
C#
78 lines
2.8 KiB
C#
#nullable enable
|
|
|
|
using System.Data;
|
|
using MBN_STOCK_WEBVIEW.DbWriteSmoke;
|
|
using MMoneyCoderSharp.Data;
|
|
|
|
namespace MBN_STOCK_WEBVIEW.DbWriteSmoke.Tests;
|
|
|
|
public sealed class ExistingChildRowGuardTests
|
|
{
|
|
[Fact]
|
|
public async Task ZeroCount_UsesBoundProductionSourceSpecificPreflights()
|
|
{
|
|
var executor = new RecordingExecutor("0");
|
|
var guard = new ExistingChildRowGuard(executor);
|
|
|
|
await guard.EnsureNamedPlaylistChildrenAbsentAsync("00000042", default);
|
|
await guard.EnsureThemeChildrenAbsentAsync(ThemeMarket.Krx, "00000043", default);
|
|
await guard.EnsureThemeChildrenAbsentAsync(ThemeMarket.Nxt, "00000044", default);
|
|
await guard.EnsureExpertChildrenAbsentAsync("0045", default);
|
|
|
|
Assert.Equal(4, executor.Calls.Count);
|
|
Assert.Equal(
|
|
[DataSourceKind.Oracle, DataSourceKind.Oracle, DataSourceKind.MariaDb, DataSourceKind.Oracle],
|
|
executor.Calls.Select(call => call.Source));
|
|
Assert.All(executor.Calls, call =>
|
|
{
|
|
var parameter = Assert.Single(call.Spec.Parameters);
|
|
Assert.Equal("parent_code", parameter.Name);
|
|
Assert.Equal(DbType.String, parameter.DbType);
|
|
Assert.DoesNotContain((string)parameter.Value!, call.Spec.Sql, StringComparison.Ordinal);
|
|
});
|
|
}
|
|
|
|
[Fact]
|
|
public async Task ExistingOrInvalidChildCount_FailsClosedBeforeMutation()
|
|
{
|
|
var guard = new ExistingChildRowGuard(new RecordingExecutor("1"));
|
|
|
|
await Assert.ThrowsAsync<InvalidOperationException>(() =>
|
|
guard.EnsureNamedPlaylistChildrenAbsentAsync("00000042", default));
|
|
}
|
|
|
|
private sealed class RecordingExecutor(string count) : IDataQueryExecutor
|
|
{
|
|
public List<QueryCall> Calls { get; } = [];
|
|
|
|
public DataTable Execute(DataSourceKind source, string tableName, string query) =>
|
|
throw new NotSupportedException();
|
|
|
|
public Task<DataTable> ExecuteAsync(
|
|
DataSourceKind source,
|
|
string tableName,
|
|
string query,
|
|
CancellationToken cancellationToken = default) =>
|
|
throw new NotSupportedException();
|
|
|
|
public Task<DataTable> ExecuteAsync(
|
|
DataSourceKind source,
|
|
string tableName,
|
|
DataQuerySpec query,
|
|
CancellationToken cancellationToken = default)
|
|
{
|
|
cancellationToken.ThrowIfCancellationRequested();
|
|
Calls.Add(new QueryCall(source, tableName, query));
|
|
var table = new DataTable();
|
|
table.Columns.Add("ROW_COUNT", typeof(string));
|
|
table.Rows.Add(count);
|
|
return Task.FromResult(table);
|
|
}
|
|
}
|
|
|
|
private sealed record QueryCall(
|
|
DataSourceKind Source,
|
|
string QueryName,
|
|
DataQuerySpec Spec);
|
|
}
|