Skip to content

Commit 801a125

Browse files
committed
Adds dynamic mapping to Mock
1 parent 485dafc commit 801a125

File tree

1 file changed

+56
-17
lines changed

1 file changed

+56
-17
lines changed

Source/NetworkServices/NetworkServiceMock.swift

Lines changed: 56 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public final class NetworkServiceMock: NetworkService, @unchecked Sendable {
7575
/// All executed requests.
7676
public private(set) var lastRequests: [URLRequest] = []
7777

78-
private var responses: [Result<(Data, HTTPURLResponse), NetworkError>]
78+
private var responses: [(String, Result<(Data, HTTPURLResponse), NetworkError>)]
7979
private let encoder: JSONEncoder
8080

8181
/// Creates an instace of `NetworkServiceMock`
@@ -84,7 +84,7 @@ public final class NetworkServiceMock: NetworkService, @unchecked Sendable {
8484
encoder: JSONEncoder = JSONEncoder()
8585
) {
8686
self.encoder = encoder
87-
self.responses = responses
87+
self.responses = responses.map({ ("*", $0) })
8888
}
8989

9090
/// Creates an instace of `NetworkServiceMock`
@@ -94,8 +94,8 @@ public final class NetworkServiceMock: NetworkService, @unchecked Sendable {
9494
) {
9595
self.encoder = encoder
9696
var encodedResponses: [Result<(Data, HTTPURLResponse), NetworkError>] = []
97-
repeat (each responses).decode(&encodedResponses, encoder: encoder)
98-
self.responses = encodedResponses
97+
repeat encodedResponses.append((each responses).encode(encoder: encoder))
98+
self.responses = encodedResponses.map({ ("*", $0) })
9999
}
100100

101101
/// Creates an instace of `NetworkServiceMock`
@@ -105,8 +105,43 @@ public final class NetworkServiceMock: NetworkService, @unchecked Sendable {
105105
) {
106106
self.encoder = encoder
107107
var encodedResponses: [Result<(Data, HTTPURLResponse), NetworkError>] = []
108-
repeat (each responses).decode(&encodedResponses, encoder: encoder)
109-
self.responses = encodedResponses
108+
repeat encodedResponses.append((each responses).encode(encoder: encoder))
109+
self.responses = encodedResponses.map({ ("*", $0) })
110+
}
111+
112+
/// Creates an instace of `NetworkServiceMock`
113+
public init(
114+
mappings responses: [(String, Result<(Data, HTTPURLResponse), NetworkError>)],
115+
encoder: JSONEncoder = JSONEncoder()
116+
) {
117+
self.encoder = encoder
118+
self.responses = responses
119+
}
120+
121+
/// Creates an instace of `NetworkServiceMock`
122+
public init<each T: Encodable>(
123+
mappings responses: repeat (String, Result<(each T, HTTPURLResponse), NetworkError>),
124+
encoder: JSONEncoder = JSONEncoder()
125+
) {
126+
self.encoder = encoder
127+
var encodedResponses: [Result<(Data, HTTPURLResponse), NetworkError>] = []
128+
var paths: [String] = []
129+
repeat encodedResponses.append((each responses).1.encode(encoder: encoder))
130+
repeat paths.append((each responses).0)
131+
self.responses = encodedResponses.enumerated().map({ (paths[$0.offset], $0.element) })
132+
}
133+
134+
/// Creates an instace of `NetworkServiceMock`
135+
public init<each T: Encodable>(
136+
mappings responses: repeat (String, Result<each T, NetworkError>),
137+
encoder: JSONEncoder = JSONEncoder()
138+
) {
139+
self.encoder = encoder
140+
var encodedResponses: [Result<(Data, HTTPURLResponse), NetworkError>] = []
141+
var paths: [String] = []
142+
repeat encodedResponses.append((each responses).1.encode(encoder: encoder))
143+
repeat paths.append((each responses).0)
144+
self.responses = encodedResponses.enumerated().map({ (paths[$0.offset], $0.element) })
110145
}
111146

112147
/**
@@ -137,7 +172,13 @@ public final class NetworkServiceMock: NetworkService, @unchecked Sendable {
137172
public func requestResultWithResponse<Success>(for resource: Resource<Success, NetworkError>) async -> Result<(Success, HTTPURLResponse), NetworkError> {
138173
lastRequests.append(resource.request)
139174
if !responses.isEmpty {
140-
let scheduled = responses.removeFirst()
175+
let index = responses.firstIndex(where: {
176+
return $0.0 == "*" || $0.0 == resource.request.url?.path
177+
})
178+
guard let index else {
179+
return .failure(.serverError(response: nil, data: nil))
180+
}
181+
let scheduled = responses.remove(at: index).1
141182
switch scheduled {
142183
case .success((let data, let httpURLResponse)):
143184
do {
@@ -165,7 +206,7 @@ public final class NetworkServiceMock: NetworkService, @unchecked Sendable {
165206
}
166207
scheduled = .success((data, httpUrlResponse))
167208
}
168-
responses.append(scheduled)
209+
responses.append(("*", scheduled))
169210
}
170211

171212
public func schedule(success: Void) {
@@ -185,34 +226,32 @@ public final class NetworkServiceMock: NetworkService, @unchecked Sendable {
185226
}
186227

187228
public func schedule(failure: NetworkError) {
188-
responses.append(.failure(failure))
229+
responses.append(("*", .failure(failure)))
189230
}
190231
}
191232

192233
fileprivate extension Result {
193234

194-
func decode<T: Encodable>(
195-
_ array: inout [Result<(Data, HTTPURLResponse), NetworkError>],
235+
func encode<T: Encodable>(
196236
encoder: JSONEncoder
197-
) where Success == (T, HTTPURLResponse), Failure == NetworkError {
198-
array.append(self.map({ (try! encoder.encode($0.0), $0.1) }))
237+
) -> Result<(Data, HTTPURLResponse), NetworkError> where Success == (T, HTTPURLResponse), Failure == NetworkError {
238+
return self.map({ ((try? encoder.encode($0.0)) ?? Data(), $0.1) })
199239
}
200240

201241
}
202242

203243
fileprivate extension Result where Success: Encodable, Failure == NetworkError {
204244

205-
func decode(
206-
_ array: inout [Result<(Data, HTTPURLResponse), NetworkError>],
245+
func encode(
207246
encoder: JSONEncoder
208-
) {
247+
) -> Result<(Data, HTTPURLResponse), NetworkError> {
209248
let defaultResponse: HTTPURLResponse! = HTTPURLResponse(
210249
url: URL(staticString: "bahn.de"),
211250
statusCode: 200,
212251
httpVersion: "HTTP/1.1",
213252
headerFields: nil
214253
)
215-
array.append(self.map({ (try! encoder.encode($0), defaultResponse) }))
254+
return self.map({ ((try? encoder.encode($0)) ?? Data(), defaultResponse) })
216255
}
217256

218257
}

0 commit comments

Comments
 (0)