Files
letro-ios/UnitTests/Sources/UserIndicatorControllerTests.swift
Stefan Ceriu 030b1b0bfa Various tweaks (#1129)
* Fixes #1121 - Hide the loading indicator after the logout task finishes

* Manually restart the sync only when entering the `error` state

* Use stopSync instead of the roomListService directly on client deinit

* Replace WeakClientProxyWrapper with callback based delegate

* Fix homescreen user avatar not automatically updating

* Replace default Build SDK profile with reldbg, which is fast but also doesn't crash

* Always show the loading indicator when the room list is not in a `running` state

* Implement delayed user indicator presentations through the normal API

* Fix the unit tests

* Replace UserIndicatorController delayedIndicators dictionary with a plain set
2023-06-22 15:04:20 +03:00

108 lines
4.3 KiB
Swift

//
// Copyright 2022 New Vector Ltd
//
// 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 Foundation
import XCTest
@testable import ElementX
@MainActor
class UserIndicatorControllerTests: XCTestCase {
private var indicatorController: UserIndicatorController!
override func setUp() {
indicatorController = UserIndicatorController(rootCoordinator: SplashScreenCoordinator())
}
func testIndicatorQueueing() {
indicatorController.minimumDisplayDuration = 0.0
indicatorController.submitIndicator(.init(id: "First", title: ""))
indicatorController.submitIndicator(.init(id: "Second", title: ""))
indicatorController.submitIndicator(.init(id: "Third", title: ""))
XCTAssertEqual(indicatorController.indicatorQueue.count, 3)
XCTAssertEqual(indicatorController.indicatorQueue[2].id, "Third")
XCTAssertEqual(indicatorController.indicatorQueue[1].id, "Second")
XCTAssertEqual(indicatorController.indicatorQueue[0].id, "First")
indicatorController.retractIndicatorWithId("Second")
XCTAssertEqual(indicatorController.indicatorQueue.count, 2)
XCTAssertEqual(indicatorController.indicatorQueue[1].id, "Third")
XCTAssertEqual(indicatorController.indicatorQueue[0].id, "First")
indicatorController.retractAllIndicators()
XCTAssertEqual(indicatorController.indicatorQueue.count, 0)
}
func testChainedPresentation() {
indicatorController.minimumDisplayDuration = 0.25
indicatorController.nonPersistentDisplayDuration = 2.5
indicatorController.submitIndicator(.init(id: "First", title: ""))
indicatorController.submitIndicator(.init(id: "Second", title: ""))
indicatorController.submitIndicator(.init(id: "Third", title: ""))
XCTAssertEqual(indicatorController.activeIndicator?.id, "Third")
let expectation = expectation(description: "Waiting for last indicator to be dismissed")
DispatchQueue.main.asyncAfter(deadline: .now() + indicatorController.nonPersistentDisplayDuration) {
expectation.fulfill()
}
waitForExpectations(timeout: 5.0)
XCTAssertEqual(indicatorController.indicatorQueue.count, 2)
XCTAssertEqual(indicatorController.activeIndicator?.id, "Second")
}
func testMinimumDisplayDuration() {
indicatorController.minimumDisplayDuration = 0.25
indicatorController.nonPersistentDisplayDuration = 2.5
indicatorController.submitIndicator(.init(id: "First", title: ""))
indicatorController.submitIndicator(.init(id: "Second", title: ""))
indicatorController.submitIndicator(.init(id: "Third", title: ""))
indicatorController.retractIndicatorWithId("Second")
XCTAssertEqual(indicatorController.indicatorQueue.count, 3)
let dismissalExpectation = expectation(description: "Waiting for minimum display duration to pass")
DispatchQueue.main.asyncAfter(deadline: .now() + indicatorController.minimumDisplayDuration) {
dismissalExpectation.fulfill()
}
waitForExpectations(timeout: 5.0)
XCTAssertEqual(indicatorController.indicatorQueue.count, 2)
XCTAssertEqual(indicatorController.activeIndicator?.id, "Third")
let dismissalExpectation2 = expectation(description: "Waiting for last indicator to be dismissed")
DispatchQueue.main.asyncAfter(deadline: .now() + indicatorController.nonPersistentDisplayDuration) {
dismissalExpectation2.fulfill()
}
waitForExpectations(timeout: 5.0)
XCTAssertEqual(indicatorController.indicatorQueue.count, 1)
XCTAssertEqual(indicatorController.activeIndicator?.id, "First")
}
}