Refactored the test cases.

* Improved the instrumentation test cases.
* Improved the migration test case.
This commit is contained in:
MohitMaliFtechiz 2024-01-05 19:31:49 +05:30 committed by MohitMaliFtechiz
parent e866dd29b5
commit f45e321655
2 changed files with 114 additions and 28 deletions

View File

@ -1,6 +1,6 @@
/*
* Kiwix Android
* Copyright (c) 2023 Kiwix <android.kiwix.org>
* Copyright (c) 2024 Kiwix <android.kiwix.org>
* 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<BookmarkEntity>, libkiwixBookmark: LibkiwixBookmarks) {

View File

@ -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()
}
}
}