implemented a way to filter out roles that can't be assigned to permission, and disable permissions that are above the current power level of the user.

This commit is contained in:
Mauro Romito
2025-12-18 18:43:19 +01:00
committed by Mauro
parent f2fc164e2b
commit 88cd816392
18 changed files with 197 additions and 90 deletions
@@ -26,18 +26,44 @@ class RoomChangePermissionsScreenViewModelTests: XCTestCase {
XCTFail("There should be a setting for the room avatar.")
return
}
XCTAssertEqual(context.settings[.roomDetails]?[index].value, .moderator)
XCTAssertEqual(context.settings[.roomDetails]?[index].roleValue, .moderator)
XCTAssertFalse(context.viewState.hasChanges)
// When updating a setting.
let setting = RoomPermissionsSetting(title: "", value: .user, keyPath: \.roomAvatar)
let setting = RoomPermissionsSetting(title: "",
value: RoomRole.user.powerLevelValue,
ownPowerLevel: RoomRole.creator.powerLevel,
keyPath: \.roomAvatar)
XCTAssertFalse(setting.isDisabled)
XCTAssertEqual(setting.availableValues.map(\.tag), RoomPermissionsSetting.allValues.map(\.tag))
context.settings[.roomDetails]?[index] = setting
// Then the setting should update and the changes should be flagged.
XCTAssertEqual(context.settings[.roomDetails]?[index].value, .user)
XCTAssertEqual(context.settings[.roomDetails]?[index].roleValue, .user)
XCTAssertTrue(context.viewState.hasChanges)
}
func testSettingsCantBeChanged() {
setUp(isSpace: false, ownPowerLevel: .value(25))
// Given a screen with no changes.
guard let index = context.settings[.roomDetails]?.firstIndex(where: { $0.keyPath == \.roomAvatar }) else {
XCTFail("There should be a setting for the room avatar.")
return
}
XCTAssertEqual(context.settings[.roomDetails]?[index].roleValue, .moderator)
XCTAssertEqual(context.settings[.roomDetails]?[index].isDisabled, true)
XCTAssertEqual(context.settings[.roomDetails]?[index].availableValues.count, 1)
XCTAssertFalse(context.viewState.hasChanges)
guard let index = context.settings[.messagesAndContent]?.firstIndex(where: { $0.keyPath == \.eventsDefault }) else {
XCTFail("There should be a setting for the events.")
return
}
XCTAssertEqual(context.settings[.messagesAndContent]?[index].roleValue, .user)
XCTAssertEqual(context.settings[.messagesAndContent]?[index].isDisabled, false)
XCTAssertEqual(context.settings[.messagesAndContent]?[index].availableValues.count, 1)
}
func testSave() async throws {
setUp(isSpace: false)
// Given a screen with changes.
@@ -45,8 +71,13 @@ class RoomChangePermissionsScreenViewModelTests: XCTestCase {
XCTFail("There should be a setting for the room avatar.")
return
}
context.settings[.roomDetails]?[index] = RoomPermissionsSetting(title: "", value: .user, keyPath: \.roomAvatar)
XCTAssertEqual(context.settings[.roomDetails]?[index].value, .user)
context.settings[.roomDetails]?[index] = RoomPermissionsSetting(title: "",
value: RoomRole.user.powerLevelValue,
ownPowerLevel: RoomRole.creator.powerLevel,
keyPath: \.roomAvatar)
XCTAssertEqual(context.settings[.roomDetails]?[index].roleValue, .user)
XCTAssertEqual(context.settings[.roomDetails]?[index].isDisabled, false)
XCTAssertEqual(context.settings[.roomDetails]?[index].availableValues.map(\.tag), RoomPermissionsSetting.allValues.map(\.tag))
XCTAssertTrue(context.viewState.hasChanges)
XCTAssertEqual(context.settings.count, 3)
@@ -89,9 +120,10 @@ class RoomChangePermissionsScreenViewModelTests: XCTestCase {
XCTAssertNotNil(context.settings[.manageSpace])
}
private func setUp(isSpace: Bool) {
private func setUp(isSpace: Bool, ownPowerLevel: RoomPowerLevel = RoomRole.creator.powerLevel) {
roomProxy = JoinedRoomProxyMock(.init(isSpace: isSpace))
viewModel = RoomChangePermissionsScreenViewModel(currentPermissions: .init(powerLevels: .mock),
ownPowerLevel: ownPowerLevel,
roomProxy: roomProxy,
userIndicatorController: UserIndicatorControllerMock(),
analytics: ServiceLocator.shared.analytics)
+11 -11
View File
@@ -30,16 +30,16 @@ class RoomPermissionsTests: XCTestCase {
let permissions = RoomPermissions(powerLevels: powerLevels)
// Then the permissions should be created with values mapped to the correct role.
XCTAssertEqual(permissions.ban, .administrator)
XCTAssertEqual(permissions.invite, .administrator)
XCTAssertEqual(permissions.kick, .administrator)
XCTAssertEqual(permissions.redact, .moderator)
XCTAssertEqual(permissions.eventsDefault, .moderator)
XCTAssertEqual(permissions.stateDefault, .moderator)
XCTAssertEqual(permissions.usersDefault, .user)
XCTAssertEqual(permissions.roomName, .user)
XCTAssertEqual(permissions.roomAvatar, .user)
XCTAssertEqual(permissions.roomTopic, .user)
XCTAssertEqual(permissions.spaceChild, .administrator)
XCTAssertEqual(permissions.ban, RoomRole.administrator.powerLevelValue)
XCTAssertEqual(permissions.invite, RoomRole.administrator.powerLevelValue)
XCTAssertEqual(permissions.kick, RoomRole.administrator.powerLevelValue)
XCTAssertEqual(permissions.redact, RoomRole.moderator.powerLevelValue)
XCTAssertEqual(permissions.eventsDefault, RoomRole.moderator.powerLevelValue)
XCTAssertEqual(permissions.stateDefault, RoomRole.moderator.powerLevelValue)
XCTAssertEqual(permissions.usersDefault, RoomRole.user.powerLevelValue)
XCTAssertEqual(permissions.roomName, RoomRole.user.powerLevelValue)
XCTAssertEqual(permissions.roomAvatar, RoomRole.user.powerLevelValue)
XCTAssertEqual(permissions.roomTopic, RoomRole.user.powerLevelValue)
XCTAssertEqual(permissions.spaceChild, RoomRole.administrator.powerLevelValue)
}
}