import lib
fn contains(haystack: String, needle: String): Bool =
match String.indexOf(haystack, needle) {
Some(_) => true,
None => false,
}
// Snapshot: complete single-item feed
fn test_snapshot_single_item_feed(): Unit with {Test} = {
let f = lib.feed(
"My Blog",
"https://example.com",
"A personal blog",
[lib.item("Hello World", "https://example.com/hello", "My first post", "2025-01-29")]
)
let xml = lib.render(f)
// Verify exact structure of the feed
Test.assert(String.startsWith(xml, ""), "snap: XML declaration")
Test.assert(contains(xml, ""), "snap: RSS opening tag")
Test.assert(contains(xml, ""), "snap: channel open")
Test.assert(contains(xml, "My Blog"), "snap: feed title")
Test.assert(contains(xml, "https://example.com"), "snap: feed link")
Test.assert(contains(xml, "A personal blog"), "snap: feed desc")
Test.assert(contains(xml, "en"), "snap: language")
Test.assert(contains(xml, "Lux RSS Package"), "snap: generator")
Test.assert(contains(xml, "- "), "snap: item open")
Test.assert(contains(xml, "Hello World"), "snap: item title")
Test.assert(contains(xml, "https://example.com/hello"), "snap: item link")
Test.assert(contains(xml, "My first post"), "snap: item desc")
Test.assert(contains(xml, "29 Jan 2025 00:00:00 GMT"), "snap: item pubDate")
Test.assert(contains(xml, "https://example.com/hello"), "snap: item guid")
Test.assert(contains(xml, "
"), "snap: item close")
Test.assert(contains(xml, ""), "snap: channel and rss close")
}
// Snapshot: empty feed
fn test_snapshot_empty_feed(): Unit with {Test} = {
let f = lib.feed("Empty", "https://example.com", "Nothing", [])
let xml = lib.render(f)
Test.assert(String.startsWith(xml, " tags
Test.assertEqualMsg(false, contains(xml, "- "), "snap: no item tags")
Test.assert(contains(xml, "Empty"), "snap: title present")
Test.assert(String.endsWith(xml, ""), "snap: ends properly")
}
// Snapshot: feed with custom language
fn test_snapshot_french_feed(): Unit with {Test} = {
let f = lib.feedWithLang("Blog Francais", "https://exemple.fr", "Un blog", "fr", [
lib.item("Bonjour", "https://exemple.fr/bonjour", "Premier article", "2025-06-15")
])
let xml = lib.render(f)
Test.assert(contains(xml, "fr"), "snap: french language")
Test.assert(contains(xml, "Bonjour"), "snap: french item title")
Test.assert(contains(xml, "15 Jun 2025 00:00:00 GMT"), "snap: french item date")
}
// Snapshot: feed with escaped content
fn test_snapshot_escaped_feed(): Unit with {Test} = {
let f = lib.feed(
"Tom & Jerry",
"https://example.com",
"A show",
[lib.item("Episode: \"The Chase\"", "https://example.com/1", "Tom & Jerry's adventure", "2025-01-01")]
)
let xml = lib.render(f)
Test.assert(contains(xml, "Tom & Jerry"), "snap: escaped feed title")
Test.assert(contains(xml, "A <fun> show"), "snap: escaped feed desc")
}
// Snapshot: multi-item feed order
fn test_snapshot_multi_item_order(): Unit with {Test} = {
let f = lib.feed("Blog", "https://example.com", "A blog", [
lib.item("First", "https://example.com/1", "D1", "2025-01-01"),
lib.item("Second", "https://example.com/2", "D2", "2025-02-01"),
lib.item("Third", "https://example.com/3", "D3", "2025-03-01")
])
let xml = lib.render(f)
// Items should appear in order
let firstIdx = match String.indexOf(xml, "First") { Some(i) => i, None => -1 }
let secondIdx = match String.indexOf(xml, "Second") { Some(i) => i, None => -1 }
let thirdIdx = match String.indexOf(xml, "Third") { Some(i) => i, None => -1 }
Test.assert(firstIdx > 0, "snap: first item found")
Test.assert(secondIdx > firstIdx, "snap: second after first")
Test.assert(thirdIdx > secondIdx, "snap: third after second")
}
// Snapshot: date conversion across all months
fn test_snapshot_all_month_dates(): Unit with {Test} = {
Test.assertEqualMsg("01 Jan 2025 00:00:00 GMT", lib.isoToRfc822("2025-01-01"), "snap: Jan")
Test.assertEqualMsg("01 Feb 2025 00:00:00 GMT", lib.isoToRfc822("2025-02-01"), "snap: Feb")
Test.assertEqualMsg("01 Mar 2025 00:00:00 GMT", lib.isoToRfc822("2025-03-01"), "snap: Mar")
Test.assertEqualMsg("01 Apr 2025 00:00:00 GMT", lib.isoToRfc822("2025-04-01"), "snap: Apr")
Test.assertEqualMsg("01 May 2025 00:00:00 GMT", lib.isoToRfc822("2025-05-01"), "snap: May")
Test.assertEqualMsg("01 Jun 2025 00:00:00 GMT", lib.isoToRfc822("2025-06-01"), "snap: Jun")
Test.assertEqualMsg("01 Jul 2025 00:00:00 GMT", lib.isoToRfc822("2025-07-01"), "snap: Jul")
Test.assertEqualMsg("01 Aug 2025 00:00:00 GMT", lib.isoToRfc822("2025-08-01"), "snap: Aug")
Test.assertEqualMsg("01 Sep 2025 00:00:00 GMT", lib.isoToRfc822("2025-09-01"), "snap: Sep")
Test.assertEqualMsg("01 Oct 2025 00:00:00 GMT", lib.isoToRfc822("2025-10-01"), "snap: Oct")
Test.assertEqualMsg("01 Nov 2025 00:00:00 GMT", lib.isoToRfc822("2025-11-01"), "snap: Nov")
Test.assertEqualMsg("01 Dec 2025 00:00:00 GMT", lib.isoToRfc822("2025-12-01"), "snap: Dec")
}