Files
MBN_STOCK_WEBVIEW/tests/MBN_STOCK_WEBVIEW.LegacyWeb.Tests/LegacyPackageLocalStateSmokeContractTests.cs

166 lines
8.3 KiB
C#

namespace MBN_STOCK_WEBVIEW.LegacyWeb.Tests;
public sealed class LegacyPackageLocalStateSmokeContractTests
{
private static readonly string Root = FindRepositoryRoot();
private static readonly string Wrapper = Read(
"scripts", "Invoke-LegacyPackageLocalStateSmoke.ps1");
private static readonly string Harness = Read(
"scripts", "Test-LegacyPackageLocalStateSmoke.mjs");
private static readonly string Shared = Read(
"scripts", "Invoke-LegacyPackageInputSmoke.ps1");
[Fact]
public void Dedicated_profile_reuses_exact_debug_package_and_dryrun_guards()
{
Assert.Contains("-BuildFlavor DebugAppX", Wrapper, StringComparison.Ordinal);
Assert.Contains("-DefinitionsOnly", Wrapper, StringComparison.Ordinal);
Assert.Contains("[string]$LegacyDataDirectory", Wrapper, StringComparison.Ordinal);
Assert.Contains(
"'..\\MBN_STOCK_N\\MBN_STOCK_N\\bin\\Debug\\Data'",
Wrapper,
StringComparison.Ordinal);
Assert.DoesNotMatch(@"(?i)C:\\Users\\[^\\]+", Wrapper);
Assert.Contains("Assert-LocalConfigurationIsDryRun", Wrapper, StringComparison.Ordinal);
Assert.Contains("Assert-NoTornadoConnection", Wrapper, StringComparison.Ordinal);
Assert.Contains("Get-ExactDevelopmentPackage", Wrapper, StringComparison.Ordinal);
Assert.Contains("[switch]$DefinitionsOnly", Shared, StringComparison.Ordinal);
Assert.Contains("if ($DefinitionsOnly)", Shared, StringComparison.Ordinal);
Assert.Contains("function Read-LocalHarnessEvidenceFile", Wrapper,
StringComparison.Ordinal);
Assert.Contains("$item.Length -gt 128KB", Wrapper, StringComparison.Ordinal);
Assert.DoesNotContain(
"Read-SmallJsonEvidenceFile $EvidencePath 'Local-state harness evidence'",
Wrapper,
StringComparison.Ordinal);
}
[Fact]
public void Folder_pickers_are_real_click_owned_unique_and_escape_cancel_only()
{
Assert.Contains("SendApplicationClick(", Shared, StringComparison.Ordinal);
Assert.Contains("SendEscapeToForegroundWindow", Shared, StringComparison.Ordinal);
Assert.Contains("Key-up only releases the", Shared,
StringComparison.Ordinal);
Assert.Contains("caller separately proves that this exact", Shared,
StringComparison.Ordinal);
Assert.DoesNotContain("lost foreground before Escape was released", Shared,
StringComparison.Ordinal);
Assert.Contains("Wait-UniqueOwnedFolderPicker", Wrapper, StringComparison.Ordinal);
Assert.Contains("OwnerChainContains", Wrapper, StringComparison.Ordinal);
Assert.Contains("VisibleTopLevelWindows", Wrapper, StringComparison.Ordinal);
Assert.Contains("EnumWindows(callback, IntPtr.Zero)", Wrapper,
StringComparison.Ordinal);
Assert.Contains("AutomationElement]::FromHandle($handle)", Wrapper,
StringComparison.Ordinal);
Assert.Contains("$windowClass -cne '#32770'", Wrapper,
StringComparison.Ordinal);
Assert.Contains("$revalidated[0].Handle -ne $picker.Handle", Wrapper,
StringComparison.Ordinal);
Assert.Contains("ControlType]::Button", Wrapper, StringComparison.Ordinal);
Assert.Contains("Current.ClassName -ceq 'Button'", Wrapper,
StringComparison.Ordinal);
Assert.Contains("$automationId -ceq '1'", Wrapper, StringComparison.Ordinal);
Assert.Contains("$automationId -ceq '2'", Wrapper, StringComparison.Ordinal);
Assert.Contains("WindowPattern]::Pattern", Wrapper, StringComparison.Ordinal);
Assert.Contains("$windowPattern.Current.IsModal", Wrapper,
StringComparison.Ordinal);
Assert.Contains("AcquireOwnedForeground", Wrapper, StringComparison.Ordinal);
Assert.Contains("OwnerChainContains(window, expectedOwner)", Wrapper,
StringComparison.Ordinal);
Assert.Contains("uniqueNewPicker = $true", Wrapper, StringComparison.Ordinal);
Assert.Contains("closedAfterEscape = $true", Wrapper, StringComparison.Ordinal);
Assert.Contains("not destroyed after the one Escape input", Wrapper,
StringComparison.Ordinal);
Assert.Contains("waitForTrustedPointerClick", Harness, StringComparison.Ordinal);
Assert.Contains("isTrusted: event.isTrusted === true", Harness,
StringComparison.Ordinal);
Assert.Contains("settings file changed during a cancel-only smoke", Wrapper,
StringComparison.Ordinal);
Assert.DoesNotContain("reset-operator-folder", Harness, StringComparison.Ordinal);
}
[Fact]
public void Comparison_import_requires_exact_source_one_row_baseline_and_idempotence()
{
Assert.Contains(
"1EE76BC464FB1C44C8B6546E99CDC21C726C0E2C24AD344F5C19AE41BFC0D2F2",
Wrapper,
StringComparison.Ordinal);
Assert.Contains(
"13C07BA64587549EDA9C1A694F3DFA19875CB1F888F02C9E071F17C47739E087",
Wrapper,
StringComparison.Ordinal);
Assert.Contains("receipt?.addedPairCount === 8", Harness, StringComparison.Ordinal);
Assert.Contains("receipt?.addedPairCount === 0", Harness, StringComparison.Ordinal);
Assert.Contains("receipt?.skippedDuplicateCount === 8", Harness,
StringComparison.Ordinal);
Assert.Equal(
2,
CountOccurrences(
Harness,
"allowBusy: true, allowDialog: true, timeoutMilliseconds: 90_000"));
Assert.Contains("secondImportIdempotent = true", Harness, StringComparison.Ordinal);
Assert.Contains("rowId: pair.rowId", Harness, StringComparison.Ordinal);
Assert.Contains("displayLabel: pair.displayLabel", Harness, StringComparison.Ordinal);
Assert.Contains(
"initialPair.displayLabel !== \"KRX100지수 ↔ 코스피 지수\"",
Harness,
StringComparison.Ordinal);
Assert.DoesNotContain("pair.first?.displayName", Harness, StringComparison.Ordinal);
Assert.DoesNotContain("pair.second?.displayName", Harness, StringComparison.Ordinal);
Assert.Contains("no input was retried", Harness, StringComparison.Ordinal);
}
[Fact]
public void Harness_has_no_cdp_input_or_app_close_call_site()
{
Assert.Contains("\"Input.dispatchMouseEvent\"", Harness, StringComparison.Ordinal);
Assert.DoesNotContain("rpc(\"Input.dispatchMouseEvent\"", Harness,
StringComparison.Ordinal);
Assert.DoesNotContain("rpc(\"Input.dispatchKeyEvent\"", Harness,
StringComparison.Ordinal);
Assert.DoesNotContain("rpc(\"Browser.close\"", Harness, StringComparison.Ordinal);
Assert.DoesNotContain("rpc(\"Page.close\"", Harness, StringComparison.Ordinal);
Assert.DoesNotContain("Stop-Process", Wrapper, StringComparison.OrdinalIgnoreCase);
Assert.DoesNotContain("taskkill", Wrapper, StringComparison.OrdinalIgnoreCase);
}
[Fact]
public void Initial_state_race_is_input_free_and_stdin_does_not_hold_node_open()
{
Assert.Contains("process.stdin.unref", Harness, StringComparison.Ordinal);
Assert.Contains("label !== \"DryRun IDLE preflight\"", Harness,
StringComparison.Ordinal);
Assert.Contains("Only the input-free initial preflight", Harness,
StringComparison.Ordinal);
Assert.Contains("allowMissingState: true", Harness, StringComparison.Ordinal);
Assert.Contains("last.safety.blockedOutboundMessages.length", Harness,
StringComparison.Ordinal);
Assert.Contains("last.dom.connectionText !== \"DRY RUN\"", Harness,
StringComparison.Ordinal);
}
private static string Read(params string[] segments) =>
File.ReadAllText(Path.Combine([Root, .. segments]));
private static int CountOccurrences(string value, string token) =>
value.Split(token, StringSplitOptions.None).Length - 1;
private static string FindRepositoryRoot()
{
var current = new DirectoryInfo(AppContext.BaseDirectory);
while (current is not null)
{
if (File.Exists(Path.Combine(current.FullName, "MBN_STOCK_WEBVIEW.sln")))
{
return current.FullName;
}
current = current.Parent;
}
throw new DirectoryNotFoundException("Repository root was not found.");
}
}