TM-SGNL-iOS/Signal/test/Badge/BadgeManagerTest.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

92 lines
2.7 KiB
Swift

//
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import XCTest
@testable import Signal
@testable import SignalServiceKit
class BadgeManagerTest: XCTestCase {
private class MockBadgeObserver: BadgeObserver {
var badgeValues = [UInt]()
func didUpdateBadgeCount(_ badgeManager: BadgeManager, badgeCount: BadgeCount) {
badgeValues.append(badgeCount.unreadChatCount)
}
}
func testMultipleRequestsReuseResults() {
let scheduler = TestScheduler()
var fetchCount: UInt = 0
let badgeManager = BadgeManager(
mainScheduler: scheduler,
serialScheduler: scheduler,
fetchIntBadgeValue: {
fetchCount += 1
return fetchCount
}
)
let observer1 = MockBadgeObserver()
badgeManager.addObserver(observer1)
let observer2 = MockBadgeObserver()
badgeManager.addObserver(observer2)
scheduler.runUntilIdle()
XCTAssertEqual(observer1.badgeValues, [1])
XCTAssertEqual(observer2.badgeValues, [1])
XCTAssertEqual(fetchCount, 1)
let observer3 = MockBadgeObserver()
badgeManager.addObserver(observer3)
scheduler.runUntilIdle()
XCTAssertEqual(observer1.badgeValues, [1])
XCTAssertEqual(observer2.badgeValues, [1])
XCTAssertEqual(observer3.badgeValues, [1])
XCTAssertEqual(fetchCount, 1)
}
func testPendingRequestsCoalesce() {
let mainScheduler = TestScheduler()
let serialScheduler = TestScheduler()
var fetchCount: UInt = 0
let badgeManager = BadgeManager(
mainScheduler: mainScheduler,
serialScheduler: serialScheduler,
fetchIntBadgeValue: {
fetchCount += 1
return fetchCount
}
)
serialScheduler.start()
let observer = MockBadgeObserver()
badgeManager.addObserver(observer)
mainScheduler.runUntilIdle()
XCTAssertEqual(observer.badgeValues, [1])
badgeManager.invalidateBadgeValue()
badgeManager.invalidateBadgeValue()
badgeManager.invalidateBadgeValue()
mainScheduler.runUntilIdle()
XCTAssertEqual(observer.badgeValues, [1, 2, 3])
XCTAssertEqual(fetchCount, 3)
}
}
private extension BadgeManager {
convenience init(
mainScheduler: Scheduler,
serialScheduler: Scheduler,
fetchIntBadgeValue: @escaping () -> UInt
) {
self.init(
mainScheduler: mainScheduler,
serialScheduler: serialScheduler,
fetchBadgeCountBlock: { BadgeCount(unreadChatCount: fetchIntBadgeValue(), unreadCallsCount: 0) }
)
}
}