mirror of
https://github.com/f-droid/fdroidclient.git
synced 2026-05-06 22:53:01 -04:00
Fix and add tests for hasAuthorMoreThanOneApp(), getAppListItemsForAuthor()
This commit is contained in:
@@ -11,11 +11,13 @@ import org.fdroid.database.AppListSortOrder.LAST_UPDATED
|
||||
import org.fdroid.database.AppListSortOrder.NAME
|
||||
import org.fdroid.database.TestUtils.getOrFail
|
||||
import org.fdroid.index.v2.MetadataV2
|
||||
import org.fdroid.test.TestAppUtils.getRandomMetadataV2
|
||||
import org.fdroid.test.TestRepoUtils.getRandomRepo
|
||||
import org.fdroid.test.TestUtils.getRandomString
|
||||
import org.fdroid.test.TestVersionUtils.getRandomPackageVersionV2
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import kotlin.collections.map
|
||||
import kotlin.random.Random
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.assertFalse
|
||||
@@ -614,6 +616,106 @@ internal class AppListItemsTest : AppTest() {
|
||||
assertNotNull(appDao.getInstalledAppListItems(pm).getOrFail()[0].installedVersionName)
|
||||
}
|
||||
|
||||
// region author tests
|
||||
@Test
|
||||
fun testAuthor_NoApp() {
|
||||
// should never happen, but test this just in case
|
||||
every { pm.getInstalledPackages(0) } returns emptyList()
|
||||
val author = getRandomString()
|
||||
|
||||
assertFalse(appDao.hasAuthorMoreThanOneApp(author).getOrFail())
|
||||
assertTrue(appDao.getAppListItemsForAuthor(pm, author, null, NAME).getOrFail().isEmpty())
|
||||
assertTrue(appDao.getAppListItemsForAuthor(pm, author, null, LAST_UPDATED)
|
||||
.getOrFail().isEmpty())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testAuthor_OneApp() {
|
||||
every { pm.getInstalledPackages(0) } returns emptyList()
|
||||
val author = getRandomString()
|
||||
val packageName = getRandomString()
|
||||
val repoId = repoDao.insertOrReplace(getRandomRepo())
|
||||
appDao.insert(repoId, packageName, getRandomMetadataV2(author), locales)
|
||||
|
||||
assertFalse(appDao.hasAuthorMoreThanOneApp(author).getOrFail())
|
||||
val appsForAuthor = appDao.getAppListItemsForAuthor(pm, author, null, NAME).getOrFail()
|
||||
assertEquals(1, appsForAuthor.size)
|
||||
assertEquals(1, appDao.getAppListItemsForAuthor(pm, author, null, LAST_UPDATED)
|
||||
.getOrFail().size)
|
||||
assertEquals(packageName, appsForAuthor[0].packageName)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testAuthor_TwoApps() {
|
||||
every { pm.getInstalledPackages(0) } returns emptyList()
|
||||
val author = getRandomString()
|
||||
val repoId = repoDao.insertOrReplace(getRandomRepo())
|
||||
val packageName1 = getRandomString()
|
||||
val packageName2 = getRandomString()
|
||||
val metadata2 = getRandomMetadataV2(author)
|
||||
val metadata1 = getRandomMetadataV2(author, metadata2.lastUpdated + 1)
|
||||
appDao.insert(repoId, packageName1, metadata1, locales)
|
||||
appDao.insert(repoId, packageName2, metadata2, locales)
|
||||
|
||||
assertTrue(appDao.hasAuthorMoreThanOneApp(author).getOrFail())
|
||||
val appsForAuthor = appDao.getAppListItemsForAuthor(pm, author, null, LAST_UPDATED)
|
||||
.getOrFail()
|
||||
assertEquals(2, appsForAuthor.size)
|
||||
assertEquals(packageName1, appsForAuthor[0].packageName)
|
||||
assertEquals(packageName2, appsForAuthor[1].packageName)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testAuthor_MultipleApps() {
|
||||
every { pm.getInstalledPackages(0) } returns emptyList()
|
||||
val author = getRandomString()
|
||||
val repoId = repoDao.insertOrReplace(getRandomRepo())
|
||||
for (i in 1..50) {
|
||||
appDao.insert(repoId, getRandomString(), getRandomMetadataV2(author), locales)
|
||||
}
|
||||
|
||||
assertTrue(appDao.hasAuthorMoreThanOneApp(author).getOrFail())
|
||||
assertEquals(50, appDao.getAppListItemsForAuthor(pm, author, null, NAME).getOrFail().size)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testHasAuthorMoreThanOneApp_OneAppDifferentRepos() {
|
||||
every { pm.getInstalledPackages(0) } returns emptyList()
|
||||
val author = getRandomString()
|
||||
val repoId1 = repoDao.insertOrReplace(getRandomRepo())
|
||||
val repoId2 = repoDao.insertOrReplace(getRandomRepo())
|
||||
val packageName = getRandomString()
|
||||
appDao.insert(repoId1, packageName, getRandomMetadataV2(author), locales)
|
||||
val app4 = getRandomMetadataV2(author)
|
||||
appDao.insert(repoId2, packageName, app4, locales)
|
||||
appPrefsDao.update(
|
||||
AppPrefs(
|
||||
packageName = packageName,
|
||||
preferredRepoId = repoId2,
|
||||
)
|
||||
)
|
||||
assertFalse(appDao.hasAuthorMoreThanOneApp(author).getOrFail())
|
||||
val appsForAuthor = appDao.getAppListItemsForAuthor(pm, author, null, NAME).getOrFail()
|
||||
assertEquals(1, appsForAuthor.size)
|
||||
assertEquals(packageName, appsForAuthor[0].packageName)
|
||||
assertEquals(repoId2, appsForAuthor[0].repoId)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testHasAuthorMoreThanOneApp_TwoAppsDifferentRepos() {
|
||||
every { pm.getInstalledPackages(0) } returns emptyList()
|
||||
val author = getRandomString()
|
||||
val repoId1 = repoDao.insertOrReplace(getRandomRepo())
|
||||
val repoId2 = repoDao.insertOrReplace(getRandomRepo())
|
||||
appDao.insert(repoId1, getRandomString(), getRandomMetadataV2(author), locales)
|
||||
appDao.insert(repoId2, getRandomString(), getRandomMetadataV2(author), locales)
|
||||
|
||||
assertTrue(appDao.hasAuthorMoreThanOneApp(author).getOrFail())
|
||||
val appsForAuthor = appDao.getAppListItemsForAuthor(pm, author, null, NAME).getOrFail()
|
||||
assertEquals(2, appsForAuthor.size)
|
||||
}
|
||||
// endregion
|
||||
|
||||
/**
|
||||
* Runs the given block on all getAppListItems* methods.
|
||||
* Uses category "A" as all apps should be in that.
|
||||
|
||||
@@ -647,7 +647,10 @@ internal interface AppDaoInt : AppDao {
|
||||
FROM (
|
||||
SELECT 1
|
||||
FROM AppMetadata
|
||||
WHERE authorName = :author
|
||||
JOIN ${RepositoryPreferences.TABLE} AS pref USING (repoId)
|
||||
JOIN PreferredRepo USING (packageName)
|
||||
WHERE authorName = :author AND repoId = preferredRepoId
|
||||
GROUP BY packageName
|
||||
LIMIT 2)""")
|
||||
override fun hasAuthorMoreThanOneApp(author: String): LiveData<Boolean>
|
||||
|
||||
|
||||
@@ -15,9 +15,12 @@ import kotlin.test.assertEquals
|
||||
|
||||
object TestAppUtils {
|
||||
|
||||
fun getRandomMetadataV2(): MetadataV2 = MetadataV2(
|
||||
fun getRandomMetadataV2(
|
||||
authorName: String? = null,
|
||||
lastUpdated: Long? = null
|
||||
): MetadataV2 = MetadataV2(
|
||||
added = Random.nextLong(),
|
||||
lastUpdated = Random.nextLong(),
|
||||
lastUpdated = lastUpdated ?: Random.nextLong(),
|
||||
name = getRandomLocalizedTextV2().orNull(),
|
||||
summary = getRandomLocalizedTextV2().orNull(),
|
||||
description = getRandomLocalizedTextV2().orNull(),
|
||||
@@ -29,7 +32,7 @@ object TestAppUtils {
|
||||
translation = getRandomString().orNull(),
|
||||
preferredSigner = getRandomString().orNull(),
|
||||
video = getRandomLocalizedTextV2().orNull(),
|
||||
authorName = getRandomString().orNull(),
|
||||
authorName = authorName ?: getRandomString().orNull(),
|
||||
authorEmail = getRandomString().orNull(),
|
||||
authorWebSite = getRandomString().orNull(),
|
||||
authorPhone = getRandomString().orNull(),
|
||||
|
||||
Reference in New Issue
Block a user