From 1e2159b2480d747fcf6e1539217a0f034c4d5bba Mon Sep 17 00:00:00 2001 From: Victor Bodinaud Date: Thu, 21 Mar 2024 17:23:06 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=85=20Add=20unit=20testing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + Sources/Hermes/Hermes.swift | 7 ++- Sources/Hermes/HermesResponse.swift | 14 +++++ Tests/HermesTests/HermesTests.swift | 96 +++++++++++++++++++++++++++-- 4 files changed, 109 insertions(+), 9 deletions(-) create mode 100644 Sources/Hermes/HermesResponse.swift diff --git a/README.md b/README.md index 6e5861c..96bf061 100644 --- a/README.md +++ b/README.md @@ -19,3 +19,4 @@ You can use Swift Package Manager to integrate Hermes into your project. Add the dependencies: [ .package(url: "https://git.mahtan-melwasul.com/Mahtan/Hermes.git", from: "1.0.0") ] +test \ No newline at end of file diff --git a/Sources/Hermes/Hermes.swift b/Sources/Hermes/Hermes.swift index 0505414..f3caf37 100644 --- a/Sources/Hermes/Hermes.swift +++ b/Sources/Hermes/Hermes.swift @@ -19,7 +19,6 @@ extension NetworkError: LocalizedError { case .badRequest: return NSLocalizedString("Unable to perform request", comment: "badRequestError") case .serverError(let errorMessage): - print(errorMessage) return NSLocalizedString(errorMessage, comment: "serverError") case .decodingError: return NSLocalizedString("Unable to decode successfully", comment: "decodingError") @@ -30,7 +29,7 @@ extension NetworkError: LocalizedError { } public enum HTTPMethod { - case get([URLQueryItem]) + case get([URLQueryItem]? = nil) case post(Data?) case put(Data?) case patch(Data?) @@ -110,7 +109,7 @@ public struct Hermes { let (data, response) = try await session.data(for: request) - guard let _ = response as? HTTPURLResponse else { + guard let response = response as? HTTPURLResponse else { throw NetworkError.invalidResponse } @@ -118,6 +117,8 @@ public struct Hermes { throw NetworkError.decodingError } + let hermres = HermesResponse(error: "", statusCode: response.statusCode, result: result) + return result } } diff --git a/Sources/Hermes/HermesResponse.swift b/Sources/Hermes/HermesResponse.swift new file mode 100644 index 0000000..48a2e37 --- /dev/null +++ b/Sources/Hermes/HermesResponse.swift @@ -0,0 +1,14 @@ +// +// HermesResponse.swift +// +// +// Created by Victor on 21/03/2024. +// + +import Foundation + +struct HermesResponse { + let error: String + let statusCode: Int + let result: Any +} diff --git a/Tests/HermesTests/HermesTests.swift b/Tests/HermesTests/HermesTests.swift index b1cef3e..8c51f70 100644 --- a/Tests/HermesTests/HermesTests.swift +++ b/Tests/HermesTests/HermesTests.swift @@ -2,11 +2,95 @@ import XCTest @testable import Hermes final class HermesTests: XCTestCase { - func testExample() throws { - // XCTest Documentation - // https://developer.apple.com/documentation/xctest - - // Defining Test Cases and Test Methods - // https://developer.apple.com/documentation/xctest/defining_test_cases_and_test_methods + + func test404() async throws { + let hermes = Hermes() + let resource = Resource(url: URL(string: "https://httpbin.org/404")!, method: .get(), modelType: GetResponse.self) + + let getResponse = try await hermes.load(resource) + } + + func testGetRequest() async throws { + let hermes = Hermes() + let queryParams = [URLQueryItem(name: "foo", value: "bar")] + let resource = Resource(url: URL(string: "https://httpbin.org/get")!, method: .get(queryParams), modelType: GetResponse.self) + + let getResponse = try await hermes.load(resource) + + XCTAssertEqual(getResponse.url, "https://httpbin.org/get?foo=bar") + XCTAssertEqual(getResponse.args.count, 1) + XCTAssertGreaterThan(getResponse.headers.count, 0) + } + + func testPostRequest() async throws { + let hermes = Hermes() + let postDatas = try? JSONEncoder().encode(["foo": "bar"]) + let resource = Resource(url: URL(string: "https://httpbin.org/post")!, method: .post(postDatas), modelType: PostResponse.self) + + let postResponse = try await hermes.load(resource) + + XCTAssertEqual(postResponse.url, "https://httpbin.org/post") + XCTAssertEqual(postResponse.args.count, 0) + XCTAssertNotNil(postResponse.json) + XCTAssertEqual(postResponse.json!.count, 1) + XCTAssertGreaterThan(postResponse.headers.count, 0) + } + + func testPutRequest() async throws { + let hermes = Hermes() + let postDatas = try? JSONEncoder().encode(["foo": "bar"]) + let resource = Resource(url: URL(string: "https://httpbin.org/put")!, method: .put(postDatas), modelType: PostResponse.self) + + let putResponse = try await hermes.load(resource) + + XCTAssertEqual(putResponse.url, "https://httpbin.org/put") + XCTAssertEqual(putResponse.args.count, 0) + XCTAssertNotNil(putResponse.json) + XCTAssertEqual(putResponse.json!.count, 1) + XCTAssertGreaterThan(putResponse.headers.count, 0) + } + + func testPatchRequest() async throws { + let hermes = Hermes() + let postDatas = try? JSONEncoder().encode(["foo": "bar"]) + let resource = Resource(url: URL(string: "https://httpbin.org/patch")!, method: .patch(postDatas), modelType: PostResponse.self) + + let patchResponse = try await hermes.load(resource) + + XCTAssertEqual(patchResponse.url, "https://httpbin.org/patch") + XCTAssertEqual(patchResponse.args.count, 0) + XCTAssertNotNil(patchResponse.json) + XCTAssertEqual(patchResponse.json!.count, 1) + XCTAssertGreaterThan(patchResponse.headers.count, 0) + } + + func testDeleteRequest() async throws { + let hermes = Hermes() + let resource = Resource(url: URL(string: "https://httpbin.org/delete")!, method: .delete, modelType: PostResponse.self) + + let deleteResponse = try await hermes.load(resource) + + XCTAssertEqual(deleteResponse.url, "https://httpbin.org/delete") + XCTAssertEqual(deleteResponse.args.count, 0) + XCTAssertNil(deleteResponse.json) + XCTAssertGreaterThan(deleteResponse.headers.count, 0) } } + +struct GetResponse: Codable { + let args: [String: String] + let headers: [String: String] + let origin: String + let url: String +} + +struct PostResponse: Codable { + let args: [String: String] + let data: String + let files: [String: String] + let form: [String: String] + let headers: [String: String] + let json: [String: String]? + let origin: String + let url: String +}