@@ -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
192233fileprivate 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
203243fileprivate 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