using System.Security.Cryptography; using System.Text.Json; using Xunit; namespace XFESystem.Documents.Tests; public sealed class WebsiteWebPreviewTests { [Fact] public void NativeWebsiteSnapshotKeepsEveryImportedSourceByteAndLicenseReference() { using var manifest = JsonDocument.Parse(WebsiteAssets.ReadText("Exact/SourceManifest.json")); Assert.Equal(2, manifest.RootElement.GetProperty("SchemaVersion").GetInt32()); Assert.Equal("XFEStudioWebSite", manifest.RootElement.GetProperty("SourceRepository").GetString()); foreach (var entry in manifest.RootElement.GetProperty("Entries").EnumerateArray()) { var expected = entry.GetProperty("SourceSha256").GetString(); Assert.Equal(expected, entry.GetProperty("SnapshotSha256").GetString()); using var asset = WebsiteAssets.Open("Exact/" + entry.GetProperty("SnapshotPath").GetString()); Assert.Equal(expected, Convert.ToHexStringLower(SHA256.HashData(asset))); Assert.False(string.IsNullOrWhiteSpace(entry.GetProperty("License").GetString())); } } [Fact] public void NativeWebsitePreviewKeepsOriginalPartialsAndAddsAnExplicitFlatDesktopHostStylesheet() { var preview = new DocumentPreviewBuilder(new()).MarkdownWeb("# XFE\n\n```csharp\npublic class Sample {}\n```", "Sample.md"); Assert.Contains("class=\"markdown-body docs-article-body\"", preview.Html); Assert.Contains("data-bs-theme=\"dark\"", preview.Html); Assert.DoesNotContain("", preview.Html); Assert.Contains("language-csharp", preview.Html); Assert.True(preview.RequiresJavaScript); } [Theory] [InlineData(true, "dark", "class=\"dark\"")] [InlineData(false, "light", "class=\"\"")] public void WebsiteThemeSelectsTheOriginalThemeVariableRules(bool dark, string theme, string cssClass) { var preview = new DocumentPreviewBuilder(new()).MarkdownWeb("Hello", dark: dark); Assert.Contains(cssClass, preview.Html); Assert.Contains("data-bs-theme=\"" + theme + "\"", preview.Html); Assert.Contains("--main-color: #ac99ea", WebsiteAssets.ReadText("Exact/ThemeVariables.css")); Assert.Contains("--main-color: #512db4", WebsiteAssets.ReadText("Exact/ThemeVariables.css")); } [Fact] public void MarkdownContentCannotInjectExecutableScriptIntoTheTrustedDocumentWrapper() { var preview = new DocumentPreviewBuilder(new()).MarkdownWeb( "# Safe\nBad" + "", ""); Assert.DoesNotContain("globalThis.Evil", preview.Html); Assert.DoesNotContain("javascript:", preview.Html); Assert.DoesNotContain("\";", "Sample.cs"); Assert.Contains("language-csharp", preview.Html); Assert.Contains("</script>", preview.Html); Assert.Contains("/js/docs/csharp.js", preview.Html); Assert.DoesNotContain("monarch", preview.Html, StringComparison.OrdinalIgnoreCase); } }