Better integrate RoomPowerLevelsProxyMock's own Configuration struct.

This commit is contained in:
Stefan Ceriu
2025-06-20 16:43:39 +03:00
committed by Stefan Ceriu
parent f522e15dac
commit cbf405a67e
9 changed files with 52 additions and 39 deletions
@@ -36,12 +36,6 @@ struct JoinedRoomProxyMockConfiguration {
var ownUserID = RoomMemberProxyMock.mockMe.userID var ownUserID = RoomMemberProxyMock.mockMe.userID
var inviter: RoomMemberProxyProtocol? var inviter: RoomMemberProxyProtocol?
var canUserSendMessage = true
var canUserInvite = true
var canUserTriggerRoomNotification = false
var canUserJoinCall = true
var canUserPin = true
var shouldUseAutoUpdatingTimeline = false var shouldUseAutoUpdatingTimeline = false
var joinRule: JoinRule? var joinRule: JoinRule?
@@ -50,6 +44,8 @@ struct JoinedRoomProxyMockConfiguration {
var isVisibleInPublicDirectory = false var isVisibleInPublicDirectory = false
var predecessor: PredecessorRoom? var predecessor: PredecessorRoom?
var successor: SuccessorRoom? var successor: SuccessorRoom?
var powerLevelsConfiguration = RoomPowerLevelsProxyMockConfiguration()
} }
extension JoinedRoomProxyMock { extension JoinedRoomProxyMock {
@@ -99,24 +95,17 @@ extension JoinedRoomProxyMock {
} }
updatePowerLevelsForUsersReturnValue = .success(()) updatePowerLevelsForUsersReturnValue = .success(())
let powerLevelsProxyMock = RoomPowerLevelsProxyMock(configuration: .init()) let powerLevelsProxyMock = RoomPowerLevelsProxyMock(configuration: configuration.powerLevelsConfiguration)
powerLevelsProxyMock.canUserUserIDSendMessageReturnValue = .success(configuration.canUserSendMessage)
powerLevelsProxyMock.canUserUserIDSendStateEventClosure = { [weak self] userID, _ in powerLevelsProxyMock.canUserUserIDSendStateEventClosure = { [weak self] userID, _ in
.success(self?.membersPublisher.value.first { $0.userID == userID }?.role ?? .user != .user) .success(self?.membersPublisher.value.first { $0.userID == userID }?.role ?? .user != .user)
} }
powerLevelsProxyMock.canUserInviteUserIDReturnValue = .success(configuration.canUserInvite)
powerLevelsProxyMock.canUserRedactOtherUserIDReturnValue = .success(false)
powerLevelsProxyMock.canUserRedactOwnUserIDReturnValue = .success(true)
powerLevelsProxyMock.canUserKickUserIDClosure = { [weak self] userID in powerLevelsProxyMock.canUserKickUserIDClosure = { [weak self] userID in
.success(self?.membersPublisher.value.first { $0.userID == userID }?.role ?? .user != .user) .success(self?.membersPublisher.value.first { $0.userID == userID }?.role ?? .user != .user)
} }
powerLevelsProxyMock.canUserBanUserIDClosure = { [weak self] userID in powerLevelsProxyMock.canUserBanUserIDClosure = { [weak self] userID in
.success(self?.membersPublisher.value.first { $0.userID == userID }?.role ?? .user != .user) .success(self?.membersPublisher.value.first { $0.userID == userID }?.role ?? .user != .user)
} }
powerLevelsProxyMock.canUserTriggerRoomNotificationUserIDReturnValue = .success(configuration.canUserTriggerRoomNotification)
powerLevelsProxyMock.canUserJoinCallUserIDReturnValue = .success(configuration.canUserJoinCall)
powerLevelsProxyMock.canUserPinOrUnpinUserIDReturnValue = .success(configuration.canUserPin)
powerLevelsReturnValue = .success(powerLevelsProxyMock) powerLevelsReturnValue = .success(powerLevelsProxyMock)
@@ -7,24 +7,35 @@
import MatrixRustSDK import MatrixRustSDK
struct RoomPowerLevelsProxyMockConfiguration {
var canUserSendMessage = true
var canUserSendState = false
var canUserInvite = true
var canUserRedactOther = false
var canUserRedactOwn = true
var canUserKick = false
var canUserBan = false
var canUserTriggerRoomNotification = false
var canUserPin = true
var canUserJoinCall = true
}
extension RoomPowerLevelsProxyMock { extension RoomPowerLevelsProxyMock {
struct Configuration { } convenience init(configuration: RoomPowerLevelsProxyMockConfiguration) {
convenience init(configuration: Configuration) {
self.init() self.init()
underlyingValues = RoomPowerLevelsValues.mock underlyingValues = RoomPowerLevelsValues.mock
canUserUserIDSendMessageReturnValue = .success(true) canUserUserIDSendMessageReturnValue = .success(configuration.canUserSendMessage)
canUserUserIDSendStateEventReturnValue = .success(true) canUserUserIDSendStateEventReturnValue = .success(configuration.canUserSendState)
canUserInviteUserIDReturnValue = .success(true) canUserInviteUserIDReturnValue = .success(configuration.canUserInvite)
canUserRedactOtherUserIDReturnValue = .success(true) canUserRedactOtherUserIDReturnValue = .success(configuration.canUserRedactOther)
canUserRedactOwnUserIDReturnValue = .success(true) canUserRedactOwnUserIDReturnValue = .success(configuration.canUserRedactOwn)
canUserKickUserIDReturnValue = .success(true) canUserKickUserIDReturnValue = .success(configuration.canUserKick)
canUserBanUserIDReturnValue = .success(true) canUserBanUserIDReturnValue = .success(configuration.canUserBan)
canUserTriggerRoomNotificationUserIDReturnValue = .success(true) canUserTriggerRoomNotificationUserIDReturnValue = .success(configuration.canUserTriggerRoomNotification)
canUserPinOrUnpinUserIDReturnValue = .success(true) canUserPinOrUnpinUserIDReturnValue = .success(configuration.canUserPin)
canUserJoinCallUserIDReturnValue = .success(true) canUserJoinCallUserIDReturnValue = .success(configuration.canUserJoinCall)
} }
} }
@@ -198,7 +198,7 @@ struct RoomMembersListScreen_Previews: PreviewProvider, TestablePreview {
roomProxy: JoinedRoomProxyMock(.init(name: "Some room", roomProxy: JoinedRoomProxyMock(.init(name: "Some room",
members: members, members: members,
ownUserID: ownUserID, ownUserID: ownUserID,
canUserInvite: false)), powerLevelsConfiguration: .init(canUserInvite: false))),
mediaProvider: MediaProviderMock(configuration: .init()), mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
analytics: ServiceLocator.shared.analytics) analytics: ServiceLocator.shared.analytics)
@@ -240,8 +240,8 @@ struct RoomScreen_Previews: PreviewProvider, TestablePreview {
let roomProxyMock = JoinedRoomProxyMock(.init(id: "stable_id", let roomProxyMock = JoinedRoomProxyMock(.init(id: "stable_id",
name: "Preview room", name: "Preview room",
hasOngoingCall: true, hasOngoingCall: true,
canUserSendMessage: canSendMessage, successor: hasSuccessor ? .init(roomId: UUID().uuidString, reason: nil) : nil,
successor: hasSuccessor ? .init(roomId: UUID().uuidString, reason: nil) : nil)) powerLevelsConfiguration: .init(canUserSendMessage: canSendMessage)))
let roomViewModel = RoomScreenViewModel.mock(roomProxyMock: roomProxyMock) let roomViewModel = RoomScreenViewModel.mock(roomProxyMock: roomProxyMock)
let timelineViewModel = TimelineViewModel(roomProxy: roomProxyMock, let timelineViewModel = TimelineViewModel(roomProxy: roomProxyMock,
timelineController: MockTimelineController(), timelineController: MockTimelineController(),
@@ -60,7 +60,11 @@ final class CompletionSuggestionServiceTests: XCTestCase {
func testUserSuggestionsIncludingAllUsers() async throws { func testUserSuggestionsIncludingAllUsers() async throws {
let alice: RoomMemberProxyMock = .mockAlice let alice: RoomMemberProxyMock = .mockAlice
let members: [RoomMemberProxyMock] = [alice, .mockBob, .mockCharlie, .mockMe] let members: [RoomMemberProxyMock] = [alice, .mockBob, .mockCharlie, .mockMe]
let roomProxyMock = JoinedRoomProxyMock(.init(id: "roomID", name: "test", members: members, canUserTriggerRoomNotification: true)) let roomProxyMock = JoinedRoomProxyMock(.init(id: "roomID",
name: "test",
members: members,
powerLevelsConfiguration: .init(canUserTriggerRoomNotification: true)))
let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))) let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))
let service = CompletionSuggestionService(roomProxy: roomProxyMock, let service = CompletionSuggestionService(roomProxy: roomProxyMock,
roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher()) roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher())
@@ -88,7 +92,10 @@ final class CompletionSuggestionServiceTests: XCTestCase {
let alice: RoomMemberProxyMock = .mockAlice let alice: RoomMemberProxyMock = .mockAlice
let bob: RoomMemberProxyMock = .mockBob let bob: RoomMemberProxyMock = .mockBob
let members: [RoomMemberProxyMock] = [alice, bob, .mockMe] let members: [RoomMemberProxyMock] = [alice, bob, .mockMe]
let roomProxyMock = JoinedRoomProxyMock(.init(id: "roomID", name: "test", members: members, canUserTriggerRoomNotification: true)) let roomProxyMock = JoinedRoomProxyMock(.init(id: "roomID",
name: "test",
members: members,
powerLevelsConfiguration: .init(canUserTriggerRoomNotification: true)))
let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))) let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))
let service = CompletionSuggestionService(roomProxy: roomProxyMock, let service = CompletionSuggestionService(roomProxy: roomProxyMock,
roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher()) roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher())
@@ -207,8 +207,8 @@ class KnockRequestsListScreenViewModelTests: XCTestCase {
KnockRequestProxyMock(.init(eventID: "2", userID: "@bob:matrix.org")), KnockRequestProxyMock(.init(eventID: "2", userID: "@bob:matrix.org")),
KnockRequestProxyMock(.init(eventID: "3", userID: "@charlie:matrix.org")), KnockRequestProxyMock(.init(eventID: "3", userID: "@charlie:matrix.org")),
KnockRequestProxyMock(.init(eventID: "4", userID: "@dan:matrix.org"))]), KnockRequestProxyMock(.init(eventID: "4", userID: "@dan:matrix.org"))]),
canUserInvite: false, joinRule: .knock,
joinRule: .knock)) powerLevelsConfiguration: .init(canUserInvite: false)))
viewModel = KnockRequestsListScreenViewModel(roomProxy: roomProxyMock, viewModel = KnockRequestsListScreenViewModel(roomProxy: roomProxyMock,
mediaProvider: MediaProviderMock(), mediaProvider: MediaProviderMock(),
userIndicatorController: UserIndicatorControllerMock()) userIndicatorController: UserIndicatorControllerMock())
@@ -303,7 +303,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", roomProxyMock = JoinedRoomProxyMock(.init(name: "Test",
isPublic: true, isPublic: true,
members: mockedMembers, members: mockedMembers,
canUserInvite: false)) powerLevelsConfiguration: .init(canUserInvite: false)))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), clientProxy: ClientProxyMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()), mediaProvider: MediaProviderMock(configuration: .init()),
@@ -733,7 +733,12 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
func testKnockRequestsCounterIsNotShownIfNoPermissions() async throws { func testKnockRequestsCounterIsNotShownIfNoPermissions() async throws {
ServiceLocator.shared.settings.knockingEnabled = true ServiceLocator.shared.settings.knockingEnabled = true
let mockedRequests: [KnockRequestProxyMock] = [.init(), .init()] let mockedRequests: [KnockRequestProxyMock] = [.init(), .init()]
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: false, isPublic: false, knockRequestsState: .loaded(mockedRequests), canUserInvite: false, joinRule: .knock)) roomProxyMock = JoinedRoomProxyMock(.init(name: "Test",
isDirect: false,
isPublic: false,
knockRequestsState: .loaded(mockedRequests),
joinRule: .knock,
powerLevelsConfiguration: .init(canUserInvite: false)))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), clientProxy: ClientProxyMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()), mediaProvider: MediaProviderMock(configuration: .init()),
@@ -370,8 +370,8 @@ class RoomScreenViewModelTests: XCTestCase {
func testKnockRequestsBannerDoesNotAppearIfUserHasNoPermission() async throws { func testKnockRequestsBannerDoesNotAppearIfUserHasNoPermission() async throws {
ServiceLocator.shared.settings.knockingEnabled = true ServiceLocator.shared.settings.knockingEnabled = true
let roomProxyMock = JoinedRoomProxyMock(.init(knockRequestsState: .loaded([KnockRequestProxyMock(.init(eventID: "1", userID: "@alice:matrix.org", displayName: "Alice", reason: "Hello World!"))]), let roomProxyMock = JoinedRoomProxyMock(.init(knockRequestsState: .loaded([KnockRequestProxyMock(.init(eventID: "1", userID: "@alice:matrix.org", displayName: "Alice", reason: "Hello World!"))]),
canUserInvite: false, joinRule: .knock,
joinRule: .knock)) powerLevelsConfiguration: .init(canUserInvite: false)))
let viewModel = RoomScreenViewModel(clientProxy: ClientProxyMock(), let viewModel = RoomScreenViewModel(clientProxy: ClientProxyMock(),
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil, initialSelectedPinnedEventID: nil,
@@ -494,7 +494,8 @@ class TimelineViewModelTests: XCTestCase {
} }
func testCanUserPinEvents() async throws { func testCanUserPinEvents() async throws {
let configuration = JoinedRoomProxyMockConfiguration(name: "", canUserPin: true) let configuration = JoinedRoomProxyMockConfiguration(name: "",
powerLevelsConfiguration: .init(canUserPin: true))
let roomProxyMock = JoinedRoomProxyMock(configuration) let roomProxyMock = JoinedRoomProxyMock(configuration)
let infoSubject = CurrentValueSubject<RoomInfoProxy, Never>(.init(roomInfo: RoomInfo(configuration))) let infoSubject = CurrentValueSubject<RoomInfoProxy, Never>(.init(roomInfo: RoomInfo(configuration)))
roomProxyMock.underlyingInfoPublisher = infoSubject.asCurrentValuePublisher() roomProxyMock.underlyingInfoPublisher = infoSubject.asCurrentValuePublisher()