Files
MagnumOpus/Packages/MagnumOpusCore/Tests/SyncEngineTests/MockIMAPClient.swift

59 lines
1.5 KiB
Swift

import IMAPClient
import Models
final class MockIMAPClient: IMAPClientProtocol, @unchecked Sendable {
var mailboxes: [IMAPMailboxInfo] = []
var mailboxStatuses: [String: IMAPMailboxStatus] = [:]
var envelopes: [FetchedEnvelope] = []
/// Per-mailbox envelopes takes precedence over flat `envelopes` when set
var mailboxEnvelopes: [String: [FetchedEnvelope]] = [:]
var flagUpdates: [UIDFlagsPair] = []
var bodies: [Int: (text: String?, html: String?)] = [:]
var connectCalled = false
var disconnectCalled = false
var selectedMailbox: String?
func connect() async throws {
connectCalled = true
}
func disconnect() async throws {
disconnectCalled = true
}
func listMailboxes() async throws -> [IMAPMailboxInfo] {
mailboxes
}
func selectMailbox(_ name: String) async throws -> IMAPMailboxStatus {
selectedMailbox = name
guard let status = mailboxStatuses[name] else {
throw MockIMAPError.mailboxNotFound(name)
}
return status
}
func fetchEnvelopes(uidsGreaterThan uid: Int) async throws -> [FetchedEnvelope] {
let source: [FetchedEnvelope]
if let mailbox = selectedMailbox, let perMailbox = mailboxEnvelopes[mailbox] {
source = perMailbox
} else {
source = envelopes
}
return source.filter { $0.uid > uid }
}
func fetchFlags(uids: ClosedRange<Int>) async throws -> [UIDFlagsPair] {
flagUpdates.filter { uids.contains($0.uid) }
}
func fetchBody(uid: Int) async throws -> (text: String?, html: String?) {
bodies[uid] ?? (nil, nil)
}
}
enum MockIMAPError: Error {
case mailboxNotFound(String)
}