192 lines
9.1 KiB
C#
192 lines
9.1 KiB
C#
namespace MBN_STOCK_WEBVIEW.LegacyWeb.Tests;
|
|
|
|
public sealed class LegacyPackageAppearanceSmokeContractTests
|
|
{
|
|
private static readonly string Root = FindRepositoryRoot();
|
|
private static readonly string Wrapper = Read(
|
|
"scripts", "Invoke-LegacyPackageAppearanceSmoke.ps1");
|
|
private static readonly string Harness = Read(
|
|
"scripts", "Test-LegacyPackageAppearanceSmoke.mjs");
|
|
|
|
[Fact]
|
|
public void Dedicated_runner_reuses_exact_debug_package_dryrun_and_close_guards()
|
|
{
|
|
Assert.Contains("-BuildFlavor DebugAppX", Wrapper, StringComparison.Ordinal);
|
|
Assert.Contains("-DefinitionsOnly", Wrapper, StringComparison.Ordinal);
|
|
Assert.Contains("Get-ExactDevelopmentPackage", Wrapper, StringComparison.Ordinal);
|
|
Assert.Contains("Assert-LocalConfigurationIsDryRun", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("Assert-NoTornadoConnection", Wrapper, StringComparison.Ordinal);
|
|
Assert.Contains("Start-ExactAppearanceApplication $registration 1", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("Start-ExactAppearanceApplication $registration 2", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Equal(2, CountOccurrences(Wrapper, "Close-ExactAppearanceApplication $"));
|
|
Assert.DoesNotContain("Stop-Process", Wrapper,
|
|
StringComparison.OrdinalIgnoreCase);
|
|
Assert.DoesNotContain("taskkill", Wrapper,
|
|
StringComparison.OrdinalIgnoreCase);
|
|
Assert.DoesNotMatch(@"(?i)C:\\Users\\[^\\]+", Wrapper);
|
|
}
|
|
|
|
[Fact]
|
|
public void Three_selects_use_trusted_windows_mouse_and_keyboard_once_per_phase()
|
|
{
|
|
Assert.Contains("SendApplicationClick(", Wrapper, StringComparison.Ordinal);
|
|
Assert.Contains("SendClosedSelectKeys(", Wrapper, StringComparison.Ordinal);
|
|
Assert.Contains("[FieldOffset(0)] public MouseInput Mouse", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("[FieldOffset(0)] public KeyboardInput Keyboard", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("[FieldOffset(0)] public HardwareInput Hardware", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("IntPtr.Size == 8 ? 40 : 28", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("inputSize != ExpectedInputStructureBytes()", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("event.isTrusted === true", Harness, StringComparison.Ordinal);
|
|
Assert.Contains("trustedChange: true", Harness, StringComparison.Ordinal);
|
|
Assert.Contains("physicalKeyCounts:", Harness, StringComparison.Ordinal);
|
|
Assert.Contains("home: ack.homeKeyCalls", Harness, StringComparison.Ordinal);
|
|
Assert.Contains("arrowDown: ack.arrowDownKeyCalls", Harness,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("enter: ack.enterKeyCalls", Harness, StringComparison.Ordinal);
|
|
Assert.Contains("A native HTML <select> popup consumes Home/ArrowDown/Enter", Harness,
|
|
StringComparison.Ordinal);
|
|
Assert.DoesNotContain("trustedKeyDowns.length >= expectedKeyCalls", Harness,
|
|
StringComparison.Ordinal);
|
|
Assert.DoesNotContain("trustedKeyDownCount -lt", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("selection.physicalKeyCounts.home -ne 1", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("selection.physicalKeyCounts.arrowDown -ne $expectedDownCount", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("selection.physicalKeyCounts.enter -ne 1", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("exchange.physicalInput.change.isTrusted -ne $true", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("exchange.physicalInput.change.value -cne", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("exchange.physicalKeyCounts.arrowDown -ne", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("nextExchangeSequence !== 5", Harness,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("evidence.exchanges.length !== 4", Harness,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains(
|
|
"[\"colorTheme\", \"viewMode\", \"startWorkspace\"]",
|
|
Harness,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("inputRetryCount: 0", Harness, StringComparison.Ordinal);
|
|
Assert.Contains("inputRetryCount = 0", Wrapper, StringComparison.Ordinal);
|
|
}
|
|
|
|
[Fact]
|
|
public void Harness_has_no_synthetic_input_or_appearance_bridge_post()
|
|
{
|
|
foreach (var method in new[]
|
|
{
|
|
"Input.dispatchMouseEvent",
|
|
"Input.dispatchKeyEvent",
|
|
"Input.insertText"
|
|
})
|
|
{
|
|
Assert.Contains($"\"{method}\"", Harness, StringComparison.Ordinal);
|
|
Assert.DoesNotContain($"rpc(\"{method}\"", Harness,
|
|
StringComparison.Ordinal);
|
|
}
|
|
Assert.DoesNotMatch(
|
|
@"postMessage\s*\(\s*\{\s*type:\s*['""]set-operator-appearance",
|
|
Harness);
|
|
Assert.DoesNotMatch(
|
|
@"(?:\.value\s*=(?!=)|dispatchEvent\s*\(|\.click\s*\(|localStorage\.setItem)",
|
|
Harness);
|
|
Assert.Contains(
|
|
"window.chrome.webview.postMessage({ type: \"ready\", payload: {} })",
|
|
Harness,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("outbound.length !== 1", Harness, StringComparison.Ordinal);
|
|
}
|
|
|
|
[Fact]
|
|
public void Relaunch_proves_persisted_start_behavior_before_any_settings_click()
|
|
{
|
|
Assert.Contains("persisted-appearance-after-relaunch", Harness,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("persisted start workspace behavior", Harness,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains(
|
|
"snapshot.dom.activeWorkspace === expectedStartupWorkspace",
|
|
Harness,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("startWorkspaceBehaviorVerifiedBeforeInput = true", Harness,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("startWorkspaceBehaviorVerifiedBeforeInput -ne $true", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("persistenceVerifiedBeforeInput", Wrapper,
|
|
StringComparison.Ordinal);
|
|
}
|
|
|
|
[Fact]
|
|
public void Original_settings_have_exact_raw_recovery_for_present_and_absent_baselines()
|
|
{
|
|
Assert.Contains("Initialize-ExactBaselineRecovery", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("operatorSettingsOriginallyAbsent", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("Restore-ExactBaselineSettings", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("BaselineRestoreAttempted", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("restoration is one-shot and was already attempted", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("[IO.File]::Replace(", Wrapper, StringComparison.Ordinal);
|
|
Assert.Contains("[IO.File]::Delete($OperatorSettingsPath)", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("exactOriginalBytesRestored = $true", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("recoveryCopyRemoved", Wrapper, StringComparison.Ordinal);
|
|
Assert.Contains("The application was intentionally left open", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("no input retry, close retry,", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("one-shot settings restoration had an unclear or failed result", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("retried. Preserve the recovery evidence", Wrapper,
|
|
StringComparison.Ordinal);
|
|
}
|
|
|
|
[Fact]
|
|
public void Evidence_is_bounded_create_new_and_hash_sealed()
|
|
{
|
|
Assert.Contains("flag: \"wx\"", Harness, StringComparison.Ordinal);
|
|
Assert.Contains("$item.Length -gt 512KB", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("[IO.FileMode]::CreateNew", Wrapper,
|
|
StringComparison.Ordinal);
|
|
Assert.Contains("$stream.Flush($true)", Wrapper, StringComparison.Ordinal);
|
|
Assert.Contains("phaseEvidenceSha256", Wrapper, StringComparison.Ordinal);
|
|
Assert.Contains("screenshotSha256", Wrapper, 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.");
|
|
}
|
|
}
|