add Recovery.Entities module

This commit is contained in:
mmacia committed 2026-09-14 21:45:04 +00:00
1 parent acc78f419a
commit ca35ee7d5f
2 files changed
+171

No files matched your search

@@ -0,0 +1,40 @@
defmodule FeedReader.Recovery.EntitiesTest do
use ExUnit.Case, async: true
alias FeedReader.Recovery.Entities
test "preserves valid named and numeric entities" do
xml = "& < > " ' © 😀"
assert normalize([xml]) == xml
end
test "escapes raw and invalid entity references" do
assert normalize(["A & B &unknown; C &not-an-entity D"]) ==
"A & B &unknown; C &not-an-entity D"
end
test "preserves ampersands inside CDATA" do
chunks = ["<![C", "DATA[<p>A & B</p>]]>"]
assert normalize(chunks) == "<![CDATA[<p>A & B</p>]]>"
end
test "preserves ampersands inside comments" do
chunks = ["<!-- source: A &", " B -->"]
assert normalize(chunks) == "<!-- source: A & B -->"
end
test "handles an entity split across chunks" do
assert normalize(["A &am", "p; B &#", "169; C"]) == "A &amp; B &#169; C"
end
test "handles CDATA and comment terminators split across chunks" do
chunks = ["<![CDATA[A & B]", "]><!-- C & D -", "->E & F"]
assert normalize(chunks) == "<![CDATA[A & B]]><!-- C & D -->E &amp; F"
end
defp normalize(chunks), do: chunks |> Entities.normalize() |> Enum.join()
end