Introduce flow parameters to simplify dependencies for child flows. (#4448)

This commit is contained in:
Doug
2025-08-27 13:56:06 +01:00
committed by GitHub
parent c140209e0c
commit dfb2425240
22 changed files with 456 additions and 586 deletions
@@ -33,19 +33,21 @@ class ChatsFlowCoordinatorTests: XCTestCase {
notificationManager = NotificationManagerMock()
chatsFlowCoordinator = ChatsFlowCoordinator(userSession: UserSessionMock(.init(clientProxy: clientProxy)),
isNewLogin: false,
let flowParameters = CommonFlowParameters(userSession: UserSessionMock(.init(clientProxy: clientProxy)),
bugReportService: BugReportServiceMock(.init()),
elementCallService: ElementCallServiceMock(.init()),
timelineControllerFactory: timelineControllerFactory,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
appMediator: AppMediatorMock.default,
appSettings: ServiceLocator.shared.settings,
appHooks: AppHooks(),
analytics: ServiceLocator.shared.analytics,
userIndicatorController: UserIndicatorControllerMock(),
notificationManager: notificationManager,
stateMachineFactory: stateMachineFactory)
chatsFlowCoordinator = ChatsFlowCoordinator(isNewLogin: false,
navigationSplitCoordinator: splitCoordinator,
appLockService: AppLockServiceMock(),
bugReportService: BugReportServiceMock(.init()),
elementCallService: ElementCallServiceMock(.init()),
timelineControllerFactory: timelineControllerFactory,
appMediator: AppMediatorMock.default,
appSettings: ServiceLocator.shared.settings,
appHooks: AppHooks(),
analytics: ServiceLocator.shared.analytics,
notificationManager: notificationManager,
stateMachineFactory: stateMachineFactory)
flowParameters: flowParameters)
let deferred = deferFulfillment(stateMachineFactory.chatsFlowStatePublisher) { $0 == .roomList(roomListSelectedRoomID: nil) }
chatsFlowCoordinator.start()
@@ -14,17 +14,19 @@ import XCTest
class NotificationSettingsEditScreenViewModelTests: XCTestCase {
private var viewModel: NotificationSettingsEditScreenViewModelProtocol!
private var notificationSettingsProxy: NotificationSettingsProxyMock!
private var userSession: UserSessionProtocol!
private var userSession: UserSessionMock!
private var clientProxy: ClientProxyMock!
private var context: NotificationSettingsEditScreenViewModelType.Context {
viewModel.context
}
@MainActor override func setUpWithError() throws {
let clientProxy = ClientProxyMock(.init(userID: "@a:b.com"))
userSession = UserSessionMock(.init(clientProxy: clientProxy))
notificationSettingsProxy = NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration())
notificationSettingsProxy.getDefaultRoomNotificationModeIsEncryptedIsOneToOneReturnValue = .allMessages
clientProxy = ClientProxyMock(.init(userID: "@a:b.com", notificationSettings: notificationSettingsProxy))
userSession = UserSessionMock(.init(clientProxy: clientProxy))
}
func testFetchSettings() async throws {
@@ -36,9 +38,7 @@ class NotificationSettingsEditScreenViewModelTests: XCTestCase {
return .mentionsAndKeywordsOnly
}
}
viewModel = NotificationSettingsEditScreenViewModel(chatType: .groupChat,
userSession: userSession,
notificationSettingsProxy: notificationSettingsProxy)
viewModel = NotificationSettingsEditScreenViewModel(chatType: .groupChat, userSession: userSession)
let deferred = deferFulfillment(viewModel.context.observe(\.viewState.defaultMode)) { $0 != nil }
@@ -75,9 +75,7 @@ class NotificationSettingsEditScreenViewModelTests: XCTestCase {
notificationSettingsProxy.canPushEncryptedEventsToDeviceClosure = {
true
}
viewModel = NotificationSettingsEditScreenViewModel(chatType: .groupChat,
userSession: userSession,
notificationSettingsProxy: notificationSettingsProxy)
viewModel = NotificationSettingsEditScreenViewModel(chatType: .groupChat, userSession: userSession)
let deferred = deferFulfillment(viewModel.context.observe(\.viewState.defaultMode)) { $0 != nil }
@@ -104,9 +102,7 @@ class NotificationSettingsEditScreenViewModelTests: XCTestCase {
func testSetModeAllMessages() async throws {
notificationSettingsProxy.getDefaultRoomNotificationModeIsEncryptedIsOneToOneReturnValue = .mentionsAndKeywordsOnly
viewModel = NotificationSettingsEditScreenViewModel(chatType: .groupChat,
userSession: userSession,
notificationSettingsProxy: notificationSettingsProxy)
viewModel = NotificationSettingsEditScreenViewModel(chatType: .groupChat, userSession: userSession)
let deferred = deferFulfillment(viewModel.context.observe(\.viewState.defaultMode)) { $0 != nil }
viewModel.fetchInitialContent()
@@ -142,9 +138,7 @@ class NotificationSettingsEditScreenViewModelTests: XCTestCase {
}
func testSetModeMentions() async throws {
viewModel = NotificationSettingsEditScreenViewModel(chatType: .groupChat,
userSession: userSession,
notificationSettingsProxy: notificationSettingsProxy)
viewModel = NotificationSettingsEditScreenViewModel(chatType: .groupChat, userSession: userSession)
let deferred = deferFulfillment(viewModel.context.observe(\.viewState.defaultMode)) { $0 != nil }
@@ -183,9 +177,7 @@ class NotificationSettingsEditScreenViewModelTests: XCTestCase {
func testSetModeDirectChats() async throws {
notificationSettingsProxy.getDefaultRoomNotificationModeIsEncryptedIsOneToOneReturnValue = .mentionsAndKeywordsOnly
// Initialize for direct chats
viewModel = NotificationSettingsEditScreenViewModel(chatType: .oneToOneChat,
userSession: userSession,
notificationSettingsProxy: notificationSettingsProxy)
viewModel = NotificationSettingsEditScreenViewModel(chatType: .oneToOneChat, userSession: userSession)
let deferred = deferFulfillment(viewModel.context.observe(\.viewState.defaultMode)) { $0 != nil }
@@ -216,9 +208,7 @@ class NotificationSettingsEditScreenViewModelTests: XCTestCase {
func testSetModeFailure() async throws {
notificationSettingsProxy.getDefaultRoomNotificationModeIsEncryptedIsOneToOneReturnValue = .mentionsAndKeywordsOnly
notificationSettingsProxy.setDefaultRoomNotificationModeIsEncryptedIsOneToOneModeThrowableError = NotificationSettingsError.Generic(msg: "error")
viewModel = NotificationSettingsEditScreenViewModel(chatType: .oneToOneChat,
userSession: userSession,
notificationSettingsProxy: notificationSettingsProxy)
viewModel = NotificationSettingsEditScreenViewModel(chatType: .oneToOneChat, userSession: userSession)
let deferred = deferFulfillment(viewModel.context.observe(\.viewState.defaultMode)) { $0 != nil }
@@ -238,9 +228,7 @@ class NotificationSettingsEditScreenViewModelTests: XCTestCase {
func testSelectRoom() async throws {
let roomID = "!roomidentifier:matrix.org"
viewModel = NotificationSettingsEditScreenViewModel(chatType: .oneToOneChat,
userSession: userSession,
notificationSettingsProxy: notificationSettingsProxy)
viewModel = NotificationSettingsEditScreenViewModel(chatType: .oneToOneChat, userSession: userSession)
let deferredActions = deferFulfillment(viewModel.actions) { action in
switch action {
@@ -358,18 +358,23 @@ class RoomFlowCoordinatorTests: XCTestCase {
"1"
}
roomFlowCoordinator = RoomFlowCoordinator(roomID: roomID,
userSession: UserSessionMock(.init(clientProxy: clientProxy)),
isChildFlow: asChildFlow,
let flowParameters = CommonFlowParameters(userSession: UserSessionMock(.init(clientProxy: clientProxy)),
bugReportService: BugReportServiceMock(.init()),
elementCallService: ElementCallServiceMock(.init()),
timelineControllerFactory: timelineControllerFactory,
navigationStackCoordinator: navigationStackCoordinator,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
ongoingCallRoomIDPublisher: .init(.init(nil)),
appMediator: AppMediatorMock.default,
appSettings: ServiceLocator.shared.settings,
appHooks: AppHooks(),
analytics: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController)
userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationManager: NotificationManagerMock(),
stateMachineFactory: StateMachineFactory())
roomFlowCoordinator = RoomFlowCoordinator(roomID: roomID,
isChildFlow: asChildFlow,
navigationStackCoordinator: navigationStackCoordinator,
flowParameters: flowParameters)
}
}
@@ -35,19 +35,23 @@ class UserSessionFlowCoordinatorTests: XCTestCase {
notificationManager = NotificationManagerMock()
userSessionFlowCoordinator = UserSessionFlowCoordinator(userSession: UserSessionMock(.init(clientProxy: clientProxy)),
isNewLogin: false,
let flowParameters = CommonFlowParameters(userSession: UserSessionMock(.init(clientProxy: clientProxy)),
bugReportService: BugReportServiceMock(.init()),
elementCallService: ElementCallServiceMock(.init()),
timelineControllerFactory: timelineControllerFactory,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
appMediator: AppMediatorMock.default,
appSettings: ServiceLocator.shared.settings,
appHooks: AppHooks(),
analytics: ServiceLocator.shared.analytics,
userIndicatorController: UserIndicatorControllerMock(),
notificationManager: notificationManager,
stateMachineFactory: stateMachineFactory)
userSessionFlowCoordinator = UserSessionFlowCoordinator(isNewLogin: false,
navigationRootCoordinator: rootCoordinator,
appLockService: AppLockServiceMock(),
bugReportService: BugReportServiceMock(.init()),
elementCallService: ElementCallServiceMock(.init()),
timelineControllerFactory: timelineControllerFactory,
appMediator: AppMediatorMock.default,
appSettings: ServiceLocator.shared.settings,
appHooks: AppHooks(),
analytics: ServiceLocator.shared.analytics,
notificationManager: notificationManager,
stateMachineFactory: stateMachineFactory)
flowParameters: flowParameters)
userSessionFlowCoordinator.start()
}