From 6f2f6b0cf5a91bd419c67e6ce901d5d67fa82271 Mon Sep 17 00:00:00 2001 From: Thore Goebel Date: Thu, 1 May 2025 10:34:27 +0200 Subject: [PATCH] Add testAddingMinRepoByUserMirror Also pull out mockNewRepoDbInsertion() to reduce complexity and allow future reuse. --- .../java/org/fdroid/repo/RepoAdderTest.kt | 66 +++++++++++++------ 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/libs/database/src/test/java/org/fdroid/repo/RepoAdderTest.kt b/libs/database/src/test/java/org/fdroid/repo/RepoAdderTest.kt index 50578c42d..2f479e470 100644 --- a/libs/database/src/test/java/org/fdroid/repo/RepoAdderTest.kt +++ b/libs/database/src/test/java/org/fdroid/repo/RepoAdderTest.kt @@ -45,6 +45,7 @@ import org.fdroid.repo.AddRepoError.ErrorType.INVALID_INDEX import org.fdroid.repo.AddRepoError.ErrorType.IO_ERROR import org.fdroid.repo.AddRepoError.ErrorType.UNKNOWN_SOURCES_DISALLOWED import org.fdroid.repo.FetchResult.IsNewMirror +import org.fdroid.repo.FetchResult.IsNewRepoAndNewMirror import org.fdroid.repo.FetchResult.IsNewRepository import org.fdroid.test.TestDataMinV2 import org.fdroid.test.TestUtils.decodeHex @@ -138,35 +139,34 @@ internal class RepoAdderTest { @Test fun testAddingMinRepo() = runTest { val url = TestDataMinV2.repo.address + testAddingMinRepoInt(url, IsNewRepository) + } + + @Test + fun testAddingMinRepoByUserMirror() = runTest { + val url = "https://user-mirror-of-min-v1.org/repo" + testAddingMinRepoInt(url, IsNewRepoAndNewMirror) + } + + private suspend fun testAddingMinRepoInt( + url: String, + expectedResult: FetchResult, + ) { val repoName = TestDataMinV2.repo.name.getBestLocale(localeList) - mockMinRepoDownload() + mockMinRepoDownload(url) // repo not in DB every { repoDao.getRepository(any()) } returns null - expectMinRepoPreview(repoName, url, IsNewRepository) + expectMinRepoPreview(repoName, url, expectedResult) val newRepo: Repository = mockk() - val txnSlot = slot>() - every { db.runInTransaction(capture(txnSlot)) } answers { - assertTrue(txnSlot.isCaptured) - txnSlot.captured.call() - } - every { - repoDao.insert(match { - // Note that we are not using the url the user used to add the repo, - // but what the repo tells us to use - it.address == TestDataMinV2.repo.address && - it.formatVersion == IndexFormatVersion.TWO && - it.name.getBestLocale(localeList) == repoName - }) - } returns 42L - every { repoDao.getRepository(42L) } returns newRepo + mockNewRepoDbInsertion(repoName, TestDataMinV2.repo.address, newRepo, url) repoAdder.addRepoState.test { val fetching: Fetching = awaitItem() as Fetching // still Fetching from last call - assertIs(fetching.fetchResult) + assertEquals(expectedResult, fetching.fetchResult) repoAdder.addFetchedRepository() @@ -179,7 +179,7 @@ internal class RepoAdderTest { } @Test - fun testAddingUserMirrorForMinRepo() = runTest { + fun testAddingUserMirrorForExistingMinRepo() = runTest { val url = "https://user-mirror-of-min-v1.org/repo" val repoName = TestDataMinV2.repo.name.getBestLocale(localeList) @@ -850,6 +850,34 @@ internal class RepoAdderTest { } returns digestHex.decodeHex() } + private fun mockNewRepoDbInsertion( + repoName: String?, + repoAddress: String, + newRepo: Repository, + userMirrorUrl: String? = null, + ) { + val txnSlot = slot>() + every { db.runInTransaction(capture(txnSlot)) } answers { + assertTrue(txnSlot.isCaptured) + txnSlot.captured.call() + } + + every { + repoDao.insert(match { + // Note that we are not using the url the user used to add the repo, + // but what the repo tells us to use + it.address == repoAddress && + it.formatVersion == IndexFormatVersion.TWO && + it.name.getBestLocale(localeList) == repoName + }) + } returns 42L + every { repoDao.getRepository(42L) } returns newRepo + + if (userMirrorUrl != null && userMirrorUrl != repoAddress) { + every { repoDao.updateUserMirrors(42L, listOf(userMirrorUrl)) } just Runs + } + } + private suspend fun expectMinRepoPreview( repoName: String?, url: String,