mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-02 21:06:00 +00:00
Use the SDK's offline detection everywhere (except for restarting the sync loop). (#4472)
* Use the SDK's offline state to drive the offline indicator. * Only use network reachability for restarting the sync loop, use the homeserver reachability for requests. * Add a separate indicator to distinguish when the server is unreachable but the device is online.
This commit is contained in:
@@ -15,18 +15,17 @@ import XCTest
|
||||
final class MediaProviderTests: XCTestCase {
|
||||
private var mediaLoader: MediaLoaderMock!
|
||||
private var imageCache: MockImageCache!
|
||||
private var networkMonitor: NetworkMonitorMock!
|
||||
private var reachabilitySubject = CurrentValueSubject<NetworkMonitorReachability, Never>(.reachable)
|
||||
|
||||
var mediaProvider: MediaProvider!
|
||||
|
||||
override func setUp() {
|
||||
mediaLoader = MediaLoaderMock()
|
||||
imageCache = MockImageCache(name: "Test")
|
||||
networkMonitor = NetworkMonitorMock()
|
||||
|
||||
mediaProvider = MediaProvider(mediaLoader: mediaLoader,
|
||||
imageCache: imageCache,
|
||||
networkMonitor: networkMonitor)
|
||||
homeserverReachabilityPublisher: reachabilitySubject.asCurrentValuePublisher())
|
||||
}
|
||||
|
||||
func testLoadingRetriedOnReconnection() async throws {
|
||||
@@ -38,20 +37,18 @@ final class MediaProviderTests: XCTestCase {
|
||||
|
||||
let loadTask = try mediaProvider.loadImageRetryingOnReconnection(MediaSourceProxy(url: .mockMXCImage, mimeType: "image/jpeg"))
|
||||
|
||||
let connectivitySubject = CurrentValueSubject<NetworkMonitorReachability, Never>(.unreachable)
|
||||
reachabilitySubject.send(.unreachable)
|
||||
|
||||
mediaLoader.loadMediaContentForSourceClosure = { _ in
|
||||
switch connectivitySubject.value {
|
||||
mediaLoader.loadMediaContentForSourceClosure = { [reachabilitySubject] _ in
|
||||
switch reachabilitySubject.value {
|
||||
case .unreachable:
|
||||
connectivitySubject.send(.reachable)
|
||||
reachabilitySubject.send(.reachable)
|
||||
throw MediaProviderTestsError.error
|
||||
case .reachable:
|
||||
return pngData
|
||||
}
|
||||
}
|
||||
|
||||
networkMonitor.underlyingReachabilityPublisher = connectivitySubject.asCurrentValuePublisher()
|
||||
|
||||
let result = try? await loadTask.value
|
||||
|
||||
XCTAssertNotNil(result)
|
||||
@@ -61,12 +58,10 @@ final class MediaProviderTests: XCTestCase {
|
||||
func testLoadingRetriedOnReconnectionCancelsAfterSecondFailure() async throws {
|
||||
let loadTask = try mediaProvider.loadImageRetryingOnReconnection(MediaSourceProxy(url: .mockMXCImage, mimeType: "image/jpeg"))
|
||||
|
||||
let connectivitySubject = CurrentValueSubject<NetworkMonitorReachability, Never>(.reachable)
|
||||
reachabilitySubject.send(.reachable)
|
||||
|
||||
mediaLoader.loadMediaContentForSourceThrowableError = MediaProviderTestsError.error
|
||||
|
||||
networkMonitor.underlyingReachabilityPublisher = connectivitySubject.asCurrentValuePublisher()
|
||||
|
||||
let result = try? await loadTask.value
|
||||
|
||||
XCTAssertNil(result)
|
||||
|
||||
@@ -32,7 +32,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: notificationSettingsProxyMock,
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
}
|
||||
|
||||
@@ -45,7 +44,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
let deferred = deferFulfillment(context.observe(\.viewState.bindings.leaveRoomAlertItem)) { $0 != nil }
|
||||
|
||||
@@ -65,7 +63,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
let deferred = deferFulfillment(context.observe(\.viewState.bindings.leaveRoomAlertItem)) { $0 != nil }
|
||||
|
||||
@@ -86,7 +83,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
context.send(viewAction: .processTapLeave)
|
||||
@@ -139,7 +135,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
let deferred = deferFulfillment(viewModel.context.observe(\.viewState.dmRecipientInfo)) { $0 != nil }
|
||||
@@ -160,7 +155,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
let deferredRecipient = deferFulfillment(viewModel.context.observe(\.viewState.dmRecipientInfo)) { $0 != nil }
|
||||
@@ -191,7 +185,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
let deferredRecipient = deferFulfillment(viewModel.context.observe(\.viewState.dmRecipientInfo)) { $0 != nil }
|
||||
@@ -221,7 +214,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
let deferredRecipient = deferFulfillment(viewModel.context.observe(\.viewState.dmRecipientInfo)) { $0 != nil }
|
||||
@@ -252,7 +244,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
let deferredRecipient = deferFulfillment(viewModel.context.observe(\.viewState.dmRecipientInfo)) { $0 != nil }
|
||||
@@ -284,7 +275,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
_ = await context.observe(\.viewState).debounce(for: .milliseconds(100)).first()
|
||||
@@ -301,7 +291,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
_ = await context.observe(\.viewState).debounce(for: .milliseconds(100)).first()
|
||||
@@ -353,7 +342,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
_ = await context.observe(\.viewState).debounce(for: .milliseconds(100)).first()
|
||||
@@ -392,7 +380,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
_ = await context.observe(\.viewState).debounce(for: .milliseconds(100)).first()
|
||||
@@ -431,7 +418,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
_ = await context.observe(\.viewState).debounce(for: .milliseconds(100)).first()
|
||||
@@ -451,7 +437,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
_ = await context.observe(\.viewState).debounce(for: .milliseconds(100)).first()
|
||||
@@ -471,7 +456,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
_ = await context.observe(\.viewState).debounce(for: .milliseconds(100)).first()
|
||||
@@ -489,7 +473,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: notificationSettingsProxyMock,
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
var deferred = deferFulfillment(context.observe(\.viewState.notificationSettingsState)) { $0.isError }
|
||||
@@ -682,7 +665,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: notificationSettingsProxyMock,
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
let deferred = deferFulfillment(context.observe(\.viewState)) { state in
|
||||
@@ -704,7 +686,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: notificationSettingsProxyMock,
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
let deferred = deferFulfillment(context.observe(\.viewState)) { state in
|
||||
@@ -728,7 +709,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: notificationSettingsProxyMock,
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
let deferred = deferFulfillment(context.observe(\.viewState)) { state in
|
||||
@@ -752,7 +732,6 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettingsProxy: notificationSettingsProxyMock,
|
||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
let deferred = deferFulfillment(context.observe(\.viewState)) { state in
|
||||
|
||||
@@ -42,7 +42,6 @@ class RoomScreenViewModelTests: XCTestCase {
|
||||
roomProxy: roomProxyMock,
|
||||
initialSelectedPinnedEventID: nil,
|
||||
ongoingCallRoomIDPublisher: .init(.init(nil)),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings,
|
||||
appHooks: AppHooks(),
|
||||
analyticsService: ServiceLocator.shared.analytics,
|
||||
@@ -122,7 +121,6 @@ class RoomScreenViewModelTests: XCTestCase {
|
||||
roomProxy: roomProxyMock,
|
||||
initialSelectedPinnedEventID: "test1",
|
||||
ongoingCallRoomIDPublisher: .init(.init(nil)),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings,
|
||||
appHooks: AppHooks(),
|
||||
analyticsService: ServiceLocator.shared.analytics,
|
||||
@@ -180,7 +178,6 @@ class RoomScreenViewModelTests: XCTestCase {
|
||||
roomProxy: roomProxyMock,
|
||||
initialSelectedPinnedEventID: nil,
|
||||
ongoingCallRoomIDPublisher: .init(.init(nil)),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings,
|
||||
appHooks: AppHooks(),
|
||||
analyticsService: ServiceLocator.shared.analytics,
|
||||
@@ -217,7 +214,6 @@ class RoomScreenViewModelTests: XCTestCase {
|
||||
roomProxy: roomProxyMock,
|
||||
initialSelectedPinnedEventID: nil,
|
||||
ongoingCallRoomIDPublisher: ongoingCallRoomIDSubject.asCurrentValuePublisher(),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings,
|
||||
appHooks: AppHooks(),
|
||||
analyticsService: ServiceLocator.shared.analytics,
|
||||
@@ -262,7 +258,6 @@ class RoomScreenViewModelTests: XCTestCase {
|
||||
roomProxy: roomProxyMock,
|
||||
initialSelectedPinnedEventID: nil,
|
||||
ongoingCallRoomIDPublisher: .init(.init(nil)),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings,
|
||||
appHooks: AppHooks(),
|
||||
analyticsService: ServiceLocator.shared.analytics,
|
||||
@@ -284,7 +279,6 @@ class RoomScreenViewModelTests: XCTestCase {
|
||||
roomProxy: roomProxyMock,
|
||||
initialSelectedPinnedEventID: nil,
|
||||
ongoingCallRoomIDPublisher: .init(.init(nil)),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings,
|
||||
appHooks: AppHooks(),
|
||||
analyticsService: ServiceLocator.shared.analytics,
|
||||
@@ -319,7 +313,6 @@ class RoomScreenViewModelTests: XCTestCase {
|
||||
roomProxy: roomProxyMock,
|
||||
initialSelectedPinnedEventID: nil,
|
||||
ongoingCallRoomIDPublisher: .init(.init(nil)),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings,
|
||||
appHooks: AppHooks(),
|
||||
analyticsService: ServiceLocator.shared.analytics,
|
||||
@@ -349,7 +342,6 @@ class RoomScreenViewModelTests: XCTestCase {
|
||||
roomProxy: roomProxyMock,
|
||||
initialSelectedPinnedEventID: nil,
|
||||
ongoingCallRoomIDPublisher: .init(.init(nil)),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings,
|
||||
appHooks: AppHooks(),
|
||||
analyticsService: ServiceLocator.shared.analytics,
|
||||
@@ -370,7 +362,6 @@ class RoomScreenViewModelTests: XCTestCase {
|
||||
roomProxy: roomProxyMock,
|
||||
initialSelectedPinnedEventID: nil,
|
||||
ongoingCallRoomIDPublisher: .init(.init(nil)),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appSettings: ServiceLocator.shared.settings,
|
||||
appHooks: AppHooks(),
|
||||
analyticsService: ServiceLocator.shared.analytics,
|
||||
|
||||
@@ -23,14 +23,9 @@ class SecureBackupLogoutConfirmationScreenViewModelTests: XCTestCase {
|
||||
secureBackupController.underlyingKeyBackupState = CurrentValueSubject<SecureBackupKeyBackupState, Never>(.enabled).asCurrentValuePublisher()
|
||||
|
||||
reachabilitySubject = CurrentValueSubject<NetworkMonitorReachability, Never>(.reachable)
|
||||
let networkMonitor = NetworkMonitorMock()
|
||||
networkMonitor.underlyingReachabilityPublisher = reachabilitySubject.asCurrentValuePublisher()
|
||||
|
||||
let appMediator = AppMediatorMock()
|
||||
appMediator.underlyingNetworkMonitor = networkMonitor
|
||||
|
||||
viewModel = SecureBackupLogoutConfirmationScreenViewModel(secureBackupController: secureBackupController,
|
||||
appMediator: appMediator)
|
||||
homeserverReachabilityPublisher: reachabilitySubject.asCurrentValuePublisher())
|
||||
}
|
||||
|
||||
func testInitialState() {
|
||||
|
||||
@@ -12,13 +12,13 @@ import Combine
|
||||
|
||||
@MainActor
|
||||
class UserSessionFlowCoordinatorTests: XCTestCase {
|
||||
var clientProxy: ClientProxyMock!
|
||||
var timelineControllerFactory: TimelineControllerFactoryMock!
|
||||
var userSessionFlowCoordinator: UserSessionFlowCoordinator!
|
||||
var rootCoordinator: NavigationRootCoordinator!
|
||||
var notificationManager: NotificationManagerMock!
|
||||
var userIndicatorController: UserIndicatorControllerMock!
|
||||
let stateMachineFactory = PublishedStateMachineFactory()
|
||||
|
||||
let networkReachabilitySubject: CurrentValueSubject<NetworkMonitorReachability, Never> = .init(.reachable)
|
||||
let homeserverReachabilitySubject: CurrentValueSubject<NetworkMonitorReachability, Never> = .init(.reachable)
|
||||
var cancellables = Set<AnyCancellable>()
|
||||
|
||||
var tabCoordinator: NavigationTabCoordinator<UserSessionFlowCoordinator.HomeTab>? { rootCoordinator?.rootCoordinator as? NavigationTabCoordinator }
|
||||
@@ -28,24 +28,30 @@ class UserSessionFlowCoordinatorTests: XCTestCase {
|
||||
|
||||
override func setUp() async throws {
|
||||
cancellables.removeAll()
|
||||
clientProxy = ClientProxyMock(.init(userID: "hi@bob", roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))))
|
||||
timelineControllerFactory = TimelineControllerFactoryMock(.init())
|
||||
|
||||
rootCoordinator = NavigationRootCoordinator()
|
||||
|
||||
notificationManager = NotificationManagerMock()
|
||||
let clientProxy = ClientProxyMock(.init(userID: "hi@bob", roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))))
|
||||
clientProxy.homeserverReachabilityPublisher = homeserverReachabilitySubject.asCurrentValuePublisher()
|
||||
|
||||
let networkMonitor = NetworkMonitorMock.default
|
||||
networkMonitor.reachabilityPublisher = networkReachabilitySubject.asCurrentValuePublisher()
|
||||
let appMediator = AppMediatorMock.default
|
||||
appMediator.networkMonitor = networkMonitor
|
||||
|
||||
userIndicatorController = UserIndicatorControllerMock()
|
||||
|
||||
let flowParameters = CommonFlowParameters(userSession: UserSessionMock(.init(clientProxy: clientProxy)),
|
||||
bugReportService: BugReportServiceMock(.init()),
|
||||
elementCallService: ElementCallServiceMock(.init()),
|
||||
timelineControllerFactory: timelineControllerFactory,
|
||||
timelineControllerFactory: TimelineControllerFactoryMock(.init()),
|
||||
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
|
||||
appMediator: AppMediatorMock.default,
|
||||
appMediator: appMediator,
|
||||
appSettings: ServiceLocator.shared.settings,
|
||||
appHooks: AppHooks(),
|
||||
analytics: ServiceLocator.shared.analytics,
|
||||
userIndicatorController: UserIndicatorControllerMock(),
|
||||
notificationManager: notificationManager,
|
||||
userIndicatorController: userIndicatorController,
|
||||
notificationManager: NotificationManagerMock(),
|
||||
stateMachineFactory: stateMachineFactory)
|
||||
|
||||
userSessionFlowCoordinator = UserSessionFlowCoordinator(isNewLogin: false,
|
||||
@@ -56,6 +62,8 @@ class UserSessionFlowCoordinatorTests: XCTestCase {
|
||||
userSessionFlowCoordinator.start()
|
||||
}
|
||||
|
||||
// MARK: Navigation
|
||||
|
||||
func testInitialState() async throws {
|
||||
XCTAssertNotNil(chatsSplitCoordinator)
|
||||
XCTAssertNil(detailCoordinator)
|
||||
@@ -154,6 +162,51 @@ class UserSessionFlowCoordinatorTests: XCTestCase {
|
||||
XCTAssertNil(chatsSplitCoordinator?.sheetCoordinator, "The media upload sheet shouldn't be shown when sharing text.")
|
||||
}
|
||||
|
||||
// MARK: Indicators
|
||||
|
||||
func testReachabilityIndicators() async throws {
|
||||
// Given a flow in its initial state.
|
||||
try await Task.sleep(for: .milliseconds(100))
|
||||
|
||||
// Then no reachability indicators should be shown.
|
||||
XCTAssertFalse(userIndicatorController.submitIndicatorDelayCalled)
|
||||
XCTAssertEqual(retractReachabilityIndicatorCallsCount, 1) // The initial state removes the indicator.
|
||||
|
||||
// When the homeserver becomes unreachable.
|
||||
homeserverReachabilitySubject.send(.unreachable)
|
||||
try await Task.sleep(for: .milliseconds(100))
|
||||
|
||||
// Then a server unreachable indicator should be shown.
|
||||
XCTAssertEqual(userIndicatorController.submitIndicatorDelayCallsCount, 1)
|
||||
XCTAssertEqual(userIndicatorController.submitIndicatorDelayReceivedArguments?.indicator.title, L10n.commonServerUnreachable)
|
||||
XCTAssertEqual(retractReachabilityIndicatorCallsCount, 1)
|
||||
|
||||
// When the network also becomes unreachable.
|
||||
networkReachabilitySubject.send(.unreachable)
|
||||
try await Task.sleep(for: .milliseconds(100))
|
||||
|
||||
// Then the server unreachable indicator should be replaced with an offline indicator.
|
||||
XCTAssertEqual(userIndicatorController.submitIndicatorDelayCallsCount, 2)
|
||||
XCTAssertEqual(userIndicatorController.submitIndicatorDelayReceivedArguments?.indicator.title, L10n.commonOffline)
|
||||
XCTAssertEqual(retractReachabilityIndicatorCallsCount, 1)
|
||||
|
||||
// When the homeserver becomes reachable again.
|
||||
homeserverReachabilitySubject.send(.reachable)
|
||||
try await Task.sleep(for: .milliseconds(100))
|
||||
|
||||
// Then the indicator should be hidden even if the network isn't reachable.
|
||||
XCTAssertEqual(userIndicatorController.submitIndicatorDelayCallsCount, 2)
|
||||
XCTAssertEqual(retractReachabilityIndicatorCallsCount, 2)
|
||||
|
||||
// When the network becomes reachable again.
|
||||
networkReachabilitySubject.send(.reachable)
|
||||
try await Task.sleep(for: .milliseconds(100))
|
||||
|
||||
// Then nothing else should happen.
|
||||
XCTAssertEqual(userIndicatorController.submitIndicatorDelayCallsCount, 2)
|
||||
XCTAssertEqual(retractReachabilityIndicatorCallsCount, 3)
|
||||
}
|
||||
|
||||
// MARK: - Helpers
|
||||
|
||||
private func process(route: AppRoute,
|
||||
@@ -179,4 +232,12 @@ class UserSessionFlowCoordinatorTests: XCTestCase {
|
||||
try await deferredUserSession?.fulfill()
|
||||
try await deferredChatsState?.fulfill()
|
||||
}
|
||||
|
||||
/// Other services retract indicators, so this filters based on the reachability ID.
|
||||
private var retractReachabilityIndicatorCallsCount: Int {
|
||||
userIndicatorController
|
||||
.retractIndicatorWithIdReceivedInvocations
|
||||
.filter { $0 == "io.element.elementx.reachability.notification" }
|
||||
.count
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user