diff --git a/BBus/BBus.xcodeproj/project.pbxproj b/BBus/BBus.xcodeproj/project.pbxproj index c515be9b..bd6c03ce 100644 --- a/BBus/BBus.xcodeproj/project.pbxproj +++ b/BBus/BBus.xcodeproj/project.pbxproj @@ -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 */; }; @@ -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 */; }; @@ -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; @@ -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", @@ -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", diff --git a/BBus/BBus/Global/Network/Fetcher/ServiceFetchable.swift b/BBus/BBus/Global/Network/Fetcher/ServiceFetchable.swift index d3f19b77..f8ae2acd 100644 --- a/BBus/BBus/Global/Network/Fetcher/ServiceFetchable.swift +++ b/BBus/BBus/Global/Network/Fetcher/ServiceFetchable.swift @@ -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) } 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) + } }