@@ -10,6 +10,10 @@ class MockupNetwork: Network {
1010 ///
1111 private var responseMap = [ String: String] ( )
1212
13+ /// Mapping between URL Suffix and Error responses.
14+ ///
15+ private var errorMap = [ String: Error] ( )
16+
1317 /// Keeps a collection of all of the `responseJSON` requests.
1418 ///
1519 var requestsForResponseJSON = [ URLRequestConvertible] ( )
@@ -20,6 +24,7 @@ class MockupNetwork: Network {
2024
2125
2226
27+
2328 /// Public Initializer
2429 ///
2530 required init ( credentials: Credentials ) { }
@@ -38,12 +43,17 @@ class MockupNetwork: Network {
3843 func responseJSON( for request: URLRequestConvertible , completion: @escaping ( Any ? , Error ? ) -> Void ) {
3944 requestsForResponseJSON. append ( request)
4045
41- guard let filename = filename ( for: request) , let response = Loader . jsonObject ( for: filename) else {
42- completion ( nil , NetworkError . emptyResponse)
46+ if let error = error ( for: request) {
47+ completion ( nil , error)
48+ return
49+ }
50+
51+ if let filename = filename ( for: request) , let response = Loader . jsonObject ( for: filename) {
52+ completion ( response, nil )
4353 return
4454 }
4555
46- completion ( response , nil )
56+ completion ( nil , NetworkError . unknown )
4757 }
4858
4959 /// Whenever the Request's URL matches any of the "Mocked Up Patterns", we'll return the specified response file, loaded as *Data*.
@@ -52,12 +62,17 @@ class MockupNetwork: Network {
5262 func responseData( for request: URLRequestConvertible , completion: @escaping ( Data ? , Error ? ) -> Void ) {
5363 requestsForResponseData. append ( request)
5464
55- guard let filename = filename ( for: request) , let data = Loader . contentsOf ( filename ) else {
56- completion ( nil , NetworkError . emptyResponse )
65+ if let error = error ( for: request) {
66+ completion ( nil , error )
5767 return
5868 }
5969
60- completion ( data, nil )
70+ if let filename = filename ( for: request) , let data = Loader . contentsOf ( filename) {
71+ completion ( data, nil )
72+ return
73+ }
74+
75+ completion ( nil , NetworkError . unknown)
6176 }
6277}
6378
@@ -73,10 +88,17 @@ extension MockupNetwork {
7388 responseMap [ requestUrlSuffix] = filename
7489 }
7590
91+ /// We'll return the specified Error, whenever a request matches the specified Suffix Criteria!.
92+ ///
93+ func simulateError( requestUrlSuffix: String , error: Error ) {
94+ errorMap [ requestUrlSuffix] = error
95+ }
96+
7697 /// Removes all of the stored Simulated Responses.
7798 ///
7899 func removeAllSimulatedResponses( ) {
79100 responseMap. removeAll ( )
101+ errorMap. removeAll ( )
80102 }
81103
82104 /// Returns the Mockup JSON Filename for a given URLRequestConvertible.
@@ -90,6 +112,17 @@ extension MockupNetwork {
90112 return nil
91113 }
92114
115+ /// Returns the Mockup Error for a given URLRequestConvertible.
116+ ///
117+ private func error( for request: URLRequestConvertible ) -> Error ? {
118+ let searchPath = path ( for: request)
119+ for (pattern, error) in errorMap where searchPath. hasSuffix ( pattern) {
120+ return error
121+ }
122+
123+ return nil
124+ }
125+
93126 /// Returns the "Request Path" for a given URLRequestConvertible instance.
94127 ///
95128 private func path( for request: URLRequestConvertible ) -> String {
0 commit comments