Add UI tests for accepting space invites. (#4602)

* Fix the space visibility icon size in the join room screen.

* Add a UI test for accepting space invites.
This commit is contained in:
Doug
2025-10-09 10:11:02 +01:00
committed by GitHub
parent 0e047477c5
commit c572a1a431
51 changed files with 166 additions and 83 deletions
+23 -3
View File
@@ -17,6 +17,7 @@ struct ClientProxyMockConfiguration {
var spaceServiceConfiguration: SpaceServiceProxyMock.Configuration = .init()
var roomPreviews: [RoomPreviewProxyProtocol]?
var roomDirectorySearchProxy: RoomDirectorySearchProxyProtocol?
var overrides = Overrides()
var recoveryState: SecureBackupRecoveryState = .enabled
@@ -26,6 +27,10 @@ struct ClientProxyMockConfiguration {
var hideInviteAvatars = false
var maxMediaUploadSize: UInt = 100 * 1024 * 1024
class Overrides {
var joinedRoomIDs: Set<String> = []
}
}
enum ClientProxyMockError: Error {
@@ -67,6 +72,11 @@ extension ClientProxyMock {
createDirectRoomWithExpectedRoomNameReturnValue = .failure(.sdkError(ClientProxyMockError.generic))
createRoomNameTopicIsRoomPrivateIsKnockingOnlyUserIDsAvatarURLAliasLocalPartReturnValue = .failure(.sdkError(ClientProxyMockError.generic))
canJoinRoomWithReturnValue = true
joinRoomViaClosure = { roomID, _ in
configuration.overrides.joinedRoomIDs.insert(roomID)
return .success(())
}
joinRoomAliasReturnValue = .success(())
uploadMediaReturnValue = .failure(.sdkError(ClientProxyMockError.generic))
loadUserDisplayNameReturnValue = .failure(.sdkError(ClientProxyMockError.generic))
setUserDisplayNameReturnValue = .failure(.sdkError(ClientProxyMockError.generic))
@@ -96,9 +106,19 @@ extension ClientProxyMock {
roomForIdentifierClosure = { [weak self] identifier in
if let room = self?.roomSummaryProvider.roomListPublisher.value.first(where: { $0.id == identifier }) {
let roomProxy = await JoinedRoomProxyMock(.init(id: room.id, name: room.name))
roomProxy.loadOrFetchEventDetailsForReturnValue = .success(TimelineEventSDKMock())
return .joined(roomProxy)
let joinedRoomIDs = configuration.overrides.joinedRoomIDs
switch room.joinRequestType {
case .invite where !joinedRoomIDs.contains(room.id):
let roomProxy = await InvitedRoomProxyMock(.init(id: room.id, name: room.name, isSpace: room.isSpace))
return .invited(roomProxy)
case .knock where !joinedRoomIDs.contains(room.id):
let roomProxy = await KnockedRoomProxyMock(.init(id: room.id, name: room.name))
return .knocked(roomProxy)
default:
let roomProxy = await JoinedRoomProxyMock(.init(id: room.id, name: room.name, isSpace: room.isSpace))
roomProxy.loadOrFetchEventDetailsForReturnValue = .success(TimelineEventSDKMock())
return .joined(roomProxy)
}
} else if let spaceRoomProxy = configuration.spaceServiceConfiguration.joinedSpaces.first(where: { $0.id == identifier }) {
let roomProxy = await JoinedRoomProxyMock(.init(id: spaceRoomProxy.id, name: spaceRoomProxy.name, isSpace: spaceRoomProxy.isSpace))
roomProxy.loadOrFetchEventDetailsForReturnValue = .success(TimelineEventSDKMock())
@@ -344,7 +344,7 @@ extension Array where Element == RoomSummary {
static let mockSpaceInvites: [Element] = [
RoomSummary(room: RoomSDKMock(),
id: "someAwesomeSpaceID1",
id: "!space1:matrix.org",
joinRequestType: .invite(inviter: RoomMemberProxyMock.mockCharlie),
name: "First space",
isDirect: false,
@@ -365,7 +365,7 @@ extension Array where Element == RoomSummary {
isFavourite: false,
isTombstoned: false),
RoomSummary(room: RoomSDKMock(),
id: "someAwesomeSpaceID2",
id: "!space2:matrix.org",
joinRequestType: .invite(inviter: RoomMemberProxyMock.mockCharlie),
name: "Second space",
isDirect: false,
@@ -22,6 +22,7 @@ enum A11yIdentifiers {
static let loginScreen = LoginScreen()
static let authenticationStartScreen = AuthenticationStartScreen()
static let reportContent = ReportContent()
static let joinRoomScreen = JoinRoomScreen()
static let roomScreen = RoomScreen()
static let roomDetailsScreen = RoomDetailsScreen()
static let roomNotificationSettingsScreen = RoomNotificationSettingsScreen()
@@ -132,6 +133,10 @@ enum A11yIdentifiers {
let ignoreUser = "report_content-ignore_user"
}
struct JoinRoomScreen {
let join = "join-room_join"
}
struct RoomScreen {
let name = "room-name"
let avatar = "room-avatar"
@@ -53,6 +53,7 @@ struct HomeScreenInviteCell: View {
context.send(viewAction: .selectRoom(roomIdentifier: roomID))
}
}
.accessibilityIdentifier(A11yIdentifiers.homeScreen.roomName(room.name))
}
// MARK: - Private
@@ -78,7 +78,7 @@ struct JoinRoomScreen: View {
.multilineTextAlignment(.center)
} icon: {
if let icon = context.viewState.subtitleIcon {
CompoundIcon(icon)
CompoundIcon(icon, size: .small, relativeTo: .compound.bodyLG)
.foregroundStyle(.compound.iconTertiary)
}
}
@@ -308,6 +308,7 @@ struct JoinRoomScreen: View {
var joinButton: some View {
Button(L10n.screenJoinRoomJoinAction) { context.send(viewAction: .join) }
.buttonStyle(.compound(.super))
.accessibilityIdentifier(A11yIdentifiers.joinRoomScreen.join)
}
@ToolbarContentBuilder
@@ -586,9 +586,14 @@ class MockScreen: Identifiable {
appSettings.analyticsConsentState = .optedOut
appSettings.hasSeenSpacesAnnouncement = true
let roomSummaries: [RoomSummary] = if id == .userSessionSpacesFlow {
[[RoomSummary].mockSpaceInvites[0]] + .mockRooms
} else {
.mockRooms
}
let clientProxy = ClientProxyMock(.init(userID: "@mock:client.com",
deviceID: "MOCKCLIENT",
roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))),
roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(roomSummaries))),
spaceServiceConfiguration: .init(joinedSpaces: .mockSingleRoom),
roomPreviews: [SpaceRoomProxyProtocol].mockSpaceList.map(RoomPreviewProxyMock.init)))