diff options
| author | test@dangofactory.cos <you@example.com> | 2026-08-20 16:57:18 +0000 |
|---|---|---|
| committer | test@dangofactory.cos <you@example.com> | 2026-08-20 16:57:18 +0000 |
| commit | 50ce5d5e6cd0d720ff437d35eace545816848428 (patch) | |
| tree | b59af206a36265cf081945e434900b32b0c43edd /app/k9mail/src/test/java | |
| download | monocles_mail-50ce5d5e6cd0d720ff437d35eace545816848428.tar.gz monocles_mail-50ce5d5e6cd0d720ff437d35eace545816848428.tar.bz2 monocles_mail-50ce5d5e6cd0d720ff437d35eace545816848428.zip | |
Inital
Diffstat (limited to 'app/k9mail/src/test/java')
3 files changed, 214 insertions, 0 deletions
diff --git a/app/k9mail/src/test/java/com/fsck/k9/AppRobolectricTest.kt b/app/k9mail/src/test/java/com/fsck/k9/AppRobolectricTest.kt new file mode 100644 index 0000000..1739d41 --- /dev/null +++ b/app/k9mail/src/test/java/com/fsck/k9/AppRobolectricTest.kt @@ -0,0 +1,14 @@ +package com.fsck.k9 + +import android.app.Application +import org.junit.runner.RunWith +import org.koin.test.AutoCloseKoinTest +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +/** + * A Robolectric test that creates an instance of our [Application] class [App]. + */ +@RunWith(RobolectricTestRunner::class) +@Config(application = App::class) +abstract class AppRobolectricTest : AutoCloseKoinTest() diff --git a/app/k9mail/src/test/java/com/fsck/k9/DependencyInjectionTest.kt b/app/k9mail/src/test/java/com/fsck/k9/DependencyInjectionTest.kt new file mode 100644 index 0000000..1c73b1d --- /dev/null +++ b/app/k9mail/src/test/java/com/fsck/k9/DependencyInjectionTest.kt @@ -0,0 +1,55 @@ +package com.fsck.k9 + +import android.view.ContextThemeWrapper +import androidx.lifecycle.LifecycleOwner +import androidx.work.WorkerParameters +import com.fsck.k9.job.MailSyncWorker +import com.fsck.k9.ui.R +import com.fsck.k9.ui.changelog.ChangeLogMode +import com.fsck.k9.ui.changelog.ChangelogViewModel +import com.fsck.k9.ui.endtoend.AutocryptKeyTransferActivity +import com.fsck.k9.ui.endtoend.AutocryptKeyTransferPresenter +import com.fsck.k9.ui.folders.FolderIconProvider +import com.fsck.k9.ui.folders.FolderNameFormatter +import com.fsck.k9.ui.helper.SizeFormatter +import org.junit.Test +import org.junit.runner.RunWith +import org.koin.core.annotation.KoinInternalApi +import org.koin.core.logger.PrintLogger +import org.koin.core.parameter.parametersOf +import org.koin.java.KoinJavaComponent +import org.koin.test.AutoCloseKoinTest +import org.koin.test.check.checkModules +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.openintents.openpgp.OpenPgpApiManager +import org.robolectric.RobolectricTestRunner +import org.robolectric.RuntimeEnvironment +import org.robolectric.annotation.Config + +@RunWith(RobolectricTestRunner::class) +@Config(application = App::class) +class DependencyInjectionTest : AutoCloseKoinTest() { + private val lifecycleOwner = mock<LifecycleOwner> { + on { lifecycle } doReturn mock() + } + private val autocryptTransferView = mock<AutocryptKeyTransferActivity>() + + @KoinInternalApi + @Test + fun testDependencyTree() { + KoinJavaComponent.getKoin().setupLogger(PrintLogger()) + + getKoin().checkModules { + withParameter<OpenPgpApiManager> { lifecycleOwner } + withParameters<AutocryptKeyTransferPresenter> { parametersOf(lifecycleOwner, autocryptTransferView) } + withParameter<FolderNameFormatter> { RuntimeEnvironment.getApplication() } + withParameter<SizeFormatter> { RuntimeEnvironment.getApplication() } + withParameter<ChangelogViewModel> { ChangeLogMode.CHANGE_LOG } + withParameter<MailSyncWorker> { mock<WorkerParameters>() } + withParameter<FolderIconProvider> { + ContextThemeWrapper(RuntimeEnvironment.getApplication(), R.style.Theme_K9_DayNight).theme + } + } + } +} diff --git a/app/k9mail/src/test/java/com/fsck/k9/widget/unread/UnreadWidgetDataProviderTest.kt b/app/k9mail/src/test/java/com/fsck/k9/widget/unread/UnreadWidgetDataProviderTest.kt new file mode 100644 index 0000000..8891af4 --- /dev/null +++ b/app/k9mail/src/test/java/com/fsck/k9/widget/unread/UnreadWidgetDataProviderTest.kt @@ -0,0 +1,145 @@ +package com.fsck.k9.widget.unread + +import android.content.Context +import assertk.assertThat +import assertk.assertions.isEqualTo +import assertk.assertions.isNull +import com.fsck.k9.Account +import com.fsck.k9.AppRobolectricTest +import com.fsck.k9.Preferences +import com.fsck.k9.controller.MessageCounts +import com.fsck.k9.controller.MessageCountsProvider +import com.fsck.k9.mailstore.Folder +import com.fsck.k9.mailstore.FolderRepository +import com.fsck.k9.mailstore.FolderType +import com.fsck.k9.search.SearchAccount +import com.fsck.k9.ui.folders.FolderNameFormatter +import com.fsck.k9.ui.messagelist.DefaultFolderProvider +import org.junit.Test +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.robolectric.RuntimeEnvironment + +class UnreadWidgetDataProviderTest : AppRobolectricTest() { + private val context: Context = RuntimeEnvironment.getApplication() + private val account = createAccount() + private val preferences = createPreferences() + private val messageCountsProvider = createMessageCountsProvider() + private val defaultFolderStrategy = createDefaultFolderStrategy() + private val folderRepository = createFolderRepository() + private val folderNameFormatter = createFolderNameFormatter() + private val provider = UnreadWidgetDataProvider( + context, + preferences, + messageCountsProvider, + defaultFolderStrategy, + folderRepository, + folderNameFormatter + ) + + @Test + fun unifiedInbox() { + val configuration = UnreadWidgetConfiguration( + appWidgetId = 1, + accountUuid = SearchAccount.UNIFIED_INBOX, + folderId = null + ) + + val widgetData = provider.loadUnreadWidgetData(configuration) + + with(widgetData!!) { + assertThat(title).isEqualTo("Unified Inbox") + assertThat(unreadCount).isEqualTo(SEARCH_ACCOUNT_UNREAD_COUNT) + } + } + + @Test + fun regularAccount() { + val configuration = UnreadWidgetConfiguration( + appWidgetId = 3, + accountUuid = ACCOUNT_UUID, + folderId = null + ) + + val widgetData = provider.loadUnreadWidgetData(configuration) + + with(widgetData!!) { + assertThat(title).isEqualTo(ACCOUNT_NAME) + assertThat(unreadCount).isEqualTo(ACCOUNT_UNREAD_COUNT) + } + } + + @Test + fun folder() { + val configuration = UnreadWidgetConfiguration(appWidgetId = 4, accountUuid = ACCOUNT_UUID, folderId = FOLDER_ID) + + val widgetData = provider.loadUnreadWidgetData(configuration) + + with(widgetData!!) { + assertThat(title).isEqualTo("$ACCOUNT_NAME - $LOCALIZED_FOLDER_NAME") + assertThat(unreadCount).isEqualTo(FOLDER_UNREAD_COUNT) + } + } + + @Test + fun nonExistentAccount_shouldReturnNull() { + val configuration = UnreadWidgetConfiguration(appWidgetId = 3, accountUuid = "invalid", folderId = null) + + val widgetData = provider.loadUnreadWidgetData(configuration) + + assertThat(widgetData).isNull() + } + + private fun createAccount(): Account = mock { + on { uuid } doReturn ACCOUNT_UUID + on { displayName } doReturn ACCOUNT_NAME + } + + private fun createPreferences(): Preferences = mock { + on { getAccount(ACCOUNT_UUID) } doReturn account + } + + private fun createMessageCountsProvider() = object : MessageCountsProvider { + override fun getMessageCounts(account: Account): MessageCounts { + return MessageCounts(unread = ACCOUNT_UNREAD_COUNT, starred = 0) + } + + override fun getMessageCounts(searchAccount: SearchAccount): MessageCounts { + return MessageCounts(unread = SEARCH_ACCOUNT_UNREAD_COUNT, starred = 0) + } + + override fun getUnreadMessageCount(account: Account, folderId: Long): Int { + return FOLDER_UNREAD_COUNT + } + } + + private fun createDefaultFolderStrategy(): DefaultFolderProvider = mock { + on { getDefaultFolder(account) } doReturn FOLDER_ID + } + + private fun createFolderRepository(): FolderRepository { + return mock { + on { getFolder(account, FOLDER_ID) } doReturn FOLDER + } + } + + private fun createFolderNameFormatter(): FolderNameFormatter = mock { + on { displayName(FOLDER) } doReturn LOCALIZED_FOLDER_NAME + } + + companion object { + const val ACCOUNT_UUID = "00000000-0000-0000-0000-000000000000" + const val ACCOUNT_NAME = "Test account" + const val FOLDER_ID = 23L + const val SEARCH_ACCOUNT_UNREAD_COUNT = 1 + const val ACCOUNT_UNREAD_COUNT = 2 + const val FOLDER_UNREAD_COUNT = 3 + const val LOCALIZED_FOLDER_NAME = "Posteingang" + val FOLDER = Folder( + id = FOLDER_ID, + name = "INBOX", + type = FolderType.INBOX, + isLocalOnly = false + ) + } +} |
