summaryrefslogtreecommitdiff
path: root/backend/testing/src/main/java/app
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 /backend/testing/src/main/java/app
downloadmonocles_mail-50ce5d5e6cd0d720ff437d35eace545816848428.tar.gz
monocles_mail-50ce5d5e6cd0d720ff437d35eace545816848428.tar.bz2
monocles_mail-50ce5d5e6cd0d720ff437d35eace545816848428.zip
Inital
Diffstat (limited to 'backend/testing/src/main/java/app')
-rw-r--r--backend/testing/src/main/java/app/k9mail/backend/testing/InMemoryBackendFolder.kt154
-rw-r--r--backend/testing/src/main/java/app/k9mail/backend/testing/InMemoryBackendStorage.kt62
2 files changed, 216 insertions, 0 deletions
diff --git a/backend/testing/src/main/java/app/k9mail/backend/testing/InMemoryBackendFolder.kt b/backend/testing/src/main/java/app/k9mail/backend/testing/InMemoryBackendFolder.kt
new file mode 100644
index 0000000..d1368d9
--- /dev/null
+++ b/backend/testing/src/main/java/app/k9mail/backend/testing/InMemoryBackendFolder.kt
@@ -0,0 +1,154 @@
+package app.k9mail.backend.testing
+
+import com.fsck.k9.backend.api.BackendFolder
+import com.fsck.k9.backend.api.BackendFolder.MoreMessages
+import com.fsck.k9.mail.Flag
+import com.fsck.k9.mail.FolderType
+import com.fsck.k9.mail.Message
+import com.fsck.k9.mail.MessageDownloadState
+import com.fsck.k9.mail.internet.MimeMessage
+import java.util.Date
+import okio.Buffer
+import okio.buffer
+import okio.source
+import org.junit.Assert.assertEquals
+
+class InMemoryBackendFolder(override var name: String, var type: FolderType) : BackendFolder {
+ val extraStrings: MutableMap<String, String> = mutableMapOf()
+ val extraNumbers: MutableMap<String, Long> = mutableMapOf()
+ private val messages = mutableMapOf<String, Message>()
+ private val messageFlags = mutableMapOf<String, MutableSet<Flag>>()
+ private var moreMessages: MoreMessages = MoreMessages.UNKNOWN
+ private var status: String? = null
+ private var lastChecked = 0L
+
+ override var visibleLimit: Int = 25
+
+ fun assertMessages(vararg messagePairs: Pair<String, String>) {
+ for ((messageServerId, resourceName) in messagePairs) {
+ assertMessageContents(messageServerId, resourceName)
+ }
+ val messageServerIds = messagePairs.map { it.first }.toSet()
+ assertEquals(messageServerIds, messages.keys)
+ }
+
+ private fun assertMessageContents(messageServerId: String, resourceName: String) {
+ val message = messages[messageServerId] ?: error("Message $messageServerId not found")
+ assertEquals(loadResource(resourceName), getMessageContents(message))
+ }
+
+ fun createMessages(vararg messagePairs: Pair<String, String>) {
+ for ((messageServerId, resourceName) in messagePairs) {
+ val inputStream = javaClass.getResourceAsStream(resourceName)
+ ?: error("Couldn't load resource: $resourceName")
+
+ val message = inputStream.use {
+ MimeMessage.parseMimeMessage(inputStream, false)
+ }
+
+ messages[messageServerId] = message
+ messageFlags[messageServerId] = mutableSetOf()
+ }
+ }
+
+ private fun getMessageContents(message: Message): String {
+ val buffer = Buffer()
+ buffer.outputStream().use {
+ message.writeTo(it)
+ }
+ return buffer.readUtf8()
+ }
+
+ override fun getMessageServerIds(): Set<String> {
+ return messages.keys.toSet()
+ }
+
+ override fun getAllMessagesAndEffectiveDates(): Map<String, Long?> {
+ return messages
+ .map { (serverId, message) ->
+ serverId to message.sentDate.time
+ }
+ .toMap()
+ }
+
+ override fun destroyMessages(messageServerIds: List<String>) {
+ for (messageServerId in messageServerIds) {
+ messages.remove(messageServerId)
+ messageFlags.remove(messageServerId)
+ }
+ }
+
+ override fun clearAllMessages() {
+ destroyMessages(messages.keys.toList())
+ }
+
+ override fun getMoreMessages(): MoreMessages = moreMessages
+
+ override fun setMoreMessages(moreMessages: MoreMessages) {
+ this.moreMessages = moreMessages
+ }
+
+ override fun setLastChecked(timestamp: Long) {
+ lastChecked = timestamp
+ }
+
+ override fun setStatus(status: String?) {
+ this.status = status
+ }
+
+ override fun isMessagePresent(messageServerId: String): Boolean {
+ return messages[messageServerId] != null
+ }
+
+ override fun getMessageFlags(messageServerId: String): Set<Flag> {
+ return messageFlags[messageServerId] ?: error("Message $messageServerId not found")
+ }
+
+ override fun setMessageFlag(messageServerId: String, flag: Flag, value: Boolean) {
+ val flags = messageFlags[messageServerId] ?: error("Message $messageServerId not found")
+ if (value) {
+ flags.add(flag)
+ } else {
+ flags.remove(flag)
+ }
+ }
+
+ override fun saveMessage(message: Message, downloadState: MessageDownloadState) {
+ val messageServerId = checkNotNull(message.uid)
+ messages[messageServerId] = message
+ val flags = message.flags.toMutableSet()
+
+ when (downloadState) {
+ MessageDownloadState.ENVELOPE -> Unit
+ MessageDownloadState.PARTIAL -> flags.add(Flag.X_DOWNLOADED_PARTIAL)
+ MessageDownloadState.FULL -> flags.add(Flag.X_DOWNLOADED_FULL)
+ }
+
+ messageFlags[messageServerId] = flags
+ }
+
+ override fun getOldestMessageDate(): Date? {
+ throw UnsupportedOperationException("not implemented")
+ }
+
+ override fun getFolderExtraString(name: String): String? = extraStrings[name]
+
+ override fun setFolderExtraString(name: String, value: String?) {
+ if (value != null) {
+ extraStrings[name] = value
+ } else {
+ extraStrings.remove(name)
+ }
+ }
+
+ override fun getFolderExtraNumber(name: String): Long? = extraNumbers[name]
+
+ override fun setFolderExtraNumber(name: String, value: Long) {
+ extraNumbers[name] = value
+ }
+
+ private fun loadResource(name: String): String {
+ val resourceAsStream = javaClass.getResourceAsStream(name) ?: error("Couldn't load resource: $name")
+ return resourceAsStream.use { it.source().buffer().readUtf8() }
+ }
+}
diff --git a/backend/testing/src/main/java/app/k9mail/backend/testing/InMemoryBackendStorage.kt b/backend/testing/src/main/java/app/k9mail/backend/testing/InMemoryBackendStorage.kt
new file mode 100644
index 0000000..909477c
--- /dev/null
+++ b/backend/testing/src/main/java/app/k9mail/backend/testing/InMemoryBackendStorage.kt
@@ -0,0 +1,62 @@
+package app.k9mail.backend.testing
+
+import com.fsck.k9.backend.api.BackendFolderUpdater
+import com.fsck.k9.backend.api.BackendStorage
+import com.fsck.k9.backend.api.FolderInfo
+import com.fsck.k9.mail.FolderType
+
+class InMemoryBackendStorage : BackendStorage {
+ val folders: MutableMap<String, InMemoryBackendFolder> = mutableMapOf()
+ val extraStrings: MutableMap<String, String> = mutableMapOf()
+ val extraNumbers: MutableMap<String, Long> = mutableMapOf()
+
+ override fun getFolder(folderServerId: String): InMemoryBackendFolder {
+ return folders[folderServerId] ?: error("Folder $folderServerId not found")
+ }
+
+ override fun getFolderServerIds(): List<String> {
+ return folders.keys.toList()
+ }
+
+ override fun createFolderUpdater(): BackendFolderUpdater {
+ return InMemoryBackendFolderUpdater()
+ }
+
+ override fun getExtraString(name: String): String? = extraStrings[name]
+
+ override fun setExtraString(name: String, value: String) {
+ extraStrings[name] = value
+ }
+
+ override fun getExtraNumber(name: String): Long? = extraNumbers[name]
+
+ override fun setExtraNumber(name: String, value: Long) {
+ extraNumbers[name] = value
+ }
+
+ private inner class InMemoryBackendFolderUpdater : BackendFolderUpdater {
+ override fun createFolders(folders: List<FolderInfo>) {
+ folders.forEach { folder ->
+ if (this@InMemoryBackendStorage.folders.containsKey(folder.serverId)) {
+ error("Folder ${folder.serverId} already present")
+ }
+
+ this@InMemoryBackendStorage.folders[folder.serverId] = InMemoryBackendFolder(folder.name, folder.type)
+ }
+ }
+
+ override fun deleteFolders(folderServerIds: List<String>) {
+ for (folderServerId in folderServerIds) {
+ folders.remove(folderServerId) ?: error("Folder $folderServerId not found")
+ }
+ }
+
+ override fun changeFolder(folderServerId: String, name: String, type: FolderType) {
+ val folder = folders[folderServerId] ?: error("Folder $folderServerId not found")
+ folder.name = name
+ folder.type = type
+ }
+
+ override fun close() = Unit
+ }
+}