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 = """
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)
}
}