diff options
| author | Orangerot <purple@orangerot.dev> | 2024-06-19 00:14:49 +0200 | 
|---|---|---|
| committer | Orangerot <purple@orangerot.dev> | 2024-06-27 12:11:14 +0200 | 
| commit | 5b8851b6c268d0e93c158908fbfae9f8473db5ff (patch) | |
| tree | 7010eb85d86fa2da06ea4ffbcdb01a685d502ae8 /pse-server/src/test/java/org/psesquared/server/util | |
Diffstat (limited to 'pse-server/src/test/java/org/psesquared/server/util')
| -rw-r--r-- | pse-server/src/test/java/org/psesquared/server/util/RssParserTests.java | 135 | 
1 files changed, 135 insertions, 0 deletions
diff --git a/pse-server/src/test/java/org/psesquared/server/util/RssParserTests.java b/pse-server/src/test/java/org/psesquared/server/util/RssParserTests.java new file mode 100644 index 0000000..73c5497 --- /dev/null +++ b/pse-server/src/test/java/org/psesquared/server/util/RssParserTests.java @@ -0,0 +1,135 @@ +package org.psesquared.server.util; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.File; + +import org.junit.jupiter.api.Test; +import org.psesquared.server.BaseTest; +import org.psesquared.server.TestAsyncConfig; +import org.psesquared.server.model.Episode; +import org.psesquared.server.model.Subscription; +import org.springframework.test.context.ContextConfiguration; + +// Disable async behavior for this Test Class +@ContextConfiguration(classes = TestAsyncConfig.class) +public class RssParserTests extends BaseTest { + +    private static final String TAGESSCHAU_URL = "https://www.tagesschau.de/multimedia/podcasts/mal-angenommen-feed-101.xml"; +    private final Subscription tagesschauPodcast = Subscription.builder() +            .url(TAGESSCHAU_URL) +            .build(); +    private final String relativePathToTestFeeds = "./testfeeds/"; + +    @Test +    public void testSubscriptionInvalid() { +        Subscription nullSubscription = null; +        Subscription nullUrlSubscription = Subscription.builder().build(); +        Subscription invalidUrlSubscription = Subscription.builder() +                .url("Not a url") +                .title("Some inventive Title") +                .build(); + +        assertDoesNotThrow(() -> rssParser.validate(nullSubscription)); +        assertDoesNotThrow(() -> rssParser.validate(nullUrlSubscription)); +        assertDoesNotThrow(() -> rssParser.validate(invalidUrlSubscription)); +        assertFalse(subscriptionDao.findByUrl(invalidUrlSubscription.getUrl()).isPresent()); +    } + +    // Does currently only work in debugger by making sure the Parser has time to +    // validate, before the Test evaluates the Assertions. +    @Test +    public void testValidSubscription() { +        final String expectedURL = "https://media.tagesschau.de/audio/2023/0125/AU-20230125-1854-5200.hi.mp3"; +        final String expectedGuid = "tagesschau-podcast-mal-angenommen-tierrechte-101"; +        final String expectedTitle = "Gleiche Rechte für Tiere? Was dann?"; +        final int expectedTotal = 1442; +        Episode expectedEpisode = Episode.builder().url(expectedURL).guid(expectedGuid).title(expectedTitle) +                .total(expectedTotal).subscription(tagesschauPodcast).build(); +        Episode testEpisode = Episode.builder().url(expectedURL).id(expectedEpisode.getId()).build(); +        tagesschauPodcast.addEpisode(testEpisode); + +        assertDoesNotThrow(() -> rssParser.validate(tagesschauPodcast)); +        assertTrue(subscriptionDao.findByUrl(TAGESSCHAU_URL).isPresent()); +    } + +    @Test +    public void currentDirTest() { +        //System.out.println(System.getProperty("user.dir")); +        final String pathToTestFile = relativePathToTestFeeds + "dirtest.txt"; +        File testFile = new File(pathToTestFile); +        assertTrue(testFile.exists() && !testFile.isDirectory()); +    } + +    public void testByteHamsterEdgeCasePodcast() { +        final String subscriptionURL = "https://tools.bytehamster.com/podcast/rss.xml"; +        final String firstEpisodeURL = "http://tools.bytehamster.com/podcast/piano.mp3?1.mp3"; +        final String lastEpisodeURL = "http://tools.bytehamster.com/podcast/piano.mp3?13.mp3"; + +        Subscription subscription = Subscription.builder().url(subscriptionURL).build(); +        Episode firstEpisode = Episode.builder().url(firstEpisodeURL) +                .subscription(subscription).build(); +        subscription.addEpisode(firstEpisode); + +        Episode lastEpisode = Episode.builder().url(lastEpisodeURL) +                .subscription(subscription).build(); +        subscription.addEpisode(lastEpisode); +        subscriptionDao.save(subscription); +        episodeDao.save(firstEpisode); +        episodeDao.save(lastEpisode); + +        // Feed contains an Episode that does not meet minimum requirements, so +        // Subscription and its Episodes should be deleted +        assertDoesNotThrow(() -> rssParser.validate(subscription)); +        assertFalse(subscriptionDao.findByUrl(subscriptionURL).isPresent()); +        assertFalse(episodeDao.findByUrl(firstEpisodeURL).isPresent()); +        assertFalse(episodeDao.findByUrl(lastEpisodeURL).isPresent()); +    } + +    @Test +    public void testDeletionOfEpisodeNotInFeed() { +        final String subscriptionURL = "https://tools.bytehamster.com/podcast/alwaysNew.php"; +        final String notIncludedURL = "http://tools.bytehamster.com/podcast/piano.mp3?2023-03-15-21:53:21.mp3"; + +        Subscription subscription = Subscription.builder().url(subscriptionURL).build(); +        Episode episodeToDelete = Episode.builder().url(notIncludedURL) +                .subscription(subscription).build(); +        subscription.addEpisode(episodeToDelete); +        subscriptionDao.save(subscription); +        episodeDao.save(episodeToDelete); + +        // Feed does not contain the Episode, so the Episode should be deleted, but the +        // Subscription remains +        assertDoesNotThrow(() -> rssParser.validate(subscription)); +        assertTrue(subscriptionDao.findByUrl(subscriptionURL).isPresent()); +        assertFalse(episodeDao.findByUrl(notIncludedURL).isPresent()); +    } + +    @Test +    public void testValidateBaseTestFeed() { +        final String testPodcastUrl = new File("testfeeds/testPodcast0.xml").toURI().toString(); +        Subscription subscription = subscriptionDao.findByUrl(testPodcastUrl).orElseThrow(); +        assertDoesNotThrow(() -> rssParser.validate(subscription)); +        assertNotNull(subscriptionDao.findByUrl(testPodcastUrl)); +    } + +    @Test +    public void testTimeParsing() { +        final String subscriptionUrl = new File("testfeeds/timeTestPodcast.xml").toURI().toString(); +        Subscription subscription = subscriptionDao.save(Subscription.builder().url(subscriptionUrl).build()); +        assertDoesNotThrow(() -> rssParser.validate(subscription)); +        assertFalse(subscriptionDao.findByUrl(subscriptionUrl).isPresent()); +    } + +    @Test +    public void doubleEnclosureTest() { +        final String subscriptionUrl = new File("testfeeds/multipleEnclosuresFeed.xml").toURI().toString(); +        Subscription subscription = subscriptionDao.save(Subscription.builder().url(subscriptionUrl).build()); +        assertDoesNotThrow(() -> rssParser.validate(subscription)); +        assertFalse(subscriptionDao.findByUrl(subscriptionUrl).isPresent()); +    } + +}  | 
