MultipartFormDataParser/Tests/MultipartFormDataParserTests/TestFunctions/TestFunction_Alamofire.swift

116 lines
3.6 KiB
Swift

import Foundation
import XCTest
#if canImport(Alamofire)
import Alamofire
private let session: Session = {
#if canImport(OHHTTPStubs)
return AF
#else
let configuration = URLSessionConfiguration.ephemeral
configuration.protocolClasses = [StubURLProtocol.self]
return Session(configuration: configuration)
#endif
}()
extension XCTestCase {
func uploadWithAlamoFire(
genbaNeko: Data,
denwaNeko: Data,
message: Data,
retryCount: UInt = 3,
file: StaticString = #file,
line: UInt = #line
) throws -> TestEntity? {
let exp = expectation(description: "response")
let task = session.upload(
multipartFormData: { formData in
formData.append(
genbaNeko,
withName: "genbaNeko",
fileName: "genbaNeko.jpeg",
mimeType: "image/jpeg"
)
formData.append(
denwaNeko,
withName: "denwaNeko",
fileName: "denwaNeko.jpeg",
mimeType: "image/jpeg"
)
formData.append(message, withName: "message")
},
to: "https://localhost/upload",
interceptor: Interceptor()
)
var response: AFDataResponse<TestEntity>!
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
task.responseDecodable(of: TestEntity.self,
decoder: decoder) {
response = $0
exp.fulfill()
}
waitForExpectations(timeout: timeoutInterval)
XCTAssertNotNil(response, file: file, line: line)
XCTAssertEqual(response?.response?.statusCode, 200, file: file, line: line)
switch response.result {
case let .success(entity): return entity
case let .failure(error): throw error
}
}
#if compiler(>=5.6) && canImport(_Concurrency)
@available(macOS 10.15, macCatalyst 13, iOS 13, tvOS 13, *)
func uploadWithAlamoFireConcurrency(
genbaNeko: Data,
denwaNeko: Data,
message: Data,
retryCount: UInt = 3,
file: StaticString = #file,
line: UInt = #line
) async throws -> TestEntity {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
return try await session.upload(
multipartFormData: { formData in
formData.append(
genbaNeko,
withName: "genbaNeko",
fileName: "genbaNeko.jpeg",
mimeType: "image/jpeg"
)
formData.append(
denwaNeko,
withName: "denwaNeko",
fileName: "denwaNeko.jpeg",
mimeType: "image/jpeg"
)
formData.append(message, withName: "message")
},
to: "https://localhost/upload",
interceptor: Interceptor()
)
.serializingDecodable(TestEntity.self, decoder: decoder)
.value
}
#endif
}
private class Interceptor: RequestInterceptor {
private let lock = NSLock()
func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) {
lock.lock(); defer { lock.unlock() }
if request.retryCount < 3 {
print("retry: \(request.retryCount)")
completion(.retry)
} else {
completion(.doNotRetry)
}
}
}
#endif