119 lines
2.9 KiB
Swift
119 lines
2.9 KiB
Swift
//
|
|
// Copyright 2021-2024 New Vector Ltd.
|
|
//
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
// Please see LICENSE in the repository root for full details.
|
|
//
|
|
|
|
import Foundation
|
|
import XCTest
|
|
|
|
class UserIndicatorTests: XCTestCase {
|
|
var presenter: UserIndicatorPresenterSpy!
|
|
|
|
override func setUp() {
|
|
super.setUp()
|
|
presenter = UserIndicatorPresenterSpy()
|
|
}
|
|
|
|
func makeIndicator(dismissal: UserIndicatorDismissal = .manual, callback: @escaping () -> Void = {}) -> UserIndicator {
|
|
let request = UserIndicatorRequest(
|
|
presenter: presenter,
|
|
dismissal: dismissal
|
|
)
|
|
return UserIndicator(
|
|
request: request,
|
|
completion: callback
|
|
)
|
|
}
|
|
|
|
// MARK: - State
|
|
|
|
func testNewIndicatorIsPending() {
|
|
let indicator = makeIndicator()
|
|
XCTAssertEqual(indicator.state, .pending)
|
|
}
|
|
|
|
func testStartedIndicatorIsExecuting() {
|
|
let indicator = makeIndicator()
|
|
indicator.start()
|
|
XCTAssertEqual(indicator.state, .executing)
|
|
}
|
|
|
|
func testCancelledIndicatorIsCompleted() {
|
|
let indicator = makeIndicator()
|
|
indicator.cancel()
|
|
XCTAssertEqual(indicator.state, .completed)
|
|
}
|
|
|
|
// MARK: - Presenter
|
|
|
|
func testStartingIndicatorPresentsUI() {
|
|
let indicator = makeIndicator()
|
|
indicator.start()
|
|
XCTAssertEqual(presenter.intel, ["present()"])
|
|
}
|
|
|
|
func testAllowStartingOnlyOnce() {
|
|
let indicator = makeIndicator()
|
|
indicator.start()
|
|
presenter.intel = []
|
|
|
|
indicator.start()
|
|
|
|
XCTAssertEqual(presenter.intel, [])
|
|
}
|
|
|
|
func testCancellingIndicatorDismissesUI() {
|
|
let indicator = makeIndicator()
|
|
indicator.start()
|
|
presenter.intel = []
|
|
|
|
indicator.cancel()
|
|
|
|
XCTAssertEqual(presenter.intel, ["dismiss()"])
|
|
}
|
|
|
|
func testAllowCancellingOnlyOnce() {
|
|
let indicator = makeIndicator()
|
|
indicator.start()
|
|
indicator.cancel()
|
|
presenter.intel = []
|
|
|
|
indicator.cancel()
|
|
|
|
XCTAssertEqual(presenter.intel, [])
|
|
}
|
|
|
|
// MARK: - Dismissal
|
|
|
|
func testDismissAfterTimeout() {
|
|
let interval: TimeInterval = 0.01
|
|
let indicator = makeIndicator(dismissal: .timeout(interval))
|
|
|
|
indicator.start()
|
|
|
|
let exp = expectation(description: "")
|
|
DispatchQueue.main.asyncAfter(deadline: .now() + interval) {
|
|
exp.fulfill()
|
|
}
|
|
waitForExpectations(timeout: 1)
|
|
|
|
XCTAssertEqual(indicator.state, .completed)
|
|
}
|
|
|
|
// MARK: - Completion callback
|
|
|
|
func testTriggersCallbackWhenCompleted() {
|
|
var didComplete = false
|
|
let indicator = makeIndicator {
|
|
didComplete = true
|
|
}
|
|
indicator.start()
|
|
|
|
indicator.cancel()
|
|
|
|
XCTAssertTrue(didComplete)
|
|
}
|
|
}
|