@@ -6,7 +6,15 @@ import Alamofire
66///
77class MockupNetwork : Network {
88
9- /// Mapping between URL Suffix and JSON Mockup responses.
9+ /// Should this instance use the responseQueue or responseMap
10+ ///
11+ private var useResponseQueue : Bool = false
12+
13+ /// Mapping between URL Suffix and JSON Mockup responses (in a FIFO queue).
14+ ///
15+ private var responseQueue = [ String : Queue < String > ] ( )
16+
17+ /// Mapping between URL Suffix and JSON Mockup responses (in a simple array).
1018 ///
1119 private var responseMap = [ String: String] ( )
1220
@@ -23,17 +31,24 @@ class MockupNetwork: Network {
2331 var requestsForResponseData = [ URLRequestConvertible] ( )
2432
2533
26-
27-
2834 /// Public Initializer
2935 ///
3036 required init ( credentials: Credentials ) { }
3137
3238 /// Dummy convenience initializer. Remember: Real Network wrappers will allways need credentials!
3339 ///
34- convenience init ( ) {
40+ /// Note: If the useResponseQueue param is `true`, any repsonses added via `simulateResponse` will stored in a FIFO queue
41+ /// and used once for a matching request (then removed from the queue). Subsuquent requests will use the next response in the queue, and so on.
42+ ///
43+ /// If the useResponseQueue param is `false`, any repsonses added via `simulateResponse` will stored in an array and can
44+ /// be reused multiple times.
45+ ///
46+ /// - Parameter useResponseQueue: Use the response queue. Default is `false`.
47+ ///
48+ convenience init ( useResponseQueue: Bool = false ) {
3549 let dummy = Credentials ( username: " " , authToken: " " )
3650 self . init ( credentials: dummy)
51+ self . useResponseQueue = useResponseQueue
3752 }
3853
3954
@@ -48,7 +63,8 @@ class MockupNetwork: Network {
4863 return
4964 }
5065
51- if let filename = filename ( for: request) , let response = Loader . jsonObject ( for: filename) {
66+ let name = filename ( for: request)
67+ if let name = name, let response = Loader . jsonObject ( for: name) {
5268 completion ( response, nil )
5369 return
5470 }
@@ -67,7 +83,8 @@ class MockupNetwork: Network {
6783 return
6884 }
6985
70- if let filename = filename ( for: request) , let data = Loader . contentsOf ( filename) {
86+ let name = filename ( for: request)
87+ if let name = name, let data = Loader . contentsOf ( name) {
7188 completion ( data, nil )
7289 return
7390 }
@@ -77,15 +94,19 @@ class MockupNetwork: Network {
7794}
7895
7996
80- /// Public Methods
81- ///
97+ // MARK: - Public Methods
98+ //
8299extension MockupNetwork {
83100
84101 /// Whenever a request is enqueued, we'll return the specified JSON Encoded file, whenever the Request's URL suffix matches with
85102 /// the specified one.
86103 ///
87104 func simulateResponse( requestUrlSuffix: String , filename: String ) {
88- responseMap [ requestUrlSuffix] = filename
105+ if useResponseQueue {
106+ addResponseToQueue ( requestUrlSuffix: requestUrlSuffix, filename: filename)
107+ } else {
108+ addResponseToMap ( requestUrlSuffix: requestUrlSuffix, filename: filename)
109+ }
89110 }
90111
91112 /// We'll return the specified Error, whenever a request matches the specified Suffix Criteria!
@@ -100,13 +121,43 @@ extension MockupNetwork {
100121 responseMap. removeAll ( )
101122 errorMap. removeAll ( )
102123 }
124+ }
125+
126+
127+ // MARK: - Private Helpers
128+ //
129+ private extension MockupNetwork {
130+
131+ /// Adds the URL suffix and response JSON Filename to the response queue
132+ ///
133+ private func addResponseToQueue( requestUrlSuffix: String , filename: String ) {
134+ if responseQueue [ requestUrlSuffix] == nil {
135+ responseQueue [ requestUrlSuffix] = Queue < String > ( )
136+ }
137+ responseQueue [ requestUrlSuffix] ? . enqueue ( filename)
138+ }
139+
140+ /// Adds the URL suffix and response JSON Filename to the response map
141+ ///
142+ private func addResponseToMap( requestUrlSuffix: String , filename: String ) {
143+ responseMap [ requestUrlSuffix] = filename
144+ }
103145
104- /// Returns the Mockup JSON Filename for a given URLRequestConvertible.
146+ /// Returns the Mockup JSON Filename for a given URLRequestConvertible from either:
147+ ///
148+ /// * the FIFO response queue (where the response is removed from the queue when this func returns)
149+ /// * the responseMap (array)
105150 ///
106- private func filename( for request: URLRequestConvertible ) -> String ? {
151+ func filename( for request: URLRequestConvertible ) -> String ? {
107152 let searchPath = path ( for: request)
108- for (pattern, filename) in responseMap where searchPath. hasSuffix ( pattern) {
109- return filename
153+ if useResponseQueue {
154+ if var queue = responseQueue. filter ( { searchPath. hasSuffix ( $0. key) } ) . first? . value {
155+ return queue. dequeue ( )
156+ }
157+ } else {
158+ if let filename = responseMap. filter ( { searchPath. hasSuffix ( $0. key) } ) . first? . value {
159+ return filename
160+ }
110161 }
111162
112163 return nil
0 commit comments