Adopt the lastest SDK APIs and refactor how we deal with user permissions.

This patch introduces a new RoomPowerLevelsProxy and its associated mock and adopts newer Rust APIs to make working with user power levels and permissions easier.
This commit is contained in:
Stefan Ceriu
2025-06-20 14:20:01 +03:00
committed by Stefan Ceriu
parent 96e5ed06f5
commit f522e15dac
25 changed files with 1863 additions and 1660 deletions
@@ -356,7 +356,11 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
func testCanEditAvatar() async {
let mockedMembers: [RoomMemberProxyMock] = [.mockMe, .mockBob, .mockAlice]
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: false, isPublic: false, members: mockedMembers))
roomProxyMock.canUserUserIDSendStateEventClosure = { _, event in
let powerLevelsMock = RoomPowerLevelsProxyMock(configuration: .init())
roomProxyMock.powerLevelsReturnValue = .success(powerLevelsMock)
powerLevelsMock.canUserUserIDSendStateEventClosure = { _, event in
.success(event == .roomAvatar)
}
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
@@ -380,7 +384,11 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
func testCanEditName() async {
let mockedMembers: [RoomMemberProxyMock] = [.mockMe, .mockBob, .mockAlice]
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: false, isPublic: false, members: mockedMembers))
roomProxyMock.canUserUserIDSendStateEventClosure = { _, event in
let powerLevelsMock = RoomPowerLevelsProxyMock(configuration: .init())
roomProxyMock.powerLevelsReturnValue = .success(powerLevelsMock)
powerLevelsMock.canUserUserIDSendStateEventClosure = { _, event in
.success(event == .roomName)
}
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
@@ -404,7 +412,11 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
func testCanEditTopic() async {
let mockedMembers: [RoomMemberProxyMock] = [.mockMe, .mockBob, .mockAlice]
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: false, isPublic: false, members: mockedMembers))
roomProxyMock.canUserUserIDSendStateEventClosure = { _, event in
let powerLevelsMock = RoomPowerLevelsProxyMock(configuration: .init())
roomProxyMock.powerLevelsReturnValue = .success(powerLevelsMock)
powerLevelsMock.canUserUserIDSendStateEventClosure = { _, event in
.success(event == .roomTopic)
}
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
+10 -10
View File
@@ -13,16 +13,16 @@ import XCTest
class RoomPermissionsTests: XCTestCase {
func testFromRust() {
// Given a set of power level changes with various values.
let powerLevels = RoomPowerLevels(ban: 100,
invite: 100,
kick: 100,
redact: 50,
eventsDefault: 50,
stateDefault: 50,
usersDefault: 0,
roomName: 0,
roomAvatar: 0,
roomTopic: 0)
let powerLevels = RoomPowerLevelsValues(ban: 100,
invite: 100,
kick: 100,
redact: 50,
eventsDefault: 50,
stateDefault: 50,
usersDefault: 0,
roomName: 0,
roomAvatar: 0,
roomTopic: 0)
// When creating room permissions from them.
let permissions = RoomPermissions(powerLevels: powerLevels)
@@ -167,8 +167,12 @@ class RoomScreenViewModelTests: XCTestCase {
var configuration = JoinedRoomProxyMockConfiguration(id: "TestID", name: "StartingName", avatarURL: nil, hasOngoingCall: false)
let infoSubject = CurrentValueSubject<RoomInfoProxy, Never>(.init(roomInfo: RoomInfo(configuration)))
let roomProxyMock = JoinedRoomProxyMock(configuration)
let powerLevelsMock = RoomPowerLevelsProxyMock(configuration: .init())
roomProxyMock.powerLevelsReturnValue = .success(powerLevelsMock)
// setup the room proxy actions publisher
roomProxyMock.canUserJoinCallUserIDReturnValue = .success(false)
powerLevelsMock.canUserJoinCallUserIDReturnValue = .success(false)
roomProxyMock.underlyingInfoPublisher = infoSubject.asCurrentValuePublisher()
let viewModel = RoomScreenViewModel(clientProxy: ClientProxyMock(),
roomProxy: roomProxyMock,
@@ -193,7 +197,7 @@ class RoomScreenViewModelTests: XCTestCase {
configuration.name = "NewName"
configuration.avatarURL = .mockMXCAvatar
configuration.hasOngoingCall = true
roomProxyMock.canUserJoinCallUserIDReturnValue = .success(true)
powerLevelsMock.canUserJoinCallUserIDReturnValue = .success(true)
deferred = deferFulfillment(viewModel.context.$viewState) { viewState in
viewState.roomTitle == "NewName" &&
@@ -517,7 +517,10 @@ class TimelineViewModelTests: XCTestCase {
}
try await deferred.fulfill()
roomProxyMock.canUserPinOrUnpinUserIDReturnValue = .success(false)
let powerLevelsMock = RoomPowerLevelsProxyMock(configuration: .init())
powerLevelsMock.canUserPinOrUnpinUserIDReturnValue = .success(false)
roomProxyMock.powerLevelsReturnValue = .success(powerLevelsMock)
deferred = deferFulfillment(viewModel.context.$viewState) { value in
!value.canCurrentUserPin
}