From 99eac56dfc95b50fb3e1afa92085838a5da4bdf7 Mon Sep 17 00:00:00 2001 From: Nicholas Sala Date: Sun, 8 Dec 2024 17:22:17 +0100 Subject: [PATCH] NewPlayerImpl tests: tested addToPlaylist, movePlaylistItem, removePlaylistItem, selectChapter and release functions --- .../newpipe/newplayer/NewPlayerImpltest.kt | 79 ++++++++++++++++++- .../repository/CachingRepositoryTest.kt | 59 +++++++------- 2 files changed, 105 insertions(+), 33 deletions(-) diff --git a/new-player/src/test/java/net/newpipe/newplayer/NewPlayerImpltest.kt b/new-player/src/test/java/net/newpipe/newplayer/NewPlayerImpltest.kt index 3bb5e4c..7263dfa 100644 --- a/new-player/src/test/java/net/newpipe/newplayer/NewPlayerImpltest.kt +++ b/new-player/src/test/java/net/newpipe/newplayer/NewPlayerImpltest.kt @@ -10,6 +10,7 @@ import android.content.pm.ServiceInfo import android.os.Looper import android.text.TextUtils import android.util.Log +import androidx.media3.common.MediaItem import androidx.media3.exoplayer.ExoPlayer import androidx.media3.session.MediaController import androidx.media3.session.SessionToken @@ -22,18 +23,20 @@ import io.mockk.mockkStatic import io.mockk.verify import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.setMain import net.newpipe.newplayer.repository.DelayTestRepository import net.newpipe.newplayer.repository.MockMediaRepository import org.junit.Before import org.junit.BeforeClass +import org.junit.Ignore import org.junit.Test @OptIn(ExperimentalCoroutinesApi::class) class NewPlayerImpltest { val mockExoPlayer = mockk(relaxed = true) + val mockMediaController = mockk(relaxed = true) val mockApp = mockk(relaxed = true) val playerActivityClass = Activity::class.java val repository = DelayTestRepository(MockMediaRepository(), 100) @@ -53,7 +56,6 @@ class NewPlayerImpltest { mockkConstructor(MediaController.Builder::class) val mockLooper = mockk(relaxed = true) - val mockMediaController = mockk(relaxed = true) val mockPackageManager = mockk(relaxed = true) val mockResolveInfo = mockk(relaxed = true) val mockServiceInfo = mockk(relaxed = true) @@ -78,7 +80,7 @@ class NewPlayerImpltest { @JvmStatic @BeforeClass fun init() { - Dispatchers.setMain(StandardTestDispatcher()) + Dispatchers.setMain(UnconfinedTestDispatcher()) } @JvmStatic @@ -165,5 +167,74 @@ class NewPlayerImpltest { verify (exactly = 1) { mockExoPlayer.pause() } } - + @Test + fun addToPlaylist_prepareExoPlayerIfNotPrepared() { + player.addToPlaylist("item") + verify (exactly = 1) { mockExoPlayer.prepare() } + } + + @Test + fun addToPlaylist_notPrepareExoPlayerIfAlreadyPrepared() { + player.prepare() + clearMocks(mockExoPlayer) + player.addToPlaylist("item") + verify (exactly = 0) { mockExoPlayer.prepare() } + } + + @Ignore("Find a way to test code inside launchJobAndCollectError") + @Test + fun addToPlaylist_addMediaSource() { + player.addToPlaylist("item") +// try { +// Dispatchers.Main.job.join() +// } catch (e : Exception) { } +// coVerify (exactly = 2) { mockExoPlayer.addMediaSource(any()) } + } + + @Test + fun movePlaylistItem() { + player.prepare() + player.movePlaylistItem(0, 1) + verify (exactly = 1){ mockExoPlayer.moveMediaItem(0, 1) } + } + + @Test + fun removePlaylistItem_removeItem() { + player.prepare() + val mediaItem = MediaItem.Builder().setMediaId("123").build() + every { mockExoPlayer.mediaItemCount } returns 1 + every { mockExoPlayer.getMediaItemAt(any()) } returns mediaItem + player.removePlaylistItem(123) + verify (exactly = 1) { mockExoPlayer.removeMediaItem(0) } + } + + @Test + fun removePlaylistItem_notRemoveItem() { + player.prepare() + val mediaItem = MediaItem.Builder().setMediaId("123").build() + every { mockExoPlayer.mediaItemCount } returns 1 + every { mockExoPlayer.getMediaItemAt(any()) } returns mediaItem + player.removePlaylistItem(124) + verify (exactly = 0) { mockExoPlayer.removeMediaItem(0) } + } + + @Ignore("Mock currentChapters.value and test the selection of a chapter") + @Test + fun selectChapter() { + player.selectChapter(0) + } + + @Test(expected = IndexOutOfBoundsException::class) + fun selectChapter_throwsException() { + player.selectChapter(3) + } + + @Test + fun release() { + player.prepare() + player.release() + verify (exactly = 1) { mockMediaController.release() } + verify (exactly = 1) { mockExoPlayer.release() } + } + } \ No newline at end of file diff --git a/new-player/src/test/java/net/newpipe/newplayer/repository/CachingRepositoryTest.kt b/new-player/src/test/java/net/newpipe/newplayer/repository/CachingRepositoryTest.kt index 48dd3f9..bec4e4d 100644 --- a/new-player/src/test/java/net/newpipe/newplayer/repository/CachingRepositoryTest.kt +++ b/new-player/src/test/java/net/newpipe/newplayer/repository/CachingRepositoryTest.kt @@ -13,6 +13,7 @@ import org.junit.Test import org.junit.Assert.* import org.junit.Before import org.junit.BeforeClass +import org.junit.Ignore @OptIn(ExperimentalCoroutinesApi::class) class CachingRepositoryTest { @@ -157,33 +158,33 @@ class CachingRepositoryTest { assertNotNull(repository.getHttpDataSourceFactory("item")) } - // TODO -// @Test -// fun flush_flushTheCaches() = runTest { -// repository.getMetaInfo("item") -// repository.getStreams("item") -// repository.getSubtitles("item") -// repository.getPreviewThumbnail("item", 1000) -// repository.getPreviewThumbnailsInfo("item") -// repository.getChapters("item") -// repository.getTimestampLink("item", 0) -// -// repository.flush() -// -// repository.getMetaInfo("item") -// repository.getStreams("item") -// repository.getSubtitles("item") -// repository.getPreviewThumbnail("item", 1000) -// repository.getPreviewThumbnailsInfo("item") -// repository.getChapters("item") -// repository.getTimestampLink("item", 0) -// -// coVerify (exactly = 2) { mockMediaRepository.getMetaInfo("item") } -// coVerify (exactly = 2) { mockMediaRepository.getStreams("item") } -// coVerify (exactly = 2) { mockMediaRepository.getSubtitles("item") } -// coVerify (exactly = 2) { mockMediaRepository.getPreviewThumbnail("item", 1000) } -// coVerify (exactly = 2) { mockMediaRepository.getPreviewThumbnailsInfo("item") } -// coVerify (exactly = 2) { mockMediaRepository.getChapters("item") } -// coVerify (exactly = 2) { mockMediaRepository.getTimestampLink("item", 0) } -// } + @Ignore("Test flush if the job is cancelled using cacheRepoScope and the test is interrupted") + @Test + fun flush_flushTheCaches() = runTest { + repository.getMetaInfo("item") + repository.getStreams("item") + repository.getSubtitles("item") + repository.getPreviewThumbnail("item", 1000) + repository.getPreviewThumbnailsInfo("item") + repository.getChapters("item") + repository.getTimestampLink("item", 0) + + repository.flush() + + repository.getMetaInfo("item") + repository.getStreams("item") + repository.getSubtitles("item") + repository.getPreviewThumbnail("item", 1000) + repository.getPreviewThumbnailsInfo("item") + repository.getChapters("item") + repository.getTimestampLink("item", 0) + + coVerify (exactly = 2) { mockMediaRepository.getMetaInfo("item") } + coVerify (exactly = 2) { mockMediaRepository.getStreams("item") } + coVerify (exactly = 2) { mockMediaRepository.getSubtitles("item") } + coVerify (exactly = 2) { mockMediaRepository.getPreviewThumbnail("item", 1000) } + coVerify (exactly = 2) { mockMediaRepository.getPreviewThumbnailsInfo("item") } + coVerify (exactly = 2) { mockMediaRepository.getChapters("item") } + coVerify (exactly = 2) { mockMediaRepository.getTimestampLink("item", 0) } + } } \ No newline at end of file