RIBsTests/Router/RouterTests.swift (111 lines of code) (raw):
//
// Copyright (c) 2017. Uber Technologies
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import RxSwift
import XCTest
@testable import RIBs
final class RouterMock: Routing {
var interactable: Interactable
var children: [Routing]
init(interactor: Interactable) {
self.interactable = interactor
self.children = []
}
var attachChildCallCount = 0
func attachChild(_ child: Routing) {
attachChildCallCount += 1
}
var detachChildCallCount = 0
func detachChild(_ child: Routing) {
detachChildCallCount += 1
}
var lifecycle: Observable<RouterLifecycle> {
return Observable.just(.didLoad)
}
var loadCallCount = 0
func load() {
loadCallCount += 1
}
}
final class RouterTests: XCTestCase {
private var router: Router<Interactable>!
private var lifecycleDisposable: Disposable = Disposables.create()
private var leakDetectorMock: LeakDetectorMock = LeakDetectorMock()
// MARK: - Setup
override func setUp() {
super.setUp()
leakDetectorMock = LeakDetectorMock()
LeakDetector.setInstance(leakDetectorMock)
}
override func tearDown() {
super.tearDown()
lifecycleDisposable.dispose()
}
// MARK: - Tests
func test_load_verifyLifecycleObservable() {
router = Router(interactor: InteractableMock())
var currentLifecycle: RouterLifecycle?
var didComplete = false
lifecycleDisposable = router
.lifecycle
.subscribe(onNext: { lifecycle in
currentLifecycle = lifecycle
}, onCompleted: {
currentLifecycle = nil
didComplete = true
})
XCTAssertNil(currentLifecycle)
XCTAssertFalse(didComplete)
router.load()
XCTAssertEqual(currentLifecycle, RouterLifecycle.didLoad)
XCTAssertFalse(didComplete)
router = nil
XCTAssertNil(currentLifecycle)
XCTAssertTrue(didComplete)
}
func test_attachChild() {
// given
router = Router(interactor: InteractableMock())
let mockChildInteractor = InteractableMock()
let mockChildRouter = RouterMock(interactor: mockChildInteractor)
// when
router.attachChild(mockChildRouter)
// then
XCTAssertEqual(router.children.count, 1)
XCTAssertEqual(mockChildInteractor.activateCallCount, 1)
XCTAssertEqual(mockChildRouter.loadCallCount, 1)
}
func test_attachChild_activatesSubtreeOfTheChild() {
// given
router = Router(interactor: InteractableMock())
let childInteractor = InteractableMock()
let childRouter = Router(interactor: childInteractor)
let grandChildInteractor = InteractableMock()
let grandChildRouter = RouterMock(interactor: grandChildInteractor)
childRouter.attachChild(grandChildRouter)
router.load()
// when
router.attachChild(childRouter)
// then
XCTAssertEqual(grandChildInteractor.activateCallCount, 1)
XCTAssertEqual(grandChildRouter.loadCallCount, 1)
}
func test_detachChild() {
// given
router = Router(interactor: InteractableMock())
let mockChildInteractor = InteractableMock()
let mockChildRouter = RouterMock(interactor: mockChildInteractor)
router.attachChild(mockChildRouter)
// when
router.detachChild(mockChildRouter)
// then
XCTAssertEqual(router.children.count, 0)
XCTAssertEqual(mockChildInteractor.deactivateCallCount, 1)
}
func test_detachChild_deactivatesSubtreeOfTheChild() {
// given
router = Router(interactor: InteractableMock())
let childInteractor = Interactor()
let childRouter = Router(interactor: childInteractor)
let grandChildInteractor = InteractableMock()
let grandChildRouter = RouterMock(interactor: grandChildInteractor)
router.load()
router.attachChild(childRouter)
childRouter.attachChild(grandChildRouter)
grandChildInteractor.isActive = true
// when
router.detachChild(childRouter)
// then
XCTAssertEqual(grandChildInteractor.deactivateCallCount, 1)
}
func test_deinit_triggers_leakDetection() {
// given
let interactor = InteractableMock()
router = Router(interactor: interactor)
router.load()
// when
router = nil
// then
XCTAssertEqual(leakDetectorMock.expectDeallocateCallCount, 1)
}
}