183 lines
9.2 KiB
C#
183 lines
9.2 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_known_baseline_and_idempotence()
|
|
{
|
|
Assert.Contains(
|
|
"1EE76BC464FB1C44C8B6546E99CDC21C726C0E2C24AD344F5C19AE41BFC0D2F2",
|
|
Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains(
|
|
"13C07BA64587549EDA9C1A694F3DFA19875CB1F888F02C9E071F17C47739E087",
|
|
Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains(
|
|
"2575C2420800670B0022EBEE819BA3D9640DB14E9552426DF46075D079F1F697",
|
|
Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("baselineMode === \"fresh\" ? 8 : 0", Harness,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("baselineMode === \"fresh\" ? 0 : 8", Harness,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("receipt?.addedPairCount === expectedFirstAdded", Harness,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("receipt?.skippedDuplicateCount === expectedFirstSkipped", Harness,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("receipt?.addedPairCount === 0", Harness, StringComparison.Ordinal);
|
|
Assert.Contains("receipt?.skippedDuplicateCount === 8", Harness,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains(
|
|
"initialDestinationMode = isFresh ? \"fresh\" : \"alreadyImported\"",
|
|
Harness,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("$script:DestinationBaselineMode = if ($isFresh)", Wrapper,
|
|
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.");
|
|
}
|
|
}
|