Adopt StateStoreViewModelV2 in the remaining settings screens. (#4158)

* Move the AuthenticationStartScreen into the Authentication directory.

* Commit the updated Sentry license.

No idea why they dropped the 2024 🤷‍♂️

* Use StateStoreViewModelV2 in BugReportScreen.

* Use StateStoreViewModelV2 in UserDetailsEditScreen.

* Use StateStoreViewModelV2 in NotificationSettingsScreen.

* Use StateStoreViewModelV2 in NotificationSettingsEditScreen.

* Use StateStoreViewModelV2 in LegalInformationScreen.

* Use StateStoreViewModelV2 in LogViewerScreen.

* Use StateStoreViewModelV2 in AnalyticsSettingsScreen.

* Rename AdvancedSettingsScreen directory.

* Use StateStoreViewModelV2 in EncryptionResetScreen.

* Use StateStoreViewModelV2 in EncryptionResetPasswordScreen.

* Use StateStoreViewModelV2 in SecureBackup…Screens.

* Use StateStoreViewModelV2 in LoginScreen.

Seems this one was ignored waiting on the fulfillment transitionValues implementation.

* Use StateStoreViewModelV2 in DeactivateAccountScreen.

* Move DeactivateAccountScreen into the Settings directory.
This commit is contained in:
Doug
2025-05-30 12:24:56 +01:00
committed by GitHub
parent 565ca3ab0b
commit 458c6aaa57
54 changed files with 238 additions and 294 deletions
@@ -61,7 +61,7 @@ class DeactivateAccountScreenViewModelTests: XCTestCase {
XCTAssertNil(context.alertInfo)
let deferredState = deferFulfillment(context.$viewState) { $0.bindings.alertInfo != nil }
let deferredState = deferFulfillment(context.observe(\.viewState.bindings.alertInfo)) { $0 != nil }
context.send(viewAction: .deactivate)
try await deferredState.fulfill()
@@ -86,7 +86,7 @@ class LoginScreenViewModelTests: XCTestCase {
XCTAssertFalse(context.viewState.canSubmit, "The form should not be submittable.")
// When updating the view model whilst loading a homeserver.
let deferred = deferFulfillment(context.$viewState, keyPath: \.isLoading, transitionValues: [true, false])
let deferred = deferFulfillment(context.observe(\.viewState.isLoading), transitionValues: [true, false])
context.send(viewAction: .parseUsername)
// Then the view state should represent the loading but never allow submitting to occur.
@@ -105,7 +105,7 @@ class LoginScreenViewModelTests: XCTestCase {
XCTAssertTrue(context.viewState.canSubmit, "The form should be ready to submit.")
// When updating the view model whilst loading a homeserver.
let deferred = deferFulfillment(context.$viewState, keyPath: \.canSubmit, transitionValues: [false, true])
let deferred = deferFulfillment(context.observe(\.viewState.canSubmit), transitionValues: [false, true])
context.send(viewAction: .parseUsername)
// Then the view should be blocked from submitting while loading and then become unblocked again.
@@ -134,7 +134,7 @@ class LoginScreenViewModelTests: XCTestCase {
XCTAssertNil(context.alertInfo, "There shouldn't be an alert when the screen loads.")
// When entering a username for an unsupported homeserver.
let deferred = deferFulfillment(context.$viewState) { $0.bindings.alertInfo != nil }
let deferred = deferFulfillment(context.observe(\.viewState.bindings.alertInfo)) { $0 != nil }
context.username = "@bob:server.net"
context.send(viewAction: .parseUsername)
try await deferred.fulfill()
@@ -40,9 +40,7 @@ class NotificationSettingsEditScreenViewModelTests: XCTestCase {
userSession: userSession,
notificationSettingsProxy: notificationSettingsProxy)
let deferred = deferFulfillment(viewModel.context.$viewState) { state in
state.defaultMode != nil
}
let deferred = deferFulfillment(viewModel.context.observe(\.viewState.defaultMode)) { $0 != nil }
viewModel.fetchInitialContent()
@@ -81,9 +79,7 @@ class NotificationSettingsEditScreenViewModelTests: XCTestCase {
userSession: userSession,
notificationSettingsProxy: notificationSettingsProxy)
let deferred = deferFulfillment(viewModel.context.$viewState) { state in
state.defaultMode != nil
}
let deferred = deferFulfillment(viewModel.context.observe(\.viewState.defaultMode)) { $0 != nil }
viewModel.fetchInitialContent()
@@ -111,15 +107,14 @@ class NotificationSettingsEditScreenViewModelTests: XCTestCase {
viewModel = NotificationSettingsEditScreenViewModel(chatType: .groupChat,
userSession: userSession,
notificationSettingsProxy: notificationSettingsProxy)
let deferred = deferFulfillment(viewModel.context.$viewState) { state in
state.defaultMode != nil
}
let deferred = deferFulfillment(viewModel.context.observe(\.viewState.defaultMode)) { $0 != nil }
viewModel.fetchInitialContent()
try await deferred.fulfill()
var deferredViewState = deferFulfillment(viewModel.context.$viewState, keyPath: \.pendingMode, transitionValues: [nil, .allMessages, nil])
var deferredViewState = deferFulfillment(viewModel.context.observe(\.viewState.pendingMode),
transitionValues: [nil, .allMessages, nil])
context.send(viewAction: .setMode(.allMessages))
@@ -137,8 +132,7 @@ class NotificationSettingsEditScreenViewModelTests: XCTestCase {
XCTAssertEqual(invocations[1].isOneToOne, false)
XCTAssertEqual(invocations[1].mode, .allMessages)
deferredViewState = deferFulfillment(viewModel.context.$viewState,
keyPath: \.defaultMode,
deferredViewState = deferFulfillment(viewModel.context.observe(\.viewState.defaultMode),
transitionValues: [.allMessages])
try await deferredViewState.fulfill()
@@ -152,16 +146,13 @@ class NotificationSettingsEditScreenViewModelTests: XCTestCase {
userSession: userSession,
notificationSettingsProxy: notificationSettingsProxy)
let deferred = deferFulfillment(viewModel.context.$viewState) { state in
state.defaultMode != nil
}
let deferred = deferFulfillment(viewModel.context.observe(\.viewState.defaultMode)) { $0 != nil }
viewModel.fetchInitialContent()
try await deferred.fulfill()
var deferredViewState = deferFulfillment(viewModel.context.$viewState,
keyPath: \.pendingMode,
var deferredViewState = deferFulfillment(viewModel.context.observe(\.viewState.pendingMode),
transitionValues: [nil, .mentionsAndKeywordsOnly, nil])
context.send(viewAction: .setMode(.mentionsAndKeywordsOnly))
@@ -180,8 +171,7 @@ class NotificationSettingsEditScreenViewModelTests: XCTestCase {
XCTAssertEqual(invocations[1].isOneToOne, false)
XCTAssertEqual(invocations[1].mode, .mentionsAndKeywordsOnly)
deferredViewState = deferFulfillment(viewModel.context.$viewState,
keyPath: \.defaultMode,
deferredViewState = deferFulfillment(viewModel.context.observe(\.viewState.defaultMode),
transitionValues: [.mentionsAndKeywordsOnly])
try await deferredViewState.fulfill()
@@ -197,16 +187,13 @@ class NotificationSettingsEditScreenViewModelTests: XCTestCase {
userSession: userSession,
notificationSettingsProxy: notificationSettingsProxy)
let deferred = deferFulfillment(viewModel.context.$viewState) { state in
state.defaultMode != nil
}
let deferred = deferFulfillment(viewModel.context.observe(\.viewState.defaultMode)) { $0 != nil }
viewModel.fetchInitialContent()
try await deferred.fulfill()
let deferredViewState = deferFulfillment(viewModel.context.$viewState,
keyPath: \.pendingMode,
let deferredViewState = deferFulfillment(viewModel.context.observe(\.viewState.pendingMode),
transitionValues: [nil, .allMessages, nil])
context.send(viewAction: .setMode(.allMessages))
@@ -233,16 +220,13 @@ class NotificationSettingsEditScreenViewModelTests: XCTestCase {
userSession: userSession,
notificationSettingsProxy: notificationSettingsProxy)
let deferred = deferFulfillment(viewModel.context.$viewState) { state in
state.defaultMode != nil
}
let deferred = deferFulfillment(viewModel.context.observe(\.viewState.defaultMode)) { $0 != nil }
viewModel.fetchInitialContent()
try await deferred.fulfill()
let deferredViewState = deferFulfillment(viewModel.context.$viewState,
keyPath: \.pendingMode,
let deferredViewState = deferFulfillment(viewModel.context.observe(\.viewState.pendingMode),
transitionValues: [nil, .allMessages, nil])
context.send(viewAction: .setMode(.allMessages))
@@ -58,9 +58,7 @@ class NotificationSettingsScreenViewModelTests: XCTestCase {
}
}
let deferred = deferFulfillment(viewModel.context.$viewState) { state in
state.settings != nil
}
let deferred = deferFulfillment(viewModel.context.observe(\.viewState.settings)) { $0 != nil }
notificationSettingsProxy.callbacks.send(.settingsDidChange)
@@ -88,9 +86,7 @@ class NotificationSettingsScreenViewModelTests: XCTestCase {
}
}
let deferred = deferFulfillment(viewModel.context.$viewState) { state in
state.settings != nil
}
let deferred = deferFulfillment(viewModel.context.observe(\.viewState.settings)) { $0 != nil }
notificationSettingsProxy.callbacks.send(.settingsDidChange)
@@ -112,9 +108,7 @@ class NotificationSettingsScreenViewModelTests: XCTestCase {
}
}
let deferred = deferFulfillment(viewModel.context.$viewState) { state in
state.settings != nil
}
let deferred = deferFulfillment(viewModel.context.observe(\.viewState.settings)) { $0 != nil }
notificationSettingsProxy.callbacks.send(.settingsDidChange)
@@ -137,22 +131,21 @@ class NotificationSettingsScreenViewModelTests: XCTestCase {
}
}
var deferred = deferFulfillment(viewModel.context.$viewState) { state in
state.settings != nil
}
let deferredSettings = deferFulfillment(viewModel.context.observe(\.viewState.settings)) { $0 != nil }
notificationSettingsProxy.callbacks.send(.settingsDidChange)
try await deferred.fulfill()
try await deferredSettings.fulfill()
XCTAssertEqual(context.viewState.settings?.directChatsMode, .allMessages)
XCTAssertEqual(context.viewState.settings?.inconsistentSettings, [.init(chatType: .oneToOneChat, isEncrypted: false)])
deferred = deferFulfillment(viewModel.context.$viewState, keyPath: \.fixingConfigurationMismatch, transitionValues: [false, true, false])
let deferredMismatch = deferFulfillment(viewModel.context.observe(\.viewState.fixingConfigurationMismatch),
transitionValues: [false, true, false])
context.send(viewAction: .fixConfigurationMismatchTapped)
try await deferred.fulfill()
try await deferredMismatch.fulfill()
// Ensure we only fix the invalid setting: unencrypted one-to-one chats should be set to `.allMessages` (to match encrypted one-to-one chats)
XCTAssertEqual(notificationSettingsProxy.setDefaultRoomNotificationModeIsEncryptedIsOneToOneModeCallsCount, 1)
@@ -175,30 +168,24 @@ class NotificationSettingsScreenViewModelTests: XCTestCase {
}
}
var deferred = deferFulfillment(viewModel.context.$viewState) { state in
state.settings != nil
}
let deferredSettings = deferFulfillment(viewModel.context.observe(\.viewState.settings)) { $0 != nil }
notificationSettingsProxy.callbacks.send(.settingsDidChange)
try await deferred.fulfill()
try await deferredSettings.fulfill()
XCTAssertEqual(context.viewState.settings?.directChatsMode, .allMessages)
XCTAssertEqual(context.viewState.settings?.inconsistentSettings, [.init(chatType: .groupChat, isEncrypted: false), .init(chatType: .oneToOneChat, isEncrypted: false)])
deferred = deferFulfillment(viewModel.context.$viewState) { state in
state.fixingConfigurationMismatch == true
}
var deferredMismatch = deferFulfillment(viewModel.context.observe(\.viewState.fixingConfigurationMismatch)) { $0 }
context.send(viewAction: .fixConfigurationMismatchTapped)
try await deferred.fulfill()
try await deferredMismatch.fulfill()
deferred = deferFulfillment(viewModel.context.$viewState) { state in
state.fixingConfigurationMismatch == false
}
deferredMismatch = deferFulfillment(viewModel.context.observe(\.viewState.fixingConfigurationMismatch)) { !$0 }
try await deferred.fulfill()
try await deferredMismatch.fulfill()
// All problems should be fixed
XCTAssertEqual(notificationSettingsProxy.setDefaultRoomNotificationModeIsEncryptedIsOneToOneModeCallsCount, 2)
@@ -216,9 +203,7 @@ class NotificationSettingsScreenViewModelTests: XCTestCase {
func testToggleRoomMentionOff() async throws {
notificationSettingsProxy.isRoomMentionEnabledReturnValue = true
let deferredState = deferFulfillment(viewModel.context.$viewState) { state in
state.settings != nil
}
let deferredState = deferFulfillment(viewModel.context.observe(\.viewState.settings)) { $0 != nil }
notificationSettingsProxy.callbacks.send(.settingsDidChange)
@@ -241,9 +226,7 @@ class NotificationSettingsScreenViewModelTests: XCTestCase {
func testToggleRoomMentionOn() async throws {
notificationSettingsProxy.isRoomMentionEnabledReturnValue = false
let deferredInitialFetch = deferFulfillment(viewModel.context.$viewState) { state in
state.settings != nil
}
let deferredInitialFetch = deferFulfillment(viewModel.context.observe(\.viewState.settings)) { $0 != nil }
viewModel.fetchInitialContent()
try await deferredInitialFetch.fulfill()
@@ -266,9 +249,7 @@ class NotificationSettingsScreenViewModelTests: XCTestCase {
notificationSettingsProxy.setRoomMentionEnabledEnabledThrowableError = NotificationSettingsError.Generic(msg: "error")
notificationSettingsProxy.isRoomMentionEnabledReturnValue = false
let deferredInitialFetch = deferFulfillment(viewModel.context.$viewState) { state in
state.settings != nil
}
let deferredInitialFetch = deferFulfillment(viewModel.context.observe(\.viewState.settings)) { $0 != nil }
viewModel.fetchInitialContent()
@@ -276,17 +257,13 @@ class NotificationSettingsScreenViewModelTests: XCTestCase {
context.roomMentionsEnabled = true
var deferred = deferFulfillment(context.$viewState) { state in
state.applyingChange == true
}
var deferred = deferFulfillment(context.observe(\.viewState.applyingChange)) { $0 }
context.send(viewAction: .roomMentionChanged)
try await deferred.fulfill()
deferred = deferFulfillment(context.$viewState) { state in
state.applyingChange == false
}
deferred = deferFulfillment(context.observe(\.viewState.applyingChange)) { !$0 }
try await deferred.fulfill()
@@ -296,9 +273,7 @@ class NotificationSettingsScreenViewModelTests: XCTestCase {
func testToggleCallsOff() async throws {
notificationSettingsProxy.isCallEnabledReturnValue = true
let deferredInitialFetch = deferFulfillment(viewModel.context.$viewState) { state in
state.settings != nil
}
let deferredInitialFetch = deferFulfillment(viewModel.context.observe(\.viewState.settings)) { $0 != nil }
viewModel.fetchInitialContent()
@@ -320,9 +295,7 @@ class NotificationSettingsScreenViewModelTests: XCTestCase {
func testToggleCallsOn() async throws {
notificationSettingsProxy.isCallEnabledReturnValue = false
let deferredInitialFetch = deferFulfillment(viewModel.context.$viewState) { state in
state.settings != nil
}
let deferredInitialFetch = deferFulfillment(viewModel.context.observe(\.viewState.settings)) { $0 != nil }
viewModel.fetchInitialContent()
@@ -346,9 +319,7 @@ class NotificationSettingsScreenViewModelTests: XCTestCase {
notificationSettingsProxy.setCallEnabledEnabledThrowableError = NotificationSettingsError.Generic(msg: "error")
notificationSettingsProxy.isCallEnabledReturnValue = false
let deferredInitialFetch = deferFulfillment(viewModel.context.$viewState) { state in
state.settings != nil
}
let deferredInitialFetch = deferFulfillment(viewModel.context.observe(\.viewState.settings)) { $0 != nil }
viewModel.fetchInitialContent()
@@ -356,17 +327,13 @@ class NotificationSettingsScreenViewModelTests: XCTestCase {
context.callsEnabled = true
var deferred = deferFulfillment(context.$viewState) { state in
state.applyingChange == true
}
var deferred = deferFulfillment(context.observe(\.viewState.applyingChange)) { $0 }
context.send(viewAction: .callsChanged)
try await deferred.fulfill()
deferred = deferFulfillment(context.$viewState) { state in
state.applyingChange == false
}
deferred = deferFulfillment(context.observe(\.viewState.applyingChange)) { !$0 }
try await deferred.fulfill()
@@ -376,9 +343,7 @@ class NotificationSettingsScreenViewModelTests: XCTestCase {
func testToggleInvitationsOff() async throws {
notificationSettingsProxy.isInviteForMeEnabledReturnValue = true
let deferredInitialFetch = deferFulfillment(viewModel.context.$viewState) { state in
state.settings != nil
}
let deferredInitialFetch = deferFulfillment(viewModel.context.observe(\.viewState.settings)) { $0 != nil }
viewModel.fetchInitialContent()
@@ -400,9 +365,7 @@ class NotificationSettingsScreenViewModelTests: XCTestCase {
func testToggleInvitationsOn() async throws {
notificationSettingsProxy.isInviteForMeEnabledReturnValue = false
let deferredInitialFetch = deferFulfillment(viewModel.context.$viewState) { state in
state.settings != nil
}
let deferredInitialFetch = deferFulfillment(viewModel.context.observe(\.viewState.settings)) { $0 != nil }
viewModel.fetchInitialContent()
@@ -426,9 +389,7 @@ class NotificationSettingsScreenViewModelTests: XCTestCase {
notificationSettingsProxy.setInviteForMeEnabledEnabledThrowableError = NotificationSettingsError.Generic(msg: "error")
notificationSettingsProxy.isInviteForMeEnabledReturnValue = false
let deferredInitialFetch = deferFulfillment(viewModel.context.$viewState) { state in
state.settings != nil
}
let deferredInitialFetch = deferFulfillment(viewModel.context.observe(\.viewState.settings)) { $0 != nil }
viewModel.fetchInitialContent()
@@ -436,17 +397,13 @@ class NotificationSettingsScreenViewModelTests: XCTestCase {
context.invitationsEnabled = true
var deferred = deferFulfillment(context.$viewState) { state in
state.applyingChange == true
}
var deferred = deferFulfillment(context.observe(\.viewState.applyingChange)) { $0 }
context.send(viewAction: .invitationsChanged)
try await deferred.fulfill()
deferred = deferFulfillment(context.$viewState) { state in
state.applyingChange == false
}
deferred = deferFulfillment(context.observe(\.viewState.applyingChange)) { !$0 }
try await deferred.fulfill()
@@ -48,12 +48,12 @@ class SecureBackupLogoutConfirmationScreenViewModelTests: XCTestCase {
return .success(())
}
let deferredWaiting = deferFulfillment(context.$viewState) { $0.mode == .waitingToStart(hasStalled: false) }
let deferredWaiting = deferFulfillment(context.observe(\.viewState.mode)) { $0 == .waitingToStart(hasStalled: false) }
context.send(viewAction: .logout)
try await deferredWaiting.fulfill()
// Wait for the 2-second timeout.
let deferredHasStalled = deferFulfillment(context.$viewState) { $0.mode == .waitingToStart(hasStalled: true) }
let deferredHasStalled = deferFulfillment(context.observe(\.viewState.mode)) { $0 == .waitingToStart(hasStalled: true) }
try await deferredHasStalled.fulfill()
// Wait for the progress to be reported.
@@ -64,7 +64,7 @@ class SecureBackupLogoutConfirmationScreenViewModelTests: XCTestCase {
func testOfflineState() async throws {
try await testOngoingState()
let deferred = deferFulfillment(context.$viewState) { $0.mode == .offline }
let deferred = deferFulfillment(context.observe(\.viewState.mode)) { $0 == .offline }
reachabilitySubject.send(.unreachable)
try await deferred.fulfill()
}