|  |  |  | // Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import Foundation | 
					
						
							|  |  |  | import Combine | 
					
						
							|  |  |  | import SessionSnodeKit | 
					
						
							|  |  |  | import SessionUtilitiesKit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @testable import SessionMessagingKit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // FIXME: Change 'OnionRequestAPIType' to have instance methods instead of static methods once everything is updated to use 'Dependencies' | 
					
						
							|  |  |  | class TestOnionRequestAPI: OnionRequestAPIType { | 
					
						
							|  |  |  |     struct RequestData: Codable { | 
					
						
							|  |  |  |         let urlString: String? | 
					
						
							|  |  |  |         let httpMethod: String | 
					
						
							|  |  |  |         let headers: [String: String] | 
					
						
							|  |  |  |         let body: Data? | 
					
						
							|  |  |  |         let destination: OnionRequestAPIDestination | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         var publicKey: String? { | 
					
						
							|  |  |  |             switch destination { | 
					
						
							|  |  |  |                 case .snode: return nil | 
					
						
							|  |  |  |                 case .server(_, _, let x25519PublicKey, _, _): return x25519PublicKey | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class ResponseInfo: ResponseInfoType { | 
					
						
							|  |  |  |         let requestData: RequestData | 
					
						
							|  |  |  |         let code: Int | 
					
						
							|  |  |  |         let headers: [String: String] | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         init(requestData: RequestData, code: Int, headers: [String: String]) { | 
					
						
							|  |  |  |             self.requestData = requestData | 
					
						
							|  |  |  |             self.code = code | 
					
						
							|  |  |  |             self.headers = headers | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     class var mockResponse: Data? { return nil } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     static func sendOnionRequest(_ request: URLRequest, to server: String, with x25519PublicKey: String, timeout: TimeInterval) -> AnyPublisher<(ResponseInfoType, Data?), Error> { | 
					
						
							|  |  |  |         let responseInfo: ResponseInfo = ResponseInfo( | 
					
						
							|  |  |  |             requestData: RequestData( | 
					
						
							|  |  |  |                 urlString: request.url?.absoluteString, | 
					
						
							|  |  |  |                 httpMethod: (request.httpMethod ?? "GET"), | 
					
						
							|  |  |  |                 headers: (request.allHTTPHeaderFields ?? [:]), | 
					
						
							|  |  |  |                 body: request.httpBody, | 
					
						
							|  |  |  |                 destination: OnionRequestAPIDestination.server( | 
					
						
							|  |  |  |                     host: (request.url?.host ?? ""), | 
					
						
							|  |  |  |                     target: OnionRequestAPIVersion.v4.rawValue, | 
					
						
							|  |  |  |                     x25519PublicKey: x25519PublicKey, | 
					
						
							|  |  |  |                     scheme: request.url!.scheme, | 
					
						
							|  |  |  |                     port: request.url!.port.map { UInt16($0) } | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             code: 200, | 
					
						
							|  |  |  |             headers: [:] | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         return Just((responseInfo, mockResponse)) | 
					
						
							|  |  |  |             .setFailureType(to: Error.self) | 
					
						
							|  |  |  |             .eraseToAnyPublisher() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     static func sendOnionRequest(_ payload: Data, to snode: Snode, timeout: TimeInterval) -> AnyPublisher<(ResponseInfoType, Data?), Error> { | 
					
						
							|  |  |  |         let responseInfo: ResponseInfo = ResponseInfo( | 
					
						
							|  |  |  |             requestData: RequestData( | 
					
						
							|  |  |  |                 urlString: "\(snode.address):\(snode.port)/onion_req/v2", | 
					
						
							|  |  |  |                 httpMethod: "POST", | 
					
						
							|  |  |  |                 headers: [:], | 
					
						
							|  |  |  |                 body: payload, | 
					
						
							|  |  |  |                 destination: OnionRequestAPIDestination.snode(snode) | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             code: 200, | 
					
						
							|  |  |  |             headers: [:] | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         return Just((responseInfo, mockResponse)) | 
					
						
							|  |  |  |             .setFailureType(to: Error.self) | 
					
						
							|  |  |  |             .eraseToAnyPublisher() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |