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.
		
		
		
		
		
			
		
			
	
	
		
			180 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Swift
		
	
		
		
			
		
	
	
			180 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Swift
		
	
| 
											4 years ago
										 | // Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. | ||
|  | 
 | ||
|  | import Foundation | ||
|  | 
 | ||
|  | import Quick | ||
|  | import Nimble | ||
|  | 
 | ||
| 
											3 years ago
										 | @testable import SessionUtilitiesKit | ||
| 
											4 years ago
										 | 
 | ||
|  | class RequestSpec: QuickSpec { | ||
| 
											3 years ago
										 |     enum TestEndpoint: EndpointType { | ||
|  |         case test1 | ||
|  |         case testParams(String, Int) | ||
|  |          | ||
|  |         var path: String { | ||
|  |             switch self { | ||
|  |                 case .test1: return "test1" | ||
|  |                 case .testParams(let str, let int): return "testParams/\(str)/int/\(int)" | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  |      | ||
| 
											4 years ago
										 |     struct TestType: Codable, Equatable { | ||
|  |         let stringValue: String | ||
|  |     } | ||
|  |      | ||
|  |     // MARK: - Spec | ||
|  | 
 | ||
|  |     override func spec() { | ||
|  |         describe("a Request") { | ||
|  |             it("is initialized with the correct default values") { | ||
| 
											3 years ago
										 |                 let request: Request<NoBody, TestEndpoint> = Request( | ||
| 
											4 years ago
										 |                     server: "testServer", | ||
| 
											3 years ago
										 |                     endpoint: .test1 | ||
| 
											4 years ago
										 |                 ) | ||
|  |                  | ||
|  |                 expect(request.method.rawValue).to(equal("GET")) | ||
|  |                 expect(request.queryParameters).to(equal([:])) | ||
|  |                 expect(request.headers).to(equal([:])) | ||
|  |                 expect(request.body).to(beNil()) | ||
|  |             } | ||
|  |              | ||
|  |             context("when generating a URL") { | ||
|  |                 it("adds a leading forward slash to the endpoint path") { | ||
| 
											3 years ago
										 |                     let request: Request<NoBody, TestEndpoint> = Request( | ||
| 
											4 years ago
										 |                         server: "testServer", | ||
| 
											3 years ago
										 |                         endpoint: .test1 | ||
| 
											4 years ago
										 |                     ) | ||
|  |                      | ||
| 
											3 years ago
										 |                     expect(request.urlPathAndParamsString).to(equal("/test1")) | ||
| 
											4 years ago
										 |                 } | ||
|  |                  | ||
|  |                 it("creates a valid URL with no query parameters") { | ||
| 
											3 years ago
										 |                     let request: Request<NoBody, TestEndpoint> = Request( | ||
| 
											4 years ago
										 |                         server: "testServer", | ||
| 
											3 years ago
										 |                         endpoint: .test1 | ||
| 
											4 years ago
										 |                     ) | ||
|  |                      | ||
| 
											3 years ago
										 |                     expect(request.urlPathAndParamsString).to(equal("/test1")) | ||
| 
											4 years ago
										 |                 } | ||
|  |                  | ||
|  |                 it("creates a valid URL when query parameters are provided") { | ||
| 
											3 years ago
										 |                     let request: Request<NoBody, TestEndpoint> = Request( | ||
| 
											4 years ago
										 |                         server: "testServer", | ||
| 
											3 years ago
										 |                         endpoint: .test1, | ||
| 
											4 years ago
										 |                         queryParameters: [ | ||
|  |                             .limit: "123" | ||
|  |                         ] | ||
|  |                     ) | ||
|  |                      | ||
| 
											3 years ago
										 |                     expect(request.urlPathAndParamsString).to(equal("/test1?limit=123")) | ||
| 
											4 years ago
										 |                 } | ||
|  |             } | ||
|  |              | ||
|  |             context("when generating a URLRequest") { | ||
|  |                 it("sets all the values correctly") { | ||
| 
											3 years ago
										 |                     let request: Request<NoBody, TestEndpoint> = Request( | ||
| 
											4 years ago
										 |                         method: .delete, | ||
|  |                         server: "testServer", | ||
| 
											3 years ago
										 |                         endpoint: .test1, | ||
| 
											4 years ago
										 |                         headers: [ | ||
|  |                             .authorization: "test" | ||
|  |                         ] | ||
|  |                     ) | ||
|  |                     let urlRequest: URLRequest? = try? request.generateUrlRequest() | ||
|  |                      | ||
|  |                     expect(urlRequest?.httpMethod).to(equal("DELETE")) | ||
|  |                     expect(urlRequest?.allHTTPHeaderFields).to(equal(["Authorization": "test"])) | ||
|  |                     expect(urlRequest?.httpBody).to(beNil()) | ||
|  |                 } | ||
|  |                  | ||
|  |                 it("throws an error if the URL is invalid") { | ||
| 
											3 years ago
										 |                     let request: Request<NoBody, TestEndpoint> = Request( | ||
| 
											4 years ago
										 |                         server: "testServer", | ||
| 
											3 years ago
										 |                         endpoint: .testParams("!!%%", 123) | ||
| 
											4 years ago
										 |                     ) | ||
|  |                      | ||
|  |                     expect { | ||
|  |                         try request.generateUrlRequest() | ||
|  |                     } | ||
| 
											3 years ago
										 |                     .to(throwError(HTTPError.invalidURL)) | ||
| 
											4 years ago
										 |                 } | ||
|  |                  | ||
|  |                 context("with a base64 string body") { | ||
|  |                     it("successfully encodes the body") { | ||
| 
											3 years ago
										 |                         let request: Request<String, TestEndpoint> = Request( | ||
| 
											4 years ago
										 |                             server: "testServer", | ||
| 
											3 years ago
										 |                             endpoint: .test1, | ||
| 
											4 years ago
										 |                             body: "TestMessage".data(using: .utf8)!.base64EncodedString() | ||
|  |                         ) | ||
|  |                          | ||
|  |                         let urlRequest: URLRequest? = try? request.generateUrlRequest() | ||
|  |                         let requestBody: Data? = Data(base64Encoded: urlRequest?.httpBody?.base64EncodedString() ?? "") | ||
|  |                         let requestBodyString: String? = String(data: requestBody ?? Data(), encoding: .utf8) | ||
|  |                          | ||
|  |                         expect(requestBodyString).to(equal("TestMessage")) | ||
|  |                     } | ||
|  |                      | ||
|  |                     it("throws an error if the body is not base64 encoded") { | ||
| 
											3 years ago
										 |                         let request: Request<String, TestEndpoint> = Request( | ||
| 
											4 years ago
										 |                             server: "testServer", | ||
| 
											3 years ago
										 |                             endpoint: .test1, | ||
| 
											4 years ago
										 |                             body: "TestMessage" | ||
|  |                         ) | ||
|  |                          | ||
|  |                         expect { | ||
|  |                             try request.generateUrlRequest() | ||
|  |                         } | ||
| 
											3 years ago
										 |                         .to(throwError(HTTPError.parsingFailed)) | ||
| 
											4 years ago
										 |                     } | ||
|  |                 } | ||
|  |                  | ||
|  |                 context("with a byte body") { | ||
|  |                     it("successfully encodes the body") { | ||
| 
											3 years ago
										 |                         let request: Request<[UInt8], TestEndpoint> = Request( | ||
| 
											4 years ago
										 |                             server: "testServer", | ||
| 
											3 years ago
										 |                             endpoint: .test1, | ||
| 
											4 years ago
										 |                             body: [1, 2, 3] | ||
|  |                         ) | ||
|  |                          | ||
|  |                         let urlRequest: URLRequest? = try? request.generateUrlRequest() | ||
|  |                          | ||
|  |                         expect(urlRequest?.httpBody?.bytes).to(equal([1, 2, 3])) | ||
|  |                     } | ||
|  |                 } | ||
|  |                  | ||
|  |                 context("with a JSON body") { | ||
|  |                     it("successfully encodes the body") { | ||
| 
											3 years ago
										 |                         let request: Request<TestType, TestEndpoint> = Request( | ||
| 
											4 years ago
										 |                             server: "testServer", | ||
| 
											3 years ago
										 |                             endpoint: .test1, | ||
| 
											4 years ago
										 |                             body: TestType(stringValue: "test") | ||
|  |                         ) | ||
|  |                          | ||
|  |                         let urlRequest: URLRequest? = try? request.generateUrlRequest() | ||
|  |                         let requestBody: TestType? = try? JSONDecoder().decode( | ||
|  |                             TestType.self, | ||
|  |                             from: urlRequest?.httpBody ?? Data() | ||
|  |                         ) | ||
|  |                          | ||
|  |                         expect(requestBody).to(equal(TestType(stringValue: "test"))) | ||
|  |                     } | ||
|  |                      | ||
|  |                     it("successfully encodes no body") { | ||
| 
											3 years ago
										 |                         let request: Request<NoBody, TestEndpoint> = Request( | ||
| 
											4 years ago
										 |                             server: "testServer", | ||
| 
											3 years ago
										 |                             endpoint: .test1, | ||
| 
											4 years ago
										 |                             body: nil | ||
|  |                         ) | ||
|  |                          | ||
|  |                         expect { | ||
|  |                             try request.generateUrlRequest() | ||
|  |                         }.toNot(throwError()) | ||
|  |                     } | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } |