Fix unit tests.

This commit is contained in:
Doug
2026-09-25 14:17:15 +01:00
committed by Stefan Ceriu
parent fccad5fc30
commit c0469e681f
34 changed files with 239 additions and 301 deletions
@@ -23,7 +23,7 @@ final class AnalyticsSettingsScreenViewModelTests {
client.isRunning = false
analytics = AnalyticsService(client: client, appSettings: appSettings)
viewModel = AnalyticsSettingsScreenViewModel(appSettings: appSettings,
viewModel = AnalyticsSettingsScreenViewModel(userSettings: UserSettings(appSettings: appSettings, accountSettings: .init()),
analytics: analytics)
context = viewModel.context
}
@@ -13,12 +13,12 @@ import Testing
@MainActor
final class BugReportServiceTests {
var appSettings: AppSettings!
var userSettings: UserSettings!
var bugReportService: BugReportServiceProtocol!
init() throws {
appSettings = AppSettings.volatile()
appSettings.bugReportRageshakeURL.reset()
userSettings = UserSettings.volatile()
userSettings.bugReportRageshakeURL.reset()
let bugReportServiceMock = BugReportServiceMock()
bugReportServiceMock.lastCrashEventIDSubject = .init(nil)
@@ -27,7 +27,7 @@ final class BugReportServiceTests {
}
deinit {
appSettings.bugReportRageshakeURL.reset()
userSettings.bugReportRageshakeURL.reset()
}
@Test
@@ -104,22 +104,22 @@ final class BugReportServiceTests {
@Test
@MainActor
func configurations() async throws {
guard case let .url(initialURL) = appSettings.bugReportRageshakeURL.publisher.value else {
guard case let .url(initialURL) = userSettings.bugReportRageshakeURL.publisher.value else {
Issue.record("Unexpected initial configuration.")
return
}
let service = BugReportService(rageshakeURLPublisher: appSettings.bugReportRageshakeURL.publisher,
let service = BugReportService(rageshakeURLPublisher: userSettings.bugReportRageshakeURL.publisher,
applicationID: "mock_app_id",
sdkGitSHA: "1234",
session: .mock,
appHooks: AppHooks())
#expect(service.isEnabled)
appSettings.bugReportRageshakeURL.applyRemoteValue(.disabled)
userSettings.bugReportRageshakeURL.applyRemoteValue(.disabled)
#expect(!service.isEnabled)
appSettings.bugReportRageshakeURL.applyRemoteValue(.url("https://bugs.server.net/submit"))
userSettings.bugReportRageshakeURL.applyRemoteValue(.url("https://bugs.server.net/submit"))
#expect(service.isEnabled)
let bugReport = BugReport(userID: "@mock:client.com",
@@ -136,7 +136,7 @@ final class BugReportServiceTests {
#expect(customConfigurationResponse.reportURL == "https://bugs.server.net/123")
appSettings.bugReportRageshakeURL.reset()
userSettings.bugReportRageshakeURL.reset()
#expect(service.isEnabled)
let defaultConfigurationResponse = try await service.submitBugReport(bugReport, progressListener: progressSubject).get()
@@ -29,7 +29,7 @@ struct ChatsTabFlowCoordinatorTests {
}
init() async throws {
let appSettings = AppSettings.volatile()
let userSettings = UserSettings.volatile()
clientProxy = ClientProxyMock(.init(userID: "hi@bob", roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))))
timelineControllerFactory = TimelineControllerFactoryMock(.init())
@@ -42,10 +42,10 @@ struct ChatsTabFlowCoordinatorTests {
bugReportService: BugReportServiceMock(.init()),
elementCallService: ElementCallServiceMock(.init()),
timelineControllerFactory: timelineControllerFactory,
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: userSettings),
linkMetadataProvider: LinkMetadataProvider(),
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
userSettings: userSettings,
appHooks: AppHooks(),
analytics: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -84,14 +84,14 @@ final class ComposerToolbarViewModelTests {
.init(suggestionType: .user(.init(id: "@user_mention_2:matrix.org", displayName: "User 2", avatarURL: nil)), range: .init(), rawSuggestionText: "")]
let mockCompletionSuggestionService = CompletionSuggestionServiceMock(configuration: .init(suggestions: suggestions))
let appSettings = AppSettings.volatile()
let userSettings = UserSettings.volatile()
viewModel = ComposerToolbarViewModel(roomProxy: JoinedRoomProxyMock(.init()),
wysiwygViewModel: wysiwygViewModel,
completionSuggestionService: mockCompletionSuggestionService,
mediaProvider: MediaProviderMock(.init()),
mentionDisplayHelper: ComposerMentionDisplayHelper.mock,
appSettings: appSettings,
userSettings: userSettings,
analyticsService: AnalyticsServiceMock(.init()),
composerDraftService: draftServiceMock)
@@ -803,14 +803,14 @@ final class ComposerToolbarViewModelTests {
let mockSubject = CurrentValueSubject<[IdentityStatusChange], Never>([])
roomProxyMock.identityStatusChangesPublisher = mockSubject.asCurrentValuePublisher()
let appSettings = AppSettings.volatile()
let userSettings = UserSettings.volatile()
viewModel = ComposerToolbarViewModel(roomProxy: roomProxyMock,
wysiwygViewModel: wysiwygViewModel,
completionSuggestionService: mockCompletionSuggestionService,
mediaProvider: MediaProviderMock(.init()),
mentionDisplayHelper: ComposerMentionDisplayHelper.mock,
appSettings: appSettings,
userSettings: userSettings,
analyticsService: AnalyticsServiceMock(.init()),
composerDraftService: draftServiceMock)
@@ -846,14 +846,14 @@ final class ComposerToolbarViewModelTests {
roomProxyMock.identityStatusChangesPublisher = mockSubject.asCurrentValuePublisher()
let appSettings = AppSettings.volatile()
let userSettings = UserSettings.volatile()
viewModel = ComposerToolbarViewModel(roomProxy: roomProxyMock,
wysiwygViewModel: wysiwygViewModel,
completionSuggestionService: mockCompletionSuggestionService,
mediaProvider: MediaProviderMock(.init()),
mentionDisplayHelper: ComposerMentionDisplayHelper.mock,
appSettings: appSettings,
userSettings: userSettings,
analyticsService: AnalyticsServiceMock(.init()),
composerDraftService: draftServiceMock)
@@ -886,14 +886,14 @@ final class ComposerToolbarViewModelTests {
}
roomProxyMock.identityStatusChangesPublisher = CurrentValueSubject([IdentityStatusChange(userId: "@alice:localhost", changedTo: .pinViolation)]).asCurrentValuePublisher()
let appSettings = AppSettings.volatile()
let userSettings = UserSettings.volatile()
viewModel = ComposerToolbarViewModel(roomProxy: roomProxyMock,
wysiwygViewModel: wysiwygViewModel,
completionSuggestionService: mockCompletionSuggestionService,
mediaProvider: MediaProviderMock(.init()),
mentionDisplayHelper: ComposerMentionDisplayHelper.mock,
appSettings: appSettings,
userSettings: userSettings,
analyticsService: AnalyticsServiceMock(.init()),
composerDraftService: draftServiceMock)
@@ -923,7 +923,7 @@ final class ComposerToolbarViewModelTests {
draftServiceMock.loadDraftClosure = loadDraftClosure
}
let appSettings = AppSettings.volatile()
let userSettings = UserSettings.volatile()
viewModel = ComposerToolbarViewModel(initialText: initialText,
roomProxy: JoinedRoomProxyMock(.init()),
@@ -931,7 +931,7 @@ final class ComposerToolbarViewModelTests {
completionSuggestionService: completionSuggestionServiceMock,
mediaProvider: MediaProviderMock(.init()),
mentionDisplayHelper: ComposerMentionDisplayHelper.mock,
appSettings: appSettings,
userSettings: userSettings,
analyticsService: AnalyticsServiceMock(.init()),
composerDraftService: draftServiceMock)
viewModel.context.composerFormattingEnabled = true
@@ -17,14 +17,14 @@ final class CreateRoomScreenViewModelTests {
var spaceService: SpaceServiceProxyMock!
var userSession: UserSessionMock!
private let appSettings: AppSettings
private let userSettings: UserSettings
var context: CreateRoomScreenViewModel.Context {
viewModel.context
}
init() {
appSettings = AppSettings.volatile()
userSettings = UserSettings.volatile()
}
isolated deinit {
@@ -85,14 +85,14 @@ final class CreateRoomScreenViewModelTests {
spaceServiceConfiguration: .init(spaceRoomLists: ["1": .init()])))
clientProxy.roomForIdentifierClosure = { roomID in .joined(JoinedRoomProxyMock(.init(id: roomID))) }
userSession = UserSessionMock(.init(clientProxy: clientProxy))
appSettings.knockingEnabled = true
userSettings.knockingEnabled = true
let viewModel = CreateRoomScreenViewModel(isSpace: true,
spaceSelectionMode: .none,
shouldShowCancelButton: false,
userSession: userSession,
analytics: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
appSettings: appSettings)
userSettings: userSettings)
self.viewModel = viewModel
// Given a form with a blank topic.
@@ -335,14 +335,14 @@ final class CreateRoomScreenViewModelTests {
clientProxy.spaceService = spaceService
clientProxy.roomForIdentifierClosure = { roomID in .joined(JoinedRoomProxyMock(.init(id: roomID))) }
userSession = UserSessionMock(.init(clientProxy: clientProxy))
appSettings.knockingEnabled = true
userSettings.knockingEnabled = true
let viewModel = CreateRoomScreenViewModel(isSpace: isSpace,
spaceSelectionMode: spacesSelectionMode,
shouldShowCancelButton: false,
userSession: userSession,
analytics: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
appSettings: appSettings)
userSettings: userSettings)
self.viewModel = viewModel
}
}
@@ -55,7 +55,7 @@ struct EmojiPickerScreenViewModelTests {
emojiPickerStream = stream
viewModel = EmojiPickerScreenViewModel(selectedEmojis: selectedEmojis,
emojiProvider: EmojiProvider(appSettings: .volatile()),
emojiProvider: EmojiProvider(userSettings: .volatile()),
continuation: continuation)
}
}
+4 -4
View File
@@ -19,7 +19,7 @@ struct EmojiProviderTests {
let emojiLoaderMock = EmojiLoaderMock()
emojiLoaderMock.categories = [category]
let emojiProvider = EmojiProvider(loader: emojiLoaderMock, appSettings: .volatile())
let emojiProvider = EmojiProvider(loader: emojiLoaderMock, userSettings: .volatile())
let categories = await emojiProvider.categories()
#expect(emojiLoaderMock.categories == categories)
@@ -33,7 +33,7 @@ struct EmojiProviderTests {
let emojiLoaderMock = EmojiLoaderMock()
emojiLoaderMock.categories = [category]
let emojiProvider = EmojiProvider(loader: emojiLoaderMock, appSettings: .volatile())
let emojiProvider = EmojiProvider(loader: emojiLoaderMock, userSettings: .volatile())
let categories = await emojiProvider.categories(searchString: "")
#expect(emojiLoaderMock.categories == categories)
@@ -51,7 +51,7 @@ struct EmojiProviderTests {
let emojiLoaderMock = EmojiLoaderMock()
emojiLoaderMock.categories = categoriesForFirstLoad
let emojiProvider = EmojiProvider(loader: emojiLoaderMock, appSettings: .volatile())
let emojiProvider = EmojiProvider(loader: emojiLoaderMock, userSettings: .volatile())
_ = await emojiProvider.categories()
emojiLoaderMock.categories = categoriesForSecondLoad
@@ -82,7 +82,7 @@ struct EmojiProviderTests {
let emojiLoaderMock = EmojiLoaderMock()
emojiLoaderMock.categories = categories
let emojiProvider = EmojiProvider(loader: emojiLoaderMock, appSettings: .volatile())
let emojiProvider = EmojiProvider(loader: emojiLoaderMock, userSettings: .volatile())
_ = await emojiProvider.categories()
let result = await emojiProvider.categories(searchString: searchString)
@@ -20,12 +20,12 @@ final class HomeScreenViewModelTests {
var clientProxy: ClientProxyMock!
var roomSummaryProvider: RoomSummaryProviderMock!
var notificationManager: NotificationManagerMock!
private let appSettings: AppSettings
private let userSettings: UserSettings
var cancellables = Set<AnyCancellable>()
init() {
appSettings = AppSettings.volatile()
userSettings = UserSettings.volatile()
}
@Test
@@ -275,7 +275,7 @@ final class HomeScreenViewModelTests {
room.roomID == invites[0].roomID && room.badges.isDotShown == false
}
}
appSettings.seenInvites = Set(invites.compactMap(\.roomID))
userSettings.seenInvites = Set(invites.compactMap(\.roomID))
try await deferred.fulfill()
invites = context.viewState.rooms.invites
@@ -289,14 +289,14 @@ final class HomeScreenViewModelTests {
setupViewModel(invites: .rooms)
let invitedRoomIDs = context.viewState.rooms.invites.compactMap(\.roomID)
appSettings.seenInvites = Set(invitedRoomIDs)
userSettings.seenInvites = Set(invitedRoomIDs)
#expect(invitedRoomIDs.count == 2)
let deferred = deferFulfillment(viewModel.actions) { $0 == .presentRoom(roomIdentifier: invitedRoomIDs[0]) }
context.send(viewAction: .acceptInvite(roomIdentifier: invitedRoomIDs[0]))
try await deferred.fulfill()
#expect(appSettings.seenInvites == [invitedRoomIDs[1]])
#expect(userSettings.seenInvites == [invitedRoomIDs[1]])
#expect(!notificationManager.removeDeliveredMessageNotificationsForCalled, "The notification will be dismissed when opening the room.")
}
@@ -305,7 +305,7 @@ final class HomeScreenViewModelTests {
setupViewModel(invites: .spaces)
let invitedRoomIDs = context.viewState.rooms.invites.compactMap(\.roomID)
appSettings.seenInvites = Set(invitedRoomIDs)
userSettings.seenInvites = Set(invitedRoomIDs)
#expect(invitedRoomIDs.count == 2)
let deferred = deferFulfillment(viewModel.actions) {
@@ -314,7 +314,7 @@ final class HomeScreenViewModelTests {
context.send(viewAction: .acceptInvite(roomIdentifier: invitedRoomIDs[0]))
try await deferred.fulfill()
#expect(appSettings.seenInvites == [invitedRoomIDs[1]])
#expect(userSettings.seenInvites == [invitedRoomIDs[1]])
#expect(!notificationManager.removeDeliveredMessageNotificationsForCalled, "The notification will be dismissed when opening the room.")
}
@@ -322,7 +322,7 @@ final class HomeScreenViewModelTests {
func declineInvite() async throws {
setupViewModel(invites: .rooms)
let invitedRoomIDs = context.viewState.rooms.invites.compactMap(\.roomID)
appSettings.seenInvites = Set(invitedRoomIDs)
userSettings.seenInvites = Set(invitedRoomIDs)
#expect(invitedRoomIDs.count == 2)
let deferred = deferFulfillment(context.$viewState) { $0.bindings.alertInfo != nil }
@@ -345,7 +345,7 @@ final class HomeScreenViewModelTests {
try await Task.sleep(for: .milliseconds(100))
#expect(rejectCalled)
#expect(appSettings.seenInvites == [invitedRoomIDs[1]])
#expect(userSettings.seenInvites == [invitedRoomIDs[1]])
#expect(notificationManager.removeDeliveredMessageNotificationsForCalled)
#expect(notificationManager.removeDeliveredMessageNotificationsForReceivedInvocations == [invitedRoomIDs[0]])
}
@@ -354,7 +354,7 @@ final class HomeScreenViewModelTests {
func declineAndBlockInvite() async throws {
setupViewModel(invites: .rooms)
let invitedRoomIDs = context.viewState.rooms.invites.compactMap(\.roomID)
appSettings.seenInvites = Set(invitedRoomIDs)
userSettings.seenInvites = Set(invitedRoomIDs)
#expect(invitedRoomIDs.count == 2)
let deferred = deferFulfillment(context.$viewState) { $0.bindings.alertInfo != nil }
@@ -368,7 +368,7 @@ final class HomeScreenViewModelTests {
@Test
func newSoundBanner() {
appSettings.hasSeenNewSoundBanner = false
userSettings.hasSeenNewSoundBanner = false
setupViewModel()
#expect(context.viewState.shouldShowBanner)
@@ -377,7 +377,7 @@ final class HomeScreenViewModelTests {
context.send(viewAction: .dismissNewSoundBanner)
#expect(!context.viewState.shouldShowBanner)
#expect(!context.viewState.shouldShowNewSoundBanner)
#expect(appSettings.hasSeenNewSoundBanner)
#expect(userSettings.hasSeenNewSoundBanner)
}
// MARK: - Helpers
@@ -483,7 +483,7 @@ final class HomeScreenViewModelTests {
viewModel = HomeScreenViewModel(userSession: userSession,
selectedRoomPublisher: CurrentValueSubject<String?, Never>(nil).asCurrentValuePublisher(),
appSettings: appSettings,
userSettings: userSettings,
analyticsService: AnalyticsServiceMock(.init()),
bugReportService: BugReportServiceMock(.init()),
notificationManager: notificationManager,
@@ -109,7 +109,7 @@ struct IdentityConfirmationScreenViewModelTests {
userSession.sessionSecurityStatePublisher = securityStateSubject.asCurrentValuePublisher()
viewModel = IdentityConfirmationScreenViewModel(userSession: userSession,
appSettings: .volatile(),
userSettings: .volatile(),
userIndicatorController: UserIndicatorControllerMock())
}
}
@@ -31,10 +31,10 @@ final class JoinRoomScreenViewModelTests {
viewModel.context
}
private let appSettings: AppSettings
private let userSettings: UserSettings
init() {
appSettings = AppSettings.volatile()
userSettings = UserSettings.volatile()
}
isolated deinit {
@@ -45,12 +45,12 @@ final class JoinRoomScreenViewModelTests {
@Test
func interaction() async throws {
#expect(appSettings.seenInvites.isEmpty, "There shouldn't be any seen invites before running the tests.")
#expect(userSettings.seenInvites.isEmpty, "There shouldn't be any seen invites before running the tests.")
setupViewModel()
try await deferFulfillment(viewModel.context.$viewState) { $0.mode == .joinable }.fulfill()
#expect(appSettings.seenInvites.isEmpty, "Only an invited room should register the room ID as a seen invite.")
#expect(userSettings.seenInvites.isEmpty, "Only an invited room should register the room ID as a seen invite.")
let deferred = deferFulfillment(viewModel.actionsPublisher) { $0 == .joined(.roomID("1")) }
context.send(viewAction: .join)
@@ -59,28 +59,28 @@ final class JoinRoomScreenViewModelTests {
@Test
func acceptInviteInteraction() async throws {
#expect(appSettings.seenInvites.isEmpty, "There shouldn't be any seen invites before running the tests.")
#expect(userSettings.seenInvites.isEmpty, "There shouldn't be any seen invites before running the tests.")
setupViewModel(mode: .invited)
try await deferFulfillment(viewModel.context.$viewState) { $0.mode == .invited(isDM: false) }.fulfill()
#expect(appSettings.seenInvites == ["1"], "The invited room's ID should be registered as a seen invite.")
#expect(userSettings.seenInvites == ["1"], "The invited room's ID should be registered as a seen invite.")
let deferred = deferFulfillment(viewModel.actionsPublisher) { $0 == .joined(.roomID("1")) }
context.send(viewAction: .acceptInvite)
try await deferred.fulfill()
#expect(appSettings.seenInvites.isEmpty, "The after accepting an invite the invite should be forgotten in case the user leaves.")
#expect(userSettings.seenInvites.isEmpty, "The after accepting an invite the invite should be forgotten in case the user leaves.")
}
@Test
func declineInviteInteraction() async throws {
#expect(appSettings.seenInvites.isEmpty, "There shouldn't be any seen invites before running the tests.")
#expect(userSettings.seenInvites.isEmpty, "There shouldn't be any seen invites before running the tests.")
setupViewModel(mode: .invited)
try await deferFulfillment(viewModel.context.$viewState) { $0.mode == .invited(isDM: false) }.fulfill()
#expect(appSettings.seenInvites == ["1"], "The invited room's ID should be registered as a seen invite.")
#expect(userSettings.seenInvites == ["1"], "The invited room's ID should be registered as a seen invite.")
context.send(viewAction: .declineInvite)
@@ -89,17 +89,17 @@ final class JoinRoomScreenViewModelTests {
context.alertInfo?.secondaryButton?.action?()
try await deferred.fulfill()
#expect(appSettings.seenInvites.isEmpty, "The after declining an invite the invite should be forgotten in case another invite is received.")
#expect(userSettings.seenInvites.isEmpty, "The after declining an invite the invite should be forgotten in case another invite is received.")
}
@Test
func knockedState() async throws {
#expect(appSettings.seenInvites.isEmpty, "There shouldn't be any seen invites before running the tests.")
#expect(userSettings.seenInvites.isEmpty, "There shouldn't be any seen invites before running the tests.")
setupViewModel(mode: .knocked)
try await deferFulfillment(viewModel.context.$viewState) { $0.mode == .knocked }.fulfill()
#expect(appSettings.seenInvites.isEmpty, "Only an invited room should register the room ID as a seen invite.")
#expect(userSettings.seenInvites.isEmpty, "Only an invited room should register the room ID as a seen invite.")
}
@Test
@@ -237,7 +237,7 @@ final class JoinRoomScreenViewModelTests {
}
viewModel = JoinRoomScreenViewModel(source: .generic(roomID: "1", via: []),
appSettings: appSettings,
userSettings: userSettings,
userSession: UserSessionMock(.init(clientProxy: clientProxy)),
userIndicatorController: UserIndicatorControllerMock())
}
@@ -16,7 +16,7 @@ final class LiveLocationManagerTests {
private var clientProxy: ClientProxyMock!
private var locationManagerMock: CLLocationManagerMock!
private var manager: LiveLocationManager!
private var appSettings: AppSettings!
private var userSettings: UserSettings!
private var beaconInfoSubject: PassthroughSubject<LiveLocationOwnInfoUpdate, Never>!
// MARK: - startLiveLocation
@@ -41,11 +41,11 @@ final class LiveLocationManagerTests {
try result.get()
#expect(callOrder == ["stop", "start"])
#expect(appSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] == nil)
#expect(userSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] == nil)
try await simulateBeaconEcho(roomID: "!room:matrix.org", eventID: "$event:matrix.org")
#expect(appSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] != nil)
#expect(userSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] != nil)
#expect(locationManagerMock.startUpdatingLocationCalled)
}
@@ -54,7 +54,7 @@ final class LiveLocationManagerTests {
setUp()
let roomProxy = makeRoomProxy(roomID: "!room:matrix.org")
clientProxy.roomForIdentifierClosure = { _ in .joined(roomProxy) }
appSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] = LiveLocationSession(eventID: "$old_event:matrix.org", expirationDate: Date().addingTimeInterval(300))
userSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] = LiveLocationSession(eventID: "$old_event:matrix.org", expirationDate: Date().addingTimeInterval(300))
var callOrder: [String] = []
roomProxy.stopLiveLocationShareClosure = {
@@ -73,7 +73,7 @@ final class LiveLocationManagerTests {
try await simulateBeaconEcho(roomID: "!room:matrix.org", eventID: "$event:matrix.org")
#expect(appSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] != nil)
#expect(userSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] != nil)
}
@Test
@@ -82,12 +82,12 @@ final class LiveLocationManagerTests {
let roomProxy = makeRoomProxy(roomID: "!room1:matrix.org")
clientProxy.roomForIdentifierClosure = { _ in .joined(roomProxy) }
appSettings.liveLocationSharingSessionsByRoomID["!room2:matrix.org"] = LiveLocationSession(eventID: "$event:matrix.org", expirationDate: Date().addingTimeInterval(300))
userSettings.liveLocationSharingSessionsByRoomID["!room2:matrix.org"] = LiveLocationSession(eventID: "$event:matrix.org", expirationDate: Date().addingTimeInterval(300))
_ = await manager.startLiveLocation(roomID: "!room1:matrix.org", duration: .seconds(300))
#expect(roomProxy.stopLiveLocationShareCalled)
#expect(appSettings.liveLocationSharingSessionsByRoomID["!room2:matrix.org"] != nil)
#expect(userSettings.liveLocationSharingSessionsByRoomID["!room2:matrix.org"] != nil)
}
@Test
@@ -98,7 +98,7 @@ final class LiveLocationManagerTests {
let result = await manager.startLiveLocation(roomID: "!room:matrix.org", duration: .seconds(300))
#expect(throws: LiveLocationManagerError.roomNotJoined) { try result.get() }
#expect(appSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] == nil)
#expect(userSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] == nil)
}
@Test
@@ -111,7 +111,7 @@ final class LiveLocationManagerTests {
let result = await manager.startLiveLocation(roomID: "!room:matrix.org", duration: .seconds(300))
#expect(throws: LiveLocationManagerError.startFailed) { try result.get() }
#expect(appSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] == nil)
#expect(userSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] == nil)
}
@Test
@@ -127,7 +127,7 @@ final class LiveLocationManagerTests {
try await simulateBeaconEcho(roomID: "!room:matrix.org", eventID: "$event:matrix.org")
let storedSession = try #require(appSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"])
let storedSession = try #require(userSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"])
let expectedMinTimeout = beforeStart.addingTimeInterval(TimeInterval(duration.seconds))
let expectedMaxTimeout = afterStart.addingTimeInterval(TimeInterval(duration.seconds))
@@ -142,12 +142,12 @@ final class LiveLocationManagerTests {
setUp()
let roomProxy = makeRoomProxy(roomID: "!room:matrix.org")
clientProxy.roomForIdentifierClosure = { _ in .joined(roomProxy) }
appSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] = LiveLocationSession(eventID: "$event:matrix.org", expirationDate: Date().addingTimeInterval(300))
userSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] = LiveLocationSession(eventID: "$event:matrix.org", expirationDate: Date().addingTimeInterval(300))
await manager.stopLiveLocation(roomID: "!room:matrix.org")
#expect(roomProxy.stopLiveLocationShareCalled)
#expect(appSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] == nil)
#expect(userSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] == nil)
// Setting the timeout date above starts tracking; removing it stops tracking.
#expect(locationManagerMock.startUpdatingLocationCalled)
#expect(locationManagerMock.stopUpdatingLocationCalled)
@@ -169,13 +169,13 @@ final class LiveLocationManagerTests {
setUp()
let roomProxy = makeRoomProxy(roomID: "!room1:matrix.org")
clientProxy.roomForIdentifierClosure = { _ in .joined(roomProxy) }
appSettings.liveLocationSharingSessionsByRoomID["!room1:matrix.org"] = LiveLocationSession(eventID: "$event:matrix.org", expirationDate: Date().addingTimeInterval(300))
appSettings.liveLocationSharingSessionsByRoomID["!room2:matrix.org"] = LiveLocationSession(eventID: "$event:matrix.org", expirationDate: Date().addingTimeInterval(300))
userSettings.liveLocationSharingSessionsByRoomID["!room1:matrix.org"] = LiveLocationSession(eventID: "$event:matrix.org", expirationDate: Date().addingTimeInterval(300))
userSettings.liveLocationSharingSessionsByRoomID["!room2:matrix.org"] = LiveLocationSession(eventID: "$event:matrix.org", expirationDate: Date().addingTimeInterval(300))
await manager.stopLiveLocation(roomID: "!room1:matrix.org")
#expect(appSettings.liveLocationSharingSessionsByRoomID["!room1:matrix.org"] == nil)
#expect(appSettings.liveLocationSharingSessionsByRoomID["!room2:matrix.org"] != nil)
#expect(userSettings.liveLocationSharingSessionsByRoomID["!room1:matrix.org"] == nil)
#expect(userSettings.liveLocationSharingSessionsByRoomID["!room2:matrix.org"] != nil)
}
// MARK: - Beacon info updates
@@ -188,13 +188,13 @@ final class LiveLocationManagerTests {
try await manager.startLiveLocation(roomID: "!room:matrix.org", duration: .seconds(300)).get()
try await simulateBeaconEcho(roomID: "!room:matrix.org", eventID: "$event:matrix.org")
#expect(appSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] != nil)
#expect(userSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] != nil)
let deferred = deferFulfillment(appSettings.liveLocationSharingSessionsByRoomIDPublisher) { $0["!room:matrix.org"] == nil }
let deferred = deferFulfillment(userSettings.liveLocationSharingSessionsByRoomIDPublisher) { $0["!room:matrix.org"] == nil }
beaconInfoSubject.send(LiveLocationOwnInfoUpdate(roomID: "!room:matrix.org", eventID: "$external_event:matrix.org", isLive: true))
try await deferred.fulfill()
#expect(appSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] == nil)
#expect(userSettings.liveLocationSharingSessionsByRoomID["!room:matrix.org"] == nil)
}
// MARK: - Reduced accuracy
@@ -228,16 +228,16 @@ final class LiveLocationManagerTests {
}
private func setUp(accuracyAuthorization: CLAccuracyAuthorization = .fullAccuracy) {
appSettings = AppSettings.volatile()
userSettings = UserSettings.volatile()
clientProxy = ClientProxyMock(.init())
beaconInfoSubject = PassthroughSubject<LiveLocationOwnInfoUpdate, Never>()
clientProxy.liveLocationOwnInfoUpdatesPublisher = beaconInfoSubject.eraseToAnyPublisher()
locationManagerMock = CLLocationManagerMock(.init(accuracyAuthorization: accuracyAuthorization))
manager = LiveLocationManager(clientProxy: clientProxy, appSettings: appSettings, locationManager: locationManagerMock)
manager = LiveLocationManager(clientProxy: clientProxy, userSettings: userSettings, locationManager: locationManagerMock)
}
private func simulateBeaconEcho(roomID: String, eventID: String) async throws {
let deferred = deferFulfillment(appSettings.liveLocationSharingSessionsByRoomIDPublisher) { $0[roomID] != nil }
let deferred = deferFulfillment(userSettings.liveLocationSharingSessionsByRoomIDPublisher) { $0[roomID] != nil }
beaconInfoSubject.send(LiveLocationOwnInfoUpdate(roomID: roomID, eventID: eventID, isLive: true))
try await deferred.fulfill()
}
@@ -16,7 +16,7 @@ struct LocationSharingScreenViewModelTests {
private static let roomID = "!live-location-room:matrix.org"
private var timelineProxy: TimelineProxyMock!
private var appSettings: AppSettings!
private var userSettings: UserSettings!
private var viewModel: LocationSharingScreenViewModel!
private var context: LocationSharingScreenViewModel.Context {
@@ -417,14 +417,14 @@ struct LocationSharingScreenViewModelTests {
let roomProxyMock = JoinedRoomProxyMock(.init(members: .allMembers))
roomProxyMock.makeLiveLocationServiceReturnValue = liveLocationServiceMock
let appSettings = AppSettings.volatile()
let userSettings = UserSettings.volatile()
viewModel = LocationSharingScreenViewModel(interactionMode: .viewLive(sender: nil, initialLiveLocationShare: nil),
mapURLBuilder: appSettings.mapTilerConfiguration.publisher.value,
mapURLBuilder: userSettings.mapTilerConfiguration.publisher.value,
roomProxy: roomProxyMock,
timelineController: TimelineControllerMock(.init(timelineProxy: TimelineProxyMock(.init()))),
liveLocationManager: LiveLocationManagerMock(.init()),
appSettings: appSettings,
userSettings: userSettings,
analytics: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
mediaProvider: MediaProviderMock(.init()))
@@ -546,7 +546,7 @@ struct LocationSharingScreenViewModelTests {
#expect(context.showsUserLocationMode == .hide)
// Another device takes over: this device's session is removed and a new own share arrives.
appSettings.liveLocationSharingSessionsByRoomID.removeValue(forKey: Self.roomID)
userSettings.liveLocationSharingSessionsByRoomID.removeValue(forKey: Self.roomID)
let newOwnShare = makeLiveLocationShare(userID: RoomMemberProxyMock.mockMe.userID, latitude: 48.8, longitude: 2.3)
let deferred = deferFulfillment(context.observe(\.showsUserLocationMode)) { $0 == .show }
@@ -630,14 +630,14 @@ struct LocationSharingScreenViewModelTests {
private mutating func setupViewModel(liveLocationManagerMock: LiveLocationManagerMock,
members: [RoomMemberProxyMock] = .allMembersAsAdmin) {
appSettings = AppSettings.volatile()
userSettings = UserSettings.volatile()
timelineProxy = TimelineProxyMock(.init())
viewModel = LocationSharingScreenViewModel(interactionMode: .picker(shouldShowLiveLocationOption: true),
mapURLBuilder: appSettings.mapTilerConfiguration.publisher.value,
mapURLBuilder: userSettings.mapTilerConfiguration.publisher.value,
roomProxy: JoinedRoomProxyMock(.init(members: members)),
timelineController: TimelineControllerMock(.init(timelineProxy: timelineProxy)),
liveLocationManager: liveLocationManagerMock,
appSettings: appSettings,
userSettings: userSettings,
analytics: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
mediaProvider: MediaProviderMock(.init()))
@@ -649,9 +649,9 @@ struct LocationSharingScreenViewModelTests {
liveLocationsSubject: CurrentValueSubject<[LiveLocationShare], Never>,
members: [RoomMemberProxyMock] = .allMembers,
isSharingLiveLocationFromThisDevice: Bool = false) {
appSettings = AppSettings.volatile()
userSettings = UserSettings.volatile()
if isSharingLiveLocationFromThisDevice {
appSettings.liveLocationSharingSessionsByRoomID[Self.roomID] = .init(eventID: "$event:matrix.org", expirationDate: .distantFuture)
userSettings.liveLocationSharingSessionsByRoomID[Self.roomID] = .init(eventID: "$event:matrix.org", expirationDate: .distantFuture)
}
let liveLocationServiceMock = RoomLiveLocationServiceMock()
@@ -661,11 +661,11 @@ struct LocationSharingScreenViewModelTests {
roomProxyMock.makeLiveLocationServiceReturnValue = liveLocationServiceMock
viewModel = LocationSharingScreenViewModel(interactionMode: .viewLive(sender: sender, initialLiveLocationShare: initialShare),
mapURLBuilder: appSettings.mapTilerConfiguration.publisher.value,
mapURLBuilder: userSettings.mapTilerConfiguration.publisher.value,
roomProxy: roomProxyMock,
timelineController: TimelineControllerMock(.init(timelineProxy: TimelineProxyMock(.init()))),
liveLocationManager: LiveLocationManagerMock(.init()),
appSettings: appSettings,
userSettings: userSettings,
analytics: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
mediaProvider: MediaProviderMock(.init()))
@@ -15,7 +15,7 @@ final class MediaUploadPreviewScreenViewModelTests {
var timelineProxy: TimelineProxyMock!
var clientProxy: ClientProxyMock!
var userIndicatorController: UserIndicatorControllerMock
private let appSettings: AppSettings
private let userSettings: UserSettings
var viewModel: MediaUploadPreviewScreenViewModel!
var context: MediaUploadPreviewScreenViewModel.Context {
@@ -28,8 +28,8 @@ final class MediaUploadPreviewScreenViewModelTests {
}
init() {
appSettings = AppSettings.volatile()
appSettings.optimizeMediaUploads = false
userSettings = UserSettings.volatile()
userSettings.optimizeMediaUploads = false
userIndicatorController = UserIndicatorControllerMock()
}
@@ -322,7 +322,7 @@ final class MediaUploadPreviewScreenViewModelTests {
title: "Some File",
shouldShowCaptionWarning: true,
galleryEnabled: galleryEnabled,
mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: appSettings),
mediaUploadingPreprocessor: MediaUploadingPreprocessor(userSettings: userSettings),
timelineController: TimelineControllerMock(.init(timelineProxy: timelineProxy)),
clientProxy: clientProxy,
userIndicatorController: userIndicatorController)
@@ -13,13 +13,13 @@ import UniformTypeIdentifiers
final class MediaUploadingPreprocessorTests {
let maxUploadSize: UInt = 100 * 1024 * 1024
var appSettings: AppSettings!
var userSettings: UserSettings!
var mediaUploadingPreprocessor: MediaUploadingPreprocessor!
init() {
appSettings = AppSettings.volatile()
appSettings.optimizeMediaUploads = false
mediaUploadingPreprocessor = MediaUploadingPreprocessor(appSettings: appSettings)
userSettings = UserSettings.volatile()
userSettings.optimizeMediaUploads = false
mediaUploadingPreprocessor = MediaUploadingPreprocessor(userSettings: userSettings)
}
@Test
@@ -80,7 +80,7 @@ final class MediaUploadingPreprocessorTests {
func landscapeMovVideoOptimizedProcessing() async throws {
let url = try #require(Bundle(for: Self.self).url(forResource: "landscape_test_video.mov", withExtension: nil), "Failed retrieving test asset")
appSettings.optimizeMediaUploads = true
userSettings.optimizeMediaUploads = true
guard case let .success(optimizedResult) = await mediaUploadingPreprocessor.processMedia(at: url, maxUploadSize: maxUploadSize),
case let .video(optimizedVideoURL, _, optimizedVideoInfo) = optimizedResult else {
@@ -139,7 +139,7 @@ final class MediaUploadingPreprocessorTests {
func portraitMp4VideoOptimizedProcessing() async throws {
let url = try #require(Bundle(for: Self.self).url(forResource: "portrait_test_video.mp4", withExtension: nil), "Failed retrieving test asset")
appSettings.optimizeMediaUploads = true
userSettings.optimizeMediaUploads = true
guard case let .success(optimizedResult) = await mediaUploadingPreprocessor.processMedia(at: url, maxUploadSize: maxUploadSize),
case let .video(optimizedVideoURL, _, optimizedVideoInfo) = optimizedResult else {
@@ -184,7 +184,7 @@ final class MediaUploadingPreprocessorTests {
#expect(imageInfo.thumbnailInfo?.height == 344)
// Repeat with optimised media setting
appSettings.optimizeMediaUploads = true
userSettings.optimizeMediaUploads = true
guard case let .success(optimizedResult) = await mediaUploadingPreprocessor.processMedia(at: url, maxUploadSize: maxUploadSize),
case let .image(optimizedImageURL, thumbnailURL, optimizedImageInfo) = optimizedResult else {
@@ -228,7 +228,7 @@ final class MediaUploadingPreprocessorTests {
#expect(imageInfo.thumbnailInfo?.height == 800)
// Repeat with optimised media setting
appSettings.optimizeMediaUploads = true
userSettings.optimizeMediaUploads = true
guard case let .success(optimizedResult) = await mediaUploadingPreprocessor.processMedia(at: url, maxUploadSize: maxUploadSize),
case let .image(optimizedImageURL, thumbnailURL, optimizedImageInfo) = optimizedResult else {
@@ -274,7 +274,7 @@ final class MediaUploadingPreprocessorTests {
#expect(imageInfo.thumbnailInfo?.height == 240)
// Repeat with optimised media setting
appSettings.optimizeMediaUploads = true
userSettings.optimizeMediaUploads = true
guard case let .success(optimizedResult) = await mediaUploadingPreprocessor.processMedia(at: url, maxUploadSize: maxUploadSize),
case let .image(optimizedImageURL, _, optimizedImageInfo) = optimizedResult else {
@@ -325,7 +325,7 @@ final class MediaUploadingPreprocessorTests {
#expect(imageInfo.thumbnailInfo?.height == 800)
// Repeat with optimised media setting
appSettings.optimizeMediaUploads = true
userSettings.optimizeMediaUploads = true
guard case let .success(optimizedResult) = await mediaUploadingPreprocessor.processMedia(at: url, maxUploadSize: maxUploadSize),
case let .image(optimizedImageURL, thumbnailURL, optimizedImageInfo) = optimizedResult else {
@@ -377,7 +377,7 @@ final class MediaUploadingPreprocessorTests {
#expect(imageInfo.thumbnailInfo?.height == 472)
// Repeat with optimised media setting
appSettings.optimizeMediaUploads = true
userSettings.optimizeMediaUploads = true
guard case let .success(optimizedResult) = await mediaUploadingPreprocessor.processMedia(at: url, maxUploadSize: maxUploadSize),
case let .image(optimizedImageURL, _, optimizedImageInfo) = optimizedResult else {
@@ -419,7 +419,7 @@ final class MediaUploadingPreprocessorTests {
#expect(imageInfo.thumbnailInfo?.height == 800)
// Repeat with optimised media setting
appSettings.optimizeMediaUploads = true
userSettings.optimizeMediaUploads = true
guard case let .success(optimizedResult) = await mediaUploadingPreprocessor.processMedia(at: url, maxUploadSize: maxUploadSize),
case let .image(optimizedImageURL, thumbnailURL, optimizedImageInfo) = optimizedResult else {
@@ -453,7 +453,7 @@ final class MediaUploadingPreprocessorTests {
fatalError()
}
if appSettings.optimizeMediaUploads {
if userSettings.optimizeMediaUploads {
// Check that new image has been scaled within the requirements for an optimised image
#expect(convertedImage.size.width <= MediaUploadingPreprocessor.Constants.optimizedMaxPixelSize)
#expect(convertedImage.size.height <= MediaUploadingPreprocessor.Constants.optimizedMaxPixelSize)
@@ -15,7 +15,7 @@ import Testing
struct NotificationSettingsScreenViewModelTests {
private var viewModel: NotificationSettingsScreenViewModelProtocol
private var context: NotificationSettingsScreenViewModelType.Context
private var appSettings: AppSettings
private var userSettings: UserSettings
private var userNotificationCenter: UserNotificationCenterMock
private var notificationSettingsProxy: NotificationSettingsProxyMock
private var toneManager: NotificationToneManagerMock
@@ -23,7 +23,7 @@ struct NotificationSettingsScreenViewModelTests {
init() throws {
userNotificationCenter = UserNotificationCenterMock()
userNotificationCenter.authorizationStatusReturnValue = .authorized
appSettings = AppSettings.volatile()
userSettings = UserSettings.volatile()
notificationSettingsProxy = NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration())
notificationSettingsProxy.getDefaultRoomNotificationModeIsEncryptedIsOneToOneReturnValue = .allMessages
notificationSettingsProxy.isRoomMentionEnabledReturnValue = true
@@ -31,7 +31,7 @@ struct NotificationSettingsScreenViewModelTests {
toneManager = NotificationToneManagerMock()
toneManager.customTonesReturnValue = []
viewModel = NotificationSettingsScreenViewModel(appSettings: appSettings,
viewModel = NotificationSettingsScreenViewModel(userSettings: userSettings,
userNotificationCenter: userNotificationCenter,
notificationToneManager: toneManager,
notificationSettingsProxy: notificationSettingsProxy,
@@ -42,16 +42,16 @@ struct NotificationSettingsScreenViewModelTests {
@Test
func enableNotifications() {
appSettings.enableNotifications = false
userSettings.enableNotifications = false
context.send(viewAction: .changedEnableNotifications)
#expect(appSettings.enableNotifications)
#expect(userSettings.enableNotifications)
}
@Test
func disableNotifications() {
appSettings.enableNotifications = true
userSettings.enableNotifications = true
context.send(viewAction: .changedEnableNotifications)
#expect(!appSettings.enableNotifications)
#expect(!userSettings.enableNotifications)
}
@Test
@@ -410,8 +410,8 @@ struct NotificationSettingsScreenViewModelTests {
func selectingAlertTonePersistsSelection() {
// Given a tone and a manager that persists the selection to app settings
let tone = NotificationTone.createBundledSound(label: "Test", filename: "test.caf")
toneManager.setSelectedToneClosure = { [appSettings] selectedTone in
appSettings.selectedNotificationTone = selectedTone
toneManager.setSelectedToneClosure = { [userSettings] selectedTone in
userSettings.selectedNotificationTone = selectedTone
return NotificationToneManager.libraryLocation
}
@@ -419,21 +419,21 @@ struct NotificationSettingsScreenViewModelTests {
context.send(viewAction: .selectAlertTone(tone))
// Then it is reflected in app settings
#expect(appSettings.selectedNotificationTone == tone)
#expect(userSettings.selectedNotificationTone == tone)
}
@Test
func deletingActiveToneResetsSelection() {
// Given the active tone is a custom tone
let customTone = NotificationTone.createCustomUserSound(filename: "custom.caf")
appSettings.selectedNotificationTone = customTone
userSettings.selectedNotificationTone = customTone
toneManager.customTonesReturnValue = [customTone]
// When that tone is deleted
context.send(viewAction: .deleteCustomAlertTones([customTone]))
// Then the selection is cleared, falling back to the default
#expect(appSettings.selectedNotificationTone == nil)
#expect(userSettings.selectedNotificationTone == nil)
}
@Test
@@ -441,14 +441,14 @@ struct NotificationSettingsScreenViewModelTests {
// Given a custom tone is active and a different custom tone also exists
let activeTone = NotificationTone.createCustomUserSound(filename: "active.caf")
let otherTone = NotificationTone.createCustomUserSound(filename: "other.caf")
appSettings.selectedNotificationTone = activeTone
userSettings.selectedNotificationTone = activeTone
toneManager.customTonesReturnValue = [activeTone, otherTone]
// When the non-active tone is deleted
context.send(viewAction: .deleteCustomAlertTones([otherTone]))
// Then the active selection is unchanged
#expect(appSettings.selectedNotificationTone == activeTone)
#expect(userSettings.selectedNotificationTone == activeTone)
}
@Test
@@ -457,7 +457,7 @@ struct NotificationSettingsScreenViewModelTests {
let customTone = NotificationTone.createCustomUserSound(filename: "custom.caf")
var remainingTones = [customTone]
toneManager.customTonesClosure = { remainingTones }
let localVM = NotificationSettingsScreenViewModel(appSettings: appSettings,
let localVM = NotificationSettingsScreenViewModel(userSettings: userSettings,
userNotificationCenter: userNotificationCenter,
notificationToneManager: toneManager,
notificationSettingsProxy: notificationSettingsProxy,
@@ -476,7 +476,7 @@ struct NotificationSettingsScreenViewModelTests {
func deleteCustomToneFailurePreservesSelection() {
// Given the active tone is a custom tone and deletion will fail
let customTone = NotificationTone.createCustomUserSound(filename: "custom.caf")
appSettings.selectedNotificationTone = customTone
userSettings.selectedNotificationTone = customTone
toneManager.deleteCustomToneThrowableError = NSError(domain: "test", code: 1)
toneManager.customTonesReturnValue = [customTone]
@@ -484,7 +484,7 @@ struct NotificationSettingsScreenViewModelTests {
context.send(viewAction: .deleteCustomAlertTones([customTone]))
// Then the selection is unchanged
#expect(appSettings.selectedNotificationTone == customTone)
#expect(userSettings.selectedNotificationTone == customTone)
}
@Test
@@ -18,7 +18,7 @@ struct NotificationToneManagerTests {
private let manager: NotificationToneManager
init() {
manager = NotificationToneManager(appSettings: .volatile())
manager = NotificationToneManager(userSettings: .volatile())
}
// MARK: - Deletion
+11 -33
View File
@@ -15,7 +15,6 @@ import Testing
struct PillContextTests {
@Test
func user() async {
let appSettings = AppSettings.volatile()
let userIndicatorController = UserIndicatorControllerMock()
let id = "@test:matrix.org"
@@ -28,9 +27,8 @@ struct PillContextTests {
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: userIndicatorController,
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .user(userID: id), font: .preferredFont(forTextStyle: .body)))
@@ -49,7 +47,6 @@ struct PillContextTests {
@Test
func ownUser() {
let appSettings = AppSettings.volatile()
let userIndicatorController = UserIndicatorControllerMock()
let id = "@test:matrix.org"
@@ -62,9 +59,8 @@ struct PillContextTests {
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: userIndicatorController,
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .user(userID: id), font: .preferredFont(forTextStyle: .body)))
@@ -74,7 +70,6 @@ struct PillContextTests {
@Test
func allUsers() {
let appSettings = AppSettings.volatile()
let userIndicatorController = UserIndicatorControllerMock()
let avatarURL = URL(string: "https://matrix.jpg")
@@ -88,9 +83,8 @@ struct PillContextTests {
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: userIndicatorController,
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .allUsers, font: .preferredFont(forTextStyle: .body)))
@@ -101,7 +95,6 @@ struct PillContextTests {
@Test
func roomIDMention() {
let appSettings = AppSettings.volatile()
let userIndicatorController = UserIndicatorControllerMock()
let proxyMock = JoinedRoomProxyMock(.init())
@@ -114,9 +107,8 @@ struct PillContextTests {
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: userIndicatorController,
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .roomID("1"), font: .preferredFont(forTextStyle: .body)))
@@ -128,7 +120,6 @@ struct PillContextTests {
@Test
func roomIDMentionMissingRoom() {
let appSettings = AppSettings.volatile()
let userIndicatorController = UserIndicatorControllerMock()
let proxyMock = JoinedRoomProxyMock(.init())
@@ -139,9 +130,8 @@ struct PillContextTests {
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: userIndicatorController,
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .roomID("1"), font: .preferredFont(forTextStyle: .body)))
@@ -153,7 +143,6 @@ struct PillContextTests {
@Test
func roomAliasMention() {
let appSettings = AppSettings.volatile()
let userIndicatorController = UserIndicatorControllerMock()
let proxyMock = JoinedRoomProxyMock(.init())
@@ -168,9 +157,8 @@ struct PillContextTests {
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: userIndicatorController,
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .roomAlias("#foundation-and-empire:matrix.org"), font: .preferredFont(forTextStyle: .body)))
@@ -182,7 +170,6 @@ struct PillContextTests {
@Test
func roomAliasMentionMissingRoom() {
let appSettings = AppSettings.volatile()
let userIndicatorController = UserIndicatorControllerMock()
let proxyMock = JoinedRoomProxyMock(.init())
@@ -193,9 +180,8 @@ struct PillContextTests {
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: userIndicatorController,
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .roomAlias("#foundation-and-empire:matrix.org"), font: .preferredFont(forTextStyle: .body)))
@@ -207,7 +193,6 @@ struct PillContextTests {
@Test
func eventOnRoomIDMention() {
let appSettings = AppSettings.volatile()
let userIndicatorController = UserIndicatorControllerMock()
let proxyMock = JoinedRoomProxyMock(.init())
@@ -220,9 +205,8 @@ struct PillContextTests {
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: userIndicatorController,
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .event(room: .roomID("1")), font: .preferredFont(forTextStyle: .body)))
@@ -234,7 +218,6 @@ struct PillContextTests {
@Test
func eventOnRoomIDMentionMissingRoom() {
let appSettings = AppSettings.volatile()
let userIndicatorController = UserIndicatorControllerMock()
let proxyMock = JoinedRoomProxyMock(.init())
@@ -245,9 +228,8 @@ struct PillContextTests {
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: userIndicatorController,
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .event(room: .roomID("1")), font: .preferredFont(forTextStyle: .body)))
@@ -259,7 +241,6 @@ struct PillContextTests {
@Test
func eventOnRoomAliasMention() {
let appSettings = AppSettings.volatile()
let userIndicatorController = UserIndicatorControllerMock()
let proxyMock = JoinedRoomProxyMock(.init())
@@ -274,9 +255,8 @@ struct PillContextTests {
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: userIndicatorController,
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .event(room: .roomAlias("#foundation-and-empire:matrix.org")), font: .preferredFont(forTextStyle: .body)))
@@ -288,7 +268,6 @@ struct PillContextTests {
@Test
func eventOnRoomAliasMentionMissingRoom() {
let appSettings = AppSettings.volatile()
let userIndicatorController = UserIndicatorControllerMock()
let proxyMock = JoinedRoomProxyMock(.init())
@@ -299,9 +278,8 @@ struct PillContextTests {
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: userIndicatorController,
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .event(room: .roomAlias("#foundation-and-empire:matrix.org")), font: .preferredFont(forTextStyle: .body)))
+15 -15
View File
@@ -14,14 +14,14 @@ import UIKit
@MainActor
struct PresenceServiceTests {
let clientProxy: ClientProxyMock
let appSettings: AppSettings
let userSettings: UserSettings
let notificationCenter: NotificationCenter
let sendsSubject = PassthroughSubject<(presence: ClientProxyPresence, sendImmediately: Bool), Never>()
init() {
clientProxy = ClientProxyMock(.init())
appSettings = AppSettings.volatile()
userSettings = UserSettings.volatile()
notificationCenter = NotificationCenter()
clientProxy.configurePresenceSendImmediatelyClosure = { [sendsSubject] presence, sendImmediately in
@@ -32,14 +32,14 @@ struct PresenceServiceTests {
private func makeService(initialApplicationState: UIApplication.State) -> PresenceService {
PresenceService(clientProxy: clientProxy,
appSettings: appSettings,
userSettings: userSettings,
notificationCenter: notificationCenter,
initialApplicationState: initialApplicationState)
}
@Test
func serviceSeededActiveWhileSharingReportsOnline() async throws {
appSettings.sharePresence = true
userSettings.sharePresence = true
let deferred = deferFulfillment(sendsSubject) { $0.presence == .online }
let service = makeService(initialApplicationState: .active)
@@ -53,7 +53,7 @@ struct PresenceServiceTests {
@Test
func serviceSeededBackgroundedWhileSharingReportsUnavailable() async throws {
appSettings.sharePresence = true
userSettings.sharePresence = true
let deferred = deferFulfillment(sendsSubject) { $0.presence == .unavailable }
let service = makeService(initialApplicationState: .background)
@@ -66,7 +66,7 @@ struct PresenceServiceTests {
@Test
func serviceSeededActiveWhileNotSharingReportsOffline() async throws {
appSettings.sharePresence = false
userSettings.sharePresence = false
let deferred = deferFulfillment(sendsSubject) { $0.presence == .offline }
let service = makeService(initialApplicationState: .active)
@@ -79,7 +79,7 @@ struct PresenceServiceTests {
@Test
func becomingActiveNotificationWhileSharingReportsOnlineImmediately() async throws {
appSettings.sharePresence = true
userSettings.sharePresence = true
let service = makeService(initialApplicationState: .inactive)
let deferred = deferFulfillment(sendsSubject) { $0.presence == .online }
@@ -93,7 +93,7 @@ struct PresenceServiceTests {
@Test
func resigningActiveNotificationWhileSharingReportsUnavailableImmediately() async throws {
appSettings.sharePresence = true
userSettings.sharePresence = true
let initialDeferred = deferFulfillment(sendsSubject) { $0.presence == .online }
let service = makeService(initialApplicationState: .active)
_ = try await initialDeferred.fulfill()
@@ -109,19 +109,19 @@ struct PresenceServiceTests {
@Test
func togglingSharingWhileActiveDrivesOnlineAndOffline() async throws {
appSettings.sharePresence = false
userSettings.sharePresence = false
let initialDeferred = deferFulfillment(sendsSubject) { $0.presence == .offline }
let service = makeService(initialApplicationState: .active)
_ = try await initialDeferred.fulfill()
let onlineDeferred = deferFulfillment(sendsSubject) { $0.presence == .online }
appSettings.sharePresence = true
userSettings.sharePresence = true
let online = try await onlineDeferred.fulfill()
#expect(online.presence == .online)
#expect(online.sendImmediately)
let offlineDeferred = deferFulfillment(sendsSubject) { $0.presence == .offline }
appSettings.sharePresence = false
userSettings.sharePresence = false
let offline = try await offlineDeferred.fulfill()
#expect(offline.presence == .offline)
#expect(offline.sendImmediately)
@@ -131,7 +131,7 @@ struct PresenceServiceTests {
@Test
func repeatingTheSameStateSendsOnlyOnce() async throws {
appSettings.sharePresence = true
userSettings.sharePresence = true
let initialDeferred = deferFulfillment(sendsSubject) { $0.presence == .online }
let service = makeService(initialApplicationState: .active)
@@ -148,7 +148,7 @@ struct PresenceServiceTests {
@Test
func failedImmediateSendIsNotRetriedUntilTheDesiredPresenceChanges() async throws {
appSettings.sharePresence = true
userSettings.sharePresence = true
clientProxy.configurePresenceSendImmediatelyClosure = { [sendsSubject] presence, sendImmediately in
sendsSubject.send((presence, sendImmediately))
return presence == .online ? .failure(.forbiddenAccess) : .success(())
@@ -173,7 +173,7 @@ struct PresenceServiceTests {
@Test
func newerTransitionWinsWhenAnEarlierSendIsInFlight() async throws {
appSettings.sharePresence = true
userSettings.sharePresence = true
let (onlineStartedStream, onlineStartedContinuation) = AsyncStream<Void>.makeStream()
let (resumeOnlineSendStream, resumeOnlineSendContinuation) = AsyncStream<Void>.makeStream()
@@ -206,7 +206,7 @@ struct PresenceServiceTests {
@Test
func deinitCancelsPendingSend() async throws {
appSettings.sharePresence = true
userSettings.sharePresence = true
let (onlineStartedStream, onlineStartedContinuation) = AsyncStream.makeStream(of: Void.self)
let (onlineFinishedStream, onlineFinishedContinuation) = AsyncStream.makeStream(of: Void.self)
@@ -167,7 +167,7 @@ struct RoomDetailsEditScreenViewModelTests {
userIndicatorController = UserIndicatorControllerMock()
viewModel = .init(roomProxy: JoinedRoomProxyMock(roomProxyConfiguration),
userSession: UserSessionMock(.init()),
mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: .volatile()),
mediaUploadingPreprocessor: MediaUploadingPreprocessor(userSettings: .volatile()),
userIndicatorController: userIndicatorController)
}
}
@@ -30,7 +30,7 @@ struct RoomDetailsScreenViewModelTests {
notificationSettingsProxyMock = NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration())
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -44,7 +44,7 @@ struct RoomDetailsScreenViewModelTests {
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", members: mockedMembers, joinRule: .public))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -65,7 +65,7 @@ struct RoomDetailsScreenViewModelTests {
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -87,7 +87,7 @@ struct RoomDetailsScreenViewModelTests {
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -146,7 +146,7 @@ struct RoomDetailsScreenViewModelTests {
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -168,7 +168,7 @@ struct RoomDetailsScreenViewModelTests {
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -201,7 +201,7 @@ struct RoomDetailsScreenViewModelTests {
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init(clientProxy: clientProxy)),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -233,7 +233,7 @@ struct RoomDetailsScreenViewModelTests {
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -266,7 +266,7 @@ struct RoomDetailsScreenViewModelTests {
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init(clientProxy: clientProxy)),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -300,7 +300,7 @@ struct RoomDetailsScreenViewModelTests {
powerLevelsConfiguration: .init(canUserInvite: false)))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -318,7 +318,7 @@ struct RoomDetailsScreenViewModelTests {
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", members: mockedMembers, joinRule: .public))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -367,7 +367,7 @@ struct RoomDetailsScreenViewModelTests {
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -403,7 +403,7 @@ struct RoomDetailsScreenViewModelTests {
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -439,7 +439,7 @@ struct RoomDetailsScreenViewModelTests {
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -460,7 +460,7 @@ struct RoomDetailsScreenViewModelTests {
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: false, members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -481,7 +481,7 @@ struct RoomDetailsScreenViewModelTests {
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -500,7 +500,7 @@ struct RoomDetailsScreenViewModelTests {
notificationSettingsProxyMock.getNotificationSettingsRoomIdIsEncryptedIsOneToOneThrowableError = NotificationSettingsError.Generic(msg: "error")
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -709,7 +709,7 @@ struct RoomDetailsScreenViewModelTests {
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: false, knockRequestsState: .loaded(mockedRequests), joinRule: .knock))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -731,7 +731,7 @@ struct RoomDetailsScreenViewModelTests {
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: false, knockRequestsState: .loading, joinRule: .knock))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -755,7 +755,7 @@ struct RoomDetailsScreenViewModelTests {
powerLevelsConfiguration: .init(canUserInvite: false)))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -779,7 +779,7 @@ struct RoomDetailsScreenViewModelTests {
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, members: mockedMembers, knockRequestsState: .loaded(mockedRequests), joinRule: .knock))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -807,7 +807,7 @@ struct RoomDetailsScreenViewModelTests {
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
userSession: UserSessionMock(.init()),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -19,10 +19,10 @@ final class RoomFlowCoordinatorTests {
var navigationStackCoordinator: NavigationStackCoordinator!
var cancellables = Set<AnyCancellable>()
private let appSettings: AppSettings
private let userSettings: UserSettings
init() {
appSettings = AppSettings.volatile()
userSettings = UserSettings.volatile()
}
@Test
@@ -230,7 +230,7 @@ final class RoomFlowCoordinatorTests {
@Test
func threadedEventRoutes() async throws {
appSettings.threadsEnabled = true
userSettings.threadsEnabled = true
setupRoomFlowCoordinator()
// Navigate directly to the threaded event
@@ -526,10 +526,10 @@ final class RoomFlowCoordinatorTests {
bugReportService: BugReportServiceMock(.init()),
elementCallService: ElementCallServiceMock(.init()),
timelineControllerFactory: timelineControllerFactory,
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: userSettings),
linkMetadataProvider: LinkMetadataProvider(),
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
userSettings: userSettings,
appHooks: AppHooks(),
analytics: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -11,14 +11,14 @@ import Testing
@MainActor
final class RoomListFiltersStateTests {
var appSettings: AppSettings
var userSettings: UserSettings
var state: RoomListFiltersState
/// The filters that aren't hidden behind a feature flag.
let defaultFilters = RoomListFilter.allCases.filter { $0 != .mentions && $0 != .lowPriority }
init() {
appSettings = AppSettings.volatile()
state = RoomListFiltersState(appSettings: appSettings)
userSettings = UserSettings.volatile()
state = RoomListFiltersState(userSettings: userSettings)
}
@Test
@@ -148,12 +148,12 @@ final class RoomListFiltersStateTests {
// MARK: - Helpers
private func enableLowPriorityFeature() {
appSettings.lowPriorityFilterEnabled = true
state = RoomListFiltersState(appSettings: appSettings)
userSettings.lowPriorityFilterEnabled = true
state = RoomListFiltersState(userSettings: userSettings)
}
private func enableMentionsFeature() {
appSettings.mentionsFilterEnabled = true
state = RoomListFiltersState(appSettings: appSettings)
userSettings.mentionsFilterEnabled = true
state = RoomListFiltersState(userSettings: userSettings)
}
}
@@ -51,16 +51,16 @@ struct RoomMembersFlowCoordinatorTests {
let clientProxy = ClientProxyMock(.init())
clientProxy.directRoomForUserIDReturnValue = .success(nil)
let appSettings = AppSettings.volatile()
let userSettings = UserSettings.volatile()
let flowParameters = CommonFlowParameters(userSession: UserSessionMock(.init(clientProxy: clientProxy)),
bugReportService: BugReportServiceMock(.init()),
elementCallService: ElementCallServiceMock(.init()),
timelineControllerFactory: TimelineControllerFactoryMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: userSettings),
linkMetadataProvider: LinkMetadataProvider(),
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
userSettings: userSettings,
appHooks: AppHooks(),
analytics: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock(),
@@ -16,12 +16,6 @@ import Testing
@MainActor
final class RoomScreenViewModelTests {
private let appSettings: AppSettings
init() async throws {
appSettings = AppSettings.volatile()
}
@Test
func pinnedEventsBanner() async throws {
var configuration = JoinedRoomProxyMockConfiguration()
@@ -42,7 +36,6 @@ final class RoomScreenViewModelTests {
roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil,
ongoingCallRoomIDPublisher: .init(.init(nil)),
appSettings: appSettings,
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock())
@@ -122,7 +115,6 @@ final class RoomScreenViewModelTests {
roomProxy: roomProxyMock,
initialSelectedPinnedEventID: "test1",
ongoingCallRoomIDPublisher: .init(.init(nil)),
appSettings: appSettings,
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock())
@@ -161,7 +153,9 @@ final class RoomScreenViewModelTests {
@Test
func pinnedEventsBannerThreadedSelection() async throws {
appSettings.threadsEnabled = true
let userSettings = UserSettings.volatile()
userSettings.threadsEnabled = true
let userSession = UserSessionMock(.init(userSettings: userSettings))
let roomProxyMock = JoinedRoomProxyMock(.init())
let eventMock = TimelineEventSDKMock()
@@ -178,11 +172,10 @@ final class RoomScreenViewModelTests {
.event(.init(item: EventTimelineItem(configuration: .init(eventID: "test3")), uniqueID: .init("3")))]
roomProxyMock.pinnedEventsTimelineReturnValue = .success(pinnedTimelineMock)
let viewModel = RoomScreenViewModel(userSession: UserSessionMock(.init()),
let viewModel = RoomScreenViewModel(userSession: userSession,
roomProxy: roomProxyMock,
initialSelectedPinnedEventID: "test1",
ongoingCallRoomIDPublisher: .init(.init(nil)),
appSettings: appSettings,
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock())
@@ -238,7 +231,6 @@ final class RoomScreenViewModelTests {
roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil,
ongoingCallRoomIDPublisher: .init(.init(nil)),
appSettings: appSettings,
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock())
@@ -273,7 +265,6 @@ final class RoomScreenViewModelTests {
roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil,
ongoingCallRoomIDPublisher: ongoingCallRoomIDSubject.asCurrentValuePublisher(),
appSettings: appSettings,
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock())
@@ -320,7 +311,6 @@ final class RoomScreenViewModelTests {
roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil,
ongoingCallRoomIDPublisher: .init(.init(nil)),
appSettings: appSettings,
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock())
@@ -342,7 +332,6 @@ final class RoomScreenViewModelTests {
roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil,
ongoingCallRoomIDPublisher: .init(.init(nil)),
appSettings: appSettings,
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock())
@@ -375,7 +364,6 @@ final class RoomScreenViewModelTests {
roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil,
ongoingCallRoomIDPublisher: .init(.init(nil)),
appSettings: appSettings,
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock())
@@ -403,7 +391,6 @@ final class RoomScreenViewModelTests {
roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil,
ongoingCallRoomIDPublisher: .init(.init(nil)),
appSettings: appSettings,
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock())
@@ -422,7 +409,6 @@ final class RoomScreenViewModelTests {
roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil,
ongoingCallRoomIDPublisher: .init(.init(nil)),
appSettings: appSettings,
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock())
@@ -448,7 +434,6 @@ final class RoomScreenViewModelTests {
roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil,
ongoingCallRoomIDPublisher: .init(.init(nil)),
appSettings: appSettings,
appHooks: AppHooks(),
analyticsService: AnalyticsServiceMock(.init()),
userIndicatorController: UserIndicatorControllerMock())
@@ -17,7 +17,7 @@ final class RoomSummaryProviderTests {
.all(filters: [.space, .invite])]),
.deduplicateVersions]
var appSettings: AppSettings!
var userSettings: UserSettings!
var roomList: RoomListSDKMock!
var dynamicEntriesController: RoomListDynamicEntriesControllerSDKMock!
var roomSummaryProvider: RoomSummaryProvider!
@@ -90,8 +90,8 @@ final class RoomSummaryProviderTests {
// MARK: - Helpers
private func setup(isLowPriorityFilterEnabled: Bool = false) {
appSettings = AppSettings.volatile()
appSettings.lowPriorityFilterEnabled = isLowPriorityFilterEnabled
userSettings = UserSettings.volatile()
userSettings.lowPriorityFilterEnabled = isLowPriorityFilterEnabled
let stateEventStringBuilder = RoomStateEventStringBuilder(userID: "@me:matrix.org")
let attributedStringBuilder = AttributedStringBuilder(mentionBuilder: MentionBuilder())
@@ -104,7 +104,7 @@ final class RoomSummaryProviderTests {
eventStringBuilder: eventStringBuilder,
name: "Test",
notificationSettings: NotificationSettingsProxyMock(with: .init()),
appSettings: appSettings)
userSettings: userSettings)
dynamicEntriesController = RoomListDynamicEntriesControllerSDKMock()
dynamicEntriesController.setFilterKindReturnValue = true
@@ -14,7 +14,7 @@ struct SearchScreenViewModelTests {
let viewModel: SearchScreenViewModelProtocol
let searchService: SearchServiceProxyMock
let userIndicatorController: UserIndicatorControllerMock
let appSettings: AppSettings
let userSettings: UserSettings
/// The rooms known to the client, empty until the room list loads.
let staticRoomListSubject = CurrentValueSubject<[RoomSummary], Never>([])
/// Fires with the query each time the (async, debounced) message search runs.
@@ -49,13 +49,13 @@ struct SearchScreenViewModelTests {
staticRoomListSubject.value.first { $0.id == identifier }
}
appSettings = AppSettings.volatile()
userSettings = UserSettings.volatile()
viewModel = SearchScreenViewModel(roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))),
clientProxy: clientProxy,
mediaProvider: MediaProviderMock(.init()),
userIndicatorController: userIndicatorController,
appSettings: appSettings)
userSettings: userSettings)
}
@Test
@@ -77,7 +77,7 @@ struct SearchScreenViewModelTests {
clientProxy: clientProxy,
mediaProvider: MediaProviderMock(.init()),
userIndicatorController: userIndicatorController,
appSettings: appSettings)
userSettings: userSettings)
let deferred = deferFulfillment(viewModel.context.observe(\.viewState.rooms)) { !$0.isEmpty }
viewModel.context.searchQuery = "room"
@@ -130,13 +130,13 @@ struct SearchScreenViewModelTests {
context.searchQuery = "Second"
context.send(viewAction: .selectRoom(roomID: "2"))
#expect(appSettings.searchBreadcrumbs == [.room(roomID: "2"), .query("Second")])
#expect(userSettings.searchBreadcrumbs == [.room(roomID: "2"), .query("Second")])
// Selecting the same room again from the empty state only bumps it back to the top.
context.searchQuery = ""
context.send(viewAction: .selectRoom(roomID: "2"))
#expect(appSettings.searchBreadcrumbs == [.room(roomID: "2"), .query("Second")])
#expect(userSettings.searchBreadcrumbs == [.room(roomID: "2"), .query("Second")])
}
@Test
@@ -144,7 +144,7 @@ struct SearchScreenViewModelTests {
staticRoomListSubject.send([.mock(id: "2", name: "Second")])
let deferred = deferFulfillment(context.observe(\.viewState.breadcrumbs)) { $0.count == 2 }
appSettings.searchBreadcrumbs = [.query("Second"), .room(roomID: "2")]
userSettings.searchBreadcrumbs = [.query("Second"), .room(roomID: "2")]
try await deferred.fulfill()
#expect(context.viewState.breadcrumbs.map(\.id) == ["query-Second", "room-2"])
@@ -154,7 +154,7 @@ struct SearchScreenViewModelTests {
@Test
func roomBreadcrumbsAreDisplayedAfterTheRoomListLoads() async throws {
var deferred = deferFulfillment(context.observe(\.viewState.breadcrumbs)) { $0.count == 1 }
appSettings.searchBreadcrumbs = [.query("Second"), .room(roomID: "2")]
userSettings.searchBreadcrumbs = [.query("Second"), .room(roomID: "2")]
try await deferred.fulfill()
#expect(context.viewState.breadcrumbs.map(\.id) == ["query-Second"])
@@ -457,9 +457,9 @@ final class SecurityAndPrivacyScreenViewModelTests {
topLevelSpaces: [SpaceServiceRoom] = [],
joinRule: ElementX.JoinRule,
forceDisableE2EE: Bool = false) {
let appSettings = AppSettings.volatile()
appSettings.knockingEnabled = true
appSettings.forceDisableE2EE.applyRemoteValue(forceDisableE2EE)
let userSettings = UserSettings.volatile()
userSettings.knockingEnabled = true
userSettings.forceDisableE2EE.applyRemoteValue(forceDisableE2EE)
roomProxy = JoinedRoomProxyMock(.init(isEncrypted: false,
canonicalAlias: "#room:matrix.org",
members: .allMembersAsCreator,
@@ -473,6 +473,6 @@ final class SecurityAndPrivacyScreenViewModelTests {
spaceServiceConfiguration: .init(topLevelSpaces: topLevelSpaces,
joinedParentSpaces: joinedParentSpaces))),
userIndicatorController: UserIndicatorControllerMock(),
appSettings: appSettings)
userSettings: userSettings)
}
}
@@ -21,7 +21,7 @@ struct SessionVerificationViewModelTests {
sessionVerificationController = SessionVerificationControllerProxyMock.configureMock()
viewModel = SessionVerificationScreenViewModel(sessionVerificationControllerProxy: sessionVerificationController,
flow: .deviceInitiator,
appSettings: .volatile(),
userSettings: .volatile(),
mediaProvider: MediaProviderMock(.init()))
context = viewModel.context
}
@@ -177,7 +177,7 @@ struct SettingsScreenViewModelTests {
private mutating func setupViewModel(status: UserStatus = .init()) {
clientProxy = ClientProxyMock(.init(userID: "", status: status))
viewModel = SettingsScreenViewModel(userSession: UserSessionMock(.init(clientProxy: clientProxy)),
appSettings: AppSettings.volatile(),
userSettings: UserSettings.volatile(),
isBugReportServiceEnabled: true,
isInSecondaryWindow: false,
userIndicatorController: UserIndicatorControllerMock())
@@ -210,8 +210,6 @@ struct TimelineInteractionHandlerTests {
let userSession = UserSessionMock(.init())
userSession.voiceMessageMediaManager = voiceMessageMediaManager
let appSettings = AppSettings.volatile()
return TimelineInteractionHandler(roomProxy: JoinedRoomProxyMock(.init()),
timelineController: TimelineControllerMock(.init(timelineItems: timelineItems)),
userSession: userSession,
@@ -219,9 +217,8 @@ struct TimelineInteractionHandlerTests {
voiceMessageRecorder: voiceMessageRecorder,
userIndicatorController: UserIndicatorControllerMock(),
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
}
@@ -123,7 +123,7 @@ struct TimelineItemMenuActionProviderTests {
isViewSourceEnabled: true,
areThreadsEnabled: true,
timelineKind: timelineKind,
emojiProvider: EmojiProvider(appSettings: .volatile()))
emojiProvider: EmojiProvider(userSettings: .volatile()))
.makeActions()
}
}
+17 -39
View File
@@ -294,17 +294,14 @@ final class TimelineViewModelTests {
let timelineController = TimelineControllerMock(.init(roomProxy: roomProxy, timelineItems: items))
let appSettings = AppSettings.volatile()
let viewModel = TimelineViewModel(roomProxy: roomProxy,
timelineController: timelineController,
userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: UserIndicatorControllerMock(),
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
return (viewModel, roomProxy, timelineProxy, timelineController)
@@ -320,8 +317,6 @@ final class TimelineViewModelTests {
addReadReceipts: receipts)
let id = message.id
let appSettings = AppSettings.volatile()
// When showing them in a timeline.
let timelineController = TimelineControllerMock(.init(timelineItems: [message]))
let viewModel = TimelineViewModel(roomProxy: JoinedRoomProxyMock(.init(name: "", members: [RoomMemberProxyMock.mockAlice, RoomMemberProxyMock.mockCharlie])),
@@ -330,9 +325,8 @@ final class TimelineViewModelTests {
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: UserIndicatorControllerMock(),
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
@@ -346,8 +340,6 @@ final class TimelineViewModelTests {
@Test
func showManageUserAsAdmin() async throws {
let appSettings = AppSettings.volatile()
let viewModel = TimelineViewModel(roomProxy: JoinedRoomProxyMock(.init(name: "",
members: [RoomMemberProxyMock.mockAdmin,
RoomMemberProxyMock.mockAlice],
@@ -357,9 +349,8 @@ final class TimelineViewModelTests {
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: UserIndicatorControllerMock(),
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
@@ -385,8 +376,6 @@ final class TimelineViewModelTests {
@Test
func showDetailsForAnAdmin() async throws {
let appSettings = AppSettings.volatile()
let viewModel = TimelineViewModel(roomProxy: JoinedRoomProxyMock(.init(name: "",
members: [RoomMemberProxyMock.mockAdmin,
RoomMemberProxyMock.mockAlice],
@@ -396,9 +385,8 @@ final class TimelineViewModelTests {
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: UserIndicatorControllerMock(),
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
@@ -424,8 +412,6 @@ final class TimelineViewModelTests {
@Test
func showDetailsForABannedUser() async throws {
let appSettings = AppSettings.volatile()
let viewModel = TimelineViewModel(roomProxy: JoinedRoomProxyMock(.init(name: "",
members: [RoomMemberProxyMock.mockAdmin,
RoomMemberProxyMock.mockBanned[0]],
@@ -435,9 +421,8 @@ final class TimelineViewModelTests {
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: UserIndicatorControllerMock(),
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
@@ -466,8 +451,6 @@ final class TimelineViewModelTests {
@Test
func pinnedEvents() async throws {
let appSettings = AppSettings.volatile()
var configuration = JoinedRoomProxyMockConfiguration(name: "",
pinnedEventIDs: .init(["test1"]))
let roomProxyMock = JoinedRoomProxyMock(configuration)
@@ -480,9 +463,8 @@ final class TimelineViewModelTests {
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: UserIndicatorControllerMock(),
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
#expect(configuration.pinnedEventIDs == viewModel.context.viewState.pinnedEventIDs)
@@ -497,8 +479,6 @@ final class TimelineViewModelTests {
@Test
func canUserPinEvents() async throws {
let appSettings = AppSettings.volatile()
let configuration = JoinedRoomProxyMockConfiguration(name: "",
powerLevelsConfiguration: .init(canUserPin: true))
let roomProxyMock = JoinedRoomProxyMock(configuration)
@@ -511,9 +491,8 @@ final class TimelineViewModelTests {
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: UserIndicatorControllerMock(),
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
@@ -915,15 +894,15 @@ final class TimelineViewModelTests {
@Test
func disablingTheFlagClearsTheSelection() async throws {
let items = [TextRoomTimelineItem(eventID: "$1")]
let appSettings = AppSettings.volatile()
appSettings.messageMultiSelectEnabled = true
let viewModel = makeViewModel(timelineController: TimelineControllerMock(.init(timelineItems: items)), appSettings: appSettings)
let userSettings = UserSettings.volatile()
userSettings.messageMultiSelectEnabled = true
let viewModel = makeViewModel(timelineController: TimelineControllerMock(.init(timelineItems: items)), userSettings: userSettings)
startSelection(items[0].id, in: viewModel)
#expect(viewModel.state.messageSelection.isActive)
let deferred = deferFulfillment(viewModel.context.$viewState) { !$0.messageSelection.isEnabled && !$0.messageSelection.isActive }
appSettings.messageMultiSelectEnabled = false
userSettings.messageMultiSelectEnabled = false
try await deferred.fulfill()
}
@@ -933,17 +912,16 @@ final class TimelineViewModelTests {
focussedEventID: String? = nil,
timelineController: TimelineControllerProtocol,
userIndicatorController: UserIndicatorControllerProtocol = UserIndicatorControllerMock(),
appSettings: AppSettings = .volatile()) -> TimelineViewModel {
userSettings: UserSettings = .volatile()) -> TimelineViewModel {
TimelineViewModel(roomProxy: roomProxy ?? JoinedRoomProxyMock(.init(name: "")),
focussedEventID: focussedEventID,
timelineController: timelineController,
userSession: UserSessionMock(.init()),
userSession: UserSessionMock(.init(userSettings: userSettings)),
mediaPlayerProvider: MediaPlayerProviderMock(),
userIndicatorController: userIndicatorController,
appMediator: AppMediatorMock(.init()),
appSettings: appSettings,
analyticsService: AnalyticsServiceMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: .volatile()),
linkMetadataProvider: LinkMetadataProvider(),
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
}
@@ -961,11 +939,11 @@ final class TimelineViewModelTests {
private func makeSelectionViewModel(timelineController: TimelineControllerProtocol,
userIndicatorController: UserIndicatorControllerProtocol = UserIndicatorControllerMock()) -> TimelineViewModel {
let appSettings = AppSettings.volatile()
appSettings.messageMultiSelectEnabled = true
let userSettings = UserSettings.volatile()
userSettings.messageMultiSelectEnabled = true
return makeViewModel(timelineController: timelineController,
userIndicatorController: userIndicatorController,
appSettings: appSettings)
userSettings: userSettings)
}
}
@@ -20,7 +20,7 @@ struct UserDetailsEditScreenViewModelTests {
init() {
viewModel = .init(userSession: UserSessionMock(.init()),
mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: .volatile()),
mediaUploadingPreprocessor: MediaUploadingPreprocessor(userSettings: .volatile()),
userIndicatorController: UserIndicatorControllerMock())
}
@@ -48,16 +48,16 @@ struct UserSessionFlowCoordinatorTests {
appMediator.networkMonitor = networkMonitor
userIndicatorController = UserIndicatorControllerMock()
let appSettings = AppSettings.volatile()
let userSettings = UserSettings.volatile()
let flowParameters = CommonFlowParameters(userSession: UserSessionMock(.init(clientProxy: clientProxy)),
bugReportService: BugReportServiceMock(.init()),
elementCallService: ElementCallServiceMock(.init()),
timelineControllerFactory: TimelineControllerFactoryMock(.init()),
emojiProvider: EmojiProvider(appSettings: appSettings),
emojiProvider: EmojiProvider(userSettings: userSettings),
linkMetadataProvider: LinkMetadataProvider(),
appMediator: appMediator,
appSettings: appSettings,
userSettings: userSettings,
appHooks: AppHooks(),
analytics: AnalyticsServiceMock(.init()),
userIndicatorController: userIndicatorController,