// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. import Foundation import Combine import SessionSnodeKit import SessionUtilitiesKit import Quick import Nimble @testable import SessionMessagingKit class BatchRequestInfoSpec: QuickSpec { override class func spec() { // MARK: Configuration @TestState var request: OpenGroupAPI.BatchRequest! // MARK: - a BatchRequest.Child describe("a BatchRequest.Child") { // MARK: -- when encoding context("when encoding") { // MARK: ---- successfully encodes a string body it("successfully encodes a string body") { request = OpenGroupAPI.BatchRequest( requests: [ OpenGroupAPI.PreparedSendData( request: Request( method: .get, server: "testServer", endpoint: .batch, queryParameters: [:], headers: [:], body: "testBody" ), urlRequest: URLRequest(url: URL(string: "https://www.oxen.io")!), publicKey: "", responseType: NoResponse.self, timeout: 0 ) ] ) let requestData: Data? = try? JSONEncoder().encode(request) let requestJson: [[String: Any]]? = requestData .map { try? JSONSerialization.jsonObject(with: $0) as? [[String: Any]] } expect(requestJson?.first?["path"] as? String).to(equal("/batch")) expect(requestJson?.first?["method"] as? String).to(equal("GET")) expect(requestJson?.first?["b64"] as? String).to(equal("testBody")) } // MARK: ---- successfully encodes a byte body it("successfully encodes a byte body") { request = OpenGroupAPI.BatchRequest( requests: [ OpenGroupAPI.PreparedSendData( request: Request<[UInt8], OpenGroupAPI.Endpoint>( method: .get, server: "testServer", endpoint: .batch, queryParameters: [:], headers: [:], body: [1, 2, 3] ), urlRequest: URLRequest(url: URL(string: "https://www.oxen.io")!), publicKey: "", responseType: NoResponse.self, timeout: 0 ) ] ) let requestData: Data? = try? JSONEncoder().encode(request) let requestJson: [[String: Any]]? = requestData .map { try? JSONSerialization.jsonObject(with: $0) as? [[String: Any]] } expect(requestJson?.first?["path"] as? String).to(equal("/batch")) expect(requestJson?.first?["method"] as? String).to(equal("GET")) expect(requestJson?.first?["bytes"] as? [Int]).to(equal([1, 2, 3])) } // MARK: ---- successfully encodes a JSON body it("successfully encodes a JSON body") { request = OpenGroupAPI.BatchRequest( requests: [ OpenGroupAPI.PreparedSendData( request: Request( method: .get, server: "testServer", endpoint: .batch, queryParameters: [:], headers: [:], body: TestType(stringValue: "testValue") ), urlRequest: URLRequest(url: URL(string: "https://www.oxen.io")!), publicKey: "", responseType: NoResponse.self, timeout: 0 ) ] ) let requestData: Data? = try? JSONEncoder().encode(request) let requestJson: [[String: Any]]? = requestData .map { try? JSONSerialization.jsonObject(with: $0) as? [[String: Any]] } expect(requestJson?.first?["path"] as? String).to(equal("/batch")) expect(requestJson?.first?["method"] as? String).to(equal("GET")) expect(requestJson?.first?["json"] as? [String: String]).to(equal(["stringValue": "testValue"])) } // MARK: ---- strips authentication headers it("strips authentication headers") { let httpRequest: Request = Request( method: .get, server: "testServer", endpoint: .batch, queryParameters: [:], headers: [ "TestHeader": "Test", HTTPHeader.sogsPubKey: "A", HTTPHeader.sogsTimestamp: "B", HTTPHeader.sogsNonce: "C", HTTPHeader.sogsSignature: "D" ], body: nil ) request = OpenGroupAPI.BatchRequest( requests: [ OpenGroupAPI.PreparedSendData( request: httpRequest, urlRequest: try! httpRequest.generateUrlRequest(), publicKey: "", responseType: NoResponse.self, timeout: 0 ) ] ) let requestData: Data = try! JSONEncoder().encode(request) let requestString: String? = String(data: requestData, encoding: .utf8) expect(requestString) .toNot(contain([ HTTPHeader.sogsPubKey, HTTPHeader.sogsTimestamp, HTTPHeader.sogsNonce, HTTPHeader.sogsSignature ])) } } // MARK: -- does not strip non authentication headers it("does not strip non authentication headers") { let httpRequest: Request = Request( method: .get, server: "testServer", endpoint: .batch, queryParameters: [:], headers: [ "TestHeader": "Test", HTTPHeader.sogsPubKey: "A", HTTPHeader.sogsTimestamp: "B", HTTPHeader.sogsNonce: "C", HTTPHeader.sogsSignature: "D" ], body: nil ) request = OpenGroupAPI.BatchRequest( requests: [ OpenGroupAPI.PreparedSendData( request: httpRequest, urlRequest: try! httpRequest.generateUrlRequest(), publicKey: "", responseType: NoResponse.self, timeout: 0 ) ] ) let requestData: Data = try! JSONEncoder().encode(request) let requestString: String? = String(data: requestData, encoding: .utf8) expect(requestString) .to(contain("\"TestHeader\":\"Test\"")) } } } } // MARK: - Test Types fileprivate struct TestType: Codable, Equatable { let stringValue: String }