Replace the existing RoomSummaryProviderMock with a generated one

This commit is contained in:
Stefan Ceriu
2024-02-28 18:38:13 +02:00
committed by Stefan Ceriu
parent 5f0c782ce2
commit 932ba75550
22 changed files with 150 additions and 82 deletions
+3 -3
View File
@@ -20,7 +20,7 @@ import Foundation
struct ClientProxyMockConfiguration {
let userID: String
var deviceID: String?
var roomSummaryProvider: RoomSummaryProviderProtocol? = MockRoomSummaryProvider()
var roomSummaryProvider: RoomSummaryProviderProtocol? = RoomSummaryProviderMock(.init())
}
extension ClientProxyMock {
@@ -33,8 +33,8 @@ extension ClientProxyMock {
homeserver = ""
roomSummaryProvider = configuration.roomSummaryProvider
alternateRoomSummaryProvider = MockRoomSummaryProvider()
inviteSummaryProvider = MockRoomSummaryProvider()
alternateRoomSummaryProvider = RoomSummaryProviderMock(.init())
inviteSummaryProvider = RoomSummaryProviderMock(.init())
actionsPublisher = PassthroughSubject<ClientProxyAction, Never>().eraseToAnyPublisher()
loadingStatePublisher = CurrentValuePublisher<ClientProxyLoadingState, Never>(.notLoading)
@@ -2973,6 +2973,67 @@ class RoomProxyMock: RoomProxyProtocol {
}
}
}
class RoomSummaryProviderMock: RoomSummaryProviderProtocol {
var roomListPublisher: CurrentValuePublisher<[RoomSummary], Never> {
get { return underlyingRoomListPublisher }
set(value) { underlyingRoomListPublisher = value }
}
var underlyingRoomListPublisher: CurrentValuePublisher<[RoomSummary], Never>!
var statePublisher: CurrentValuePublisher<RoomSummaryProviderState, Never> {
get { return underlyingStatePublisher }
set(value) { underlyingStatePublisher = value }
}
var underlyingStatePublisher: CurrentValuePublisher<RoomSummaryProviderState, Never>!
//MARK: - setRoomList
var setRoomListCallsCount = 0
var setRoomListCalled: Bool {
return setRoomListCallsCount > 0
}
var setRoomListReceivedRoomList: RoomList?
var setRoomListReceivedInvocations: [RoomList] = []
var setRoomListClosure: ((RoomList) -> Void)?
func setRoomList(_ roomList: RoomList) {
setRoomListCallsCount += 1
setRoomListReceivedRoomList = roomList
setRoomListReceivedInvocations.append(roomList)
setRoomListClosure?(roomList)
}
//MARK: - updateVisibleRange
var updateVisibleRangeCallsCount = 0
var updateVisibleRangeCalled: Bool {
return updateVisibleRangeCallsCount > 0
}
var updateVisibleRangeReceivedRange: Range<Int>?
var updateVisibleRangeReceivedInvocations: [Range<Int>] = []
var updateVisibleRangeClosure: ((Range<Int>) -> Void)?
func updateVisibleRange(_ range: Range<Int>) {
updateVisibleRangeCallsCount += 1
updateVisibleRangeReceivedRange = range
updateVisibleRangeReceivedInvocations.append(range)
updateVisibleRangeClosure?(range)
}
//MARK: - setFilter
var setFilterCallsCount = 0
var setFilterCalled: Bool {
return setFilterCallsCount > 0
}
var setFilterReceivedFilter: RoomSummaryProviderFilter?
var setFilterReceivedInvocations: [RoomSummaryProviderFilter] = []
var setFilterClosure: ((RoomSummaryProviderFilter) -> Void)?
func setFilter(_ filter: RoomSummaryProviderFilter) {
setFilterCallsCount += 1
setFilterReceivedFilter = filter
setFilterReceivedInvocations.append(filter)
setFilterClosure?(filter)
}
}
class RoomTimelineProviderMock: RoomTimelineProviderProtocol {
var updatePublisher: AnyPublisher<Void, Never> {
get { return underlyingUpdatePublisher }
@@ -1,5 +1,5 @@
//
// Copyright 2022 New Vector Ltd
// Copyright 2024 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -16,61 +16,55 @@
import Combine
import Foundation
import MatrixRustSDK
enum MockRoomSummaryProviderState {
enum RoomSummaryProviderMockConfigurationState {
case loading
case loaded([RoomSummary])
}
class MockRoomSummaryProvider: RoomSummaryProviderProtocol {
private let initialRooms: [RoomSummary]
private(set) var currentFilter: RoomSummaryProviderFilter?
private let roomListSubject: CurrentValueSubject<[RoomSummary], Never>
var roomListPublisher: CurrentValuePublisher<[RoomSummary], Never> {
roomListSubject.asCurrentValuePublisher()
}
private let stateSuject: CurrentValueSubject<RoomSummaryProviderState, Never>
var statePublisher: CurrentValuePublisher<RoomSummaryProviderState, Never> {
stateSuject.asCurrentValuePublisher()
}
convenience init() {
self.init(state: .loading)
}
init(state: MockRoomSummaryProviderState) {
switch state {
struct RoomSummaryProviderMockConfiguration {
var state: RoomSummaryProviderMockConfigurationState = .loading
}
extension RoomSummaryProviderMock {
convenience init(_ configuration: RoomSummaryProviderMockConfiguration) {
self.init()
let initialRooms: [RoomSummary]
let roomListSubject: CurrentValueSubject<[RoomSummary], Never>
let stateSubject: CurrentValueSubject<RoomSummaryProviderState, Never>
switch configuration.state {
case .loading:
initialRooms = []
roomListSubject = .init(initialRooms)
roomListSubject.send(initialRooms)
stateSuject = .init(.notLoaded)
stateSubject = .init(.notLoaded)
case .loaded(let rooms):
initialRooms = rooms
roomListSubject = .init(initialRooms)
roomListSubject.send(initialRooms)
stateSuject = .init(.loaded(totalNumberOfRooms: UInt(initialRooms.count)))
stateSubject = .init(.loaded(totalNumberOfRooms: UInt(rooms.count)))
}
}
func setRoomList(_ roomList: RoomList) { }
func updateVisibleRange(_ range: Range<Int>) { }
func setFilter(_ filter: RoomSummaryProviderFilter) {
currentFilter = filter
switch filter {
case let .include(predicate):
if let query = predicate.query, !query.isEmpty {
roomListSubject.send(initialRooms.filter { $0.name?.localizedCaseInsensitiveContains(query) ?? false })
} else {
roomListSubject.send(initialRooms)
roomListPublisher = roomListSubject.asCurrentValuePublisher()
statePublisher = stateSubject.asCurrentValuePublisher()
setFilterClosure = { [initialRooms, roomListSubject] filter in
switch filter {
case let .include(predicate):
var rooms = initialRooms
if let filter = predicate.filters.first {
rooms = rooms.filter { filter == .people ? $0.isDirect : !$0.isDirect }
}
if let query = predicate.query, !query.isEmpty {
rooms = rooms.filter { $0.name?.localizedCaseInsensitiveContains(query) ?? false }
}
roomListSubject.send(rooms)
case .excludeAll:
roomListSubject.send([])
}
case .excludeAll:
roomListSubject.send([])
}
}
}
@@ -79,7 +73,7 @@ extension Array where Element == RoomSummary {
static let mockRooms: [Element] = [
.filled(details: RoomSummaryDetails(id: "1",
name: "Foundation 🔭🪐🌌",
isDirect: true,
isDirect: false,
avatarURL: nil,
lastMessage: AttributedString("I do not wish to take the trouble to understand mysticism"),
lastMessageFormattedTimestamp: "14:56",
@@ -94,7 +88,7 @@ extension Array where Element == RoomSummary {
isFavourite: false)),
.filled(details: RoomSummaryDetails(id: "2",
name: "Foundation and Empire",
isDirect: true,
isDirect: false,
avatarURL: URL.picturesDirectory,
lastMessage: AttributedString("How do you see the Emperor then? You think he keeps office hours?"),
lastMessageFormattedTimestamp: "2:56 PM",
@@ -109,7 +103,7 @@ extension Array where Element == RoomSummary {
isFavourite: false)),
.filled(details: RoomSummaryDetails(id: "3",
name: "Second Foundation",
isDirect: true,
isDirect: false,
avatarURL: nil,
lastMessage: try? AttributedString(markdown: "He certainly seemed no *mental genius* to me"),
lastMessageFormattedTimestamp: "Some time ago",
@@ -124,7 +118,7 @@ extension Array where Element == RoomSummary {
isFavourite: false)),
.filled(details: RoomSummaryDetails(id: "4",
name: "Foundation's Edge",
isDirect: true,
isDirect: false,
avatarURL: nil,
lastMessage: AttributedString("There's an archaic measure of time that's called the month"),
lastMessageFormattedTimestamp: "Just now",
@@ -210,7 +210,7 @@ private class GlobalSearchTextField: UITextField {
// MARK: - Previews
struct GlobalSearchScreen_Previews: PreviewProvider, TestablePreview {
static let viewModel = GlobalSearchScreenViewModel(roomSummaryProvider: MockRoomSummaryProvider(state: .loaded(.mockRooms)),
static let viewModel = GlobalSearchScreenViewModel(roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))),
imageProvider: MockMediaProvider())
static var previews: some View {
@@ -47,7 +47,7 @@ struct GlobalSearchScreenListRow: View {
}
struct GlobalSearchScreenListRow_Previews: PreviewProvider, TestablePreview {
static let viewModel = GlobalSearchScreenViewModel(roomSummaryProvider: MockRoomSummaryProvider(state: .loaded(.mockRooms)),
static let viewModel = GlobalSearchScreenViewModel(roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))),
imageProvider: MockMediaProvider())
static var previews: some View {
@@ -231,7 +231,7 @@ struct HomeScreen_Previews: PreviewProvider, TestablePreview {
let appSettings = AppSettings() // This uses shared storage under the hood
appSettings.migratedAccounts[userID] = mode != .migration
let roomSummaryProviderState: MockRoomSummaryProviderState = switch mode {
let roomSummaryProviderState: RoomSummaryProviderMockConfigurationState = switch mode {
case .migration:
.loading
case .skeletons:
@@ -243,7 +243,7 @@ struct HomeScreen_Previews: PreviewProvider, TestablePreview {
}
let clientProxy = ClientProxyMock(.init(userID: userID,
roomSummaryProvider: MockRoomSummaryProvider(state: roomSummaryProviderState)))
roomSummaryProvider: RoomSummaryProviderMock(.init(state: roomSummaryProviderState))))
let userSession = MockUserSession(clientProxy: clientProxy,
mediaProvider: MockMediaProvider(),
@@ -150,7 +150,7 @@ struct HomeScreenEmptyStateView_Previews: PreviewProvider, TestablePreview {
static let viewModel = {
let userSession = MockUserSession(clientProxy: ClientProxyMock(.init(userID: "@user:example.com",
roomSummaryProvider: MockRoomSummaryProvider(state: .loaded([])))),
roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded([]))))),
mediaProvider: MockMediaProvider(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock())
@@ -66,7 +66,7 @@ struct HomeScreenRecoveryKeyConfirmationBanner_Previews: PreviewProvider, Testab
static func buildViewModel() -> HomeScreenViewModel {
let clientProxy = ClientProxyMock(.init(userID: "@alice:example.com",
roomSummaryProvider: MockRoomSummaryProvider(state: .loading)))
roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loading))))
let userSession = MockUserSession(clientProxy: clientProxy,
mediaProvider: MockMediaProvider(),
@@ -174,7 +174,7 @@ private extension View {
}
struct HomeScreenRoomCell_Previews: PreviewProvider, TestablePreview {
static let summaryProviderGeneric = MockRoomSummaryProvider(state: .loaded(.mockRooms))
static let summaryProviderGeneric = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))
static let viewModelGeneric = {
let userSession = MockUserSession(clientProxy: ClientProxyMock(.init(userID: "John Doe", roomSummaryProvider: summaryProviderGeneric)),
mediaProvider: MockMediaProvider(),
@@ -187,7 +187,7 @@ struct HomeScreenRoomCell_Previews: PreviewProvider, TestablePreview {
userIndicatorController: ServiceLocator.shared.userIndicatorController)
}()
static let summaryProviderForNotificationsState = MockRoomSummaryProvider(state: .loaded(.mockRoomsWithNotificationsState))
static let summaryProviderForNotificationsState = RoomSummaryProviderMock(.init(state: .loaded(.mockRoomsWithNotificationsState)))
static let viewModelForNotificationsState = {
let userSession = MockUserSession(clientProxy: ClientProxyMock(.init(userID: "John Doe", roomSummaryProvider: summaryProviderForNotificationsState)),
mediaProvider: MockMediaProvider(),
@@ -66,7 +66,7 @@ struct HomeScreenSessionVerificationBanner_Previews: PreviewProvider, TestablePr
static func buildViewModel() -> HomeScreenViewModel {
let clientProxy = ClientProxyMock(.init(userID: "@alice:example.com",
roomSummaryProvider: MockRoomSummaryProvider(state: .loading)))
roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loading))))
let userSession = MockUserSession(clientProxy: clientProxy,
mediaProvider: MockMediaProvider(),
@@ -92,8 +92,8 @@ private extension InvitesScreenViewModel {
static let someInvite: InvitesScreenViewModel = {
let clientProxy = ClientProxyMock(.init(userID: "@userid:example.com"))
clientProxy.inviteSummaryProvider = MockRoomSummaryProvider(state: .loaded(.mockInvites))
clientProxy.roomSummaryProvider = MockRoomSummaryProvider(state: .loaded(.mockInvites))
clientProxy.inviteSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockInvites)))
clientProxy.roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockInvites)))
let userSession = MockUserSession(clientProxy: clientProxy,
mediaProvider: MockMediaProvider(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock())
@@ -103,7 +103,7 @@ private struct MessageForwardingListRow: View {
struct MessageForwardingScreen_Previews: PreviewProvider, TestablePreview {
static var previews: some View {
let summaryProvider = MockRoomSummaryProvider(state: .loaded(.mockRooms))
let summaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))
let viewModel = MessageForwardingScreenViewModel(roomSummaryProvider: summaryProvider,
mediaProvider: MockMediaProvider(),
sourceRoomID: "")
@@ -74,7 +74,7 @@ struct NotificationSettingsEditScreen_Previews: PreviewProvider, TestablePreview
notificationSettingsProxy.getRoomsWithUserDefinedRulesReturnValue = [RoomSummary].mockRooms.compactMap(\.id)
let userSession = MockUserSession(clientProxy: ClientProxyMock(.init(userID: "@alice:example.com",
roomSummaryProvider: MockRoomSummaryProvider(state: .loaded(.mockRooms)))),
roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))))),
mediaProvider: MockMediaProvider(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock())
var viewModel = NotificationSettingsEditScreenViewModel(chatType: .groupChat,
@@ -89,7 +89,7 @@ struct NotificationSettingsEditScreen_Previews: PreviewProvider, TestablePreview
notificationSettingsProxy.getDefaultRoomNotificationModeIsEncryptedIsOneToOneReturnValue = .mentionsAndKeywordsOnly
notificationSettingsProxy.getRoomsWithUserDefinedRulesReturnValue = []
let userSession = MockUserSession(clientProxy: ClientProxyMock(.init(userID: "@alice:example.com",
roomSummaryProvider: MockRoomSummaryProvider(state: .loaded(.mockRooms)))),
roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))))),
mediaProvider: MockMediaProvider(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock())
var viewModel = NotificationSettingsEditScreenViewModel(chatType: .oneToOneChat,
@@ -121,7 +121,7 @@ struct NotificationSettingsEditScreen_Previews: PreviewProvider, TestablePreview
notificationSettingsProxy.getRoomsWithUserDefinedRulesReturnValue = [RoomSummary].mockRooms.compactMap(\.id)
let userSession = MockUserSession(clientProxy: ClientProxyMock(.init(userID: "@alice:example.com",
roomSummaryProvider: MockRoomSummaryProvider(state: .loaded(.mockRooms)))),
roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))))),
mediaProvider: MockMediaProvider(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock())
var viewModel = NotificationSettingsEditScreenViewModel(chatType: .groupChat,
@@ -59,7 +59,7 @@ struct NotificationSettingsEditScreenRoomCell: View {
struct NotificationSettingsEditScreenRoomCell_Previews: PreviewProvider, TestablePreview {
static var previews: some View {
let summaryProvider = MockRoomSummaryProvider(state: .loaded(.mockRooms))
let summaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))
let userSession = MockUserSession(clientProxy: ClientProxyMock(.init(userID: "John Doe", roomSummaryProvider: summaryProvider)),
mediaProvider: MockMediaProvider(),
@@ -64,6 +64,15 @@ enum RoomSummary: CustomStringConvertible, Equatable {
}
}
var isDirect: Bool {
switch self {
case .empty:
return false
case .invalidated(let details), .filled(let details):
return details.isDirect
}
}
var description: String {
switch self {
case .empty:
@@ -111,6 +120,7 @@ enum RoomSummaryProviderFilter: Equatable {
case include(Predicate)
}
// sourcery: AutoMockable
protocol RoomSummaryProviderProtocol {
/// Publishes the currently available room summaries
var roomListPublisher: CurrentValuePublisher<[RoomSummary], Never> { get }
@@ -560,7 +560,7 @@ class MockScreen: Identifiable {
appSettings.richTextEditorEnabled = id == .userSessionScreenRTE
let navigationSplitCoordinator = NavigationSplitCoordinator(placeholderCoordinator: PlaceholderScreenCoordinator())
let clientProxy = ClientProxyMock(.init(userID: "@mock:client.com", roomSummaryProvider: MockRoomSummaryProvider(state: .loaded(.mockRooms))))
let clientProxy = ClientProxyMock(.init(userID: "@mock:client.com", roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))))
ServiceLocator.shared.settings.migratedAccounts[clientProxy.userID] = true
ServiceLocator.shared.settings.hasShownWelcomeScreen = true
@@ -820,7 +820,7 @@ class MockScreen: Identifiable {
}
}
let summaryProvider = MockRoomSummaryProvider(state: .loaded(.mockInvites))
let summaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockInvites)))
clientProxy.inviteSummaryProvider = summaryProvider
let coordinator = InvitesScreenCoordinator(parameters: .init(userSession: MockUserSession(clientProxy: clientProxy, mediaProvider: MockMediaProvider(), voiceMessageMediaManager: VoiceMessageMediaManagerMock())))
@@ -842,7 +842,7 @@ class MockScreen: Identifiable {
}
}
let summaryProvider = MockRoomSummaryProvider(state: .loaded(.mockInvites))
let summaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockInvites)))
clientProxy.inviteSummaryProvider = summaryProvider
let coordinator = InvitesScreenCoordinator(parameters: .init(userSession: MockUserSession(clientProxy: clientProxy, mediaProvider: MockMediaProvider(), voiceMessageMediaManager: VoiceMessageMediaManagerMock())))