Last Owner should edit admins, and not leave when is last (#4372)

This commit is contained in:
Mauro
2025-08-07 10:40:14 +02:00
committed by GitHub
parent e2d743640d
commit 979f526f19
67 changed files with 691 additions and 363 deletions

View File

@@ -38,8 +38,8 @@ class RoomChangeRolesScreenViewModelTests: XCTestCase {
XCTAssertEqual(context.viewState.administrators, context.viewState.visibleAdministrators)
XCTAssertEqual(context.viewState.moderators, context.viewState.visibleModerators)
XCTAssertEqual(context.viewState.users, context.viewState.visibleUsers)
XCTAssertEqual(context.viewState.membersWithRole.count, 1)
XCTAssertEqual(context.viewState.membersWithRole.first?.id, RoomMemberProxyMock.mockModerator.userID)
XCTAssertEqual(context.viewState.membersWithRole.count, 3)
XCTAssert(context.viewState.membersWithRole.first(where: { $0.id == RoomMemberProxyMock.mockModerator.userID }) != nil)
XCTAssertFalse(context.viewState.hasChanges)
XCTAssertFalse(context.viewState.isSearching)
}
@@ -55,7 +55,7 @@ class RoomChangeRolesScreenViewModelTests: XCTestCase {
XCTAssertEqual(context.viewState.membersToPromote, [firstUser])
XCTAssertEqual(context.viewState.membersToDemote, [])
XCTAssertEqual(context.viewState.membersWithRole.count, 2)
XCTAssertEqual(context.viewState.membersWithRole.count, 4)
XCTAssertTrue(context.viewState.membersWithRole.contains(firstUser))
XCTAssertTrue(context.viewState.hasChanges)
}
@@ -71,7 +71,7 @@ class RoomChangeRolesScreenViewModelTests: XCTestCase {
XCTAssertEqual(context.viewState.membersToPromote, [])
XCTAssertEqual(context.viewState.membersToDemote, [])
XCTAssertEqual(context.viewState.membersWithRole.count, 1)
XCTAssertEqual(context.viewState.membersWithRole.count, 3)
XCTAssertFalse(context.viewState.membersWithRole.contains(firstUser))
XCTAssertFalse(context.viewState.hasChanges)
}
@@ -87,14 +87,14 @@ class RoomChangeRolesScreenViewModelTests: XCTestCase {
XCTAssertEqual(context.viewState.membersToPromote, [])
XCTAssertEqual(context.viewState.membersToDemote, [])
XCTAssertEqual(context.viewState.membersWithRole.count, 1)
XCTAssertEqual(context.viewState.membersWithRole.count, 3)
XCTAssertFalse(context.viewState.membersWithRole.contains(firstUser))
XCTAssertFalse(context.viewState.hasChanges)
}
func testToggleModeratorOff() {
testInitialStateModerators()
guard let existingModerator = context.viewState.membersWithRole.first else {
guard let existingModerator = context.viewState.membersWithRole.first(where: { $0.role == .moderator }) else {
XCTFail("There should be a member with the role before we begin.")
return
}
@@ -103,7 +103,7 @@ class RoomChangeRolesScreenViewModelTests: XCTestCase {
XCTAssertEqual(context.viewState.membersToPromote, [])
XCTAssertEqual(context.viewState.membersToDemote, [existingModerator])
XCTAssertEqual(context.viewState.membersWithRole.count, 0)
XCTAssertEqual(context.viewState.membersWithRole.count, 2)
XCTAssertFalse(context.viewState.membersWithRole.contains(existingModerator))
XCTAssertTrue(context.viewState.hasChanges)
}
@@ -120,14 +120,14 @@ class RoomChangeRolesScreenViewModelTests: XCTestCase {
XCTAssertEqual(context.viewState.membersToPromote, [])
XCTAssertEqual(context.viewState.membersToDemote, [])
XCTAssertEqual(context.viewState.membersWithRole.count, 1)
XCTAssertEqual(context.viewState.membersWithRole.count, 3)
XCTAssertTrue(context.viewState.membersWithRole.contains(demotedMember))
XCTAssertFalse(context.viewState.hasChanges)
}
func testDemoteModerator() {
testInitialStateModerators()
guard let existingModerator = context.viewState.membersWithRole.first else {
guard let existingModerator = context.viewState.membersWithRole.first(where: { $0.role == .moderator }) else {
XCTFail("There should be a member with the role before we begin.")
return
}
@@ -136,7 +136,7 @@ class RoomChangeRolesScreenViewModelTests: XCTestCase {
XCTAssertEqual(context.viewState.membersToPromote, [])
XCTAssertEqual(context.viewState.membersToDemote, [existingModerator])
XCTAssertEqual(context.viewState.membersWithRole.count, 0)
XCTAssertEqual(context.viewState.membersWithRole.count, 2)
XCTAssertFalse(context.viewState.membersWithRole.contains(existingModerator))
XCTAssertTrue(context.viewState.hasChanges)
}
@@ -146,7 +146,7 @@ class RoomChangeRolesScreenViewModelTests: XCTestCase {
setupViewModel(mode: .moderator)
guard let firstUser = context.viewState.users.first(where: { !context.viewState.isMemberSelected($0) }),
let existingModerator = context.viewState.membersWithRole.first else {
let existingModerator = context.viewState.membersWithRole.first(where: { $0.role == .moderator }) else {
XCTFail("There should be a regular user and a moderator to begin with.")
return
}
@@ -192,7 +192,7 @@ class RoomChangeRolesScreenViewModelTests: XCTestCase {
XCTAssertEqual(roomProxy.updatePowerLevelsForUsersReceivedUpdates?.contains { $0.userID == firstUser.id && $0.powerLevel == 100 }, true)
}
private func setupViewModel(mode: RoomMemberDetails.Role) {
private func setupViewModel(mode: RoomRole) {
roomProxy = JoinedRoomProxyMock(.init(members: .allMembersAsAdmin))
viewModel = RoomChangeRolesScreenViewModel(mode: mode,
roomProxy: roomProxy,