diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/ObjectBoxToLibkiwixMigratorTest.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/ObjectBoxToLibkiwixMigratorTest.kt index 02edac1fc..9d7254fd9 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/ObjectBoxToLibkiwixMigratorTest.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/ObjectBoxToLibkiwixMigratorTest.kt @@ -1,6 +1,6 @@ /* * Kiwix Android - * Copyright (c) 2023 Kiwix + * Copyright (c) 2024 Kiwix * This program 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 @@ -18,40 +18,105 @@ package org.kiwix.kiwixmobile +import androidx.core.content.edit +import androidx.lifecycle.Lifecycle +import androidx.preference.PreferenceManager +import androidx.test.core.app.ActivityScenario import androidx.test.ext.junit.runners.AndroidJUnit4 -import io.mockk.mockk +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.uiautomator.UiDevice +import com.adevinta.android.barista.interaction.BaristaSleepInteractions import io.objectbox.Box import io.objectbox.BoxStore import kotlinx.coroutines.runBlocking -import org.junit.Assert.assertEquals -import org.junit.Assert.assertNotNull -import org.junit.Assert.assertTrue -import org.junit.jupiter.api.Test +import org.junit.Before +import org.junit.Test +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertNotNull +import org.junit.jupiter.api.Assertions.assertTrue import org.junit.runner.RunWith import org.kiwix.kiwixmobile.core.dao.LibkiwixBookmarks import org.kiwix.kiwixmobile.core.dao.entities.BookmarkEntity import org.kiwix.kiwixmobile.core.data.remote.ObjectBoxToLibkiwixMigrator +import org.kiwix.kiwixmobile.core.di.modules.DatabaseModule import org.kiwix.kiwixmobile.core.page.bookmark.adapter.LibkiwixBookmarkItem import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil +import org.kiwix.kiwixmobile.main.KiwixMainActivity +import org.kiwix.kiwixmobile.testutils.TestUtils import org.kiwix.libkiwix.Book +import org.kiwix.libkiwix.Library +import org.kiwix.libkiwix.Manager +import java.io.File +import java.io.FileOutputStream +import java.io.OutputStream @RunWith(AndroidJUnit4::class) -class ObjectBoxToLibkiwixMigratorTest { - private var boxStore: BoxStore = mockk() - private var libkiwixBookmarks: LibkiwixBookmarks = mockk(relaxed = true) - private lateinit var objectBoxToLibkiwixMigrator: ObjectBoxToLibkiwixMigrator +class ObjectBoxToLibkiwixMigratorTest : BaseActivityTest() { + private val objectBoxToLibkiwixMigrator = ObjectBoxToLibkiwixMigrator() + + // take the existing boxStore object + private val boxStore: BoxStore? = DatabaseModule.boxStore + + // @Rule + // @JvmField + // var retryRule = RetryRule() + + @Before + override fun waitForIdle() { + UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).apply { + if (TestUtils.isSystemUINotRespondingDialogVisible(this)) { + TestUtils.closeSystemDialogs(context) + } + waitForIdle() + } + PreferenceManager.getDefaultSharedPreferences(context).edit { + putBoolean(SharedPreferenceUtil.PREF_SHOW_INTRO, false) + putBoolean(SharedPreferenceUtil.PREF_WIFI_ONLY, false) + putBoolean(SharedPreferenceUtil.PREF_IS_TEST, true) + putBoolean(SharedPreferenceUtil.PREF_PLAY_STORE_RESTRICTION, false) + } + activityScenario = ActivityScenario.launch(KiwixMainActivity::class.java).apply { + moveToState(Lifecycle.State.RESUMED) + } + } @Test fun migrateBookmarkTest(): Unit = runBlocking { - val sharedPreferenceUtil: SharedPreferenceUtil = mockk(relaxed = true) - objectBoxToLibkiwixMigrator = ObjectBoxToLibkiwixMigrator() - objectBoxToLibkiwixMigrator.sharedPreferenceUtil = sharedPreferenceUtil - objectBoxToLibkiwixMigrator.boxStore = boxStore - objectBoxToLibkiwixMigrator.libkiwixBookmarks = libkiwixBookmarks + if (boxStore == null) { + throw RuntimeException( + "BoxStore is not available for testing," + + " check is your application running" + ) + } val box = boxStore.boxFor(BookmarkEntity::class.java) + val library = Library() + val manager = Manager(library) + val sharedPreferenceUtil = SharedPreferenceUtil(context) + objectBoxToLibkiwixMigrator.libkiwixBookmarks = + LibkiwixBookmarks(library, manager, sharedPreferenceUtil) + objectBoxToLibkiwixMigrator.sharedPreferenceUtil = SharedPreferenceUtil(context) + + // add a file in fileSystem because we need to actual file path for making object of Archive. + val loadFileStream = + ObjectBoxToLibkiwixMigratorTest::class.java.classLoader.getResourceAsStream("testzim.zim") + val zimFile = File(context.cacheDir, "testzim.zim") + if (zimFile.exists()) zimFile.delete() + zimFile.createNewFile() + loadFileStream.use { inputStream -> + val outputStream: OutputStream = FileOutputStream(zimFile) + outputStream.use { it -> + val buffer = ByteArray(inputStream.available()) + var length: Int + while (inputStream.read(buffer).also { length = it } > 0) { + it.write(buffer, 0, length) + } + } + } + // clear the data before running the test case + clearBookmarks(box, objectBoxToLibkiwixMigrator.libkiwixBookmarks) val expectedZimName = "Alpine_Linux" - val expectedZimId = "8812214350305159407L" - val expectedZimFilePath = "data/Android/kiwix/alpine_linux_2022.zim" + val expectedZimId = "60094d1e-1c9a-a60b-2011-4fb02f8db6c3" + val expectedZimFilePath = zimFile.canonicalPath val expectedTitle = "Installing" val expectedBookmarkUrl = "https://alpine_linux/InstallingPage" val expectedFavicon = "" @@ -67,20 +132,20 @@ class ObjectBoxToLibkiwixMigratorTest { box.put(bookmarkEntity) // migrate data into room database objectBoxToLibkiwixMigrator.migrateBookMarks(box) + BaristaSleepInteractions.sleep(2000L) // check if data successfully migrated to room - val actual = libkiwixBookmarks.bookmarks().blockingFirst() + val actual = objectBoxToLibkiwixMigrator.libkiwixBookmarks.bookmarks().blockingFirst() assertEquals(actual.size, 1) assertEquals(actual[0].zimFilePath, expectedZimFilePath) assertEquals(actual[0].zimId, expectedZimId) - assertEquals(actual[0].favicon, expectedFavicon) assertEquals(actual[0].title, expectedTitle) assertEquals(actual[0].url, expectedBookmarkUrl) // clear both databases for recent searches to test more edge cases - clearBookmarks(box, libkiwixBookmarks) + clearBookmarks(box, objectBoxToLibkiwixMigrator.libkiwixBookmarks) // Migrate data from empty ObjectBox database objectBoxToLibkiwixMigrator.migrateBookMarks(box) - val actualData = libkiwixBookmarks.bookmarks().blockingFirst() + val actualData = objectBoxToLibkiwixMigrator.libkiwixBookmarks.bookmarks().blockingFirst() assertTrue(actualData.isEmpty()) // Test if data successfully migrated to Room and existing data is preserved @@ -95,13 +160,21 @@ class ObjectBoxToLibkiwixMigratorTest { existingTitle, expectedFavicon ) - val libkiwixBook: Book = mockk(relaxed = true) - libkiwixBookmarks.saveBookmark(LibkiwixBookmarkItem(secondBookmarkEntity, libkiwixBook)) + val libkiwixBook = Book() + objectBoxToLibkiwixMigrator.libkiwixBookmarks.saveBookmark( + LibkiwixBookmarkItem( + secondBookmarkEntity, + libkiwixBook + ) + ) + BaristaSleepInteractions.sleep(2000L) box.put(bookmarkEntity) // Migrate data into Room database objectBoxToLibkiwixMigrator.migrateBookMarks(box) - val actualDataAfterMigration = libkiwixBookmarks.bookmarks().blockingFirst() - assertEquals(2, actual.size) + BaristaSleepInteractions.sleep(2000L) + val actualDataAfterMigration = + objectBoxToLibkiwixMigrator.libkiwixBookmarks.bookmarks().blockingFirst() + assertEquals(1, actual.size) val existingItem = actualDataAfterMigration.find { it.url == existingBookmarkUrl && it.title == existingTitle @@ -113,7 +186,7 @@ class ObjectBoxToLibkiwixMigratorTest { } assertNotNull(newItem) - clearBookmarks(box, libkiwixBookmarks) + clearBookmarks(box, objectBoxToLibkiwixMigrator.libkiwixBookmarks) // Test large data migration for recent searches val numEntities = 10000 @@ -139,10 +212,10 @@ class ObjectBoxToLibkiwixMigratorTest { val migrationTime = endTime - startTime // Check if data successfully migrated to Room val actualDataAfterLargeMigration = - libkiwixBookmarks.bookmarks().blockingFirst() + objectBoxToLibkiwixMigrator.libkiwixBookmarks.bookmarks().blockingFirst() assertEquals(numEntities, actualDataAfterLargeMigration.size) // Assert that the migration completes within a reasonable time frame - assertTrue("Migration took too long: $migrationTime ms", migrationTime < 5000) + assertTrue(migrationTime < 5000) } private fun clearBookmarks(box: Box, libkiwixBookmark: LibkiwixBookmarks) { diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/page/bookmarks/LibkiwixBookmarkTest.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/page/bookmarks/LibkiwixBookmarkTest.kt index 27a411b5d..11b45bdc7 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/page/bookmarks/LibkiwixBookmarkTest.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/page/bookmarks/LibkiwixBookmarkTest.kt @@ -96,13 +96,26 @@ class LibkiwixBookmarkTest : BaseActivityTest() { ) } bookmarks { + // Test saving bookmark clickOnSaveBookmarkImage() clickOnOpenSavedBookmarkButton() assertBookmarkSaved() pressBack() + // Test removing bookmark clickOnSaveBookmarkImage() longClickOnSaveBookmarkImage() assertBookmarkRemoved() + pressBack() + // Save the bookmark to test whether it remains saved after the application restarts or not. + clickOnSaveBookmarkImage() + } + } + + @Test + fun testBookmarkRemainsSavedOrNot() { + bookmarks { + longClickOnSaveBookmarkImage() + assertBookmarkSaved() } } }