package com.rssuper.parsing import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull import org.junit.Assert.fail 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 FeedParserTest { @Test fun testParseRSSFeed() { val xml = """ RSS Feed https://example.com Item https://example.com/item """.trimIndent() val result = FeedParser.parse(xml, "https://example.com/feed.xml") assertNotNull(result) assertEquals(FeedType.RSS, result.feedType) assertEquals("RSS Feed", result.feed.title) } @Test fun testParseAtomFeed() { val xml = """ Atom Feed urn:uuid:feed Entry urn:uuid:entry """.trimIndent() val result = FeedParser.parse(xml, "https://example.com/feed.atom") assertNotNull(result) assertEquals(FeedType.Atom, result.feedType) assertEquals("Atom Feed", result.feed.title) } @Test fun testParseRSSWithNamespaces() { val xml = """ Namespaced Feed Author Item """.trimIndent() val result = FeedParser.parse(xml, "https://example.com/feed.xml") assertNotNull(result) assertEquals(FeedType.RSS, result.feedType) } @Test fun testParseMalformedXml() { val malformedXml = """ Broken """.trimIndent() try { val result = FeedParser.parse(malformedXml, "https://example.com/feed.xml") assertNotNull(result) } catch (e: Exception) { assertNotNull(e) } } @Test fun testParseInvalidFeedType() { val invalidXml = """ <?xml version="1.0" encoding="UTF-8"?> <invalid> <data>Some data</data> </invalid> """.trimIndent() try { FeedParser.parse(invalidXml, "https://example.com/feed.xml") fail("Expected exception for invalid feed type") } catch (e: FeedParsingError) { assertEquals(FeedParsingError.UnsupportedFeedType, e) } } @Test fun testParseEmptyFeed() { val emptyXml = """ <?xml version="1.0" encoding="UTF-8"?> <rss version="2.0"> <channel> <title> """.trimIndent() val result = FeedParser.parse(emptyXml, "https://example.com/feed.xml") assertNotNull(result) assertEquals("Untitled Feed", result.feed.title) } @Test fun testAsyncCallback() { val xml = """ Async Feed Item """.trimIndent() FeedParser.parseAsync(xml, "https://example.com/feed.xml") { result -> assert(result.isSuccess) val feed = result.getOrNull() assertNotNull(feed) assertEquals("Async Feed", feed?.feed?.title) } } @Test fun testAsyncCallbackError() { val invalidXml = "not xml" FeedParser.parseAsync(invalidXml, "https://example.com/feed.xml") { result -> assert(result.isFailure) } } }