From d9cf1fd63123df4035446182263ef26098640ae9 Mon Sep 17 00:00:00 2001 From: Mauricio Colli Date: Sun, 4 Mar 2018 17:26:13 -0300 Subject: [PATCH] Improve Channel and Playlist tests --- .../youtube/YoutubeChannelExtractor.java | 2 +- .../newpipe/extractor/ExtractorAsserts.java | 34 +- .../services/BaseChannelExtractorTest.java | 10 + .../extractor/services/BaseExtractorTest.java | 10 + .../services/BaseListExtractorTest.java | 65 +++ .../services/BasePlaylistExtractorTest.java | 11 + .../SoundcloudChannelExtractorTest.java | 228 ++++++--- .../SoundcloudPlaylistExtractorTest.java | 349 +++++++++++--- .../youtube/YoutubeChannelExtractorTest.java | 453 ++++++++++++++---- .../youtube/YoutubePlaylistExtractorTest.java | 289 +++++++---- 10 files changed, 1144 insertions(+), 307 deletions(-) create mode 100644 src/test/java/org/schabi/newpipe/extractor/services/BaseChannelExtractorTest.java create mode 100644 src/test/java/org/schabi/newpipe/extractor/services/BaseExtractorTest.java create mode 100644 src/test/java/org/schabi/newpipe/extractor/services/BaseListExtractorTest.java create mode 100644 src/test/java/org/schabi/newpipe/extractor/services/BasePlaylistExtractorTest.java diff --git a/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractor.java index 5e49ea44..593a4ef7 100644 --- a/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractor.java +++ b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractor.java @@ -201,7 +201,7 @@ public class YoutubeChannelExtractor extends ChannelExtractor { return ""; } } catch (Exception e) { - throw new ParsingException("could not get next streams' url", e); + throw new ParsingException("Could not get next page url", e); } } diff --git a/src/test/java/org/schabi/newpipe/extractor/ExtractorAsserts.java b/src/test/java/org/schabi/newpipe/extractor/ExtractorAsserts.java index 68c1053e..1006f7b3 100644 --- a/src/test/java/org/schabi/newpipe/extractor/ExtractorAsserts.java +++ b/src/test/java/org/schabi/newpipe/extractor/ExtractorAsserts.java @@ -1,19 +1,22 @@ package org.schabi.newpipe.extractor; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.net.MalformedURLException; import java.net.URL; import java.util.List; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.*; public class ExtractorAsserts { public static void assertEmptyErrors(String message, List errors) { - if(!errors.isEmpty()) { - for (Throwable throwable : errors) { - message += "\n * " + throwable.getMessage(); + if (!errors.isEmpty()) { + StringBuilder messageBuilder = new StringBuilder(message); + for (Throwable e : errors) { + messageBuilder.append("\n * ").append(e.getMessage()); } - throw new AssertionError(message, errors.get(0)); + messageBuilder.append(" "); + throw new AssertionError(messageBuilder.toString(), errors.get(0)); } } @@ -22,7 +25,7 @@ public class ExtractorAsserts { try { return new URL(url); } catch (MalformedURLException e) { - throw new AssertionError("Invalid url: " + url, e); + throw new AssertionError("Invalid url: " + "\"" + url + "\"", e); } } @@ -34,4 +37,23 @@ public class ExtractorAsserts { URL url = urlFromString(urlToCheck); assertEquals("Protocol of URL is not secure", "https", url.getProtocol()); } + + public static void assertNotEmpty(String stringToCheck) { + assertNotEmpty(null, stringToCheck); + } + + public static void assertNotEmpty(@Nullable String message, String stringToCheck) { + assertNotNull(message, stringToCheck); + assertFalse(message, stringToCheck.isEmpty()); + } + + public static void assertEmpty(String stringToCheck) { + assertEmpty(null, stringToCheck); + } + + public static void assertEmpty(@Nullable String message, String stringToCheck) { + if (stringToCheck != null) { + assertTrue(message, stringToCheck.isEmpty()); + } + } } diff --git a/src/test/java/org/schabi/newpipe/extractor/services/BaseChannelExtractorTest.java b/src/test/java/org/schabi/newpipe/extractor/services/BaseChannelExtractorTest.java new file mode 100644 index 00000000..86ae3f9d --- /dev/null +++ b/src/test/java/org/schabi/newpipe/extractor/services/BaseChannelExtractorTest.java @@ -0,0 +1,10 @@ +package org.schabi.newpipe.extractor.services; + +@SuppressWarnings("unused") +public interface BaseChannelExtractorTest extends BaseListExtractorTest { + void testDescription() throws Exception; + void testAvatarUrl() throws Exception; + void testBannerUrl() throws Exception; + void testFeedUrl() throws Exception; + void testSubscriberCount() throws Exception; +} diff --git a/src/test/java/org/schabi/newpipe/extractor/services/BaseExtractorTest.java b/src/test/java/org/schabi/newpipe/extractor/services/BaseExtractorTest.java new file mode 100644 index 00000000..020cceaf --- /dev/null +++ b/src/test/java/org/schabi/newpipe/extractor/services/BaseExtractorTest.java @@ -0,0 +1,10 @@ +package org.schabi.newpipe.extractor.services; + +@SuppressWarnings("unused") +public interface BaseExtractorTest { + void testServiceId() throws Exception; + void testName() throws Exception; + void testId() throws Exception; + void testCleanUrl() throws Exception; + void testOriginalUrl() throws Exception; +} diff --git a/src/test/java/org/schabi/newpipe/extractor/services/BaseListExtractorTest.java b/src/test/java/org/schabi/newpipe/extractor/services/BaseListExtractorTest.java new file mode 100644 index 00000000..55a4b416 --- /dev/null +++ b/src/test/java/org/schabi/newpipe/extractor/services/BaseListExtractorTest.java @@ -0,0 +1,65 @@ +package org.schabi.newpipe.extractor.services; + +import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.InfoItemsCollector; +import org.schabi.newpipe.extractor.ListExtractor; +import org.schabi.newpipe.extractor.stream.StreamInfoItem; + +import java.util.List; + +import static org.junit.Assert.*; +import static org.schabi.newpipe.extractor.ExtractorAsserts.*; + +public interface BaseListExtractorTest extends BaseExtractorTest { + @SuppressWarnings("unused") + void testRelatedItems() throws Exception; + @SuppressWarnings("unused") + void testMoreRelatedItems() throws Exception; + + + static void defaultTestListOfItems(int expectedServiceId, List itemsList, List errors) { + assertTrue("List of items is empty", !itemsList.isEmpty()); + assertFalse("List of items contains a null element", itemsList.contains(null)); + assertEmptyErrors("Errors during stream list extraction", errors); + + for (InfoItem item : itemsList) { + assertIsSecureUrl(item.getUrl()); + if (item.getThumbnailUrl() != null && !item.getThumbnailUrl().isEmpty()) { + assertIsSecureUrl(item.getThumbnailUrl()); + } + assertNotNull("InfoItem type not set: " + item, item.getInfoType()); + assertEquals("Service id doesn't match: " + item, expectedServiceId, item.getServiceId()); + + if (item instanceof StreamInfoItem) { + StreamInfoItem streamInfoItem = (StreamInfoItem) item; + assertNotEmpty("Uploader name not set: " + item, streamInfoItem.getUploaderName()); + assertNotEmpty("Uploader url not set: " + item, streamInfoItem.getUploaderUrl()); + } + } + } + + static void defaultTestRelatedItems(ListExtractor extractor, int expectedServiceId) throws Exception { + final InfoItemsCollector itemsCollector = extractor.getInfoItems(); + final List itemsList = itemsCollector.getItemList(); + List errors = itemsCollector.getErrors(); + + defaultTestListOfItems(expectedServiceId, itemsList, errors); + } + + static ListExtractor.InfoItemPage defaultTestMoreItems(ListExtractor extractor, int expectedServiceId) throws Exception { + assertTrue("Doesn't have more items", extractor.hasNextPage()); + ListExtractor.InfoItemPage nextPage = extractor.getPage(extractor.getNextPageUrl()); + assertTrue("Next page is empty", !nextPage.getItemsList().isEmpty()); + assertEmptyErrors("Next page have errors", nextPage.getErrors()); + + defaultTestListOfItems(expectedServiceId, nextPage.getItemsList(), nextPage.getErrors()); + return nextPage; + } + + static void defaultTestGetPageInNewExtractor(ListExtractor extractor, ListExtractor newExtractor, int expectedServiceId) throws Exception { + final String nextPageUrl = extractor.getNextPageUrl(); + + final ListExtractor.InfoItemPage page = newExtractor.getPage(nextPageUrl); + BaseListExtractorTest.defaultTestListOfItems(expectedServiceId, page.getItemsList(), page.getErrors()); + } +} diff --git a/src/test/java/org/schabi/newpipe/extractor/services/BasePlaylistExtractorTest.java b/src/test/java/org/schabi/newpipe/extractor/services/BasePlaylistExtractorTest.java new file mode 100644 index 00000000..da5bfdcb --- /dev/null +++ b/src/test/java/org/schabi/newpipe/extractor/services/BasePlaylistExtractorTest.java @@ -0,0 +1,11 @@ +package org.schabi.newpipe.extractor.services; + +@SuppressWarnings("unused") +public interface BasePlaylistExtractorTest extends BaseListExtractorTest { + void testThumbnailUrl() throws Exception; + void testBannerUrl() throws Exception; + void testUploaderUrl() throws Exception; + void testUploaderName() throws Exception; + void testUploaderAvatarUrl() throws Exception; + void testStreamCount() throws Exception; +} diff --git a/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelExtractorTest.java b/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelExtractorTest.java index f988ecf6..fcd51c12 100644 --- a/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelExtractorTest.java +++ b/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelExtractorTest.java @@ -2,87 +2,199 @@ package org.schabi.newpipe.extractor.services.soundcloud; import org.junit.BeforeClass; import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import org.junit.runner.RunWith; import org.schabi.newpipe.Downloader; -import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.channel.ChannelExtractor; -import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.extractor.services.BaseChannelExtractorTest; +import org.schabi.newpipe.extractor.services.BaseListExtractorTest; import static org.junit.Assert.*; +import static org.schabi.newpipe.extractor.ExtractorAsserts.assertEmpty; import static org.schabi.newpipe.extractor.ExtractorAsserts.assertIsSecureUrl; import static org.schabi.newpipe.extractor.ServiceList.SoundCloud; /** - * Test for {@link ChannelExtractor} + * Test for {@link SoundcloudChannelExtractor} */ - +@RunWith(Enclosed.class) public class SoundcloudChannelExtractorTest { + public static class LilUzi implements BaseChannelExtractorTest { + private static SoundcloudChannelExtractor extractor; - static ChannelExtractor extractor; + @BeforeClass + public static void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + extractor = (SoundcloudChannelExtractor) SoundCloud + .getChannelExtractor("http://soundcloud.com/liluzivert/sets"); + extractor.fetchPage(); + } - @BeforeClass - public static void setUp() throws Exception { - NewPipe.init(Downloader.getInstance()); - extractor = SoundCloud - .getChannelExtractor("https://soundcloud.com/liluzivert"); - extractor.fetchPage(); + /*////////////////////////////////////////////////////////////////////////// + // Extractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testServiceId() { + assertEquals(SoundCloud.getServiceId(), extractor.getServiceId()); + } + + @Test + public void testName() { + assertEquals("LIL UZI VERT", extractor.getName()); + } + + @Test + public void testId() { + assertEquals("10494998", extractor.getId()); + } + + @Test + public void testCleanUrl() { + assertEquals("https://soundcloud.com/liluzivert", extractor.getCleanUrl()); + } + + @Test + public void testOriginalUrl() { + assertEquals("http://soundcloud.com/liluzivert/sets", extractor.getOriginalUrl()); + } + + /*////////////////////////////////////////////////////////////////////////// + // ListExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testRelatedItems() throws Exception { + BaseListExtractorTest.defaultTestRelatedItems(extractor, SoundCloud.getServiceId()); + } + + @Test + public void testMoreRelatedItems() throws Exception { + BaseListExtractorTest.defaultTestMoreItems(extractor, SoundCloud.getServiceId()); + } + + /*////////////////////////////////////////////////////////////////////////// + // ChannelExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testDescription() { + assertNotNull(extractor.getDescription()); + } + + @Test + public void testAvatarUrl() { + assertIsSecureUrl(extractor.getAvatarUrl()); + } + + @Test + public void testBannerUrl() { + assertIsSecureUrl(extractor.getBannerUrl()); + } + + @Test + public void testFeedUrl() { + assertEmpty(extractor.getFeedUrl()); + } + + @Test + public void testSubscriberCount() { + assertTrue("Wrong subscriber count", extractor.getSubscriberCount() >= 1e6); + } } - @Test - public void testGetDownloader() throws Exception { - assertNotNull(NewPipe.getDownloader()); - } + public static class DubMatix implements BaseChannelExtractorTest { + private static SoundcloudChannelExtractor extractor; - @Test - public void testGetName() throws Exception { - assertEquals("LIL UZI VERT", extractor.getName()); - } + @BeforeClass + public static void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + extractor = (SoundcloudChannelExtractor) SoundCloud + .getChannelExtractor("https://soundcloud.com/dubmatix"); + extractor.fetchPage(); + } - @Test - public void testGetDescription() throws Exception { - assertTrue(extractor.getDescription() != null); - } + /*////////////////////////////////////////////////////////////////////////// + // Additional Testing + //////////////////////////////////////////////////////////////////////////*/ - @Test - public void testGetAvatarUrl() throws Exception { - assertIsSecureUrl(extractor.getAvatarUrl()); - } + @Test + public void testGetPageInNewExtractor() throws Exception { + final ChannelExtractor newExtractor = SoundCloud.getChannelExtractor(extractor.getCleanUrl()); + BaseListExtractorTest.defaultTestGetPageInNewExtractor(extractor, newExtractor, SoundCloud.getServiceId()); + } - @Test - public void testGetStreams() throws Exception { - assertFalse("no streams are received", extractor.getInfoItems().getItemList().isEmpty()); - } + /*////////////////////////////////////////////////////////////////////////// + // Extractor + //////////////////////////////////////////////////////////////////////////*/ - @Test - public void testGetStreamsErrors() throws Exception { - assertTrue("errors during stream list extraction", extractor.getInfoItems().getErrors().isEmpty()); - } + @Test + public void testServiceId() { + assertEquals(SoundCloud.getServiceId(), extractor.getServiceId()); + } - @Test - public void testHasMoreStreams() throws Exception { - // Setup the streams - extractor.getInfoItems(); - assertTrue("don't have more streams", extractor.hasNextPage()); - } + @Test + public void testName() { + assertEquals("dubmatix", extractor.getName()); + } - @Test - public void testGetSubscriberCount() throws Exception { - assertTrue("wrong subscriber count", extractor.getSubscriberCount() >= 1000000); - } + @Test + public void testId() { + assertEquals("542134", extractor.getId()); + } - @Test - public void testGetNextPageUrl() throws Exception { - assertTrue(extractor.hasNextPage()); - } + @Test + public void testCleanUrl() { + assertEquals("https://soundcloud.com/dubmatix", extractor.getCleanUrl()); + } - @Test - public void testGetPage() throws Exception { - // Setup the streams - extractor.getInfoItems(); - ListExtractor.InfoItemPage nextItemsResult = extractor.getPage(extractor.getNextPageUrl()); - assertTrue("extractor didn't have next streams", !nextItemsResult.getItemsList().isEmpty()); - assertTrue("errors occurred during extraction of the next streams", nextItemsResult.getErrors().isEmpty()); - assertTrue("extractor didn't have more streams after getInfoItemPage", extractor.hasNextPage()); - } + @Test + public void testOriginalUrl() { + assertEquals("https://soundcloud.com/dubmatix", extractor.getOriginalUrl()); + } + /*////////////////////////////////////////////////////////////////////////// + // ListExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testRelatedItems() throws Exception { + BaseListExtractorTest.defaultTestRelatedItems(extractor, SoundCloud.getServiceId()); + } + + @Test + public void testMoreRelatedItems() throws Exception { + BaseListExtractorTest.defaultTestMoreItems(extractor, SoundCloud.getServiceId()); + } + + /*////////////////////////////////////////////////////////////////////////// + // ChannelExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testDescription() { + assertNotNull(extractor.getDescription()); + } + + @Test + public void testAvatarUrl() { + assertIsSecureUrl(extractor.getAvatarUrl()); + } + + @Test + public void testBannerUrl() { + assertIsSecureUrl(extractor.getBannerUrl()); + } + + @Test + public void testFeedUrl() { + assertEmpty(extractor.getFeedUrl()); + } + + @Test + public void testSubscriberCount() { + assertTrue("Wrong subscriber count", extractor.getSubscriberCount() >= 2e6); + } + } } diff --git a/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudPlaylistExtractorTest.java b/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudPlaylistExtractorTest.java index e029174a..ebc2f4e8 100644 --- a/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudPlaylistExtractorTest.java +++ b/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudPlaylistExtractorTest.java @@ -1,11 +1,18 @@ package org.schabi.newpipe.extractor.services.soundcloud; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import org.junit.runner.RunWith; import org.schabi.newpipe.Downloader; +import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.NewPipe; -import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.ServiceList; import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; +import org.schabi.newpipe.extractor.services.BaseListExtractorTest; +import org.schabi.newpipe.extractor.services.BasePlaylistExtractorTest; import static org.junit.Assert.*; import static org.schabi.newpipe.extractor.ExtractorAsserts.assertIsSecureUrl; @@ -14,84 +21,302 @@ import static org.schabi.newpipe.extractor.ServiceList.SoundCloud; /** * Test for {@link PlaylistExtractor} */ - +@RunWith(Enclosed.class) public class SoundcloudPlaylistExtractorTest { - private static PlaylistExtractor extractor; + public static class LuvTape implements BasePlaylistExtractorTest { + private static SoundcloudPlaylistExtractor extractor; - @BeforeClass - public static void setUp() throws Exception { - NewPipe.init(Downloader.getInstance()); - extractor = SoundCloud - .getPlaylistExtractor("https://soundcloud.com/liluzivert/sets/the-perfect-luv-tape-r"); - extractor.fetchPage(); + @BeforeClass + public static void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + extractor = (SoundcloudPlaylistExtractor) SoundCloud + .getPlaylistExtractor("https://soundcloud.com/liluzivert/sets/the-perfect-luv-tape-r?test=123"); + extractor.fetchPage(); + } + + /*////////////////////////////////////////////////////////////////////////// + // Extractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testServiceId() { + assertEquals(SoundCloud.getServiceId(), extractor.getServiceId()); + } + + @Test + public void testName() { + assertEquals("THE PERFECT LUV TAPE®️", extractor.getName()); + } + + @Test + public void testId() { + assertEquals("246349810", extractor.getId()); + } + + @Test + public void testCleanUrl() { + assertEquals("https://soundcloud.com/liluzivert/sets/the-perfect-luv-tape-r", extractor.getCleanUrl()); + } + + @Test + public void testOriginalUrl() { + assertEquals("https://soundcloud.com/liluzivert/sets/the-perfect-luv-tape-r?test=123", extractor.getOriginalUrl()); + } + + /*////////////////////////////////////////////////////////////////////////// + // ListExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testRelatedItems() throws Exception { + BaseListExtractorTest.defaultTestRelatedItems(extractor, SoundCloud.getServiceId()); + } + + @Test + public void testMoreRelatedItems() { + try { + BaseListExtractorTest.defaultTestMoreItems(extractor, SoundCloud.getServiceId()); + } catch (Throwable ignored) { + return; + } + + fail("This playlist doesn't have more items, it should throw an error"); + } + + /*////////////////////////////////////////////////////////////////////////// + // PlaylistExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testThumbnailUrl() { + assertIsSecureUrl(extractor.getThumbnailUrl()); + } + + @Ignore + @Test + public void testBannerUrl() { + assertIsSecureUrl(extractor.getBannerUrl()); + } + + @Test + public void testUploaderUrl() { + final String uploaderUrl = extractor.getUploaderUrl(); + assertIsSecureUrl(uploaderUrl); + assertTrue(uploaderUrl, uploaderUrl.contains("liluzivert")); + } + + @Test + public void testUploaderName() { + assertTrue(extractor.getUploaderName().contains("LIL UZI VERT")); + } + + @Test + public void testUploaderAvatarUrl() { + assertIsSecureUrl(extractor.getUploaderAvatarUrl()); + } + + @Test + public void testStreamCount() { + assertTrue("Error in the streams count", extractor.getStreamCount() >= 10); + } } - @Test - public void testGetDownloader() throws Exception { - assertNotNull(NewPipe.getDownloader()); + public static class RandomHouseDanceMusic implements BasePlaylistExtractorTest { + private static SoundcloudPlaylistExtractor extractor; + + @BeforeClass + public static void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + extractor = (SoundcloudPlaylistExtractor) SoundCloud + .getPlaylistExtractor("http://soundcloud.com/finn-trapple/sets/random-house-dance-music-2"); + extractor.fetchPage(); + } + + /*////////////////////////////////////////////////////////////////////////// + // Extractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testServiceId() { + assertEquals(SoundCloud.getServiceId(), extractor.getServiceId()); + } + + @Test + public void testName() { + assertEquals("Random House & Dance Music #2", extractor.getName()); + } + + @Test + public void testId() { + assertEquals("436855608", extractor.getId()); + } + + @Test + public void testCleanUrl() { + assertEquals("https://soundcloud.com/finn-trapple/sets/random-house-dance-music-2", extractor.getCleanUrl()); + } + + @Test + public void testOriginalUrl() { + assertEquals("http://soundcloud.com/finn-trapple/sets/random-house-dance-music-2", extractor.getOriginalUrl()); + } + + /*////////////////////////////////////////////////////////////////////////// + // ListExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testRelatedItems() throws Exception { + BaseListExtractorTest.defaultTestRelatedItems(extractor, SoundCloud.getServiceId()); + } + + @Test + public void testMoreRelatedItems() throws Exception { + BaseListExtractorTest.defaultTestMoreItems(extractor, SoundCloud.getServiceId()); + } + + /*////////////////////////////////////////////////////////////////////////// + // PlaylistExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testThumbnailUrl() { + assertIsSecureUrl(extractor.getThumbnailUrl()); + } + + @Ignore + @Test + public void testBannerUrl() { + assertIsSecureUrl(extractor.getBannerUrl()); + } + + @Test + public void testUploaderUrl() { + final String uploaderUrl = extractor.getUploaderUrl(); + assertIsSecureUrl(uploaderUrl); + assertTrue(uploaderUrl, uploaderUrl.contains("finn-trapple")); + } + + @Test + public void testUploaderName() { + assertEquals("Finn TrApple", extractor.getUploaderName()); + } + + @Test + public void testUploaderAvatarUrl() { + assertIsSecureUrl(extractor.getUploaderAvatarUrl()); + } + + @Test + public void testStreamCount() { + assertTrue("Error in the streams count", extractor.getStreamCount() >= 10); + } } - @Test - public void testGetId() throws Exception { - assertEquals(extractor.getId(), "246349810"); - } + public static class EDMxxx implements BasePlaylistExtractorTest { + private static SoundcloudPlaylistExtractor extractor; - @Test - public void testGetName() throws Exception { - assertEquals(extractor.getName(), "THE PERFECT LUV TAPE®️"); - } + @BeforeClass + public static void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + extractor = (SoundcloudPlaylistExtractor) SoundCloud + .getPlaylistExtractor("https://soundcloud.com/user350509423/sets/edm-xxx"); + extractor.fetchPage(); + } - @Test - public void testGetThumbnailUrl() throws Exception { - assertIsSecureUrl(extractor.getThumbnailUrl()); - } + /*////////////////////////////////////////////////////////////////////////// + // Additional Testing + //////////////////////////////////////////////////////////////////////////*/ - @Test - public void testGetUploaderUrl() throws Exception { - assertIsSecureUrl(extractor.getUploaderUrl()); - assertEquals(extractor.getUploaderUrl(), "https://soundcloud.com/liluzivert"); - } + @Test + public void testGetPageInNewExtractor() throws Exception { + final PlaylistExtractor newExtractor = SoundCloud.getPlaylistExtractor(extractor.getCleanUrl()); + BaseListExtractorTest.defaultTestGetPageInNewExtractor(extractor, newExtractor, SoundCloud.getServiceId()); + } - @Test - public void testGetUploaderName() throws Exception { - assertEquals(extractor.getUploaderName(), "LIL UZI VERT"); - } + /*////////////////////////////////////////////////////////////////////////// + // Extractor + //////////////////////////////////////////////////////////////////////////*/ - @Test - public void testGetUploaderAvatarUrl() throws Exception { - assertIsSecureUrl(extractor.getUploaderAvatarUrl()); - } + @Test + public void testServiceId() { + assertEquals(SoundCloud.getServiceId(), extractor.getServiceId()); + } - @Test - public void testGetStreamsCount() throws Exception { - assertEquals(extractor.getStreamCount(), 10); - } + @Test + public void testName() { + assertEquals("EDM xXx", extractor.getName()); + } - @Test - public void testGetStreams() throws Exception { - assertTrue("no streams are received", !extractor.getInfoItems().getItemList().isEmpty()); - } + @Test + public void testId() { + assertEquals("136000376", extractor.getId()); + } - @Test - public void testGetStreamsErrors() throws Exception { - assertTrue("errors during stream list extraction", extractor.getInfoItems().getErrors().isEmpty()); - } + @Test + public void testCleanUrl() { + assertEquals("https://soundcloud.com/user350509423/sets/edm-xxx", extractor.getCleanUrl()); + } - @Test - public void testHasMoreStreams() throws Exception { - // Setup the streams - extractor.getInfoItems(); - assertTrue("extractor didn't have more streams", !extractor.hasNextPage()); - } + @Test + public void testOriginalUrl() { + assertEquals("https://soundcloud.com/user350509423/sets/edm-xxx", extractor.getOriginalUrl()); + } - @Test(expected = ExtractionException.class) - public void testGetNextPageNonExistent() throws Exception { - // Setup the streams - extractor.getInfoItems(); + /*////////////////////////////////////////////////////////////////////////// + // ListExtractor + //////////////////////////////////////////////////////////////////////////*/ - // This playlist don't have more streams, it should throw an error - extractor.getPage(extractor.getNextPageUrl()); + @Test + public void testRelatedItems() throws Exception { + BaseListExtractorTest.defaultTestRelatedItems(extractor, SoundCloud.getServiceId()); + } - fail("Expected exception wasn't thrown"); + @Test + public void testMoreRelatedItems() throws Exception { + ListExtractor.InfoItemPage currentPage = BaseListExtractorTest.defaultTestMoreItems(extractor, ServiceList.SoundCloud.getServiceId()); + // Test for 2 more levels + for (int i = 0; i < 2; i++) { + currentPage = extractor.getPage(currentPage.getNextPageUrl()); + BaseListExtractorTest.defaultTestListOfItems(SoundCloud.getServiceId(), currentPage.getItemsList(), currentPage.getErrors()); + } + } + + /*////////////////////////////////////////////////////////////////////////// + // PlaylistExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testThumbnailUrl() { + assertIsSecureUrl(extractor.getThumbnailUrl()); + } + + @Ignore + @Test + public void testBannerUrl() { + assertIsSecureUrl(extractor.getBannerUrl()); + } + + @Test + public void testUploaderUrl() { + final String uploaderUrl = extractor.getUploaderUrl(); + assertIsSecureUrl(uploaderUrl); + assertTrue(uploaderUrl, uploaderUrl.contains("user350509423")); + } + + @Test + public void testUploaderName() { + assertEquals("user350509423", extractor.getUploaderName()); + } + + @Test + public void testUploaderAvatarUrl() { + assertIsSecureUrl(extractor.getUploaderAvatarUrl()); + } + + @Test + public void testStreamCount() { + assertTrue("Error in the streams count", extractor.getStreamCount() >= 3900); + } } } diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractorTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractorTest.java index 474288e6..7c07511e 100644 --- a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractorTest.java +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractorTest.java @@ -2,125 +2,396 @@ package org.schabi.newpipe.extractor.services.youtube; import org.junit.BeforeClass; import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import org.junit.runner.RunWith; import org.schabi.newpipe.Downloader; -import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.ServiceList; import org.schabi.newpipe.extractor.channel.ChannelExtractor; -import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.extractor.services.BaseChannelExtractorTest; +import org.schabi.newpipe.extractor.services.BaseListExtractorTest; import static org.junit.Assert.*; -import static org.schabi.newpipe.extractor.ExtractorAsserts.assertEmptyErrors; +import static org.schabi.newpipe.extractor.ExtractorAsserts.assertIsSecureUrl; import static org.schabi.newpipe.extractor.ServiceList.YouTube; -/* - * Created by Christian Schabesberger on 12.09.16. - * - * Copyright (C) Christian Schabesberger 2015 - * YoutubeSearchEngineStreamTest.java is part of NewPipe. - * - * NewPipe is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * NewPipe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with NewPipe. If not, see . - */ - /** * Test for {@link ChannelExtractor} */ +@RunWith(Enclosed.class) public class YoutubeChannelExtractorTest { + public static class Gronkh implements BaseChannelExtractorTest { + private static YoutubeChannelExtractor extractor; - static YoutubeChannelExtractor extractor; + @BeforeClass + public static void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + extractor = (YoutubeChannelExtractor) YouTube + .getChannelExtractor("http://www.youtube.com/user/Gronkh"); + extractor.fetchPage(); + } - @BeforeClass - public static void setUp() throws Exception { - NewPipe.init(Downloader.getInstance()); - extractor = (YoutubeChannelExtractor) YouTube - .getChannelExtractor("https://www.youtube.com/user/Gronkh"); - extractor.fetchPage(); + /*////////////////////////////////////////////////////////////////////////// + // Extractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testServiceId() { + assertEquals(YouTube.getServiceId(), extractor.getServiceId()); + } + + @Test + public void testName() throws Exception { + assertEquals("Gronkh", extractor.getName()); + } + + @Test + public void testId() throws Exception { + assertEquals("UCYJ61XIK64sp6ZFFS8sctxw", extractor.getId()); + } + + @Test + public void testCleanUrl() { + assertEquals("https://www.youtube.com/channel/UCYJ61XIK64sp6ZFFS8sctxw", extractor.getCleanUrl()); + } + + @Test + public void testOriginalUrl() { + assertEquals("http://www.youtube.com/user/Gronkh", extractor.getOriginalUrl()); + } + + /*////////////////////////////////////////////////////////////////////////// + // ListExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testRelatedItems() throws Exception { + BaseListExtractorTest.defaultTestRelatedItems(extractor, YouTube.getServiceId()); + } + + @Test + public void testMoreRelatedItems() throws Exception { + BaseListExtractorTest.defaultTestMoreItems(extractor, ServiceList.YouTube.getServiceId()); + } + + /*////////////////////////////////////////////////////////////////////////// + // ChannelExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testDescription() throws Exception { + assertTrue(extractor.getDescription().contains("Zart im Schmelz und süffig im Abgang. Ungebremster Spieltrieb")); + } + + @Test + public void testAvatarUrl() throws Exception { + String avatarUrl = extractor.getAvatarUrl(); + assertIsSecureUrl(avatarUrl); + assertTrue(avatarUrl, avatarUrl.contains("yt3")); + } + + @Test + public void testBannerUrl() throws Exception { + String bannerUrl = extractor.getBannerUrl(); + assertIsSecureUrl(bannerUrl); + assertTrue(bannerUrl, bannerUrl.contains("yt3")); + } + + @Test + public void testFeedUrl() throws Exception { + assertEquals("https://www.youtube.com/feeds/videos.xml?channel_id=UCYJ61XIK64sp6ZFFS8sctxw", extractor.getFeedUrl()); + } + + @Test + public void testSubscriberCount() throws Exception { + assertTrue("Wrong subscriber count", extractor.getSubscriberCount() >= 0); + } } - @Test - public void testGetDownloader() throws Exception { - assertNotNull(NewPipe.getDownloader()); + public static class Kurzgesagt implements BaseChannelExtractorTest { + private static YoutubeChannelExtractor extractor; + + @BeforeClass + public static void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + extractor = (YoutubeChannelExtractor) YouTube + .getChannelExtractor("https://www.youtube.com/channel/UCsXVk37bltHxD1rDPwtNM8Q"); + extractor.fetchPage(); + } + + /*////////////////////////////////////////////////////////////////////////// + // Additional Testing + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testGetPageInNewExtractor() throws Exception { + final ChannelExtractor newExtractor = YouTube.getChannelExtractor(extractor.getCleanUrl()); + BaseListExtractorTest.defaultTestGetPageInNewExtractor(extractor, newExtractor, YouTube.getServiceId()); + } + + /*////////////////////////////////////////////////////////////////////////// + // Extractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testServiceId() { + assertEquals(YouTube.getServiceId(), extractor.getServiceId()); + } + + @Test + public void testName() throws Exception { + String name = extractor.getName(); + assertTrue(name, name.startsWith("Kurzgesagt")); + } + + @Test + public void testId() throws Exception { + assertEquals("UCsXVk37bltHxD1rDPwtNM8Q", extractor.getId()); + } + + @Test + public void testCleanUrl() { + assertEquals("https://www.youtube.com/channel/UCsXVk37bltHxD1rDPwtNM8Q", extractor.getCleanUrl()); + } + + @Test + public void testOriginalUrl() { + assertEquals("https://www.youtube.com/channel/UCsXVk37bltHxD1rDPwtNM8Q", extractor.getOriginalUrl()); + } + + /*////////////////////////////////////////////////////////////////////////// + // ListExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testRelatedItems() throws Exception { + BaseListExtractorTest.defaultTestRelatedItems(extractor, YouTube.getServiceId()); + } + + @Test + public void testMoreRelatedItems() throws Exception { + BaseListExtractorTest.defaultTestMoreItems(extractor, ServiceList.YouTube.getServiceId()); + } + + /*////////////////////////////////////////////////////////////////////////// + // ChannelExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testDescription() throws Exception { + final String description = extractor.getDescription(); + assertTrue(description, description.contains("small team who want to make science look beautiful")); + //TODO: Description get cuts out, because the og:description is optimized and don't have all the content + //assertTrue(description, description.contains("Currently we make one animation video per month")); + } + + @Test + public void testAvatarUrl() throws Exception { + String avatarUrl = extractor.getAvatarUrl(); + assertIsSecureUrl(avatarUrl); + assertTrue(avatarUrl, avatarUrl.contains("yt3")); + } + + @Test + public void testBannerUrl() throws Exception { + String bannerUrl = extractor.getBannerUrl(); + assertIsSecureUrl(bannerUrl); + assertTrue(bannerUrl, bannerUrl.contains("yt3")); + } + + @Test + public void testFeedUrl() throws Exception { + assertEquals("https://www.youtube.com/feeds/videos.xml?channel_id=UCsXVk37bltHxD1rDPwtNM8Q", extractor.getFeedUrl()); + } + + @Test + public void testSubscriberCount() throws Exception { + assertTrue("Wrong subscriber count", extractor.getSubscriberCount() >= 5e6); + } } - @Test - public void testGetName() throws Exception { - assertEquals(extractor.getName(), "Gronkh"); + public static class CaptainDisillusion implements BaseChannelExtractorTest { + private static YoutubeChannelExtractor extractor; + + @BeforeClass + public static void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + extractor = (YoutubeChannelExtractor) YouTube + .getChannelExtractor("https://www.youtube.com/user/CaptainDisillusion/videos"); + extractor.fetchPage(); + } + + /*////////////////////////////////////////////////////////////////////////// + // Extractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testServiceId() { + assertEquals(YouTube.getServiceId(), extractor.getServiceId()); + } + + @Test + public void testName() throws Exception { + assertEquals("CaptainDisillusion", extractor.getName()); + } + + @Test + public void testId() throws Exception { + assertEquals("UCEOXxzW2vU0P-0THehuIIeg", extractor.getId()); + } + + @Test + public void testCleanUrl() { + assertEquals("https://www.youtube.com/channel/UCEOXxzW2vU0P-0THehuIIeg", extractor.getCleanUrl()); + } + + @Test + public void testOriginalUrl() { + assertEquals("https://www.youtube.com/user/CaptainDisillusion/videos", extractor.getOriginalUrl()); + } + + /*////////////////////////////////////////////////////////////////////////// + // ListExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testRelatedItems() throws Exception { + BaseListExtractorTest.defaultTestRelatedItems(extractor, YouTube.getServiceId()); + } + + @Test + public void testMoreRelatedItems() throws Exception { + BaseListExtractorTest.defaultTestMoreItems(extractor, ServiceList.YouTube.getServiceId()); + } + + /*////////////////////////////////////////////////////////////////////////// + // ChannelExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testDescription() throws Exception { + final String description = extractor.getDescription(); + assertTrue(description, description.contains("In a world where")); + } + + @Test + public void testAvatarUrl() throws Exception { + String avatarUrl = extractor.getAvatarUrl(); + assertIsSecureUrl(avatarUrl); + assertTrue(avatarUrl, avatarUrl.contains("yt3")); + } + + @Test + public void testBannerUrl() throws Exception { + String bannerUrl = extractor.getBannerUrl(); + assertIsSecureUrl(bannerUrl); + assertTrue(bannerUrl, bannerUrl.contains("yt3")); + } + + @Test + public void testFeedUrl() throws Exception { + assertEquals("https://www.youtube.com/feeds/videos.xml?channel_id=UCEOXxzW2vU0P-0THehuIIeg", extractor.getFeedUrl()); + } + + @Test + public void testSubscriberCount() throws Exception { + assertTrue("Wrong subscriber count", extractor.getSubscriberCount() >= 5e5); + } } - @Test - public void testGetId() throws Exception { - assertEquals(extractor.getId(), "UCYJ61XIK64sp6ZFFS8sctxw"); - } + public static class RandomChannel implements BaseChannelExtractorTest { + private static YoutubeChannelExtractor extractor; - @Test - public void testGetUrl() throws Exception { - assertEquals(extractor.getCleanUrl(), "https://www.youtube.com/channel/UCYJ61XIK64sp6ZFFS8sctxw"); - } + @BeforeClass + public static void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + extractor = (YoutubeChannelExtractor) YouTube + .getChannelExtractor("https://www.youtube.com/channel/UCUaQMQS9lY5lit3vurpXQ6w"); + extractor.fetchPage(); + } - @Test - public void testGetDescription() throws Exception { - assertEquals(extractor.getDescription(), "★ ★ ★ KLICK MICH HART, DU SAU! :D ★ ★ ★ Zart im Schmelz und süffig im Abgang. Ungebremster Spieltrieb seit 1896. Tägliche Folgen nonstop seit dem 01.04.2010!..."); - } + /*////////////////////////////////////////////////////////////////////////// + // Extractor + //////////////////////////////////////////////////////////////////////////*/ - @Test - public void testGetAvatarUrl() throws Exception { - assertTrue(extractor.getAvatarUrl(), extractor.getAvatarUrl().contains("yt3")); - } + @Test + public void testServiceId() { + assertEquals(YouTube.getServiceId(), extractor.getServiceId()); + } - @Test - public void testGetBannerUrl() throws Exception { - assertTrue(extractor.getBannerUrl(), extractor.getBannerUrl().contains("yt3")); - } + @Test + public void testName() throws Exception { + assertEquals("random channel", extractor.getName()); + } - @Test - public void testGetFeedUrl() throws Exception { - assertEquals(extractor.getFeedUrl(), "https://www.youtube.com/feeds/videos.xml?channel_id=UCYJ61XIK64sp6ZFFS8sctxw"); - } + @Test + public void testId() throws Exception { + assertEquals("UCUaQMQS9lY5lit3vurpXQ6w", extractor.getId()); + } - @Test - public void testGetStreams() throws Exception { - assertTrue("no streams are received", !extractor.getInfoItems().getItemList().isEmpty()); - } + @Test + public void testCleanUrl() { + assertEquals("https://www.youtube.com/channel/UCUaQMQS9lY5lit3vurpXQ6w", extractor.getCleanUrl()); + } - @Test - public void testGetStreamsErrors() throws Exception { - assertEmptyErrors("errors during stream list extraction", extractor.getInfoItems().getErrors()); - } + @Test + public void testOriginalUrl() { + assertEquals("https://www.youtube.com/channel/UCUaQMQS9lY5lit3vurpXQ6w", extractor.getOriginalUrl()); + } - @Test - public void testHasMoreStreams() throws Exception { - // Setup the streams - extractor.getInfoItems(); - assertTrue("don't have more streams", extractor.hasNextPage()); - } + /*////////////////////////////////////////////////////////////////////////// + // ListExtractor + //////////////////////////////////////////////////////////////////////////*/ - @Test - public void testGetSubscriberCount() throws Exception { - assertTrue("wrong subscriber count", extractor.getSubscriberCount() >= 0); - } + @Test + public void testRelatedItems() throws Exception { + BaseListExtractorTest.defaultTestRelatedItems(extractor, YouTube.getServiceId()); + } - @Test - public void testGetNextPageUrl() throws Exception { - assertTrue(extractor.hasNextPage()); - } + @Test + public void testMoreRelatedItems() { + try { + BaseListExtractorTest.defaultTestMoreItems(extractor, YouTube.getServiceId()); + } catch (Throwable ignored) { + return; + } - @Test - public void testGetPage() throws Exception { - // Setup the streams - extractor.getInfoItems(); - ListExtractor.InfoItemPage nextItemsResult = extractor.getPage(extractor.getNextPageUrl()); - assertTrue("extractor didn't have next streams", !nextItemsResult.getItemsList().isEmpty()); - assertEmptyErrors("errors occurred during extraction of the next streams", nextItemsResult.getErrors()); - assertTrue("extractor didn't have more streams after getInfoItemPage", extractor.hasNextPage()); + fail("This channel doesn't have more items, it should throw an error"); + } + + /*////////////////////////////////////////////////////////////////////////// + // ChannelExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testDescription() throws Exception { + final String description = extractor.getDescription(); + assertTrue(description, description.contains("Hey there iu will upoload a load of pranks onto this channel")); + } + + @Test + public void testAvatarUrl() throws Exception { + String avatarUrl = extractor.getAvatarUrl(); + assertIsSecureUrl(avatarUrl); + assertTrue(avatarUrl, avatarUrl.contains("yt3")); + } + + @Test + public void testBannerUrl() throws Exception { + String bannerUrl = extractor.getBannerUrl(); + assertIsSecureUrl(bannerUrl); + assertTrue(bannerUrl, bannerUrl.contains("yt3")); + } + + @Test + public void testFeedUrl() throws Exception { + assertEquals("https://www.youtube.com/feeds/videos.xml?channel_id=UCUaQMQS9lY5lit3vurpXQ6w", extractor.getFeedUrl()); + } + + @Test + public void testSubscriberCount() throws Exception { + assertTrue("Wrong subscriber count", extractor.getSubscriberCount() >= 50); + } } -} +}; + diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubePlaylistExtractorTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubePlaylistExtractorTest.java index 1e5d1062..2f62e572 100644 --- a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubePlaylistExtractorTest.java +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubePlaylistExtractorTest.java @@ -1,120 +1,231 @@ package org.schabi.newpipe.extractor.services.youtube; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import org.junit.runner.RunWith; import org.schabi.newpipe.Downloader; +import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.NewPipe; -import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.extractor.ServiceList; +import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; +import org.schabi.newpipe.extractor.services.BaseListExtractorTest; +import org.schabi.newpipe.extractor.services.BasePlaylistExtractorTest; -import java.util.List; - -import static org.junit.Assert.*; -import static org.schabi.newpipe.extractor.ExtractorAsserts.assertEmptyErrors; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.schabi.newpipe.extractor.ExtractorAsserts.assertIsSecureUrl; import static org.schabi.newpipe.extractor.ServiceList.YouTube; /** * Test for {@link YoutubePlaylistExtractor} */ +@RunWith(Enclosed.class) public class YoutubePlaylistExtractorTest { - private static YoutubePlaylistExtractor extractor; + public static class TimelessPopHits implements BasePlaylistExtractorTest { + private static YoutubePlaylistExtractor extractor; - private static void assertNotEmpty(String message, String value) { - assertNotNull(message, value); - assertFalse(message, value.isEmpty()); - } + @BeforeClass + public static void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + extractor = (YoutubePlaylistExtractor) YouTube + .getPlaylistExtractor("http://www.youtube.com/watch?v=lp-EO5I60KA&list=PLMC9KNkIncKtPzgY-5rmhvj7fax8fdxoj"); + extractor.fetchPage(); + } - @BeforeClass - public static void setUp() throws Exception { - NewPipe.init(Downloader.getInstance()); - extractor = (YoutubePlaylistExtractor) YouTube - .getPlaylistExtractor("https://www.youtube.com/watch?v=lp-EO5I60KA&list=PLMC9KNkIncKtPzgY-5rmhvj7fax8fdxoj"); - extractor.fetchPage(); - } + /*////////////////////////////////////////////////////////////////////////// + // Extractor + //////////////////////////////////////////////////////////////////////////*/ - @Test - public void testGetDownloader() throws Exception { - assertNotNull(NewPipe.getDownloader()); - } + @Test + public void testServiceId() { + assertEquals(YouTube.getServiceId(), extractor.getServiceId()); + } - @Test - public void testGetId() throws Exception { - assertEquals(extractor.getId(), "PLMC9KNkIncKtPzgY-5rmhvj7fax8fdxoj"); - } + @Test + public void testName() throws Exception { + String name = extractor.getName(); + assertTrue(name, name.startsWith("Pop Music Playlist: Timeless Pop Hits")); + } - @Test - public void testGetName() throws Exception { - assertEquals(extractor.getName(), "Pop Music Playlist: Timeless Pop Hits (Updated Weekly 2018)"); - } + @Test + public void testId() throws Exception { + assertEquals("PLMC9KNkIncKtPzgY-5rmhvj7fax8fdxoj", extractor.getId()); + } - @Test - public void testGetThumbnailUrl() throws Exception { - assertTrue(extractor.getThumbnailUrl(), extractor.getThumbnailUrl().contains("yt")); - } + @Test + public void testCleanUrl() { + assertEquals("https://www.youtube.com/playlist?list=PLMC9KNkIncKtPzgY-5rmhvj7fax8fdxoj", extractor.getCleanUrl()); + } - @Test - public void testGetBannerUrl() throws Exception { - System.out.println(extractor.getBannerUrl()); - assertTrue(extractor.getBannerUrl(), extractor.getBannerUrl().contains("yt")); - } + @Test + public void testOriginalUrl() { + assertEquals("http://www.youtube.com/watch?v=lp-EO5I60KA&list=PLMC9KNkIncKtPzgY-5rmhvj7fax8fdxoj", extractor.getOriginalUrl()); + } - @Test - public void testGetUploaderUrl() throws Exception { - assertTrue(extractor.getUploaderUrl(), extractor.getUploaderUrl().contains("youtube.com")); - } + /*////////////////////////////////////////////////////////////////////////// + // ListExtractor + //////////////////////////////////////////////////////////////////////////*/ - @Test - public void testGetUploaderName() throws Exception { - assertTrue(extractor.getUploaderName(), !extractor.getUploaderName().isEmpty()); - } + @Test + public void testRelatedItems() throws Exception { + BaseListExtractorTest.defaultTestRelatedItems(extractor, YouTube.getServiceId()); + } - @Test - public void testGetUploaderAvatarUrl() throws Exception { - assertTrue(extractor.getUploaderAvatarUrl(), extractor.getUploaderAvatarUrl().contains("yt")); - } + @Test + public void testMoreRelatedItems() throws Exception { + BaseListExtractorTest.defaultTestMoreItems(extractor, ServiceList.YouTube.getServiceId()); + } - @Test - public void testGetStreamsCount() throws Exception { - assertTrue("error in the streams count", extractor.getStreamCount() > 100); - } + /*////////////////////////////////////////////////////////////////////////// + // PlaylistExtractor + //////////////////////////////////////////////////////////////////////////*/ - @Test - public void testGetStreams() throws Exception { - List streams = extractor.getInfoItems().getItemList(); - assertFalse("no streams are received", streams.isEmpty()); - assertTrue(streams.size() > 60); - assertFalse(streams.contains(null)); - for(StreamInfoItem item: streams) { - assertEquals("Service id doesn't match", YouTube.getServiceId(), item.getServiceId()); - assertNotNull("Stream type not set: " + item, item.getStreamType()); - //assertNotEmpty("Upload date not set: " + item, item.getUploadDate()); - assertNotEmpty("Uploader name not set: " + item, item.getUploaderName()); - assertNotEmpty("Uploader url not set: " + item, item.getUploaderUrl()); + @Test + public void testThumbnailUrl() throws Exception { + final String thumbnailUrl = extractor.getThumbnailUrl(); + assertIsSecureUrl(thumbnailUrl); + assertTrue(thumbnailUrl, thumbnailUrl.contains("yt")); + } + + @Test + public void testBannerUrl() throws Exception { + final String bannerUrl = extractor.getBannerUrl(); + assertIsSecureUrl(bannerUrl); + assertTrue(bannerUrl, bannerUrl.contains("yt")); + } + + @Test + public void testUploaderUrl() throws Exception { + assertTrue(extractor.getUploaderUrl().contains("youtube.com")); + } + + @Test + public void testUploaderName() throws Exception { + final String uploaderName = extractor.getUploaderName(); + assertTrue(uploaderName, uploaderName.contains("Just Hits")); + } + + @Test + public void testUploaderAvatarUrl() throws Exception { + final String uploaderAvatarUrl = extractor.getUploaderAvatarUrl(); + assertTrue(uploaderAvatarUrl, uploaderAvatarUrl.contains("yt")); + } + + @Test + public void testStreamCount() throws Exception { + assertTrue("Error in the streams count", extractor.getStreamCount() > 100); } } - @Test - public void testGetStreamsErrors() throws Exception { - assertEmptyErrors("errors during stream list extraction", extractor.getInfoItems().getErrors()); + public static class ImportantVideos implements BasePlaylistExtractorTest { + private static YoutubePlaylistExtractor extractor; + + @BeforeClass + public static void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + extractor = (YoutubePlaylistExtractor) YouTube + .getPlaylistExtractor("https://www.youtube.com/playlist?list=PLOy0j9AvlVZPto6IkjKfpu0Scx--7PGTC"); + extractor.fetchPage(); + } + + /*////////////////////////////////////////////////////////////////////////// + // Additional Testing + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testGetPageInNewExtractor() throws Exception { + final PlaylistExtractor newExtractor = YouTube.getPlaylistExtractor(extractor.getCleanUrl()); + BaseListExtractorTest.defaultTestGetPageInNewExtractor(extractor, newExtractor, YouTube.getServiceId()); + } + + /*////////////////////////////////////////////////////////////////////////// + // Extractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testServiceId() { + assertEquals(YouTube.getServiceId(), extractor.getServiceId()); + } + + @Test + public void testName() throws Exception { + String name = extractor.getName(); + assertTrue(name, name.contains("Important videos")); + } + + @Test + public void testId() throws Exception { + assertEquals("PLOy0j9AvlVZPto6IkjKfpu0Scx--7PGTC", extractor.getId()); + } + + @Test + public void testCleanUrl() { + assertEquals("https://www.youtube.com/playlist?list=PLOy0j9AvlVZPto6IkjKfpu0Scx--7PGTC", extractor.getCleanUrl()); + } + + @Test + public void testOriginalUrl() { + assertEquals("https://www.youtube.com/playlist?list=PLOy0j9AvlVZPto6IkjKfpu0Scx--7PGTC", extractor.getOriginalUrl()); + } + + /*////////////////////////////////////////////////////////////////////////// + // ListExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testRelatedItems() throws Exception { + BaseListExtractorTest.defaultTestRelatedItems(extractor, YouTube.getServiceId()); + } + + @Test + public void testMoreRelatedItems() throws Exception { + ListExtractor.InfoItemPage currentPage = BaseListExtractorTest.defaultTestMoreItems(extractor, ServiceList.YouTube.getServiceId()); + // Test for 2 more levels + for (int i = 0; i < 2; i++) { + currentPage = extractor.getPage(currentPage.getNextPageUrl()); + BaseListExtractorTest.defaultTestListOfItems(YouTube.getServiceId(), currentPage.getItemsList(), currentPage.getErrors()); + } + } + + /*////////////////////////////////////////////////////////////////////////// + // PlaylistExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testThumbnailUrl() throws Exception { + final String thumbnailUrl = extractor.getThumbnailUrl(); + assertIsSecureUrl(thumbnailUrl); + assertTrue(thumbnailUrl, thumbnailUrl.contains("yt")); + } + + @Test + public void testBannerUrl() throws Exception { + final String bannerUrl = extractor.getBannerUrl(); + assertIsSecureUrl(bannerUrl); + assertTrue(bannerUrl, bannerUrl.contains("yt")); + } + + @Test + public void testUploaderUrl() throws Exception { + assertTrue(extractor.getUploaderUrl().contains("youtube.com")); + } + + @Test + public void testUploaderName() throws Exception { + assertEquals("Crazy Horse", extractor.getUploaderName()); + } + + @Test + public void testUploaderAvatarUrl() throws Exception { + final String uploaderAvatarUrl = extractor.getUploaderAvatarUrl(); + assertTrue(uploaderAvatarUrl, uploaderAvatarUrl.contains("yt")); + } + + @Test + public void testStreamCount() throws Exception { + assertTrue("Error in the streams count", extractor.getStreamCount() > 100); + } } - - @Test - public void testHasMoreStreams() throws Exception { - // Setup the streams - extractor.getInfoItems(); - assertTrue("extractor didn't have more streams", extractor.hasNextPage()); - } - - - @Test @Ignore - public void testGetNextPage() throws Exception { - // Setup the streams - extractor.getInfoItems(); - ListExtractor.InfoItemPage infoItemPage = extractor.getPage(extractor.getNextPageUrl()); - assertTrue("extractor didn't have next streams", !infoItemPage.getItemsList().isEmpty()); - assertEmptyErrors("errors occurred during extraction of the next streams", infoItemPage.getErrors()); - assertTrue("extractor didn't have more streams after getInfoItemPage", extractor.hasNextPage()); - } - }