summaryrefslogtreecommitdiff
path: root/app/k9mail/src/test/java
diff options
context:
space:
mode:
authortest@dangofactory.cos <you@example.com>2026-08-20 16:57:18 +0000
committertest@dangofactory.cos <you@example.com>2026-08-20 16:57:18 +0000
commit50ce5d5e6cd0d720ff437d35eace545816848428 (patch)
treeb59af206a36265cf081945e434900b32b0c43edd /app/k9mail/src/test/java
downloadmonocles_mail-50ce5d5e6cd0d720ff437d35eace545816848428.tar.gz
monocles_mail-50ce5d5e6cd0d720ff437d35eace545816848428.tar.bz2
monocles_mail-50ce5d5e6cd0d720ff437d35eace545816848428.zip
Inital
Diffstat (limited to 'app/k9mail/src/test/java')
-rw-r--r--app/k9mail/src/test/java/com/fsck/k9/AppRobolectricTest.kt14
-rw-r--r--app/k9mail/src/test/java/com/fsck/k9/DependencyInjectionTest.kt55
-rw-r--r--app/k9mail/src/test/java/com/fsck/k9/widget/unread/UnreadWidgetDataProviderTest.kt145
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
+ )
+ }
+}