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

[테스트] NetworkService 테스트 #341

Merged
merged 3 commits into from
Dec 2, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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)
}
}