using FluentAssertions; using HtmlAgilityPack; using Wino.Services.Extensions; using Xunit; namespace Wino.Core.Tests.Services; public class HtmlAgilityPackExtensionsTests { [Fact] public void ClearImages_Should_Block_Remote_Image_References_But_Keep_Embedded_Ones() { // Arrange var document = new HtmlDocument(); document.LoadHtml("""
hello
"""); // Act document.ClearImages(); var output = document.DocumentNode.OuterHtml; // Assert output.Should().Contain("id=\"embedded\" src=\"data:image/png;base64,AAAA\"", "embedded inline images should still render"); output.Should().NotContain("id=\"remote\" src=", "remote img sources should be removed"); output.Should().NotContain("background=\"https://tracker.example/body.png\"", "background attributes can be used as trackers"); output.Should().NotContain("srcset=", "responsive image candidates should be removed because they may fetch remote trackers"); output.Should().NotContain("https://tracker.example/inline.png", "inline CSS should not be allowed to fetch remote images"); output.Should().Contain("color:blue", "non-image inline styling should be preserved"); output.Should().NotContain("https://tracker.example/bg.png", "style blocks should not be allowed to fetch remote images"); output.Should().Contain("color: red", "safe CSS declarations should remain"); output.Should().NotContain("id=\"vml\" src=", "VML image references should be removed"); output.Should().NotContain("id=\"svg-remote\" href=", "SVG image references should not fetch remote content"); output.Should().Contain("id=\"svg-local\" href=\"#icon\"", "local fragment references should remain"); } }