package com.rssuper.parsing import com.rssuper.models.Enclosure import com.rssuper.models.Feed import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull import org.junit.Assert.assertNull import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config @RunWith(RobolectricTestRunner::class) @Config(sdk = [24]) class RSSParserTest { @Test fun testParseBasicRSS() { val xml = """ Test Feed https://example.com A test feed en-us Mon, 01 Jan 2024 12:00:00 GMT RSS Generator 60 Item 1 https://example.com/item1 Description of item 1 https://example.com/item1 Mon, 01 Jan 2024 10:00:00 GMT Item 2 https://example.com/item2 Description of item 2 item-2-guid Sun, 31 Dec 2023 10:00:00 GMT """.trimIndent() val feed = RSSParser.parse(xml, "https://example.com/feed.xml") assertNotNull(feed) assertEquals("Test Feed", feed.title) assertEquals("https://example.com", feed.link) assertEquals("A test feed", feed.description) assertEquals("en-us", feed.language) assertEquals(60, feed.ttl) assertEquals(2, feed.items.size) val item1 = feed.items[0] assertEquals("Item 1", item1.title) assertEquals("https://example.com/item1", item1.link) assertEquals("Description of item 1", item1.description) assertNotNull(item1.published) } @Test fun testParseRSSWithiTunesNamespace() { val xml = """ Podcast Feed https://example.com/podcast My podcast Podcast subtitle Author Name Episode 1 https://example.com/episode1 Episode description 01:30:00 """.trimIndent() val feed = RSSParser.parse(xml, "https://example.com/feed.xml") assertNotNull(feed) assertEquals("Podcast Feed", feed.title) val item = feed.items[0] assertEquals("Episode 1", item.title) assertNotNull(item.enclosure) assertEquals("https://example.com/ep1.mp3", item.enclosure?.url) assertEquals("audio/mpeg", item.enclosure?.type) assertEquals(12345678L, item.enclosure?.length) } @Test fun testParseRSSWithContentNamespace() { val xml = """ Feed with Content Item with Content Short description Full content here

]]>
""".trimIndent() val feed = RSSParser.parse(xml, "https://example.com/feed.xml") assertNotNull(feed) assertEquals(1, feed.items.size) assertEquals("Item with Content", feed.items[0].title) assertEquals("

Full content here

", feed.items[0].content) } @Test fun testParseRSSWithCategories() { val xml = """ Categorized Feed Tech Article Technology Programming """.trimIndent() val feed = RSSParser.parse(xml, "https://example.com/feed.xml") assertNotNull(feed) val item = feed.items[0] assertEquals(2, item.categories?.size) assertEquals("Technology", item.categories?.get(0)) assertEquals("Programming", item.categories?.get(1)) } @Test fun testParseRSSWithAuthor() { val xml = """ Author Feed Article by Author author@example.com (John Doe) """.trimIndent() val feed = RSSParser.parse(xml, "https://example.com/feed.xml") assertNotNull(feed) val item = feed.items[0] assertEquals("author@example.com (John Doe)", item.author) } @Test fun testParseRSSWithGuid() { val xml = """ Guid Feed Item custom-guid-12345 """.trimIndent() val feed = RSSParser.parse(xml, "https://example.com/feed.xml") assertNotNull(feed) assertEquals("custom-guid-12345", feed.items[0].guid) } @Test fun testParseRSSWithEmptyChannel() { val xml = """ Minimal Feed """.trimIndent() val feed = RSSParser.parse(xml, "https://example.com/feed.xml") assertNotNull(feed) assertEquals("Minimal Feed", feed.title) assertEquals(0, feed.items.size) } @Test fun testParseRSSWithMissingFields() { val xml = """ Only Title """.trimIndent() val feed = RSSParser.parse(xml, "https://example.com/feed.xml") assertNotNull(feed) assertEquals("Untitled Feed", feed.title) assertEquals(1, feed.items.size) assertEquals("Only Title", feed.items[0].title) assertNull(feed.items[0].link) } @Test fun testParseRSSWithCDATA() { val xml = """ <![CDATA[CDATA Title]]> HTML content

]]>
CDATA Item
""".trimIndent() val feed = RSSParser.parse(xml, "https://example.com/feed.xml") assertNotNull(feed) assertEquals("CDATA Title", feed.title) assertEquals("

HTML content

", feed.description) assertEquals("Item content", feed.items[0].description) } }