@@ -2,17 +2,14 @@ package net.thunderbird.feature.mail.message.list.internal.domain.usecase
22
33import app.cash.turbine.test
44import assertk.assertThat
5+ import assertk.assertions.containsExactly
56import assertk.assertions.hasMessage
7+ import assertk.assertions.isEmpty
68import assertk.assertions.isEqualTo
79import assertk.assertions.isInstanceOf
810import assertk.assertions.prop
911import com.fsck.k9.backend.api.FolderInfo
1012import com.fsck.k9.mail.folders.FolderServerId
11- import dev.mokkery.matcher.any
12- import dev.mokkery.spy
13- import dev.mokkery.verify
14- import dev.mokkery.verify.VerifyMode.Companion.exactly
15- import dev.mokkery.verifySuspend
1613import kotlin.test.Test
1714import kotlin.uuid.ExperimentalUuidApi
1815import kotlin.uuid.Uuid
@@ -44,7 +41,7 @@ class CreateArchiveFolderTest {
4441 // Arrange
4542 val accountUuid = Uuid .random().toHexString()
4643 val accounts = createAccountList(accountUuid = accountUuid)
47- val accountManager = spy( FakeLegacyAccountManager (accounts) )
44+ val accountManager = FakeLegacyAccountManager (accounts)
4845 val testSubject = createTestSubject(accountManager = accountManager)
4946 val folderName = " "
5047
@@ -59,7 +56,7 @@ class CreateArchiveFolderTest {
5956 .prop(" folderName" ) { it.folderName }
6057 .isEqualTo(folderName)
6158
62- verify(exactly( 0 )) { accountManager.getById(id = any()) }
59+ assertThat( accountManager.getByIdCalls).isEmpty()
6360
6461 awaitComplete()
6562 }
@@ -71,7 +68,7 @@ class CreateArchiveFolderTest {
7168 // Arrange
7269 val accountUuid = Uuid .random().toHexString()
7370 val accounts = createAccountList()
74- val accountManager = spy( FakeLegacyAccountManager (accounts) )
71+ val accountManager = FakeLegacyAccountManager (accounts)
7572 val testSubject = createTestSubject(accountManager = accountManager)
7673 val folderName = " TheFolder"
7774
@@ -84,7 +81,7 @@ class CreateArchiveFolderTest {
8481 .prop(" error" ) { it.error }
8582 .isEqualTo(CreateArchiveFolderOutcome .Error .AccountNotFound )
8683
87- verify(exactly( 1 )) { accountManager.getById (AccountIdFactory .of(accountUuid)) }
84+ assertThat( accountManager.getByIdCalls).containsExactly (AccountIdFactory .of(accountUuid))
8885 awaitComplete()
8986 }
9087 }
@@ -97,7 +94,7 @@ class CreateArchiveFolderTest {
9794 val accounts = createAccountList(accountUuid)
9895 val exception = MessagingException (" this is an error" )
9996 val backendFolderUpdater = FakeBackendFolderUpdater (exception)
100- val remoteFolderCreatorFactory = spy( FakeRemoteFolderCreatorFactory (outcome = null ) )
97+ val remoteFolderCreatorFactory = FakeRemoteFolderCreatorFactory (outcome = null )
10198 val testSubject = createTestSubject(
10299 accounts = accounts,
103100 backendStorageFactory = FakeBackendStorageFactory (backendFolderUpdater),
@@ -116,9 +113,7 @@ class CreateArchiveFolderTest {
116113 .prop(" throwable" ) { it.throwable }
117114 .hasMessage(exception.message)
118115
119- verifySuspend(exactly(0 )) {
120- remoteFolderCreatorFactory.create(accountId = any())
121- }
116+ assertThat(remoteFolderCreatorFactory.createCalls).isEmpty()
122117
123118 awaitComplete()
124119 }
@@ -135,7 +130,7 @@ class CreateArchiveFolderTest {
135130 returnEmptySetWhenCreatingFolders = true ,
136131 ),
137132 )
138- val remoteFolderCreatorFactory = spy( FakeRemoteFolderCreatorFactory (outcome = null ) )
133+ val remoteFolderCreatorFactory = FakeRemoteFolderCreatorFactory (outcome = null )
139134 val testSubject = createTestSubject(
140135 accounts = accounts,
141136 backendStorageFactory = backendStorageFactory,
@@ -153,22 +148,9 @@ class CreateArchiveFolderTest {
153148 .prop(" folderName" ) { it.folderName }
154149 .isEqualTo(folderName)
155150
156- verify(exactly(1 )) {
157- // verify doesn't support verifying the extension function `createFolder`,
158- // thus we verify the call of `createFolders(list)` instead.
159- backendStorageFactory.backendFolderUpdater.createFolders(
160- listOf (
161- FolderInfo (
162- serverId = folderName,
163- name = folderName,
164- type = LegacyFolderType .ARCHIVE ,
165- ),
166- ),
167- )
168- }
169- verifySuspend(exactly(0 )) {
170- remoteFolderCreatorFactory.create(accountId = any())
171- }
151+ assertThat(backendStorageFactory.backendFolderUpdater.createFoldersCalls)
152+ .containsExactly(createExpectedFolderInfo(folderName))
153+ assertThat(remoteFolderCreatorFactory.createCalls).isEmpty()
172154 awaitComplete()
173155 }
174156 }
@@ -197,19 +179,8 @@ class CreateArchiveFolderTest {
197179 .prop(" data" ) { it.data }
198180 .isEqualTo(CreateArchiveFolderOutcome .Success .LocalFolderCreated )
199181
200- verify(exactly(1 )) {
201- // verify doesn't support verifying the extension function `createFolder`,
202- // thus we verify the call of `createFolders(list)` instead.
203- backendStorageFactory.backendFolderUpdater.createFolders(
204- listOf (
205- FolderInfo (
206- serverId = folderName,
207- name = folderName,
208- type = LegacyFolderType .ARCHIVE ,
209- ),
210- ),
211- )
212- }
182+ assertThat(backendStorageFactory.backendFolderUpdater.createFoldersCalls)
183+ .containsExactly(createExpectedFolderInfo(folderName))
213184
214185 cancelAndIgnoreRemainingEvents()
215186 }
@@ -242,19 +213,8 @@ class CreateArchiveFolderTest {
242213 .prop(" serverId" ) { it.serverId }
243214 .isEqualTo(FolderServerId (folderName))
244215
245- verify(exactly(1 )) {
246- // verify doesn't support verifying the extension function `createFolder`,
247- // thus we verify the call of `createFolders(list)` instead.
248- backendStorageFactory.backendFolderUpdater.createFolders(
249- listOf (
250- FolderInfo (
251- serverId = folderName,
252- name = folderName,
253- type = LegacyFolderType .ARCHIVE ,
254- ),
255- ),
256- )
257- }
216+ assertThat(backendStorageFactory.backendFolderUpdater.createFoldersCalls)
217+ .containsExactly(createExpectedFolderInfo(folderName))
258218
259219 cancelAndIgnoreRemainingEvents()
260220 }
@@ -293,19 +253,8 @@ class CreateArchiveFolderTest {
293253 ),
294254 )
295255
296- verify(exactly(1 )) {
297- // verify doesn't support verifying the extension function `createFolder`,
298- // thus we verify the call of `createFolders(list)` instead.
299- backendStorageFactory.backendFolderUpdater.createFolders(
300- listOf (
301- FolderInfo (
302- serverId = folderName,
303- name = folderName,
304- type = LegacyFolderType .ARCHIVE ,
305- ),
306- ),
307- )
308- }
256+ assertThat(backendStorageFactory.backendFolderUpdater.createFoldersCalls)
257+ .containsExactly(createExpectedFolderInfo(folderName))
309258
310259 cancelAndIgnoreRemainingEvents()
311260 }
@@ -317,7 +266,7 @@ class CreateArchiveFolderTest {
317266 // Arrange
318267 val accountUuid = Uuid .random().toHexString()
319268 val accounts = createAccountList(accountUuid)
320- val accountManager = spy( FakeLegacyAccountManager (accounts) )
269+ val accountManager = FakeLegacyAccountManager (accounts)
321270 val backendStorageFactory = FakeBackendStorageFactory (
322271 FakeBackendFolderUpdater (),
323272 )
@@ -349,44 +298,26 @@ class CreateArchiveFolderTest {
349298 .prop(" data" ) { it.data }
350299 .isEqualTo(CreateArchiveFolderOutcome .Success .Created )
351300
352- verify(exactly(1 )) { accountManager.getById(AccountIdFactory .of(accountUuid)) }
353- verify(exactly(1 )) {
354- // verify doesn't support verifying the extension function `createFolder`,
355- // thus we verify the call of `createFolders(list)` instead.
356- backendStorageFactory.backendFolderUpdater.createFolders(
357- listOf (
358- FolderInfo (
359- serverId = folderName,
360- name = folderName,
361- type = LegacyFolderType .ARCHIVE ,
362- ),
301+ assertThat(accountManager.getByIdCalls).containsExactly(AccountIdFactory .of(accountUuid))
302+ assertThat(backendStorageFactory.backendFolderUpdater.createFoldersCalls)
303+ .containsExactly(createExpectedFolderInfo(folderName))
304+
305+ assertThat(remoteFolderCreatorFactory.instance.createCalls)
306+ .containsExactly(
307+ FakeRemoteFolderCreatorFactory .CreateCall (
308+ folderServerId = FolderServerId (folderName),
309+ mustCreate = false ,
310+ folderType = LegacyFolderType .ARCHIVE ,
363311 ),
364312 )
365- }
366313
367- verifySuspend(exactly(1 )) {
368- remoteFolderCreatorFactory.instance.create(
369- folderServerId = FolderServerId (folderName),
370- mustCreate = false ,
371- folderType = LegacyFolderType .ARCHIVE ,
372- )
373- }
314+ assertThat(specialFolderUpdaterFactory.specialFolderUpdater.setSpecialFolderCalls)
315+ .transform { calls -> calls.map { it.type to it.selection } }
316+ .containsExactly(FolderType .ARCHIVE to SpecialFolderSelection .MANUAL )
374317
375- verify(exactly(1 )) {
376- specialFolderUpdaterFactory.specialFolderUpdater.setSpecialFolder(
377- type = FolderType .ARCHIVE ,
378- folderId = any(),
379- selection = SpecialFolderSelection .MANUAL ,
380- )
381- }
382-
383- verify(exactly(1 )) {
384- specialFolderUpdaterFactory.specialFolderUpdater.updateSpecialFolders()
385- }
318+ assertThat(specialFolderUpdaterFactory.specialFolderUpdater.updateSpecialFoldersCalls).isEqualTo(1 )
386319
387- verify(exactly(1 )) {
388- accountManager.saveAccount(account = any())
389- }
320+ assertThat(accountManager.savedAccounts.map { it.id }).containsExactly(AccountIdFactory .of(accountUuid))
390321
391322 awaitComplete()
392323 }
@@ -421,22 +352,47 @@ class CreateArchiveFolderTest {
421352 val id = if (it == 0 ) AccountIdFactory .of(accountUuid) else AccountIdFactory .create()
422353 FakeLegacyAccount (id = id)
423354 }
355+
356+ private fun createExpectedFolderInfo (folderName : String ) = listOf (
357+ FolderInfo (
358+ serverId = folderName,
359+ name = folderName,
360+ type = LegacyFolderType .ARCHIVE ,
361+ ),
362+ )
424363}
425364
426- private open class FakeRemoteFolderCreatorFactory (
427- protected open val outcome : Outcome <RemoteFolderCreationOutcome .Success , RemoteFolderCreationOutcome .Error >? ,
365+ private class FakeRemoteFolderCreatorFactory (
366+ private val outcome : Outcome <RemoteFolderCreationOutcome .Success , RemoteFolderCreationOutcome .Error >? ,
428367) : RemoteFolderCreator.Factory {
429- open var instance: RemoteFolderCreator = spy<RemoteFolderCreator >(FakeRemoteFolderCreator ())
430- protected set
368+ val createCalls = mutableListOf<AccountId >()
369+ val instance = FakeRemoteFolderCreator ()
370+
371+ override suspend fun create (accountId : AccountId ): RemoteFolderCreator {
372+ createCalls + = accountId
373+ return instance
374+ }
431375
432- override suspend fun create (accountId : AccountId ): RemoteFolderCreator = instance
376+ data class CreateCall (
377+ val folderServerId : FolderServerId ,
378+ val mustCreate : Boolean ,
379+ val folderType : LegacyFolderType ,
380+ )
381+
382+ inner class FakeRemoteFolderCreator : RemoteFolderCreator {
383+ val createCalls = mutableListOf<CreateCall >()
433384
434- private open inner class FakeRemoteFolderCreator : RemoteFolderCreator {
435385 override suspend fun create (
436386 folderServerId : FolderServerId ,
437387 mustCreate : Boolean ,
438388 folderType : LegacyFolderType ,
439- ): Outcome <RemoteFolderCreationOutcome .Success , RemoteFolderCreationOutcome .Error > =
440- outcome ? : error(" Not expected to be called in this context." )
389+ ): Outcome <RemoteFolderCreationOutcome .Success , RemoteFolderCreationOutcome .Error > {
390+ createCalls + = CreateCall (
391+ folderServerId = folderServerId,
392+ mustCreate = mustCreate,
393+ folderType = folderType,
394+ )
395+ return outcome ? : error(" Not expected to be called in this context." )
396+ }
441397 }
442398}
0 commit comments