MultipartFormDataParser/Tests/MultipartFormDataParserTests/TestFunctions/TestFunction_URLSession.swift

117 lines
4.5 KiB
Swift

import Foundation
import XCTest
extension XCTestCase {
func uploadURLSessionDataTask(
genbaNeko: Data,
denwaNeko: Data,
message: Data,
retryCount: UInt = 3,
file: StaticString = #file,
line: UInt = #line
) throws -> TestEntity? {
let exp = expectation(description: "response")
let request = createRequest(genbaNeko: genbaNeko, denwaNeko: denwaNeko, message: message)
var responseData: Data!
URLSession.shared.dataTask(with: request) { data, _, _ in
responseData = data
exp.fulfill()
}.resume()
waitForExpectations(timeout: timeoutInterval)
guard let data = responseData else {
return try uploadURLSessionDataTask(genbaNeko: genbaNeko,
denwaNeko: denwaNeko,
message: message,
retryCount: retryCount - 1,
file: file,
line: line)
}
return try JSONDecoder().decode(TestEntity.self, from: data)
}
func uploadURLSessionUploadTask(
genbaNeko: Data,
denwaNeko: Data,
message: Data,
retryCount: UInt = 3,
file: StaticString = #file,
line: UInt = #line
) throws -> TestEntity? {
let exp = expectation(description: "response")
let boundary = "YoWatanabe0417"
var request = URLRequest(url: URL(string: "https://localhost/upload")!)
request.httpMethod = "POST"
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
let requestBody = createBody(boundary: boundary,
genbaNeko: genbaNeko,
denwaNeko: denwaNeko,
message: message)
var responseData: Data!
URLSession.shared.uploadTask(with: request, from: requestBody) { data, _, _ in
responseData = data
exp.fulfill()
}.resume()
waitForExpectations(timeout: timeoutInterval)
guard let data = responseData else {
return try uploadURLSessionUploadTask(genbaNeko: genbaNeko,
denwaNeko: denwaNeko,
message: message,
retryCount: retryCount - 1,
file: file,
line: line)
}
return try JSONDecoder().decode(TestEntity.self, from: data)
}
}
extension XCTestCase {
func createRequest(
genbaNeko: Data,
denwaNeko: Data,
message: Data,
file: StaticString = #file,
line: UInt = #line
) -> URLRequest {
let boundary = "YoWatanabe0417"
var request = URLRequest(url: URL(string: "https://localhost/upload")!)
request.httpMethod = "POST"
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
request.httpBody = createBody(
boundary: boundary,
genbaNeko: genbaNeko,
denwaNeko: denwaNeko,
message: message
)
return request
}
}
private func createBody(boundary: String,
genbaNeko: Data,
denwaNeko: Data,
message: Data) -> Data {
var data = "--\(boundary)\r\n".data(using: .utf8)!
data += "Content-Disposition: form-data; name=\"genbaNeko\"; filename=\"genbaNeko\"\r\n".data(using: .utf8)!
data += "Content-Type: image/jpeg\r\n".data(using: .utf8)!
data += "\r\n".data(using: .utf8)!
data += genbaNeko
data += "\r\n".data(using: .utf8)!
data += "--\(boundary)\r\n".data(using: .utf8)!
data += "Content-Disposition: form-data; name=\"denwaNeko\"; filename=\"denwaNeko\"\r\n".data(using: .utf8)!
data += "Content-Type: image/jpeg\r\n".data(using: .utf8)!
data += "\r\n".data(using: .utf8)!
data += denwaNeko
data += "\r\n".data(using: .utf8)!
data += "--\(boundary)\r\n".data(using: .utf8)!
data += "Content-Disposition: form-data; name=\"message\"\r\n".data(using: .utf8)!
data += "\r\n".data(using: .utf8)!
data += message
data += "\r\n".data(using: .utf8)!
data += "--\(boundary)--\r\n".data(using: .utf8)!
return data
}