Newer
Older
import CustomDump
import XCTest
import XXClient
@testable import XXMessengerClient
final class MessengerSendFileTests: XCTestCase {
func testSendFile() throws {
let newTransferId = "transferId".data(using: .utf8)!
var didSendFile: [FileTransferSend.Params] = []
var didCloseSend: [Data] = []
var didReceiveCallback: [MessengerSendFile.CallbackInfo] = []
var fileTransferProgressCallback: FileTransferProgressCallback!
var env: MessengerEnvironment = .unimplemented
var fileTransfer: FileTransfer = .unimplemented
fileTransfer.send.run = { params, callback in
didSendFile.append(params)
fileTransferProgressCallback = callback
return newTransferId
}
fileTransfer.closeSend.run = { id in
didCloseSend.append(id)
}
return fileTransfer
}
let sendFile: MessengerSendFile = .live(env)
let params = MessengerSendFile.Params.stub
let transferId = try sendFile(params) { info in
didReceiveCallback.append(info)
}
XCTAssertNoDifference(transferId, newTransferId)
XCTAssertNoDifference(didSendFile, [
.init(
payload: params.file,
recipientId: params.recipientId,
retry: Float(params.retry),
period: params.callbackIntervalMS
)
])
fileTransferProgressCallback.handle(.init(
transferId: newTransferId,
completed: false,
transmitted: 1,
partTracker: .unimplemented,
error: nil
))
fileTransferProgressCallback.handle(.init(
transferId: newTransferId,
completed: false,
transmitted: 6,
partTracker: .unimplemented,
error: nil
))
fileTransferProgressCallback.handle(.init(
transferId: newTransferId,
completed: true,
transmitted: 10,
partTracker: .unimplemented,
error: nil
))
XCTAssertNoDifference(didReceiveCallback, [
.progress(id: transferId, transmitted: 1, total: 10),
.progress(id: transferId, transmitted: 6, total: 10),
.finished(id: transferId),
])
XCTAssertNoDifference(didCloseSend, [transferId])
}
var env: MessengerEnvironment = .unimplemented
let sendFile: MessengerSendFile = .live(env)
XCTAssertThrowsError(try sendFile(.stub) { _ in }) { error in
XCTAssertNoDifference(
error as? MessengerSendFile.Error,
MessengerSendFile.Error.fileTransferNotStarted
)
}
}
func testSendFileCallbackFailure() throws {
let newTransferId = "transferId".data(using: .utf8)!
let error = NSError(domain: "test", code: 1234)
var didCloseSend: [Data] = []
var didReceiveCallback: [MessengerSendFile.CallbackInfo] = []
var fileTransferProgressCallback: FileTransferProgressCallback!
var env: MessengerEnvironment = .unimplemented
var fileTransfer: FileTransfer = .unimplemented
fileTransfer.send.run = { _, callback in
fileTransferProgressCallback = callback
return newTransferId
}
fileTransfer.closeSend.run = { id in
didCloseSend.append(id)
}
return fileTransfer
}
let sendFile: MessengerSendFile = .live(env)
didReceiveCallback.append(info)
}
fileTransferProgressCallback.handle(.init(
progress: .init(
transferId: newTransferId,
completed: false,
transmitted: 0,
total: 0
),
partTracker: .unimplemented,
error: error
))
XCTAssertNoDifference(didReceiveCallback, [
.failed(id: newTransferId, .callback(error)),
XCTAssertNoDifference(didCloseSend, [newTransferId])
}
func testSendFileCloseError() throws {
let closeError = NSError(domain: "test", code: 1234)
let newTransferId = "transferId".data(using: .utf8)!
var didReceiveCallback: [MessengerSendFile.CallbackInfo] = []
var fileTransferProgressCallback: FileTransferProgressCallback!
var env: MessengerEnvironment = .unimplemented
var fileTransfer: FileTransfer = .unimplemented
fileTransfer.send.run = { _, callback in
fileTransferProgressCallback = callback
return newTransferId
}
fileTransfer.closeSend.run = { id in
throw closeError
}
return fileTransfer
}
let sendFile: MessengerSendFile = .live(env)
didReceiveCallback.append(info)
}
fileTransferProgressCallback.handle(.init(
transferId: newTransferId,
completed: true,
transmitted: 1,
partTracker: .unimplemented,
error: nil
))
XCTAssertNoDifference(didReceiveCallback, [
.finished(id: newTransferId),
.failed(id: newTransferId, .close(closeError)),
])
}
}
private extension MessengerSendFile.Params {
static let stub = MessengerSendFile.Params(
file: FileSend(
name: "file-name",
type: "file-type",
preview: "file-preview".data(using: .utf8)!,
contents: "file-contents".data(using: .utf8)!
),
recipientId: "recipient-id".data(using: .utf8)!,
retry: 123,
callbackIntervalMS: 321
)
}