Skip to content

Commit

Permalink
Merge pull request #341 from boostcampwm-2021/test/NetworkServiceTests
Browse files Browse the repository at this point in the history
[테스트] NetworkService 테스트
  • Loading branch information
Modyhoon authored Dec 2, 2021
2 parents 2e50150 + 739eccf commit 08ea36d
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 20 deletions.
9 changes: 6 additions & 3 deletions BBus/BBus.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@
4A1A22DB27326FD100476861 /* HomeNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A1A22DA27326FD100476861 /* HomeNavigationView.swift */; };
4A1A22DD2732801700476861 /* StationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A1A22DC2732801700476861 /* StationCoordinator.swift */; };
4A1A22E12732CE7900476861 /* SearchResultCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A1A22E02732CE7900476861 /* SearchResultCollectionViewCell.swift */; };
4A2634AA2756674900267B47 /* NetworkService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87038A89273B96B60078EAE3 /* NetworkService.swift */; };
4A2634AB2756678100267B47 /* BBusAPIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A38E20627463FF7003A9D10 /* BBusAPIError.swift */; };
4A2634AC27566F8600267B47 /* StationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ACA5216272FCE8E00EC0531 /* StationViewModel.swift */; };
4A2634AF275670A500267B47 /* BaseUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A5100322754CDB100754B36 /* BaseUseCase.swift */; };
4A2634B0275670BE00267B47 /* StationByUidItemDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 049375B8273BE2640061ACDA /* StationByUidItemDTO.swift */; };
Expand All @@ -106,7 +108,6 @@
4A2634BA2756757F00267B47 /* PublisherExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A38E20827464015003A9D10 /* PublisherExtension.swift */; };
4A2634BB2756758C00267B47 /* BusCongestion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ACA5212272FCE8500EC0531 /* BusCongestion.swift */; };
4A2634BC2756759700267B47 /* AlarmSettingBusArriveInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ACA521E272FCEAA00EC0531 /* AlarmSettingBusArriveInfo.swift */; };
4A2634BD275675A800267B47 /* BBusAPIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A38E20627463FF7003A9D10 /* BBusAPIError.swift */; };
4A2634BE275675C400267B47 /* BusRemainTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A094CDE27435C5900428F55 /* BusRemainTime.swift */; };
4A2634BF275675CD00267B47 /* BusPosByVehicleIdDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ADB29BA274B6C8300554A4E /* BusPosByVehicleIdDTO.swift */; };
4A2634C12756862F00267B47 /* StationAPIUsable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04468430275676ED007E440A /* StationAPIUsable.swift */; };
Expand Down Expand Up @@ -1793,6 +1794,8 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4A2634AB2756678100267B47 /* BBusAPIError.swift in Sources */,
4A2634AA2756674900267B47 /* NetworkService.swift in Sources */,
4AF1E0682756262300DE51C8 /* NetworkServiceTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand Down Expand Up @@ -2265,7 +2268,7 @@
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = B3PWYBKFUK;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand All @@ -2289,7 +2292,7 @@
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = B3PWYBKFUK;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down
2 changes: 1 addition & 1 deletion BBus/BBus/Global/Network/Fetcher/ServiceFetchable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ extension ServiceFetchable {
guard let key = try? self.tokenManager.randomAccessKey() else { return BBusAPIError.noMoreAccessKeyError.publisher }
guard let request =
self.requestFactory.request(url: url, accessKey: key.key, params: param) else { return NetworkError.urlError.publisher }
return networkService.get(request: request, params: param)
return networkService.get(request: request)
.mapJsonBBusAPIError {
self.tokenManager.removeAccessKey(at: key.index)
}
Expand Down
5 changes: 3 additions & 2 deletions BBus/BBus/Global/Network/NetworkService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,18 @@ enum NetworkError: Error {
}

protocol NetworkServiceProtocol {
func get(request: URLRequest, params: [String: String]) -> AnyPublisher<Data, Error>
func get(request: URLRequest) -> AnyPublisher<Data, Error>
}

struct NetworkService: NetworkServiceProtocol {
func get(request: URLRequest, params: [String: String]) -> AnyPublisher<Data, Error> {
func get(request: URLRequest) -> AnyPublisher<Data, Error> {
return URLSession.shared.dataTaskPublisher(for: request)
.mapError({ $0 as Error })
.tryMap { data, response -> Data in
guard let response = response as? HTTPURLResponse else {
throw NetworkError.noResponseError
}
print(response.statusCode)
if response.statusCode != 200 {
throw NetworkError.responseError
}
Expand Down
79 changes: 65 additions & 14 deletions BBus/NetworkServiceTests/NetworkServiceTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,78 @@
//

import XCTest
import Combine

class NetworkServiceTests: XCTestCase {

private let timeout: TimeInterval = 10
private var successRequest: URLRequest?
private var redirectFailRequest: URLRequest?
private var cancellables: Set<AnyCancellable> = []

override func setUpWithError() throws {
// Put setup code here. This method is called before the invocation of each test method in the class.
guard let successRequest = self.makeSuccessRequest(),
let redirectFailRequest = self.makeRedirectRequest() else { throw NetworkError.urlError }
self.successRequest = successRequest
self.redirectFailRequest = redirectFailRequest
}

override func tearDownWithError() throws {
// Put teardown code here. This method is called after the invocation of each test method in the class.

private func makeSuccessRequest() -> URLRequest? {
guard let key = Bundle.main.infoDictionary?["API_ACCESS_KEY1"] as? String,
let url = URL(string: "http://ws.bus.go.kr/api/rest/arrive/getLowArrInfoByStId?stId=100&resultType=json&serviceKey=\(key)")
else { return nil }
return URLRequest(url: url)
}

func testExample() throws {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
private func makeRedirectRequest() -> URLRequest? {
guard let url = URL(string: "http://www.naver.com/.png") else { return nil }
return URLRequest(url: url)
}

func testPerformanceExample() throws {
// This is an example of a performance test case.
measure {
// Put the code you want to measure the time of here.
}

func test_get_요청_성공() throws {
// given
let expectation = self.expectation(description: "get 요청이 성공되어야 한다.")
guard let successRequest = self.successRequest else { return }
let networkService = NetworkService()
var data: Data? = nil

// when
networkService.get(request: successRequest)
.sink(receiveCompletion: { _ in
expectation.fulfill()
}, receiveValue: { result in
data = result
})
.store(in: &self.cancellables)

waitForExpectations(timeout: self.timeout)

// then
XCTAssertNotNil(data)
}

func test_get_리다이렉트로_요청_실패() throws {
// given
let expectation = self.expectation(description: "get 요청이 실패되어야 한다.")
guard let redirectFailRequest = self.redirectFailRequest else { return }
let networkService = NetworkService()
var error: Error? = nil

// when
networkService.get(request: redirectFailRequest)
.sink(receiveCompletion: { result in
if case .failure(let resultError) = result {
error = resultError
}
expectation.fulfill()
}, receiveValue: { data in
return
})
.store(in: &self.cancellables)

waitForExpectations(timeout: self.timeout)

// then
XCTAssertNotNil(error)
}
}

0 comments on commit 08ea36d

Please sign in to comment.