diff --git a/BBus/AlarmSettingViewModelTests/AlarmSettingViewModelTests.swift b/BBus/AlarmSettingViewModelTests/AlarmSettingViewModelTests.swift index 79601a39..34bf5d56 100644 --- a/BBus/AlarmSettingViewModelTests/AlarmSettingViewModelTests.swift +++ b/BBus/AlarmSettingViewModelTests/AlarmSettingViewModelTests.swift @@ -10,31 +10,53 @@ import Combine class AlarmSettingViewModelTests: XCTestCase { enum MOCKMode { - case success + case success, failure } enum TestError: Error { case fail, jsonError } - class MOCKSearchAPIUseCase: AlarmSettingAPIUsable { + class MOCKAlarmSettingAPIUseCase: AlarmSettingAPIUsable { var mode: MOCKMode + var arrInfoByRouteDTO: ArrInfoByRouteDTO - init(mode: MOCKMode) { + init(mode: MOCKMode, arrInfoByRouteDTO: ArrInfoByRouteDTO) { self.mode = mode + self.arrInfoByRouteDTO = arrInfoByRouteDTO } func busArriveInfoWillLoaded(stId: String, busRouteId: String, ord: String) -> AnyPublisher { - return Fail(error: TestError.fail).eraseToAnyPublisher() + switch mode { + case .success: + return Just(self.arrInfoByRouteDTO) + .setFailureType(to: Error.self) + .eraseToAnyPublisher() + case .failure: + return Fail(error: TestError.fail).eraseToAnyPublisher() + } + } func busStationsInfoWillLoaded(busRouetId: String, arsId: String) -> AnyPublisher<[StationByRouteListDTO]?, Error> { - return Fail(error: TestError.fail).eraseToAnyPublisher() + return Just([]) + .setFailureType(to: Error.self) + .eraseToAnyPublisher() } } private var cancellables: Set! private var arrInfoByRouteDTO: ArrInfoByRouteDTO! + private let firstArriveInfo = AlarmSettingBusArriveInfo(busArriveRemainTime: "곧 도착", + congestion: 3, + currentStation: "모두의학교.금천문화예술정보학교", + plainNumber: "서울71사1535", + vehicleId: 117020066) + private let secondArriveInfo = AlarmSettingBusArriveInfo(busArriveRemainTime: "7분9초후[3번째 전]", + congestion: 4, + currentStation: "호림박물관", + plainNumber: "서울71사1519", + vehicleId: 117020207) override func setUpWithError() throws { guard let url = Bundle.init(identifier: "com.boostcamp.ios-009.AlarmSettingViewModelTests")? @@ -53,7 +75,51 @@ class AlarmSettingViewModelTests: XCTestCase { super.tearDown() } - func test_bindBusArriveInfo_성공() { + func test_refresh_성공() { + let MOCCKAlarmSettingUseCase = MOCKAlarmSettingAPIUseCase(mode: .success, arrInfoByRouteDTO: self.arrInfoByRouteDTO) + let alarmSettingVieWModel = AlarmSettingViewModel(apiUseCase: MOCCKAlarmSettingUseCase, + calculateUseCase: AlarmSettingCalculateUseCase(), + stationId: 1, + busRouteId: 1, + stationOrd: 1, + arsId: "11111", + routeType: RouteType.mainLine, + busName: "11") + let expectation = expectation(description: "AlarmSettingViewModel에 busArriveInfos가 저장되는지 확인") + let expectedFirstArriveInfo = self.firstArriveInfo + let expectedSecondArriveInfo = self.secondArriveInfo + let expectedResult = AlarmSettingBusArriveInfos(arriveInfos: [expectedFirstArriveInfo, expectedSecondArriveInfo], changedByTimer: false) + alarmSettingVieWModel.$busArriveInfos + .receive(on: DispatchQueue.global()) + .filter { $0.count != 0 } + .sink { busArriveInfos in + let firstArriveInfo = busArriveInfos.arriveInfos[0] + let secondArriveInfo = busArriveInfos.arriveInfos[1] + + XCTAssertEqual(busArriveInfos.count, expectedResult.count) + XCTAssertEqual(firstArriveInfo.congestion, expectedFirstArriveInfo.congestion) + XCTAssertEqual(firstArriveInfo.arriveRemainTime?.message, expectedFirstArriveInfo.arriveRemainTime?.message) + XCTAssertEqual(firstArriveInfo.arriveRemainTime?.seconds, expectedFirstArriveInfo.arriveRemainTime?.seconds) + XCTAssertEqual(firstArriveInfo.currentStation, expectedFirstArriveInfo.currentStation) + XCTAssertEqual(firstArriveInfo.estimatedArrivalTime, expectedFirstArriveInfo.estimatedArrivalTime) + XCTAssertEqual(firstArriveInfo.relativePosition, expectedFirstArriveInfo.relativePosition) + XCTAssertEqual(firstArriveInfo.vehicleId, expectedFirstArriveInfo.vehicleId) + XCTAssertEqual(firstArriveInfo.plainNumber, expectedFirstArriveInfo.plainNumber) + XCTAssertEqual(secondArriveInfo.congestion, expectedSecondArriveInfo.congestion) + XCTAssertEqual(secondArriveInfo.arriveRemainTime?.message, expectedSecondArriveInfo.arriveRemainTime?.message) + XCTAssertEqual(secondArriveInfo.arriveRemainTime?.seconds, expectedSecondArriveInfo.arriveRemainTime?.seconds) + XCTAssertEqual(secondArriveInfo.currentStation, expectedSecondArriveInfo.currentStation) + XCTAssertEqual(secondArriveInfo.estimatedArrivalTime, expectedSecondArriveInfo.estimatedArrivalTime) + XCTAssertEqual(secondArriveInfo.relativePosition, expectedSecondArriveInfo.relativePosition) + XCTAssertEqual(secondArriveInfo.vehicleId, expectedSecondArriveInfo.vehicleId) + XCTAssertEqual(secondArriveInfo.plainNumber, expectedSecondArriveInfo.plainNumber) + XCTAssertFalse(busArriveInfos.changedByTimer) + + expectation.fulfill() + } + .store(in: &self.cancellables) + + waitForExpectations(timeout: 10) } } diff --git a/BBus/BBus.xcodeproj/project.pbxproj b/BBus/BBus.xcodeproj/project.pbxproj index 13ffc124..7038c73f 100644 --- a/BBus/BBus.xcodeproj/project.pbxproj +++ b/BBus/BBus.xcodeproj/project.pbxproj @@ -51,6 +51,18 @@ 04DEBDEF27572E8800B53D5F /* StationByRouteListDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 049375B4273BB98E0061ACDA /* StationByRouteListDTO.swift */; }; 04DEBDF027572E8D00B53D5F /* JsonDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0446843C275679B9007E440A /* JsonDTO.swift */; }; 04DEBDF22757311F00B53D5F /* MOCKArrInfo.json in Resources */ = {isa = PBXBuildFile; fileRef = 04DEBDF12757311F00B53D5F /* MOCKArrInfo.json */; }; + 04DEBDF32757353800B53D5F /* AlarmSettingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ACA5222272FCEB500EC0531 /* AlarmSettingViewModel.swift */; }; + 04DEBDF42757355D00B53D5F /* BusRouteDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 049375AA273B9F330061ACDA /* BusRouteDTO.swift */; }; + 04DEBDF5275735D900B53D5F /* AlarmSettingCalculateUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875F1AB12755BE08003F5BB1 /* AlarmSettingCalculateUseCase.swift */; }; + 04DEBDF62757364D00B53D5F /* AlarmSettingCalculatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0446843627567777007E440A /* AlarmSettingCalculatable.swift */; }; + 04DEBDF72757365C00B53D5F /* AverageSectionTimeCalculatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875F1AAF2755BD86003F5BB1 /* AverageSectionTimeCalculatable.swift */; }; + 04DEBDF82757366C00B53D5F /* AlarmSettingBusArriveInfos.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0484107527464D49006F8636 /* AlarmSettingBusArriveInfos.swift */; }; + 04DEBDF9275736AB00B53D5F /* NotificationNameExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A06AEE82743DAB20027222D /* NotificationNameExtension.swift */; }; + 04DEBDFA275736B500B53D5F /* PublisherExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A38E20827464015003A9D10 /* PublisherExtension.swift */; }; + 04DEBDFB275736C200B53D5F /* AlarmSettingBusArriveInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ACA521E272FCEAA00EC0531 /* AlarmSettingBusArriveInfo.swift */; }; + 04DEBDFC275736D700B53D5F /* BusRemainTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A094CDE27435C5900428F55 /* BusRemainTime.swift */; }; + 04DEBDFD275736DE00B53D5F /* BusCongestion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ACA5212272FCE8500EC0531 /* BusCongestion.swift */; }; + 04DEBDFE275736EE00B53D5F /* BBusAPIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A38E20627463FF7003A9D10 /* BBusAPIError.swift */; }; 4A04682427327876008D87CE /* BusRouteCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A04682327327876008D87CE /* BusRouteCoordinator.swift */; }; 4A04682627327BA0008D87CE /* AlarmSettingCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A04682527327BA0008D87CE /* AlarmSettingCoordinator.swift */; }; 4A04682A2732B7B3008D87CE /* SearchNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A0468292732B7B3008D87CE /* SearchNavigationView.swift */; }; @@ -1759,11 +1771,23 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 04DEBDF82757366C00B53D5F /* AlarmSettingBusArriveInfos.swift in Sources */, + 04DEBDF72757365C00B53D5F /* AverageSectionTimeCalculatable.swift in Sources */, 04DEBDEE27572E8400B53D5F /* BaseUseCase.swift in Sources */, + 04DEBDFC275736D700B53D5F /* BusRemainTime.swift in Sources */, 04DEBDF027572E8D00B53D5F /* JsonDTO.swift in Sources */, + 04DEBDF32757353800B53D5F /* AlarmSettingViewModel.swift in Sources */, 4AF1E0D0275626A700DE51C8 /* AlarmSettingViewModelTests.swift in Sources */, + 04DEBDFA275736B500B53D5F /* PublisherExtension.swift in Sources */, + 04DEBDF42757355D00B53D5F /* BusRouteDTO.swift in Sources */, 04DEBDEC27572E4700B53D5F /* AlarmSettingAPIUsable.swift in Sources */, + 04DEBDFD275736DE00B53D5F /* BusCongestion.swift in Sources */, + 04DEBDF5275735D900B53D5F /* AlarmSettingCalculateUseCase.swift in Sources */, + 04DEBDF9275736AB00B53D5F /* NotificationNameExtension.swift in Sources */, + 04DEBDF62757364D00B53D5F /* AlarmSettingCalculatable.swift in Sources */, 04DEBDED27572E6400B53D5F /* ArrInfoByRouteDTO.swift in Sources */, + 04DEBDFE275736EE00B53D5F /* BBusAPIError.swift in Sources */, + 04DEBDFB275736C200B53D5F /* AlarmSettingBusArriveInfo.swift in Sources */, 04DEBDEF27572E8800B53D5F /* StationByRouteListDTO.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/BBus/BBus/Foreground/AlarmSetting/ViewModel/AlarmSettingViewModel.swift b/BBus/BBus/Foreground/AlarmSetting/ViewModel/AlarmSettingViewModel.swift index 271526de..2170151e 100644 --- a/BBus/BBus/Foreground/AlarmSetting/ViewModel/AlarmSettingViewModel.swift +++ b/BBus/BBus/Foreground/AlarmSetting/ViewModel/AlarmSettingViewModel.swift @@ -25,7 +25,7 @@ final class AlarmSettingViewModel { private var cancellables: Set private var observer: NSObjectProtocol? - init(apiUseCase: AlarmSettingAPIUseCase, calculateUseCase: AlarmSettingCalculateUseCase, stationId: Int, busRouteId: Int, stationOrd: Int, arsId: String, routeType: RouteType?, busName: String) { + init(apiUseCase: AlarmSettingAPIUsable, calculateUseCase: AlarmSettingCalculatable, stationId: Int, busRouteId: Int, stationOrd: Int, arsId: String, routeType: RouteType?, busName: String) { self.apiUseCase = apiUseCase self.calculateUseCase = calculateUseCase self.stationId = stationId