diff options
author | ByteHamster <ByteHamster@users.noreply.github.com> | 2024-03-29 19:27:53 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-29 19:27:53 +0100 |
commit | 2fd73b148d012fba7308c86494689103b8aaace4 (patch) | |
tree | 75782c565600eadd67d0fca46acf637370fcf4a3 /core/src/test/java/de/danoeh | |
parent | 6f3a9b16764a57e43994ccbeeada5224dee93f44 (diff) | |
download | AntennaPod-2fd73b148d012fba7308c86494689103b8aaace4.zip |
Move download service to module (#7041)
Diffstat (limited to 'core/src/test/java/de/danoeh')
-rw-r--r-- | core/src/test/java/de/danoeh/antennapod/core/feed/LocalFeedUpdaterTest.java | 307 | ||||
-rw-r--r-- | core/src/test/java/de/danoeh/antennapod/core/util/FilenameGeneratorTest.java | 1 |
2 files changed, 1 insertions, 307 deletions
diff --git a/core/src/test/java/de/danoeh/antennapod/core/feed/LocalFeedUpdaterTest.java b/core/src/test/java/de/danoeh/antennapod/core/feed/LocalFeedUpdaterTest.java deleted file mode 100644 index 9703894f5..000000000 --- a/core/src/test/java/de/danoeh/antennapod/core/feed/LocalFeedUpdaterTest.java +++ /dev/null @@ -1,307 +0,0 @@ -package de.danoeh.antennapod.core.feed; - -import android.content.Context; -import android.media.MediaMetadataRetriever; -import android.net.Uri; -import android.webkit.MimeTypeMap; - -import androidx.annotation.NonNull; -import androidx.test.platform.app.InstrumentationRegistry; - -import de.danoeh.antennapod.storage.preferences.PlaybackPreferences; -import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface; -import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterfaceStub; -import de.danoeh.antennapod.core.util.FastDocumentFile; -import de.danoeh.antennapod.model.feed.Feed; -import de.danoeh.antennapod.model.feed.FeedItem; -import de.danoeh.antennapod.storage.database.PodDBAdapter; -import de.danoeh.antennapod.storage.preferences.SynchronizationSettings; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.MockedStatic; -import org.mockito.Mockito; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.shadows.ShadowMediaMetadataRetriever; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -import de.danoeh.antennapod.storage.preferences.UserPreferences; -import de.danoeh.antennapod.storage.database.DBReader; -import de.danoeh.antennapod.storage.database.DBWriter; - -import static org.hamcrest.CoreMatchers.endsWith; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.empty; -import static org.hamcrest.Matchers.startsWith; -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.any; -import static org.robolectric.Shadows.shadowOf; - -/** - * Test local feeds handling in class LocalFeedUpdater. - */ -@RunWith(RobolectricTestRunner.class) -public class LocalFeedUpdaterTest { - - /** - * URL to locate the local feed media files on the external storage (SD card). - * The exact URL doesn't matter here as access to external storage is mocked - * (seems not to be supported by Robolectric). - */ - private static final String FEED_URL = - "content://com.android.externalstorage.documents/tree/primary%3ADownload%2Flocal-feed"; - private static final String LOCAL_FEED_DIR1 = "src/test/assets/local-feed1"; - private static final String LOCAL_FEED_DIR2 = "src/test/assets/local-feed2"; - - private Context context; - - @Before - public void setUp() throws Exception { - // Initialize environment - context = InstrumentationRegistry.getInstrumentation().getContext(); - UserPreferences.init(context); - PlaybackPreferences.init(context); - SynchronizationSettings.init(context); - DownloadServiceInterface.setImpl(new DownloadServiceInterfaceStub()); - - // Initialize database - PodDBAdapter.init(context); - PodDBAdapter.deleteDatabase(); - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.close(); - - mapDummyMetadata(LOCAL_FEED_DIR1); - mapDummyMetadata(LOCAL_FEED_DIR2); - shadowOf(MimeTypeMap.getSingleton()).addExtensionMimeTypMapping("mp3", "audio/mp3"); - } - - @After - public void tearDown() { - DBWriter.tearDownTests(); - PodDBAdapter.tearDownTests(); - } - - /** - * Test adding a new local feed. - */ - @Test - public void testUpdateFeed_AddNewFeed() { - // check for empty database - List<Feed> feedListBefore = DBReader.getFeedList(); - assertThat(feedListBefore, is(empty())); - - callUpdateFeed(LOCAL_FEED_DIR2); - - // verify new feed in database - verifySingleFeedInDatabaseAndItemCount(2); - Feed feedAfter = verifySingleFeedInDatabase(); - assertEquals(FEED_URL, feedAfter.getDownloadUrl()); - } - - /** - * Test adding further items to an existing local feed. - */ - @Test - public void testUpdateFeed_AddMoreItems() { - // add local feed with 1 item (localFeedDir1) - callUpdateFeed(LOCAL_FEED_DIR1); - - // now add another item (by changing to local feed folder localFeedDir2) - callUpdateFeed(LOCAL_FEED_DIR2); - - verifySingleFeedInDatabaseAndItemCount(2); - } - - /** - * Test removing items from an existing local feed without a corresponding media file. - */ - @Test - public void testUpdateFeed_RemoveItems() { - // add local feed with 2 items (localFeedDir1) - callUpdateFeed(LOCAL_FEED_DIR2); - - // now remove an item (by changing to local feed folder localFeedDir1) - callUpdateFeed(LOCAL_FEED_DIR1); - - verifySingleFeedInDatabaseAndItemCount(1); - } - - /** - * Test feed icon defined in the local feed media folder. - */ - @Test - public void testUpdateFeed_FeedIconFromFolder() { - callUpdateFeed(LOCAL_FEED_DIR2); - - Feed feedAfter = verifySingleFeedInDatabase(); - assertThat(feedAfter.getImageUrl(), endsWith("local-feed2/folder.png")); - } - - /** - * Test default feed icon if there is no matching file in the local feed media folder. - */ - @Test - public void testUpdateFeed_FeedIconDefault() { - callUpdateFeed(LOCAL_FEED_DIR1); - - Feed feedAfter = verifySingleFeedInDatabase(); - assertThat(feedAfter.getImageUrl(), startsWith(Feed.PREFIX_GENERATIVE_COVER)); - } - - /** - * Test default feed metadata. - * - * @see #mapDummyMetadata Title and PubDate are dummy values. - */ - @Test - public void testUpdateFeed_FeedMetadata() { - callUpdateFeed(LOCAL_FEED_DIR1); - - Feed feed = verifySingleFeedInDatabase(); - List<FeedItem> feedItems = DBReader.getFeedItemList(feed); - assertEquals("track1.mp3", feedItems.get(0).getTitle()); - } - - @Test - public void testGetImageUrl_EmptyFolder() { - String imageUrl = LocalFeedUpdater.getImageUrl(Collections.emptyList(), Uri.EMPTY); - assertThat(imageUrl, startsWith(Feed.PREFIX_GENERATIVE_COVER)); - } - - @Test - public void testGetImageUrl_NoImageButAudioFiles() { - List<FastDocumentFile> folder = Collections.singletonList(mockDocumentFile("audio.mp3", "audio/mp3")); - String imageUrl = LocalFeedUpdater.getImageUrl(folder, Uri.EMPTY); - assertThat(imageUrl, startsWith(Feed.PREFIX_GENERATIVE_COVER)); - } - - @Test - public void testGetImageUrl_PreferredImagesFilenames() { - for (String filename : LocalFeedUpdater.PREFERRED_FEED_IMAGE_FILENAMES) { - List<FastDocumentFile> folder = Arrays.asList(mockDocumentFile("audio.mp3", "audio/mp3"), - mockDocumentFile(filename, "image/jpeg")); // image MIME type doesn't matter - String imageUrl = LocalFeedUpdater.getImageUrl(folder, Uri.EMPTY); - assertThat(imageUrl, endsWith(filename)); - } - } - - @Test - public void testGetImageUrl_OtherImageFilenameJpg() { - List<FastDocumentFile> folder = Arrays.asList(mockDocumentFile("audio.mp3", "audio/mp3"), - mockDocumentFile("my-image.jpg", "image/jpeg")); - String imageUrl = LocalFeedUpdater.getImageUrl(folder, Uri.EMPTY); - assertThat(imageUrl, endsWith("my-image.jpg")); - } - - @Test - public void testGetImageUrl_OtherImageFilenameJpeg() { - List<FastDocumentFile> folder = Arrays.asList(mockDocumentFile("audio.mp3", "audio/mp3"), - mockDocumentFile("my-image.jpeg", "image/jpeg")); - String imageUrl = LocalFeedUpdater.getImageUrl(folder, Uri.EMPTY); - assertThat(imageUrl, endsWith("my-image.jpeg")); - } - - @Test - public void testGetImageUrl_OtherImageFilenamePng() { - List<FastDocumentFile> folder = Arrays.asList(mockDocumentFile("audio.mp3", "audio/mp3"), - mockDocumentFile("my-image.png", "image/png")); - String imageUrl = LocalFeedUpdater.getImageUrl(folder, Uri.EMPTY); - assertThat(imageUrl, endsWith("my-image.png")); - } - - @Test - public void testGetImageUrl_OtherImageFilenameUnsupportedMimeType() { - List<FastDocumentFile> folder = Arrays.asList(mockDocumentFile("audio.mp3", "audio/mp3"), - mockDocumentFile("my-image.svg", "image/svg+xml")); - String imageUrl = LocalFeedUpdater.getImageUrl(folder, Uri.EMPTY); - assertThat(imageUrl, startsWith(Feed.PREFIX_GENERATIVE_COVER)); - } - - /** - * Fill ShadowMediaMetadataRetriever with dummy duration and title. - * - * @param localFeedDir assets local feed folder with media files - */ - private void mapDummyMetadata(@NonNull String localFeedDir) { - for (String fileName : Objects.requireNonNull(new File(localFeedDir).list())) { - String path = localFeedDir + '/' + fileName; - ShadowMediaMetadataRetriever.addMetadata(path, - MediaMetadataRetriever.METADATA_KEY_DURATION, "10"); - ShadowMediaMetadataRetriever.addMetadata(path, - MediaMetadataRetriever.METADATA_KEY_TITLE, fileName); - ShadowMediaMetadataRetriever.addMetadata(path, - MediaMetadataRetriever.METADATA_KEY_DATE, "20200601T222324"); - } - } - - /** - * Calls the method LocalFeedUpdater#tryUpdateFeed with the given local feed folder. - * - * @param localFeedDir assets local feed folder with media files - */ - private void callUpdateFeed(@NonNull String localFeedDir) { - try (MockedStatic<FastDocumentFile> dfMock = Mockito.mockStatic(FastDocumentFile.class)) { - // mock external storage - dfMock.when(() -> FastDocumentFile.list(any(), any())).thenReturn(mockLocalFolder(localFeedDir)); - - // call method to test - Feed feed = new Feed(FEED_URL, null); - try { - LocalFeedUpdater.tryUpdateFeed(feed, context, null, null); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } - - /** - * Verify that the database contains exactly one feed and return that feed. - */ - @NonNull - private static Feed verifySingleFeedInDatabase() { - List<Feed> feedListAfter = DBReader.getFeedList(); - assertEquals(1, feedListAfter.size()); - return feedListAfter.get(0); - } - - /** - * Verify that the database contains exactly one feed and the number of - * items in the feed. - * - * @param expectedItemCount expected number of items in the feed - */ - private static void verifySingleFeedInDatabaseAndItemCount(int expectedItemCount) { - Feed feed = verifySingleFeedInDatabase(); - List<FeedItem> feedItems = DBReader.getFeedItemList(feed); - assertEquals(expectedItemCount, feedItems.size()); - } - - /** - * Create a DocumentFile mock object. - */ - @NonNull - private static FastDocumentFile mockDocumentFile(@NonNull String fileName, @NonNull String mimeType) { - return new FastDocumentFile(fileName, mimeType, Uri.parse("file:///path/" + fileName), 0, 0); - } - - private static List<FastDocumentFile> mockLocalFolder(String folderName) { - List<FastDocumentFile> files = new ArrayList<>(); - for (File f : Objects.requireNonNull(new File(folderName).listFiles())) { - String extension = MimeTypeMap.getFileExtensionFromUrl(f.getPath()); - String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); - files.add(new FastDocumentFile(f.getName(), mimeType, - Uri.parse(f.toURI().toString()), f.length(), f.lastModified())); - } - return files; - } -} diff --git a/core/src/test/java/de/danoeh/antennapod/core/util/FilenameGeneratorTest.java b/core/src/test/java/de/danoeh/antennapod/core/util/FilenameGeneratorTest.java index af22a4b9d..4c225322a 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/util/FilenameGeneratorTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/util/FilenameGeneratorTest.java @@ -5,6 +5,7 @@ import android.text.TextUtils; import java.io.File; +import de.danoeh.antennapod.net.download.serviceinterface.FileNameGenerator; import org.apache.commons.lang3.StringUtils; import org.junit.Test; import org.junit.runner.RunWith; |