namespace XFESystem.Browser.Tests; public sealed class TransportCapabilitiesTests { [Fact] public void OfflineBackendDeclaresNoNetworkAndStillRunsBuiltInScripts() { var browser = new BrowserService(); Assert.False(browser.Capabilities.NativeNetworkTransport); Assert.False(browser.Capabilities.SupportsHttp); Assert.False(browser.Capabilities.SupportsHttps); Assert.Contains("JavaScript ready: 12", browser.Navigate("about:Start").Text, StringComparison.Ordinal); } [Fact] public void HostHttpBackendDoesNotClaimNativeGuestNetworking() { using var transport = new HttpWebTransport(); var browser = new BrowserService(transport); Assert.False(browser.Capabilities.NativeNetworkTransport); Assert.True(browser.Capabilities.SupportsHttp); Assert.True(browser.Capabilities.SupportsHttps); } [Fact] public void NativeBackendDeclarationDoesNotClaimConnectivityAndIsSnapshotted() { var transport = new DeclaredTransport { IsNative = true, SupportsHttp = true }; var browser = new BrowserService(transport); transport.IsNative = false; transport.SupportsHttp = false; transport.SupportsHttps = true; Assert.True(browser.Capabilities.NativeNetworkTransport); Assert.True(browser.Capabilities.SupportsHttp); Assert.False(browser.Capabilities.SupportsHttps); Assert.Contains("No configured adapter", browser.Navigate("http://example.test/").Text, StringComparison.Ordinal); } [Fact] public void TransportDeclarationNeverSubstitutesForCertificateValidation() { var transport = new DeclaredTransport { IsNative = true, SupportsHttp = true, SupportsHttps = true, ReturnUnvalidatedHttps = true }; var browser = new BrowserService(transport); var page = browser.Navigate("https://example.test/"); Assert.Equal("Navigation failed", page.Title); Assert.Contains("certificate validation", page.Text, StringComparison.Ordinal); Assert.DoesNotContain("Unvalidated content", page.Text, StringComparison.Ordinal); } [Fact] public void UndeclaredLegacyTransportStillWorksWithoutInferredCapabilities() { var browser = new BrowserService(new LegacyTransport()); Assert.False(browser.Capabilities.NativeNetworkTransport); Assert.False(browser.Capabilities.SupportsHttp); Assert.False(browser.Capabilities.SupportsHttps); Assert.Contains("Legacy HTTP content", browser.Navigate("http://example.test/").Text, StringComparison.Ordinal); } private sealed class DeclaredTransport : IWebTransport, IWebTransportCapabilities { public bool IsNative { get; set; } public bool SupportsHttp { get; set; } public bool SupportsHttps { get; set; } public bool ReturnUnvalidatedHttps { get; init; } public WebResponse Get(Uri address, BrowserLimits limits) => ReturnUnvalidatedHttps ? new(address, 200, "text/html", "

Unvalidated content

") : throw new InvalidOperationException("No configured adapter is available."); } private sealed class LegacyTransport : IWebTransport { public WebResponse Get(Uri address, BrowserLimits limits) => new(address, 200, "text/html", "

Legacy HTTP content

"); } }