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", "<p>Unvalidated content</p>")
: 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", "<p>Legacy HTTP content</p>");
}
}
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", "<p>Unvalidated content</p>")
: 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", "<p>Legacy HTTP content</p>");
}
}