using PrivaPub.Federation.Objects; namespace PrivaPub.Tests.Federation { public class ContentSanitizerTests { [Theory] [InlineData("

hi

", "

hi

")] [InlineData("

hi

", "

hi

")] [InlineData("", "")] [InlineData("x", "x")] [InlineData("alert(1)\">x", "x")] [InlineData("x", "x")] [InlineData("text", "text")] [InlineData("

x

", "

x

")] [InlineData("", "")] [InlineData("

x

", "

x

")] [InlineData("
ok", "ok")] [InlineData("

ab

", "

ab

")] [InlineData("

kept

", "

kept

")] [InlineData("

Title

", "

Title

")] [InlineData("x", "x")] public void Removes_what_is_not_allowed(string input, string expected) => Assert.Equal(expected, ContentSanitizer.Html(input)); [Fact] public void Keeps_mastodon_mention_and_hashtag_markup() { var html = "

@alice " + "#fedi " + "https://example.org/a-long

"; var sanitized = ContentSanitizer.Html(html); Assert.Contains("class=\"h-card\"", sanitized); Assert.Contains("class=\"u-url mention\"", sanitized); Assert.Contains("class=\"mention hashtag\"", sanitized); Assert.Contains("class=\"invisible\"", sanitized); Assert.Contains("class=\"ellipsis\"", sanitized); Assert.Contains("href=\"https://m.example/@alice\"", sanitized); Assert.DoesNotContain("rel=\"tag\"", sanitized); } [Theory] [InlineData("")] [InlineData(" ")] [InlineData(null)] public void Empty_input_is_empty(string input) => Assert.Equal(string.Empty, ContentSanitizer.Html(input)); } }