Skip to content

Commit

Permalink
Merge pull request #340 from boostcampwm-2021/test/AlarmSettingViewMo…
Browse files Browse the repository at this point in the history
…delTests

[테스트] AlarmSettingViewModel 테스트
  • Loading branch information
Modyhoon authored Dec 2, 2021
2 parents 3eb9bf4 + cbce413 commit 2e50150
Show file tree
Hide file tree
Showing 4 changed files with 190 additions and 16 deletions.
150 changes: 137 additions & 13 deletions BBus/AlarmSettingViewModelTests/AlarmSettingViewModelTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,151 @@
//

import XCTest
import Combine

class AlarmSettingViewModelTests: XCTestCase {
enum MOCKMode {
case success, failure
}

enum TestError: Error {
case fail, jsonError
}

class MOCKAlarmSettingAPIUseCase: AlarmSettingAPIUsable {
var mode: MOCKMode
var arrInfoByRouteDTO: ArrInfoByRouteDTO

init(mode: MOCKMode, arrInfoByRouteDTO: ArrInfoByRouteDTO) {
self.mode = mode
self.arrInfoByRouteDTO = arrInfoByRouteDTO
}

func busArriveInfoWillLoaded(stId: String, busRouteId: String, ord: String) -> AnyPublisher<ArrInfoByRouteDTO, Error> {
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 Just([])
.setFailureType(to: Error.self)
.eraseToAnyPublisher()
}
}

private var cancellables: Set<AnyCancellable>!
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 {
// Put setup code here. This method is called before the invocation of each test method in the class.
guard let url = Bundle.init(identifier: "com.boostcamp.ios-009.AlarmSettingViewModelTests")?
.url(forResource: "MOCKArrInfo", withExtension: "json"),
let data = try? Data(contentsOf: url),
let arrInfoByRouteDTO = try? JSONDecoder().decode(ArrInfoByRouteDTO.self, from: data) else { throw TestError.jsonError }

self.cancellables = []
self.arrInfoByRouteDTO = arrInfoByRouteDTO
super.setUp()
}

override func tearDownWithError() throws {
// Put teardown code here. This method is called after the invocation of each test method in the class.
self.cancellables = nil
self.arrInfoByRouteDTO = nil
super.tearDown()
}

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.

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 = self.expectation(description: "AlarmSettingViewModel에 busArriveInfos가 저장되는지 확인")
let expectedFirstArriveInfo = self.firstArriveInfo
let expectedSecondArriveInfo = self.secondArriveInfo
let expectedResult = AlarmSettingBusArriveInfos(arriveInfos: [expectedFirstArriveInfo, expectedSecondArriveInfo], changedByTimer: false)

alarmSettingVieWModel.refresh()
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)
}

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_refresh_arriveInfo가_에러를_리턴하여_실패() {
let MOCCKAlarmSettingUseCase = MOCKAlarmSettingAPIUseCase(mode: .failure, 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 = self.expectation(description: "AlarmSettingViewModel에 busArriveInfos가 에러를 리턴하는지 확인")

alarmSettingVieWModel.refresh()
alarmSettingVieWModel.$networkError
.receive(on: DispatchQueue.global())
.compactMap { $0 }
.sink { error in
guard let error = error as? TestError else { XCTFail(); return; }
switch error {
case .fail:
expectation.fulfill()
default:
XCTFail()
}
}
.store(in: &self.cancellables)

waitForExpectations(timeout: 10)
}

}
12 changes: 12 additions & 0 deletions BBus/AlarmSettingViewModelTests/MOCKArrInfo.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"arrmsg1": "곧 도착",
"arrmsg2": "7분9초후[3번째 전]",
"reride_Num1": "3",
"reride_Num2": "4",
"stationNm1": "모두의학교.금천문화예술정보학교",
"stationNm2": "호림박물관",
"plainNo1": "서울71사1535",
"plainNo2": "서울71사1519",
"vehId1": "117020066",
"vehId2": "117020207"
}
42 changes: 40 additions & 2 deletions BBus/BBus.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,24 @@
04C6D6692734B18A00D41678 /* MovingStatusTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04C6D6682734B18A00D41678 /* MovingStatusTableViewCell.swift */; };
04C6D66B2734BCAB00D41678 /* MovingStatusBusTagView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04C6D66A2734BCAB00D41678 /* MovingStatusBusTagView.swift */; };
04DC47FB27552FE5003380D9 /* StationCalculateUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04DC47FA27552FE5003380D9 /* StationCalculateUseCase.swift */; };
04DEBDEC27572E4700B53D5F /* AlarmSettingAPIUsable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0446843427567769007E440A /* AlarmSettingAPIUsable.swift */; };
04DEBDED27572E6400B53D5F /* ArrInfoByRouteDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 049375BC273C2E120061ACDA /* ArrInfoByRouteDTO.swift */; };
04DEBDEE27572E8400B53D5F /* BaseUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A5100322754CDB100754B36 /* BaseUseCase.swift */; };
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 */; };
Expand Down Expand Up @@ -389,6 +407,7 @@
04C6D6682734B18A00D41678 /* MovingStatusTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MovingStatusTableViewCell.swift; sourceTree = "<group>"; };
04C6D66A2734BCAB00D41678 /* MovingStatusBusTagView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MovingStatusBusTagView.swift; sourceTree = "<group>"; };
04DC47FA27552FE5003380D9 /* StationCalculateUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StationCalculateUseCase.swift; sourceTree = "<group>"; };
04DEBDF12757311F00B53D5F /* MOCKArrInfo.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = MOCKArrInfo.json; sourceTree = "<group>"; };
4A04682327327876008D87CE /* BusRouteCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BusRouteCoordinator.swift; sourceTree = "<group>"; };
4A04682527327BA0008D87CE /* AlarmSettingCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlarmSettingCoordinator.swift; sourceTree = "<group>"; };
4A0468292732B7B3008D87CE /* SearchNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchNavigationView.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1224,6 +1243,7 @@
isa = PBXGroup;
children = (
4AF1E0CF275626A700DE51C8 /* AlarmSettingViewModelTests.swift */,
04DEBDF12757311F00B53D5F /* MOCKArrInfo.json */,
);
path = AlarmSettingViewModelTests;
sourceTree = "<group>";
Expand Down Expand Up @@ -1736,6 +1756,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
04DEBDF22757311F00B53D5F /* MOCKArrInfo.json in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -1905,7 +1926,24 @@
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;
};
Expand Down Expand Up @@ -2611,7 +2649,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 @@ -2635,7 +2673,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
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ final class AlarmSettingViewModel {
private var cancellables: Set<AnyCancellable>
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
Expand Down

0 comments on commit 2e50150

Please sign in to comment.