From e5cfb9ec6c2abc7c8c72446772a4bdcd282e7b83 Mon Sep 17 00:00:00 2001 From: JISU LEE Date: Tue, 30 Nov 2021 23:39:09 +0900 Subject: [PATCH 1/2] =?UTF-8?q?test:=20networkService=20responseError,=20?= =?UTF-8?q?=EC=84=B1=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BBus/BBus.xcodeproj/project.pbxproj | 4 + .../Network/Fetcher/ServiceFetchable.swift | 2 +- BBus/BBus/Global/Network/NetworkService.swift | 5 +- .../NetworkServiceTests.swift | 79 +++++++++++++++---- 4 files changed, 73 insertions(+), 17 deletions(-) diff --git a/BBus/BBus.xcodeproj/project.pbxproj b/BBus/BBus.xcodeproj/project.pbxproj index 18b31800..f73c4491 100644 --- a/BBus/BBus.xcodeproj/project.pbxproj +++ b/BBus/BBus.xcodeproj/project.pbxproj @@ -47,6 +47,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 */; }; 4A38E20727463FF7003A9D10 /* BBusAPIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A38E20627463FF7003A9D10 /* BBusAPIError.swift */; }; 4A38E20927464015003A9D10 /* PublisherExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A38E20827464015003A9D10 /* PublisherExtension.swift */; }; 4A3B6C502755DF2400BBC498 /* AlarmCenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A3B6C4F2755DF2400BBC498 /* AlarmCenter.swift */; }; @@ -1612,6 +1614,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4A2634AB2756678100267B47 /* BBusAPIError.swift in Sources */, + 4A2634AA2756674900267B47 /* NetworkService.swift in Sources */, 4AF1E0682756262300DE51C8 /* NetworkServiceTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/BBus/BBus/Global/Network/Fetcher/ServiceFetchable.swift b/BBus/BBus/Global/Network/Fetcher/ServiceFetchable.swift index fa2dfe62..68d36326 100644 --- a/BBus/BBus/Global/Network/Fetcher/ServiceFetchable.swift +++ b/BBus/BBus/Global/Network/Fetcher/ServiceFetchable.swift @@ -22,7 +22,7 @@ extension ServiceFetchable { 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) } diff --git a/BBus/BBus/Global/Network/NetworkService.swift b/BBus/BBus/Global/Network/NetworkService.swift index 2e037bb0..4c525fb4 100644 --- a/BBus/BBus/Global/Network/NetworkService.swift +++ b/BBus/BBus/Global/Network/NetworkService.swift @@ -13,17 +13,18 @@ enum NetworkError: Error { } protocol NetworkServiceProtocol { - func get(request: URLRequest, params: [String: String]) -> AnyPublisher + func get(request: URLRequest) -> AnyPublisher } struct NetworkService: NetworkServiceProtocol { - func get(request: URLRequest, params: [String: String]) -> AnyPublisher { + func get(request: URLRequest) -> AnyPublisher { 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 } diff --git a/BBus/NetworkServiceTests/NetworkServiceTests.swift b/BBus/NetworkServiceTests/NetworkServiceTests.swift index c46b1b3f..91cd2838 100644 --- a/BBus/NetworkServiceTests/NetworkServiceTests.swift +++ b/BBus/NetworkServiceTests/NetworkServiceTests.swift @@ -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 = [] 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) + } } From 4087dc4d9cee87ef66d27a6da619ac02692ff9de Mon Sep 17 00:00:00 2001 From: JISU LEE Date: Wed, 1 Dec 2021 15:14:18 +0900 Subject: [PATCH 2/2] =?UTF-8?q?docs:=20test=20=EB=B9=8C=EB=93=9C=20?= =?UTF-8?q?=ED=83=80=EA=B2=9F=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BBus/BBus.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BBus/BBus.xcodeproj/project.pbxproj b/BBus/BBus.xcodeproj/project.pbxproj index f73c4491..505b6aec 100644 --- a/BBus/BBus.xcodeproj/project.pbxproj +++ b/BBus/BBus.xcodeproj/project.pbxproj @@ -1967,7 +1967,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", @@ -1991,7 +1991,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",