Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Test] Network모듈 테스트 #186

Open
wants to merge 11 commits into
base: develop
Choose a base branch
from
7 changes: 5 additions & 2 deletions Heim/Domain/Domain/Error/NetworkError.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,15 @@
//

public enum NetworkError: Error {
case interalServerError
case clientError
case serverError
case invalidURL

public var description: String {
switch self {
case .interalServerError:
case .clientError:
return "잘못된 요청"
case .serverError:
return "네트워크 요청 실패"
case .invalidURL:
return "잘못된 URL"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public struct DefaultNetworkProvider: NetworkProvider {
public func request<T: Decodable>(target: RequestTarget, type: T.Type) async throws -> T {
let request = try target.makeURLRequest()
let (data, response) = try await requestor.data(for: request)
try handleNetworkStatus(response: response)

guard let responseDTO = try? JSONDecoder().decode(T.self, from: data) else {
if let body = request.httpBody,
Expand All @@ -39,7 +40,7 @@ public struct DefaultNetworkProvider: NetworkProvider {
if let responseBody = String(data: data, encoding: .utf8) {
Logger.log(message: "Response Body: \(responseBody)")
}
throw NetworkError.interalServerError
throw NetworkError.serverError
}

return responseDTO
Expand All @@ -49,3 +50,16 @@ public struct DefaultNetworkProvider: NetworkProvider {
return try target.makeURLRequest().url
}
}

private extension DefaultNetworkProvider {
func handleNetworkStatus(response: URLResponse) throws {
guard let response = response as? HTTPURLResponse else { throw NetworkError.invalidURL }
switch response.statusCode {
case 200...299: break
case 300...399: break
case 400...499: throw NetworkError.clientError
case 500...599: throw NetworkError.serverError
default: throw NetworkError.serverError
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public struct DefaultOAuthNetworkProvider: OAuthNetworkProvider {
try await authentication()
let request = try target.makeURLRequest(accessToken: try tokenManager.loadAccessToken())
let (data, response) = try await requestor.data(for: request)
try handleNetworkStatus(response: response)

guard let responseDTO = try? JSONDecoder().decode(T.self, from: data) else {
if let body = request.httpBody,
Expand All @@ -36,7 +37,7 @@ public struct DefaultOAuthNetworkProvider: OAuthNetworkProvider {
if let responseBody = String(data: data, encoding: .utf8) {
Logger.log(message: "Response Body: \(responseBody)")
}
throw NetworkError.interalServerError
throw NetworkError.serverError
}

return responseDTO
Expand Down Expand Up @@ -80,3 +81,16 @@ private extension DefaultOAuthNetworkProvider {
)
}
}

private extension DefaultOAuthNetworkProvider {
func handleNetworkStatus(response: URLResponse) throws {
guard let response = response as? HTTPURLResponse else { throw NetworkError.invalidURL }
switch response.statusCode {
case 200...299: break
case 300...399: break
case 400...499: throw NetworkError.clientError
case 500...599: throw NetworkError.serverError
default: throw NetworkError.serverError
}
}
}
36 changes: 0 additions & 36 deletions Heim/NetworkModule/NetworkModuleTests/NetworkModuleTests.swift

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
//
// NetworkProviderTests.swift
// NetworkProviderTests
//
// Created by 김미래 on 12/5/24
//

import XCTest

@testable import Domain
@testable import NetworkModule

final class NetworkProviderTests: XCTestCase {
// MARK: - Properties
var networkProvider: DefaultNetworkProvider!
var mockNetworkRequestor: MockNetworkRequestor!
struct MockData: Codable {
let name: String
let age: Int
}

let mockData: Data? = """
{
"name": "Heim",
"age": 1
}
""".data(using: .utf8)

// MARK: - TestCycle
override func setUp() {
mockNetworkRequestor = MockNetworkRequestor()
networkProvider = DefaultNetworkProvider(requestor: mockNetworkRequestor)

super.setUp()
}

override func tearDown() {
networkProvider = nil
mockNetworkRequestor = nil

super.tearDown()
}

func test_request_sucess() async throws {
// Given
let urlReponse = HTTPURLResponse(url: URL(string: "http://mock.example.com")!,
statusCode: 200,
httpVersion: nil,
headerFields: nil)

mockNetworkRequestor.setURLResponse(urlReponse)
mockNetworkRequestor.setResponseData(mockData)

let mockTarget = MockTarget.get.request

// When
let response = try await networkProvider.request(target: mockTarget, type: MockData.self)

// then
XCTAssertEqual(response.age, 1)
XCTAssertEqual(response.name, "Heim")
}

func test_DecodingError() async throws {
// Given
let urlReponse = HTTPURLResponse(url: URL(string: "http://mock.example.com")!,
statusCode: 200,
httpVersion: nil,
headerFields: nil)
mockNetworkRequestor.setURLResponse(urlReponse)
mockNetworkRequestor.setResponseData(mockData)

let mockTarget = MockTarget.get.request

// When
do {
try await networkProvider.request(target: mockTarget, type: Int.self)
XCTFail("Error가 발생하지 않음")
} catch(let error) {
guard let error = error as? NetworkError else {
XCTFail("error가 NetworkError이 아님")
return
}

// Then
XCTAssertEqual(error, NetworkError.serverError)
}
}

func test_invalidUrl() async throws {
let mockTarget = MockTarget.get.request

do {
try await networkProvider.request(target: mockTarget, type: MockData.self)
XCTFail("Error가 발생하지 않음")
} catch(let error) {
guard let error = error as? NetworkError else {
XCTFail("error가 NetworkError이 아님")
return
}

// THen
XCTAssertEqual(error, NetworkError.serverError)
}
}

func test_NetworkProvider_Return_invalidStatuscode() async throws {
// Given
let urlReponse = HTTPURLResponse(url: URL(string: "http://mock.example.com")!,
statusCode: 404,
httpVersion: nil,
headerFields: nil)

mockNetworkRequestor.setURLResponse(urlReponse)
mockNetworkRequestor.setResponseData(mockData)
let mockTarget = MockTarget.get.request

// When
do {
try await networkProvider.request(target: mockTarget, type: MockData.self)
XCTFail("Error가 발생하지 않았습니다.")
} catch(let error) {
guard let error = error as? NetworkError else {
XCTFail("Error 객체가 NetworkError 타입으로 캐스팅 되지 않음")
return
}

// Then
XCTAssertEqual(error, NetworkError.clientError)
}
}

func test_EmptyData() async throws {
// Given
let urlResponse = HTTPURLResponse(url: URL(string: "http://mock.example.com")!,
statusCode: 200,
httpVersion: nil,
headerFields: nil)
mockNetworkRequestor.setURLResponse(urlResponse)
let mockTarget = MockTarget.get.request

// When
do {
try await networkProvider.request(target: mockTarget, type: MockData.self)
} catch(let error) {
guard let error = error as? NetworkError else {
XCTFail("Error 객체가 NetworkError 타입으로 캐스팅 되지 않음")
return
}

// Then
XCTAssertEqual(error, NetworkError.serverError)
}
}
}
Loading