Add analytics for Room Moderation. (#2571)

* Add an option to use analytics locally.

* Add analytics for Room Moderation.

* Update tests.

* Include the role in the event where appropriate.

* Update the AnalyticsEvents package.
This commit is contained in:
Doug
2024-03-14 15:55:37 +00:00
committed by GitHub
parent d2a9db874d
commit c68ec2c382
26 changed files with 185 additions and 60 deletions
@@ -32,7 +32,8 @@ class RoomChangePermissionsScreenViewModelTests: XCTestCase {
viewModel = RoomChangePermissionsScreenViewModel(currentPermissions: .init(powerLevels: .mock),
group: .roomDetails,
roomProxy: roomProxy,
userIndicatorController: UserIndicatorControllerMock())
userIndicatorController: UserIndicatorControllerMock(),
analytics: ServiceLocator.shared.analytics)
}
func testChangeSetting() {
@@ -62,6 +63,7 @@ class RoomChangePermissionsScreenViewModelTests: XCTestCase {
context.settings[index] = RoomPermissionsSetting(title: "", value: .user, keyPath: \.roomAvatar)
XCTAssertEqual(context.settings[index].value, .user)
XCTAssertTrue(context.viewState.hasChanges)
XCTAssertEqual(context.settings.count, 3)
// When saving changes.
context.send(viewAction: .save)
@@ -70,8 +72,8 @@ class RoomChangePermissionsScreenViewModelTests: XCTestCase {
// Then the changes should be applied.
XCTAssertTrue(roomProxy.applyPowerLevelChangesCalled)
XCTAssertEqual(roomProxy.applyPowerLevelChangesReceivedChanges, .init(roomName: 50, roomAvatar: 0, roomTopic: 50),
"Only the changes for this screen should be applied, the others should be nil to remain unchanged.")
XCTAssertEqual(roomProxy.applyPowerLevelChangesReceivedChanges, .init(roomAvatar: 0),
"Only the avatar setting should be applied. No other settings were changed so they should be nil to remain left alone.")
}
func testSaveNoChanges() async throws {
@@ -28,8 +28,7 @@ class RoomChangeRolesScreenViewModelTests: XCTestCase {
}
func testInitialStateAdministrators() {
setupRoomProxy()
viewModel = RoomChangeRolesScreenViewModel(mode: .administrator, roomProxy: roomProxy, userIndicatorController: UserIndicatorControllerMock())
setupViewModel(mode: .administrator)
XCTAssertEqual(context.viewState.membersToPromote, [])
XCTAssertEqual(context.viewState.membersToDemote, [])
XCTAssertEqual(context.viewState.members, context.viewState.visibleMembers)
@@ -40,8 +39,7 @@ class RoomChangeRolesScreenViewModelTests: XCTestCase {
}
func testInitialStateModerators() {
setupRoomProxy()
viewModel = RoomChangeRolesScreenViewModel(mode: .moderator, roomProxy: roomProxy, userIndicatorController: UserIndicatorControllerMock())
setupViewModel(mode: .moderator)
XCTAssertEqual(context.viewState.membersToPromote, [])
XCTAssertEqual(context.viewState.membersToDemote, [])
XCTAssertEqual(context.viewState.members, context.viewState.visibleMembers)
@@ -150,8 +148,7 @@ class RoomChangeRolesScreenViewModelTests: XCTestCase {
func testSaveModeratorChanges() async throws {
// Given the change roles view model for moderators.
setupRoomProxy()
viewModel = RoomChangeRolesScreenViewModel(mode: .moderator, roomProxy: roomProxy, userIndicatorController: UserIndicatorControllerMock())
setupViewModel(mode: .moderator)
guard let firstUser = context.viewState.members.first(where: { !context.viewState.isMemberSelected($0) }),
let existingModerator = context.viewState.membersWithRole.first else {
@@ -175,8 +172,7 @@ class RoomChangeRolesScreenViewModelTests: XCTestCase {
func testSavePromotedAdministrator() async throws {
// Given the change roles view model for administrators.
setupRoomProxy()
viewModel = RoomChangeRolesScreenViewModel(mode: .administrator, roomProxy: roomProxy, userIndicatorController: UserIndicatorControllerMock())
setupViewModel(mode: .administrator)
XCTAssertNil(context.alertInfo)
guard let firstUser = context.viewState.members.first(where: { !context.viewState.isMemberSelected($0) }) else {
@@ -201,7 +197,11 @@ class RoomChangeRolesScreenViewModelTests: XCTestCase {
XCTAssertEqual(roomProxy.updatePowerLevelsForUsersReceivedUpdates?.contains(where: { $0.userID == firstUser.id && $0.powerLevel == 100 }), true)
}
private func setupRoomProxy() {
private func setupViewModel(mode: RoomMemberDetails.Role) {
roomProxy = RoomProxyMock(with: .init(members: .allMembersAsAdmin))
viewModel = RoomChangeRolesScreenViewModel(mode: mode,
roomProxy: roomProxy,
userIndicatorController: UserIndicatorControllerMock(),
analytics: ServiceLocator.shared.analytics)
}
}
@@ -170,6 +170,7 @@ class RoomMembersListScreenViewModelTests: XCTestCase {
viewModel = .init(roomProxy: roomProxy,
mediaProvider: MockMediaProvider(),
userIndicatorController: ServiceLocator.shared.userIndicatorController,
appSettings: ServiceLocator.shared.settings)
appSettings: ServiceLocator.shared.settings,
analytics: ServiceLocator.shared.analytics)
}
}
@@ -28,25 +28,19 @@ class RoomRolesAndPermissionsScreenViewModelTests: XCTestCase {
}
func testEmptyCounters() {
roomProxy = RoomProxyMock(with: .init())
viewModel = RoomRolesAndPermissionsScreenViewModel(roomProxy: roomProxy,
userIndicatorController: UserIndicatorControllerMock())
setupViewModel(members: .allMembers)
XCTAssertEqual(context.viewState.administratorCount, 0)
XCTAssertEqual(context.viewState.moderatorCount, 0)
}
func testFilledCounters() {
roomProxy = RoomProxyMock(with: .init(members: .allMembersAsAdmin))
viewModel = RoomRolesAndPermissionsScreenViewModel(roomProxy: roomProxy,
userIndicatorController: UserIndicatorControllerMock())
setupViewModel(members: .allMembersAsAdmin)
XCTAssertEqual(context.viewState.administratorCount, 2)
XCTAssertEqual(context.viewState.moderatorCount, 1)
}
func testResetPermissions() async throws {
roomProxy = RoomProxyMock(with: .init(members: .allMembersAsAdmin))
viewModel = RoomRolesAndPermissionsScreenViewModel(roomProxy: roomProxy,
userIndicatorController: UserIndicatorControllerMock())
setupViewModel(members: .allMembersAsAdmin)
context.send(viewAction: .reset)
XCTAssertNotNil(context.alertInfo)
@@ -59,9 +53,7 @@ class RoomRolesAndPermissionsScreenViewModelTests: XCTestCase {
}
func testDemoteToModerator() async throws {
roomProxy = RoomProxyMock(with: .init(members: .allMembersAsAdmin))
viewModel = RoomRolesAndPermissionsScreenViewModel(roomProxy: roomProxy,
userIndicatorController: UserIndicatorControllerMock())
setupViewModel(members: .allMembersAsAdmin)
context.send(viewAction: .editOwnUserRole)
XCTAssertNotNil(context.alertInfo)
@@ -76,9 +68,7 @@ class RoomRolesAndPermissionsScreenViewModelTests: XCTestCase {
}
func testDemoteToMember() async throws {
roomProxy = RoomProxyMock(with: .init(members: .allMembersAsAdmin))
viewModel = RoomRolesAndPermissionsScreenViewModel(roomProxy: roomProxy,
userIndicatorController: UserIndicatorControllerMock())
setupViewModel(members: .allMembersAsAdmin)
context.send(viewAction: .editOwnUserRole)
XCTAssertNotNil(context.alertInfo)
@@ -91,4 +81,11 @@ class RoomRolesAndPermissionsScreenViewModelTests: XCTestCase {
XCTAssertEqual(roomProxy.updatePowerLevelsForUsersReceivedUpdates?.first?.powerLevel,
RoomMemberDetails.Role.user.rustPowerLevel)
}
private func setupViewModel(members: [RoomMemberProxyMock]) {
roomProxy = RoomProxyMock(with: .init(members: members))
viewModel = RoomRolesAndPermissionsScreenViewModel(roomProxy: roomProxy,
userIndicatorController: UserIndicatorControllerMock(),
analytics: ServiceLocator.shared.analytics)
}
}