mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			115 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Swift
		
	
| // Copyright © 2023 Rangeproof Pty Ltd. All rights reserved.
 | |
| 
 | |
| import Foundation
 | |
| import Combine
 | |
| import SessionUtilitiesKit
 | |
| 
 | |
| // MARK: - MockNetwork
 | |
| 
 | |
| class MockNetwork: Mock<NetworkType>, NetworkType {
 | |
|     var requestData: RequestData?
 | |
|     
 | |
|     func send<T>(_ request: Network.RequestType<T>) -> AnyPublisher<(ResponseInfoType, T), Error> {
 | |
|         requestData = request.data
 | |
|         
 | |
|         return accept(funcName: "send<T>(\(request.id))", args: request.args) as! AnyPublisher<(ResponseInfoType, T), Error>
 | |
|     }
 | |
|     
 | |
|     static func response<T: Encodable>(info: MockResponseInfo = .mockValue, with value: T) -> AnyPublisher<(ResponseInfoType, Data?), Error> {
 | |
|         return Just((info, try? JSONEncoder().with(outputFormatting: .sortedKeys).encode(value)))
 | |
|             .setFailureType(to: Error.self)
 | |
|             .eraseToAnyPublisher()
 | |
|     }
 | |
|     
 | |
|     static func response<T: Mocked & Encodable>(info: MockResponseInfo = .mockValue, type: T.Type) -> AnyPublisher<(ResponseInfoType, Data?), Error> {
 | |
|         return response(info: info, with: T.mockValue)
 | |
|     }
 | |
|     
 | |
|     static func response<T: Mocked & Encodable>(info: MockResponseInfo = .mockValue, type: Array<T>.Type) -> AnyPublisher<(ResponseInfoType, Data?), Error> {
 | |
|         return response(info: info, with: [T.mockValue])
 | |
|     }
 | |
|     
 | |
|     static func batchResponseData<E: EndpointType>(
 | |
|         info: MockResponseInfo = .mockValue,
 | |
|         with value: [(endpoint: E, data: Data)]
 | |
|     ) -> AnyPublisher<(ResponseInfoType, Data?), Error> {
 | |
|         let data: Data = "[\(value.map { String(data: $0.data, encoding: .utf8)! }.joined(separator: ","))]"
 | |
|             .data(using: .utf8)!
 | |
|         
 | |
|         return Just((info, data))
 | |
|             .setFailureType(to: Error.self)
 | |
|             .eraseToAnyPublisher()
 | |
|     }
 | |
|     
 | |
|     static func response(info: MockResponseInfo = .mockValue, data: Data) -> AnyPublisher<(ResponseInfoType, Data?), Error> {
 | |
|         return Just((info, data))
 | |
|             .setFailureType(to: Error.self)
 | |
|             .eraseToAnyPublisher()
 | |
|     }
 | |
|     
 | |
|     static func nullResponse(info: MockResponseInfo = .mockValue) -> AnyPublisher<(ResponseInfoType, Data?), Error> {
 | |
|         return Just((info, nil))
 | |
|             .setFailureType(to: Error.self)
 | |
|             .eraseToAnyPublisher()
 | |
|     }
 | |
| }
 | |
| 
 | |
| // MARK: - MockResponseInfo
 | |
| 
 | |
| struct MockResponseInfo: ResponseInfoType, Mocked {
 | |
|     static let mockValue: MockResponseInfo = MockResponseInfo(requestData: .fallbackData, code: 200, headers: [:])
 | |
|     
 | |
|     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
 | |
|     }
 | |
| }
 | |
| 
 | |
| struct RequestData: Codable {
 | |
|     static let fallbackData: RequestData = RequestData(urlString: nil, httpMethod: "GET", headers: [:], body: nil)
 | |
|     
 | |
|     let urlString: String?
 | |
|     let httpMethod: String
 | |
|     let headers: [String: String]
 | |
|     let body: Data?
 | |
| }
 | |
| 
 | |
| extension Network.RequestType {
 | |
|     var data: RequestData {
 | |
|         return RequestData(
 | |
|             urlString: url,
 | |
|             httpMethod: (method ?? ""),
 | |
|             headers: (headers ?? [:]),
 | |
|             body: body
 | |
|         )
 | |
|     }
 | |
| }
 | |
| 
 | |
| // MARK: - HTTP.BatchSubResponse Encoding Convenience
 | |
| 
 | |
| extension Encodable where Self: Codable {
 | |
|     func batchSubResponse() -> Data {
 | |
|         return try! JSONEncoder().with(outputFormatting: .sortedKeys).encode(
 | |
|             HTTP.BatchSubResponse(
 | |
|                 code: 200,
 | |
|                 headers: [:],
 | |
|                 body: self,
 | |
|                 failedToParseBody: false
 | |
|             )
 | |
|         )
 | |
|     }
 | |
| }
 | |
| 
 | |
| extension Mocked where Self: Codable {
 | |
|     static func mockBatchSubResponse() -> Data { return mockValue.batchSubResponse() }
 | |
| }
 | |
| 
 | |
| extension Array where Element: Mocked, Element: Codable {
 | |
|     static func mockBatchSubResponse() -> Data { return [Element.mockValue].batchSubResponse() }
 | |
| }
 |