More Moderation tweaks (#2566)

* Show room member role changes in the timeline.

* Fix a bug in room flow coordinator.

* Tidy up roles and permissions flow.

* Refresh the power levels in the room details screen.

* Automatically update permissions after saving.

* Remove extra button.

* Add a short delay to the roles and permissions screen snapshots.
The permissions rows are now in a loading state initially.
This commit is contained in:
Doug
2024-03-13 15:36:38 +00:00
committed by GitHub
parent 9d68d9e250
commit 1c914c314f
17 changed files with 212 additions and 43 deletions
@@ -89,4 +89,93 @@ class RoomStateEventStringBuilderTests: XCTestCase {
memberIsYou: sender.id == userID)
XCTAssertEqual(string, expectedString)
}
// MARK: - User Power Levels
let aliceID = "@alice"
let bobID = "@bob"
func testUserPowerLevelsPromotion() {
var string = stringBuilder.buildString(for: .roomPowerLevels(users: [aliceID: suggestedPowerLevelForRole(role: .moderator)],
previous: [aliceID: suggestedPowerLevelForRole(role: .user)]),
sender: TimelineItemSender(id: ""),
isOutgoing: false)
XCTAssertEqual(string, L10n.stateEventPromotedToModerator(aliceID))
string = stringBuilder.buildString(for: .roomPowerLevels(users: [aliceID: suggestedPowerLevelForRole(role: .administrator)],
previous: [aliceID: suggestedPowerLevelForRole(role: .user)]),
sender: TimelineItemSender(id: ""),
isOutgoing: false)
XCTAssertEqual(string, L10n.stateEventPromotedToAdministrator(aliceID))
string = stringBuilder.buildString(for: .roomPowerLevels(users: [aliceID: suggestedPowerLevelForRole(role: .administrator)],
previous: [aliceID: suggestedPowerLevelForRole(role: .moderator)]),
sender: TimelineItemSender(id: ""),
isOutgoing: false)
XCTAssertEqual(string, L10n.stateEventPromotedToAdministrator(aliceID))
}
func testUserPowerLevelsDemotion() {
var string = stringBuilder.buildString(for: .roomPowerLevels(users: [aliceID: suggestedPowerLevelForRole(role: .moderator)],
previous: [aliceID: suggestedPowerLevelForRole(role: .administrator)]),
sender: TimelineItemSender(id: ""),
isOutgoing: false)
XCTAssertEqual(string, L10n.stateEventDemotedToModerator(aliceID))
string = stringBuilder.buildString(for: .roomPowerLevels(users: [aliceID: suggestedPowerLevelForRole(role: .user)],
previous: [aliceID: suggestedPowerLevelForRole(role: .administrator)]),
sender: TimelineItemSender(id: ""),
isOutgoing: false)
XCTAssertEqual(string, L10n.stateEventDemotedToMember(aliceID))
string = stringBuilder.buildString(for: .roomPowerLevels(users: [aliceID: suggestedPowerLevelForRole(role: .user)],
previous: [aliceID: suggestedPowerLevelForRole(role: .moderator)]),
sender: TimelineItemSender(id: ""),
isOutgoing: false)
XCTAssertEqual(string, L10n.stateEventDemotedToMember(aliceID))
}
func testMultipleUserPowerLevels() {
let new = [aliceID: suggestedPowerLevelForRole(role: .administrator),
bobID: suggestedPowerLevelForRole(role: .user)]
let previous = [aliceID: suggestedPowerLevelForRole(role: .user),
bobID: suggestedPowerLevelForRole(role: .moderator)]
let string = stringBuilder.buildString(for: .roomPowerLevels(users: new, previous: previous),
sender: TimelineItemSender(id: ""),
isOutgoing: false)
XCTAssertEqual(string?.contains(L10n.stateEventPromotedToAdministrator(aliceID)), true)
XCTAssertEqual(string?.contains(L10n.stateEventDemotedToMember(bobID)), true)
}
func testInvalidUserPowerLevels() {
// Admin demotions aren't relevant.
var string = stringBuilder.buildString(for: .roomPowerLevels(users: [aliceID: 100],
previous: [aliceID: 200]),
sender: TimelineItemSender(id: ""),
isOutgoing: false)
XCTAssertNil(string)
// User promotions aren't relevant.
string = stringBuilder.buildString(for: .roomPowerLevels(users: [aliceID: 0],
previous: [aliceID: -100]),
sender: TimelineItemSender(id: ""),
isOutgoing: false)
XCTAssertNil(string)
// Or more generally, any change within the same role isn't relevant either.
string = stringBuilder.buildString(for: .roomPowerLevels(users: [aliceID: 75],
previous: [aliceID: 60]),
sender: TimelineItemSender(id: ""),
isOutgoing: false)
XCTAssertNil(string)
let new = [aliceID: 100,
bobID: suggestedPowerLevelForRole(role: .user)]
let previous = [aliceID: 200,
bobID: suggestedPowerLevelForRole(role: .moderator)]
string = stringBuilder.buildString(for: .roomPowerLevels(users: new, previous: previous),
sender: TimelineItemSender(id: ""),
isOutgoing: false)
XCTAssertEqual(string, L10n.stateEventDemotedToMember(bobID))
}
}