From 29e19d8fdf1b649f328b95d6f98dfcd53ed2d753 Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Sun, 4 Dec 2022 17:50:15 +0100 Subject: [PATCH] Added support for the "forbidden" response status in the APIClient client. --- .../Enumerations/ResponseStatus.swift | 1 + .../APIService/Structs/APIClient.swift | 5 ++ .../Structs/APIClient+RequestTests.swift | 51 +++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/Libraries/Sources/APIService/Enumerations/ResponseStatus.swift b/Libraries/Sources/APIService/Enumerations/ResponseStatus.swift index 1338d68..8d09e02 100644 --- a/Libraries/Sources/APIService/Enumerations/ResponseStatus.swift +++ b/Libraries/Sources/APIService/Enumerations/ResponseStatus.swift @@ -11,5 +11,6 @@ enum ResponseStatus: Int { case created = 201 case noContent = 204 case badRequest = 400 + case forbidden = 403 case notFound = 404 } diff --git a/Libraries/Sources/APIService/Structs/APIClient.swift b/Libraries/Sources/APIService/Structs/APIClient.swift index 47751cd..2397fd3 100644 --- a/Libraries/Sources/APIService/Structs/APIClient.swift +++ b/Libraries/Sources/APIService/Structs/APIClient.swift @@ -50,6 +50,8 @@ extension APIClient: Client { throw APIClientError.notSupported case .badRequest: throw APIClientError.itemAlreadyExist + case .forbidden: + throw APIClientError.authenticationFailed case .notFound: throw APIClientError.itemDoesNotExist } @@ -77,6 +79,8 @@ extension APIClient: Client { throw APIClientError.notSupported case .badRequest: throw APIClientError.itemIsNotFile + case .forbidden: + throw APIClientError.authenticationFailed case .notFound: throw APIClientError.itemDoesNotExist } @@ -106,6 +110,7 @@ private extension APIClient { public enum APIClientError: Error { case responseNotReturned + case authenticationFailed case itemIsNotFile case itemAlreadyExist case itemDoesNotExist diff --git a/Libraries/Tests/APIServiceTests/Cases/Structs/APIClient+RequestTests.swift b/Libraries/Tests/APIServiceTests/Cases/Structs/APIClient+RequestTests.swift index 00611a3..2c2e977 100644 --- a/Libraries/Tests/APIServiceTests/Cases/Structs/APIClient+RequestTests.swift +++ b/Libraries/Tests/APIServiceTests/Cases/Structs/APIClient+RequestTests.swift @@ -157,6 +157,31 @@ final class APIClientRequestTests: XCTestCase { } } + func test_withSomeEndpoint_andSomeModel_whenResponseStatusForbidden() async throws { + // GIVEN + let endpoint = GetMeEndpoint( + username: "username", + password: "password" + ) + + url = try makeURLRequest(endpoint: endpoint).url + + MockURLProtocol.mockData[url] = MockURLResponse( + status: .forbidden, + headers: [:], + data: nil + ) + + // WHEN & THEN + do { + _ = try await client.request(endpoint: endpoint, model: Me.self) + } catch APIClientError.authenticationFailed { + XCTAssertTrue(true) + } catch { + XCTAssertTrue(false) + } + } + func test_withSomeEndpoint_andSomeModel_whenResponseStatusNotFound() async throws { // GIVEN let endpoint = GetMeEndpoint( @@ -308,6 +333,32 @@ final class APIClientRequestTests: XCTestCase { } } + func test_withSomeEndpoint_whenResponseStatusForbidden() async throws { + // GIVEN + let endpoint = GetDataEndpoint( + itemId: UUID().uuidString, + username: "username", + password: "password" + ) + + url = try makeURLRequest(endpoint: endpoint).url + + MockURLProtocol.mockData[url] = MockURLResponse( + status: .forbidden, + headers: [:], + data: nil + ) + + // WHEN & THEN + do { + try await client.request(endpoint: endpoint) + } catch APIClientError.authenticationFailed { + XCTAssertTrue(true) + } catch { + XCTAssertTrue(false) + } + } + func test_withSomeEndpoint_whenResponseStatusNotFound() async throws { // GIVEN let endpoint = GetDataEndpoint(