mirror of
https://github.com/fxm90/GradientLoadingBar.git
synced 2026-04-17 12:17:30 +00:00
116 lines
3.8 KiB
Swift
116 lines
3.8 KiB
Swift
//
|
|
// GradientLoadingBarViewModelTestCase.swift
|
|
// ExampleTests
|
|
//
|
|
// Created by Felix Mau on 26.12.17.
|
|
// Copyright © 2017 Felix Mau. All rights reserved.
|
|
//
|
|
|
|
import XCTest
|
|
import LightweightObservable
|
|
|
|
@testable import GradientLoadingBar
|
|
|
|
final class GradientLoadingBarViewModelTestCase: XCTestCase {
|
|
|
|
// MARK: - Private properties
|
|
|
|
private var sharedApplicationMock: SharedApplicationMock!
|
|
private var notificationCenter: NotificationCenter!
|
|
|
|
// MARK: - Public methods
|
|
|
|
override func setUp() {
|
|
super.setUp()
|
|
|
|
sharedApplicationMock = SharedApplicationMock()
|
|
notificationCenter = NotificationCenter()
|
|
}
|
|
|
|
override func tearDown() {
|
|
notificationCenter = nil
|
|
sharedApplicationMock = nil
|
|
|
|
super.tearDown()
|
|
}
|
|
|
|
// MARK: - Test observable `superview`
|
|
|
|
func test_initializer_shouldSetupSuperviewObservable_withNil() throws {
|
|
// When
|
|
let viewModel = GradientLoadingBarViewModel(sharedApplication: sharedApplicationMock,
|
|
notificationCenter: notificationCenter)
|
|
|
|
// Then
|
|
// The property `superview` is an optional, as well as the property `value`.
|
|
// Therefore we can't use `XCTAssertNil` here, as this doesn't work with double optionals.
|
|
XCTAssertEqual(viewModel.superview.value, .some(nil))
|
|
}
|
|
|
|
func test_initializer_shouldSetupSuperviewObservable_withKeyWindow() {
|
|
// Given
|
|
let keyWindow = UIWindow()
|
|
sharedApplicationMock.keyWindowInConnectedScenes = keyWindow
|
|
|
|
// When
|
|
let viewModel = GradientLoadingBarViewModel(sharedApplication: sharedApplicationMock,
|
|
notificationCenter: notificationCenter)
|
|
|
|
// Then
|
|
XCTAssertEqual(viewModel.superview.value, keyWindow)
|
|
}
|
|
|
|
func test_initializer_shouldSetupSuperviewObservable_afterUIWindowDidBecomeKeyNotification() {
|
|
// Given
|
|
sharedApplicationMock.keyWindowInConnectedScenes = nil
|
|
|
|
let viewModel = GradientLoadingBarViewModel(sharedApplication: sharedApplicationMock,
|
|
notificationCenter: notificationCenter)
|
|
|
|
// When
|
|
let keyWindow = UIWindow()
|
|
sharedApplicationMock.keyWindowInConnectedScenes = keyWindow
|
|
|
|
notificationCenter.post(name: UIWindow.didBecomeKeyNotification,
|
|
object: nil)
|
|
|
|
// Then
|
|
XCTAssertEqual(viewModel.superview.value, keyWindow)
|
|
}
|
|
|
|
func test_deinit_shouldResetSuperviewObservable_withNil() {
|
|
// Given
|
|
let keyWindow = UIWindow()
|
|
sharedApplicationMock.keyWindowInConnectedScenes = keyWindow
|
|
|
|
var viewModel: GradientLoadingBarViewModel? = GradientLoadingBarViewModel(sharedApplication: sharedApplicationMock,
|
|
notificationCenter: notificationCenter)
|
|
|
|
let expectation = expectation(description: "Expected observer to be informed to reset superview to nil.")
|
|
var disposeBag = DisposeBag()
|
|
|
|
// As we've just initialized the view model it has to exist at this point, and therefore we can "safely" use force-unwrapping here.
|
|
// swiftlint:disable:next force_unwrapping
|
|
viewModel!.superview.subscribe { newSuperview, _ in
|
|
guard newSuperview == nil else {
|
|
// Skip initial call to observer.
|
|
return
|
|
}
|
|
|
|
expectation.fulfill()
|
|
}.disposed(by: &disposeBag)
|
|
|
|
// When
|
|
viewModel = nil
|
|
|
|
// Then
|
|
wait(for: [expectation], timeout: 0.1)
|
|
}
|
|
}
|
|
|
|
// MARK: - Mocks
|
|
|
|
private final class SharedApplicationMock: UIApplicationProtocol {
|
|
var keyWindowInConnectedScenes: UIWindow?
|
|
}
|