diff options
author | ByteHamster <info@bytehamster.com> | 2021-08-28 00:12:48 +0200 |
---|---|---|
committer | ByteHamster <info@bytehamster.com> | 2021-08-28 09:57:41 +0200 |
commit | 24389d42e89037b205fff2bc681e4ad998895286 (patch) | |
tree | 1c3d979e043510431d54bd9ff0fab86ac7159737 /parser/feed/src/test/java | |
parent | 85c8a419acb385cdf249662866715965de219c93 (diff) | |
download | AntennaPod-24389d42e89037b205fff2bc681e4ad998895286.zip |
Moved feed parser to its own module
Diffstat (limited to 'parser/feed/src/test/java')
6 files changed, 489 insertions, 0 deletions
diff --git a/parser/feed/src/test/java/de/danoeh/antennapod/parser/feed/element/element/AtomTextTest.java b/parser/feed/src/test/java/de/danoeh/antennapod/parser/feed/element/element/AtomTextTest.java new file mode 100644 index 000000000..2ec91ab1d --- /dev/null +++ b/parser/feed/src/test/java/de/danoeh/antennapod/parser/feed/element/element/AtomTextTest.java @@ -0,0 +1,37 @@ +package de.danoeh.antennapod.parser.feed.element.element; + +import de.danoeh.antennapod.parser.feed.element.AtomText; +import de.danoeh.antennapod.parser.feed.namespace.Atom; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +import static org.junit.Assert.assertEquals; + +/** + * Unit test for {@link AtomText}. + */ +@RunWith(RobolectricTestRunner.class) +public class AtomTextTest { + + private static final String[][] TEST_DATA = { + {">", ">"}, + {">", ">"}, + {"<Français>", "<Français>"}, + {"ßÄÖÜ", "ßÄÖÜ"}, + {""", "\""}, + {"ß", "ß"}, + {"’", "’"}, + {"‰", "‰"}, + {"€", "€"} + }; + + @Test + public void testProcessingHtml() { + for (String[] pair : TEST_DATA) { + final AtomText atomText = new AtomText("", new Atom(), AtomText.TYPE_HTML); + atomText.setContent(pair[0]); + assertEquals(pair[1], atomText.getProcessedContent()); + } + } +} diff --git a/parser/feed/src/test/java/de/danoeh/antennapod/parser/feed/element/namespace/AtomParserTest.java b/parser/feed/src/test/java/de/danoeh/antennapod/parser/feed/element/namespace/AtomParserTest.java new file mode 100644 index 000000000..ba8aaf4f0 --- /dev/null +++ b/parser/feed/src/test/java/de/danoeh/antennapod/parser/feed/element/namespace/AtomParserTest.java @@ -0,0 +1,98 @@ +package de.danoeh.antennapod.parser.feed.element.namespace; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +import java.io.File; +import java.util.Date; + +import de.danoeh.antennapod.model.feed.Feed; +import de.danoeh.antennapod.model.feed.FeedItem; +import de.danoeh.antennapod.model.feed.FeedMedia; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +/** + * Tests for Atom feeds in FeedHandler. + */ +@RunWith(RobolectricTestRunner.class) +public class AtomParserTest { + + @Test + public void testAtomBasic() throws Exception { + File feedFile = FeedParserTestHelper.getFeedFile("feed-atom-testAtomBasic.xml"); + Feed feed = FeedParserTestHelper.runFeedParser(feedFile); + assertEquals(Feed.TYPE_ATOM1, feed.getType()); + assertEquals("title", feed.getTitle()); + assertEquals("http://example.com/feed", feed.getFeedIdentifier()); + assertEquals("http://example.com", feed.getLink()); + assertEquals("This is the description", feed.getDescription()); + assertEquals("http://example.com/payment", feed.getPaymentLinks().get(0).url); + assertEquals("http://example.com/picture", feed.getImageUrl()); + assertEquals(10, feed.getItems().size()); + for (int i = 0; i < feed.getItems().size(); i++) { + FeedItem item = feed.getItems().get(i); + assertEquals("http://example.com/item-" + i, item.getItemIdentifier()); + assertEquals("item-" + i, item.getTitle()); + assertNull(item.getDescription()); + assertEquals("http://example.com/items/" + i, item.getLink()); + assertEquals(new Date(i * 60000), item.getPubDate()); + assertNull(item.getPaymentLink()); + assertEquals("http://example.com/picture", item.getImageLocation()); + // media + assertTrue(item.hasMedia()); + FeedMedia media = item.getMedia(); + //noinspection ConstantConditions + assertEquals("http://example.com/media-" + i, media.getDownload_url()); + assertEquals(1024 * 1024, media.getSize()); + assertEquals("audio/mp3", media.getMime_type()); + // chapters + assertNull(item.getChapters()); + } + } + + @Test + public void testEmptyRelLinks() throws Exception { + File feedFile = FeedParserTestHelper.getFeedFile("feed-atom-testEmptyRelLinks.xml"); + Feed feed = FeedParserTestHelper.runFeedParser(feedFile); + assertEquals(Feed.TYPE_ATOM1, feed.getType()); + assertEquals("title", feed.getTitle()); + assertEquals("http://example.com/feed", feed.getFeedIdentifier()); + assertEquals("http://example.com", feed.getLink()); + assertEquals("This is the description", feed.getDescription()); + assertNull(feed.getPaymentLinks()); + assertEquals("http://example.com/picture", feed.getImageUrl()); + assertEquals(1, feed.getItems().size()); + + // feed entry + FeedItem item = feed.getItems().get(0); + assertEquals("http://example.com/item-0", item.getItemIdentifier()); + assertEquals("item-0", item.getTitle()); + assertNull(item.getDescription()); + assertEquals("http://example.com/items/0", item.getLink()); + assertEquals(new Date(0), item.getPubDate()); + assertNull(item.getPaymentLink()); + assertEquals("http://example.com/picture", item.getImageLocation()); + // media + assertFalse(item.hasMedia()); + // chapters + assertNull(item.getChapters()); + } + + @Test + public void testLogoWithWhitespace() throws Exception { + File feedFile = FeedParserTestHelper.getFeedFile("feed-atom-testLogoWithWhitespace.xml"); + Feed feed = FeedParserTestHelper.runFeedParser(feedFile); + assertEquals("title", feed.getTitle()); + assertEquals("http://example.com/feed", feed.getFeedIdentifier()); + assertEquals("http://example.com", feed.getLink()); + assertEquals("This is the description", feed.getDescription()); + assertEquals("http://example.com/payment", feed.getPaymentLinks().get(0).url); + assertEquals("https://example.com/image.png", feed.getImageUrl()); + assertEquals(0, feed.getItems().size()); + } +} diff --git a/parser/feed/src/test/java/de/danoeh/antennapod/parser/feed/element/namespace/FeedParserTestHelper.java b/parser/feed/src/test/java/de/danoeh/antennapod/parser/feed/element/namespace/FeedParserTestHelper.java new file mode 100644 index 000000000..5cc52d8cb --- /dev/null +++ b/parser/feed/src/test/java/de/danoeh/antennapod/parser/feed/element/namespace/FeedParserTestHelper.java @@ -0,0 +1,36 @@ +package de.danoeh.antennapod.parser.feed.element.namespace; + +import androidx.annotation.NonNull; + +import java.io.File; + +import de.danoeh.antennapod.model.feed.Feed; +import de.danoeh.antennapod.parser.feed.FeedHandler; + +/** + * Tests for FeedHandler. + */ +public abstract class FeedParserTestHelper { + + /** + * Returns the File object for a file in the resources folder. + */ + @NonNull + static File getFeedFile(@NonNull String fileName) { + //noinspection ConstantConditions + return new File(FeedParserTestHelper.class.getClassLoader().getResource(fileName).getFile()); + } + + /** + * Runs the feed parser on the given file. + */ + @NonNull + static Feed runFeedParser(@NonNull File feedFile) throws Exception { + FeedHandler handler = new FeedHandler(); + Feed parsedFeed = new Feed("http://example.com/feed", null); + parsedFeed.setFile_url(feedFile.getAbsolutePath()); + parsedFeed.setDownloaded(true); + handler.parseFeed(parsedFeed); + return parsedFeed; + } +} diff --git a/parser/feed/src/test/java/de/danoeh/antennapod/parser/feed/element/namespace/RssParserTest.java b/parser/feed/src/test/java/de/danoeh/antennapod/parser/feed/element/namespace/RssParserTest.java new file mode 100644 index 000000000..8f8942d7b --- /dev/null +++ b/parser/feed/src/test/java/de/danoeh/antennapod/parser/feed/element/namespace/RssParserTest.java @@ -0,0 +1,99 @@ +package de.danoeh.antennapod.parser.feed.element.namespace; + +import android.text.TextUtils; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +import java.io.File; +import java.util.Date; + +import de.danoeh.antennapod.model.feed.Feed; +import de.danoeh.antennapod.model.feed.FeedItem; +import de.danoeh.antennapod.model.feed.FeedMedia; +import de.danoeh.antennapod.model.playback.MediaType; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +/** + * Tests for RSS feeds in FeedHandler. + */ +@RunWith(RobolectricTestRunner.class) +public class RssParserTest { + + @Test + public void testRss2Basic() throws Exception { + File feedFile = FeedParserTestHelper.getFeedFile("feed-rss-testRss2Basic.xml"); + Feed feed = FeedParserTestHelper.runFeedParser(feedFile); + assertEquals(Feed.TYPE_RSS2, feed.getType()); + assertEquals("title", feed.getTitle()); + assertEquals("en", feed.getLanguage()); + assertEquals("http://example.com", feed.getLink()); + assertEquals("This is the description", feed.getDescription()); + assertEquals("http://example.com/payment", feed.getPaymentLinks().get(0).url); + assertEquals("http://example.com/picture", feed.getImageUrl()); + assertEquals(10, feed.getItems().size()); + for (int i = 0; i < feed.getItems().size(); i++) { + FeedItem item = feed.getItems().get(i); + assertEquals("http://example.com/item-" + i, item.getItemIdentifier()); + assertEquals("item-" + i, item.getTitle()); + assertNull(item.getDescription()); + assertEquals("http://example.com/items/" + i, item.getLink()); + assertEquals(new Date(i * 60000), item.getPubDate()); + assertNull(item.getPaymentLink()); + assertEquals("http://example.com/picture", item.getImageLocation()); + // media + assertTrue(item.hasMedia()); + FeedMedia media = item.getMedia(); + //noinspection ConstantConditions + assertEquals("http://example.com/media-" + i, media.getDownload_url()); + assertEquals(1024 * 1024, media.getSize()); + assertEquals("audio/mp3", media.getMime_type()); + // chapters + assertNull(item.getChapters()); + } + } + + @Test + public void testImageWithWhitespace() throws Exception { + File feedFile = FeedParserTestHelper.getFeedFile("feed-rss-testImageWithWhitespace.xml"); + Feed feed = FeedParserTestHelper.runFeedParser(feedFile); + assertEquals("title", feed.getTitle()); + assertEquals("http://example.com", feed.getLink()); + assertEquals("This is the description", feed.getDescription()); + assertEquals("http://example.com/payment", feed.getPaymentLinks().get(0).url); + assertEquals("https://example.com/image.png", feed.getImageUrl()); + assertEquals(0, feed.getItems().size()); + } + + @Test + public void testMediaContentMime() throws Exception { + File feedFile = FeedParserTestHelper.getFeedFile("feed-rss-testMediaContentMime.xml"); + Feed feed = FeedParserTestHelper.runFeedParser(feedFile); + assertEquals("title", feed.getTitle()); + assertEquals("http://example.com", feed.getLink()); + assertEquals("This is the description", feed.getDescription()); + assertEquals("http://example.com/payment", feed.getPaymentLinks().get(0).url); + assertNull(feed.getImageUrl()); + assertEquals(1, feed.getItems().size()); + FeedItem feedItem = feed.getItems().get(0); + //noinspection ConstantConditions + assertEquals(MediaType.VIDEO, feedItem.getMedia().getMediaType()); + assertEquals("https://www.example.com/file.mp4", feedItem.getMedia().getDownload_url()); + } + + @Test + public void testMultipleFundingTags() throws Exception { + File feedFile = FeedParserTestHelper.getFeedFile("feed-rss-testMultipleFundingTags.xml"); + Feed feed = FeedParserTestHelper.runFeedParser(feedFile); + assertEquals(3, feed.getPaymentLinks().size()); + assertEquals("Text 1", feed.getPaymentLinks().get(0).content); + assertEquals("https://example.com/funding1", feed.getPaymentLinks().get(0).url); + assertEquals("Text 2", feed.getPaymentLinks().get(1).content); + assertEquals("https://example.com/funding2", feed.getPaymentLinks().get(1).url); + assertTrue(TextUtils.isEmpty(feed.getPaymentLinks().get(2).content)); + assertEquals("https://example.com/funding3", feed.getPaymentLinks().get(2).url); + } +} diff --git a/parser/feed/src/test/java/de/danoeh/antennapod/parser/feed/element/util/DateUtilsTest.java b/parser/feed/src/test/java/de/danoeh/antennapod/parser/feed/element/util/DateUtilsTest.java new file mode 100644 index 000000000..1f039d703 --- /dev/null +++ b/parser/feed/src/test/java/de/danoeh/antennapod/parser/feed/element/util/DateUtilsTest.java @@ -0,0 +1,175 @@ +package de.danoeh.antennapod.parser.feed.element.util; + +import de.danoeh.antennapod.parser.feed.util.DateUtils; +import org.junit.Test; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.TimeZone; + +import static org.junit.Assert.assertEquals; + +/** + * Unit test for {@link DateUtils}. + */ +public class DateUtilsTest { + + @Test + public void testParseDateWithMicroseconds() { + GregorianCalendar exp = new GregorianCalendar(2015, 2, 28, 13, 31, 4); + exp.setTimeZone(TimeZone.getTimeZone("UTC")); + Date expected = new Date(exp.getTimeInMillis() + 963); + Date actual = DateUtils.parse("2015-03-28T13:31:04.963870"); + assertEquals(expected, actual); + } + + @Test + public void testParseDateWithCentiseconds() { + GregorianCalendar exp = new GregorianCalendar(2015, 2, 28, 13, 31, 4); + exp.setTimeZone(TimeZone.getTimeZone("UTC")); + Date expected = new Date(exp.getTimeInMillis() + 960); + Date actual = DateUtils.parse("2015-03-28T13:31:04.96"); + assertEquals(expected, actual); + } + + @Test + public void testParseDateWithDeciseconds() { + GregorianCalendar exp = new GregorianCalendar(2015, 2, 28, 13, 31, 4); + exp.setTimeZone(TimeZone.getTimeZone("UTC")); + Date expected = new Date(exp.getTimeInMillis() + 900); + Date actual = DateUtils.parse("2015-03-28T13:31:04.9"); + assertEquals(expected.getTime() / 1000, actual.getTime() / 1000); + assertEquals(900, actual.getTime() % 1000); + } + + @Test + public void testParseDateWithMicrosecondsAndTimezone() { + GregorianCalendar exp = new GregorianCalendar(2015, 2, 28, 6, 31, 4); + exp.setTimeZone(TimeZone.getTimeZone("UTC")); + Date expected = new Date(exp.getTimeInMillis() + 963); + Date actual = DateUtils.parse("2015-03-28T13:31:04.963870 +0700"); + assertEquals(expected, actual); + } + + @Test + public void testParseDateWithCentisecondsAndTimezone() { + GregorianCalendar exp = new GregorianCalendar(2015, 2, 28, 6, 31, 4); + exp.setTimeZone(TimeZone.getTimeZone("UTC")); + Date expected = new Date(exp.getTimeInMillis() + 960); + Date actual = DateUtils.parse("2015-03-28T13:31:04.96 +0700"); + assertEquals(expected, actual); + } + + @Test + public void testParseDateWithDecisecondsAndTimezone() { + GregorianCalendar exp = new GregorianCalendar(2015, 2, 28, 6, 31, 4); + exp.setTimeZone(TimeZone.getTimeZone("UTC")); + Date expected = new Date(exp.getTimeInMillis() + 900); + Date actual = DateUtils.parse("2015-03-28T13:31:04.9 +0700"); + assertEquals(expected.getTime() / 1000, actual.getTime() / 1000); + assertEquals(900, actual.getTime() % 1000); + } + + @Test + public void testParseDateWithTimezoneName() { + GregorianCalendar exp = new GregorianCalendar(2015, 2, 28, 6, 31, 4); + exp.setTimeZone(TimeZone.getTimeZone("UTC")); + Date expected = new Date(exp.getTimeInMillis()); + Date actual = DateUtils.parse("Sat, 28 Mar 2015 01:31:04 EST"); + assertEquals(expected, actual); + } + + @Test + public void testParseDateWithTimezoneName2() { + GregorianCalendar exp = new GregorianCalendar(2015, 2, 28, 6, 31, 0); + exp.setTimeZone(TimeZone.getTimeZone("UTC")); + Date expected = new Date(exp.getTimeInMillis()); + Date actual = DateUtils.parse("Sat, 28 Mar 2015 01:31 EST"); + assertEquals(expected, actual); + } + + @Test + public void testParseDateWithTimeZoneOffset() { + GregorianCalendar exp = new GregorianCalendar(2015, 2, 28, 12, 16, 12); + exp.setTimeZone(TimeZone.getTimeZone("UTC")); + Date expected = new Date(exp.getTimeInMillis()); + Date actual = DateUtils.parse("Sat, 28 March 2015 08:16:12 -0400"); + assertEquals(expected, actual); + } + + @Test + public void testAsctime() { + GregorianCalendar exp = new GregorianCalendar(2011, 4, 25, 12, 33, 0); + exp.setTimeZone(TimeZone.getTimeZone("UTC")); + Date expected = new Date(exp.getTimeInMillis()); + Date actual = DateUtils.parse("Wed, 25 May 2011 12:33:00"); + assertEquals(expected, actual); + } + + @Test + public void testMultipleConsecutiveSpaces() { + GregorianCalendar exp = new GregorianCalendar(2010, 2, 23, 6, 6, 26); + exp.setTimeZone(TimeZone.getTimeZone("UTC")); + Date expected = new Date(exp.getTimeInMillis()); + Date actual = DateUtils.parse("Tue, 23 Mar 2010 01:06:26 -0500"); + assertEquals(expected, actual); + } + + @Test + public void testParseDateWithNoTimezonePadding() { + GregorianCalendar exp = new GregorianCalendar(2017, 1, 22, 22, 28, 0); + exp.setTimeZone(TimeZone.getTimeZone("UTC")); + Date expected = new Date(exp.getTimeInMillis() + 2); + Date actual = DateUtils.parse("2017-02-22T14:28:00.002-08:00"); + assertEquals(expected, actual); + } + + /** + * Requires Android platform. Root cause: {@link DateUtils} implementation makes + * use of ISO 8601 time zone, which does not work on standard JDK. + * + * @see #testParseDateWithNoTimezonePadding() + */ + @Test + public void testParseDateWithForCest() { + GregorianCalendar exp1 = new GregorianCalendar(2017, 0, 28, 22, 0, 0); + exp1.setTimeZone(TimeZone.getTimeZone("UTC")); + Date expected1 = new Date(exp1.getTimeInMillis()); + Date actual1 = DateUtils.parse("Sun, 29 Jan 2017 00:00:00 CEST"); + assertEquals(expected1, actual1); + + GregorianCalendar exp2 = new GregorianCalendar(2017, 0, 28, 23, 0, 0); + exp2.setTimeZone(TimeZone.getTimeZone("UTC")); + Date expected2 = new Date(exp2.getTimeInMillis()); + Date actual2 = DateUtils.parse("Sun, 29 Jan 2017 00:00:00 CET"); + assertEquals(expected2, actual2); + } + + @Test + public void testParseDateWithIncorrectWeekday() { + GregorianCalendar exp1 = new GregorianCalendar(2014, 9, 8, 9, 0, 0); + exp1.setTimeZone(TimeZone.getTimeZone("GMT")); + Date expected = new Date(exp1.getTimeInMillis()); + Date actual = DateUtils.parse("Thu, 8 Oct 2014 09:00:00 GMT"); // actually a Wednesday + assertEquals(expected, actual); + } + + @Test + public void testParseDateWithBadAbbreviation() { + GregorianCalendar exp1 = new GregorianCalendar(2014, 8, 8, 0, 0, 0); + exp1.setTimeZone(TimeZone.getTimeZone("GMT")); + Date expected = new Date(exp1.getTimeInMillis()); + Date actual = DateUtils.parse("Mon, 8 Sept 2014 00:00:00 GMT"); // should be Sep + assertEquals(expected, actual); + } + + @Test + public void testParseDateWithTwoTimezones() { + final GregorianCalendar exp1 = new GregorianCalendar(2015, Calendar.MARCH, 1, 1, 0, 0); + exp1.setTimeZone(TimeZone.getTimeZone("GMT-4")); + final Date expected = new Date(exp1.getTimeInMillis()); + final Date actual = DateUtils.parse("Sun 01 Mar 2015 01:00:00 GMT-0400 (EDT)"); + assertEquals(expected, actual); + } +} diff --git a/parser/feed/src/test/java/de/danoeh/antennapod/parser/feed/element/util/DurationParserTest.java b/parser/feed/src/test/java/de/danoeh/antennapod/parser/feed/element/util/DurationParserTest.java new file mode 100644 index 000000000..91d9ea5ed --- /dev/null +++ b/parser/feed/src/test/java/de/danoeh/antennapod/parser/feed/element/util/DurationParserTest.java @@ -0,0 +1,44 @@ +package de.danoeh.antennapod.parser.feed.element.util; + +import de.danoeh.antennapod.parser.feed.util.DurationParser; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class DurationParserTest { + private int milliseconds = 1; + private int seconds = 1000 * milliseconds; + private int minutes = 60 * seconds; + private int hours = 60 * minutes; + + @Test + public void testSecondDurationInMillis() { + long duration = DurationParser.inMillis("00:45"); + assertEquals(45 * seconds, duration); + } + + @Test + public void testSingleNumberDurationInMillis() { + int twoHoursInSeconds = 2 * 60 * 60; + long duration = DurationParser.inMillis(String.valueOf(twoHoursInSeconds)); + assertEquals(2 * hours, duration); + } + + @Test + public void testMinuteSecondDurationInMillis() { + long duration = DurationParser.inMillis("05:10"); + assertEquals(5 * minutes + 10 * seconds, duration); + } + + @Test + public void testHourMinuteSecondDurationInMillis() { + long duration = DurationParser.inMillis("02:15:45"); + assertEquals(2 * hours + 15 * minutes + 45 * seconds, duration); + } + + @Test + public void testSecondsWithMillisecondsInMillis() { + long duration = DurationParser.inMillis("00:00:00.123"); + assertEquals(123, duration); + } +} |