From 74dd017c68c6c837ae86ce0e84e16b7542f32188 Mon Sep 17 00:00:00 2001 From: Sean Mac Gillicuddy Date: Thu, 2 Apr 2020 15:31:47 +0100 Subject: [PATCH 1/4] #1865 Add unit tests for NewRecentSearchDao - add test for recentSearches method --- .../core/dao/NewRecentSearchDao.kt | 6 +- .../core/dao/NewRecentSearchDaoTest.kt | 104 ++++++++++++++++++ 2 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 core/src/test/java/org/kiwix/kiwixmobile/core/dao/NewRecentSearchDaoTest.kt diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/dao/NewRecentSearchDao.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/dao/NewRecentSearchDao.kt index 5563c186f..85ba019df 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/dao/NewRecentSearchDao.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/dao/NewRecentSearchDao.kt @@ -25,9 +25,7 @@ import org.kiwix.kiwixmobile.core.data.local.entity.RecentSearch import org.kiwix.kiwixmobile.core.search.adapter.SearchListItem.RecentSearchListItem import javax.inject.Inject -class NewRecentSearchDao @Inject constructor( - val box: Box -) { +class NewRecentSearchDao @Inject constructor(private val box: Box) { fun recentSearches(zimId: String?) = box.asFlowable( box.query { equal(RecentSearchEntity_.zimId, zimId ?: "") @@ -60,6 +58,6 @@ class NewRecentSearchDao @Inject constructor( } companion object { - const val NUM_RECENT_RESULTS = 100 + private const val NUM_RECENT_RESULTS = 100 } } diff --git a/core/src/test/java/org/kiwix/kiwixmobile/core/dao/NewRecentSearchDaoTest.kt b/core/src/test/java/org/kiwix/kiwixmobile/core/dao/NewRecentSearchDaoTest.kt new file mode 100644 index 000000000..6c0d5049b --- /dev/null +++ b/core/src/test/java/org/kiwix/kiwixmobile/core/dao/NewRecentSearchDaoTest.kt @@ -0,0 +1,104 @@ +/* + * Kiwix Android + * Copyright (c) 2020 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 + * (at your option) any later version. + * + * This program 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 this program. If not, see . + * + */ + +package org.kiwix.kiwixmobile.core.dao + +import io.mockk.every +import io.mockk.mockk +import io.mockk.mockkStatic +import io.objectbox.Box +import io.objectbox.query.Query +import io.objectbox.query.QueryBuilder +import io.objectbox.rx.RxQuery +import io.reactivex.Observable +import org.junit.jupiter.api.Nested +import org.junit.jupiter.api.Test +import org.kiwix.kiwixmobile.core.dao.entities.RecentSearchEntity +import org.kiwix.kiwixmobile.core.dao.entities.RecentSearchEntity_ +import org.kiwix.kiwixmobile.core.search.adapter.SearchListItem.RecentSearchListItem +import org.kiwix.sharedFunctions.recentSearchEntity + +internal class NewRecentSearchDaoTest { + + private val box: Box = mockk() + private val newRecentSearchDao = NewRecentSearchDao(box) + + @Nested + inner class RecentSearchTests { + @Test + fun `recentSearches searches by Id passed`() { + val zimId = "id" + val queryResult = listOf(recentSearchEntity()) + expectFromRecentSearches(queryResult, zimId) + newRecentSearchDao.recentSearches(zimId).test() + .assertValues(queryResult.map { RecentSearchListItem(it.searchTerm) }) + } + + @Test + fun `recentSearches searches with blank Id if null passed`() { + val queryResult = listOf(recentSearchEntity()) + expectFromRecentSearches(queryResult, "") + newRecentSearchDao.recentSearches(null).test() + .assertValues(queryResult.map { RecentSearchListItem(it.searchTerm) }) + } + + @Test + fun `recentSearches searches returns distinct entities by searchTerm`() { + val queryResult = listOf(recentSearchEntity(), recentSearchEntity()) + expectFromRecentSearches(queryResult, "") + newRecentSearchDao.recentSearches(null).test() + .assertValues(queryResult.take(1).map { RecentSearchListItem(it.searchTerm) }) + } + + @Test + fun `recentSearches searches returns a limitedNumber of entities`() { + val searchResults: List = + (0..101).map { recentSearchEntity(searchTerm = "$it") } + expectFromRecentSearches(searchResults, "") + newRecentSearchDao.recentSearches(null).test() + .assertValues(searchResults.take(100).map { RecentSearchListItem(it.searchTerm) }) + } + + private fun expectFromRecentSearches(queryResult: List, zimId: String) { + val queryBuilder = mockk>() + every { box.query() } returns queryBuilder + every { queryBuilder.equal(RecentSearchEntity_.zimId, zimId) } returns queryBuilder + every { queryBuilder.orderDesc(RecentSearchEntity_.id) } returns queryBuilder + val query = mockk>() + every { queryBuilder.build() } returns query + mockkStatic(RxQuery::class) + every { RxQuery.observable(query) } returns Observable.just(queryResult) + } + } + + @Test + fun saveSearch() { + } + + @Test + fun deleteSearchString() { + } + + @Test + fun deleteSearchHistory() { + } + + @Test + fun migrationInsert() { + } +} From 801a46d86590ab74265520091687070a2267c076 Mon Sep 17 00:00:00 2001 From: Sean Mac Gillicuddy Date: Thu, 2 Apr 2020 15:46:20 +0100 Subject: [PATCH 2/4] #1865 Add unit tests for NewRecentSearchDao - add model function --- .../java/org/kiwix/sharedFunctions/TestModelFunctions.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/sharedTestFunctions/java/org/kiwix/sharedFunctions/TestModelFunctions.kt b/core/src/sharedTestFunctions/java/org/kiwix/sharedFunctions/TestModelFunctions.kt index 2831b5191..d2cbbfcfe 100644 --- a/core/src/sharedTestFunctions/java/org/kiwix/sharedFunctions/TestModelFunctions.kt +++ b/core/src/sharedTestFunctions/java/org/kiwix/sharedFunctions/TestModelFunctions.kt @@ -160,3 +160,6 @@ fun book( fun libraryNetworkEntity(books: List = emptyList()) = LibraryNetworkEntity().apply { book = LinkedList(books) } + +fun recentSearchEntity(id: Long = 0L, searchTerm: String = "", zimId: String = "") = + RecentSearchEntity(id, searchTerm, zimId) From c062670efaf5e7f76665beaa800c4cb40dac3519 Mon Sep 17 00:00:00 2001 From: Sean Mac Gillicuddy Date: Thu, 2 Apr 2020 15:56:03 +0100 Subject: [PATCH 3/4] #1865 Add unit tests for NewRecentSearchDao - fix import --- .../java/org/kiwix/sharedFunctions/TestModelFunctions.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/sharedTestFunctions/java/org/kiwix/sharedFunctions/TestModelFunctions.kt b/core/src/sharedTestFunctions/java/org/kiwix/sharedFunctions/TestModelFunctions.kt index d2cbbfcfe..94691d5fe 100644 --- a/core/src/sharedTestFunctions/java/org/kiwix/sharedFunctions/TestModelFunctions.kt +++ b/core/src/sharedTestFunctions/java/org/kiwix/sharedFunctions/TestModelFunctions.kt @@ -27,6 +27,7 @@ import org.kiwix.kiwixmobile.core.downloader.model.DownloadState import org.kiwix.kiwixmobile.core.downloader.model.DownloadState.Pending import org.kiwix.kiwixmobile.core.downloader.model.Seconds import org.kiwix.kiwixmobile.core.entity.LibraryNetworkEntity +import org.kiwix.kiwixmobile.core.dao.entities.RecentSearchEntity import org.kiwix.kiwixmobile.core.entity.LibraryNetworkEntity.Book import org.kiwix.kiwixmobile.core.entity.MetaLinkNetworkEntity import org.kiwix.kiwixmobile.core.entity.MetaLinkNetworkEntity.FileElement From a8d6612ee6737bccf00221df39e2ce8bb0ee1553 Mon Sep 17 00:00:00 2001 From: Sean Mac Gillicuddy Date: Fri, 3 Apr 2020 09:12:14 +0100 Subject: [PATCH 4/4] #1865 Add unit tests for NewRecentSearchDao - add remaining tests --- .../core/dao/NewRecentSearchDaoTest.kt | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/core/src/test/java/org/kiwix/kiwixmobile/core/dao/NewRecentSearchDaoTest.kt b/core/src/test/java/org/kiwix/kiwixmobile/core/dao/NewRecentSearchDaoTest.kt index 6c0d5049b..b66e21c64 100644 --- a/core/src/test/java/org/kiwix/kiwixmobile/core/dao/NewRecentSearchDaoTest.kt +++ b/core/src/test/java/org/kiwix/kiwixmobile/core/dao/NewRecentSearchDaoTest.kt @@ -21,6 +21,7 @@ package org.kiwix.kiwixmobile.core.dao import io.mockk.every import io.mockk.mockk import io.mockk.mockkStatic +import io.mockk.verify import io.objectbox.Box import io.objectbox.query.Query import io.objectbox.query.QueryBuilder @@ -30,12 +31,13 @@ import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test import org.kiwix.kiwixmobile.core.dao.entities.RecentSearchEntity import org.kiwix.kiwixmobile.core.dao.entities.RecentSearchEntity_ +import org.kiwix.kiwixmobile.core.data.local.entity.RecentSearch import org.kiwix.kiwixmobile.core.search.adapter.SearchListItem.RecentSearchListItem import org.kiwix.sharedFunctions.recentSearchEntity internal class NewRecentSearchDaoTest { - private val box: Box = mockk() + private val box: Box = mockk(relaxed = true) private val newRecentSearchDao = NewRecentSearchDao(box) @Nested @@ -61,17 +63,17 @@ internal class NewRecentSearchDaoTest { fun `recentSearches searches returns distinct entities by searchTerm`() { val queryResult = listOf(recentSearchEntity(), recentSearchEntity()) expectFromRecentSearches(queryResult, "") - newRecentSearchDao.recentSearches(null).test() + newRecentSearchDao.recentSearches("").test() .assertValues(queryResult.take(1).map { RecentSearchListItem(it.searchTerm) }) } @Test fun `recentSearches searches returns a limitedNumber of entities`() { val searchResults: List = - (0..101).map { recentSearchEntity(searchTerm = "$it") } + (0..200).map { recentSearchEntity(searchTerm = "$it") } expectFromRecentSearches(searchResults, "") - newRecentSearchDao.recentSearches(null).test() - .assertValues(searchResults.take(100).map { RecentSearchListItem(it.searchTerm) }) + newRecentSearchDao.recentSearches("").test() + .assertValue { it.size == 100 } } private fun expectFromRecentSearches(queryResult: List, zimId: String) { @@ -87,18 +89,37 @@ internal class NewRecentSearchDaoTest { } @Test - fun saveSearch() { + fun `saveSearch puts RecentSearchEntity into box`() { + newRecentSearchDao.saveSearch("title", "id") + verify { box.put(recentSearchEntity(searchTerm = "title", zimId = "id")) } } @Test - fun deleteSearchString() { + fun `deleteSearchString removes query results for the term`() { + val searchTerm = "searchTerm" + val queryBuilder: QueryBuilder = mockk() + every { box.query() } returns queryBuilder + every { queryBuilder.equal(RecentSearchEntity_.searchTerm, searchTerm) } returns queryBuilder + val query: Query = mockk(relaxed = true) + every { queryBuilder.build() } returns query + newRecentSearchDao.deleteSearchString(searchTerm) + verify { query.remove() } } @Test - fun deleteSearchHistory() { + fun `deleteSearchHistory deletes everything`() { + newRecentSearchDao.deleteSearchHistory() + verify { box.removeAll() } } @Test - fun migrationInsert() { + fun `migrationInsert adds old items to box`() { + val id = "zimId" + val term = "searchString" + val recentSearch: RecentSearch = mockk() + every { recentSearch.searchString } returns term + every { recentSearch.zimID } returns id + newRecentSearchDao.migrationInsert(mutableListOf(recentSearch)) + verify { box.put(listOf(recentSearchEntity(searchTerm = term, zimId = id))) } } }