element-ios/CommonKit/Source/UserIndicators/Tests/UserIndicatorTests.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)
}
}