-
Notifications
You must be signed in to change notification settings - Fork 205
/
Copy pathTestSessionAdapter.swift
62 lines (49 loc) · 1.6 KB
/
TestSessionAdapter.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import Foundation
import APIKit
class TestSessionAdapter: SessionAdapter {
enum Error: Swift.Error {
case cancelled
}
var data: Data?
var urlResponse: URLResponse?
var error: Error?
private class Runner {
weak var adapter: TestSessionAdapter?
@objc func run() {
adapter?.executeAllTasks()
}
}
private var tasks = [TestSessionTask]()
private let runner: Runner
private let timer: Timer
init(data: Data? = Data(), urlResponse: URLResponse? = HTTPURLResponse(url: NSURL(string: "")! as URL, statusCode: 200, httpVersion: nil, headerFields: nil), error: Error? = nil) {
self.data = data
self.urlResponse = urlResponse
self.error = error
self.runner = Runner()
self.timer = Timer.scheduledTimer(timeInterval: 0.001,
target: runner,
selector: #selector(Runner.run),
userInfo: nil,
repeats: true)
self.runner.adapter = self
}
func executeAllTasks() {
for task in tasks {
if task.cancelled {
task.handler(nil, nil, Error.cancelled)
} else {
task.handler(data, urlResponse, error)
}
}
tasks = []
}
func createTask(with URLRequest: URLRequest, handler: @escaping (Data?, URLResponse?, Swift.Error?) -> Void) -> SessionTask {
let task = TestSessionTask(handler: handler)
tasks.append(task)
return task
}
func getTasks(with handler: @escaping ([SessionTask]) -> Void) {
handler(tasks.map { $0 })
}
}