diff --git a/WireUI/Sources/WireLocators/Locators.swift b/WireUI/Sources/WireLocators/Locators.swift index 601b3ba53de..8fbf96b9687 100644 --- a/WireUI/Sources/WireLocators/Locators.swift +++ b/WireUI/Sources/WireLocators/Locators.swift @@ -198,6 +198,8 @@ public enum Locators { case guestsArePresent = "Guests are present" case conversationBackground case openOngoingCallButton + case readReceiptsDisabledSystemMessage + case readReceiptsEnabledSystemMessage } @@ -232,6 +234,7 @@ public enum Locators { case adminCell case memberCell case close + case readReceiptsSwitch } public enum ConversationDetailsActions: AutoPrefixedEnum { diff --git a/wire-ios/Wire-iOS/Sources/UserInterface/Conversation/Content/Cells/ConfigurationMessageCell/Components/ConversationReadReceiptSettingChangedCellDescription.swift b/wire-ios/Wire-iOS/Sources/UserInterface/Conversation/Content/Cells/ConfigurationMessageCell/Components/ConversationReadReceiptSettingChangedCellDescription.swift index f88bb370cd6..571039960ac 100644 --- a/wire-ios/Wire-iOS/Sources/UserInterface/Conversation/Content/Cells/ConfigurationMessageCell/Components/ConversationReadReceiptSettingChangedCellDescription.swift +++ b/wire-ios/Wire-iOS/Sources/UserInterface/Conversation/Content/Cells/ConfigurationMessageCell/Components/ConversationReadReceiptSettingChangedCellDescription.swift @@ -20,6 +20,7 @@ import Foundation import WireCommonComponents import WireDataModel import WireDesign +import WireLocators struct ReadReceiptViewModel { let icon: StyleKitIcon @@ -88,7 +89,7 @@ final class ConversationReadReceiptSettingChangedCellDescription: ConversationMe let containsHighlightableContent: Bool = false - let accessibilityIdentifier: String? = nil + let accessibilityIdentifier: String? let accessibilityLabel: String? init( @@ -108,6 +109,14 @@ final class ConversationReadReceiptSettingChangedCellDescription: ConversationMe showLine: true ) self.accessibilityLabel = viewModel.attributedTitle()?.string + self.accessibilityIdentifier = switch systemMessageType { + case .readReceiptsDisabled: + Locators.ActiveConversationPage.readReceiptsDisabledSystemMessage.rawValue + case .readReceiptsEnabled: + Locators.ActiveConversationPage.readReceiptsEnabledSystemMessage.rawValue + default: + nil + } self.actionController = nil } } diff --git a/wire-ios/Wire-iOS/Sources/UserInterface/GroupDetails/Cells/GroupDetailsReceiptOptionsCell.swift b/wire-ios/Wire-iOS/Sources/UserInterface/GroupDetails/Cells/GroupDetailsReceiptOptionsCell.swift index 85a099955d5..8d7b1a663c1 100644 --- a/wire-ios/Wire-iOS/Sources/UserInterface/GroupDetails/Cells/GroupDetailsReceiptOptionsCell.swift +++ b/wire-ios/Wire-iOS/Sources/UserInterface/GroupDetails/Cells/GroupDetailsReceiptOptionsCell.swift @@ -20,6 +20,7 @@ import UIKit import WireCommonComponents import WireDataModel import WireDesign +import WireLocators final class GroupDetailsReceiptOptionsCell: IconToggleCell { @@ -27,7 +28,7 @@ final class GroupDetailsReceiptOptionsCell: IconToggleCell { super.setUp() accessibilityIdentifier = "cell.groupdetails.receiptoptions" - toggle.accessibilityIdentifier = "ReadReceiptsSwitch" + toggle.accessibilityIdentifier = Locators.ConversationDetailsPage.readReceiptsSwitch.rawValue title = L10n.Localizable.GroupDetails.ReceiptOptionsCell.title diff --git a/wire-ios/WireUITests/Pages/ActiveConversationPage.swift b/wire-ios/WireUITests/Pages/ActiveConversationPage.swift index cd4617030ad..453a92bfe96 100644 --- a/wire-ios/WireUITests/Pages/ActiveConversationPage.swift +++ b/wire-ios/WireUITests/Pages/ActiveConversationPage.swift @@ -528,6 +528,24 @@ class ActiveConversationPage: PageModel { return self } + @discardableResult + func verifyReadReceiptsSystemMessage( + enabled: Bool, + file: StaticString = #filePath, + line: UInt = #line + ) -> ActiveConversationPage { + let identifier = enabled + ? Locators.ActiveConversationPage.readReceiptsEnabledSystemMessage.rawValue + : Locators.ActiveConversationPage.readReceiptsDisabledSystemMessage.rawValue + XCTAssertTrue( + app.descendants(matching: .any)[identifier].firstMatch.waitForExistence(timeout: 10), + "Expected read-receipts system message with identifier '\(identifier)' not found", + file: file, + line: line + ) + return self + } + func verifyLinkPreviewCell( file: StaticString = #filePath, line: UInt = #line diff --git a/wire-ios/WireUITests/Pages/ConversationDetailsPage.swift b/wire-ios/WireUITests/Pages/ConversationDetailsPage.swift index 126b2bf8f2f..f2285062829 100644 --- a/wire-ios/WireUITests/Pages/ConversationDetailsPage.swift +++ b/wire-ios/WireUITests/Pages/ConversationDetailsPage.swift @@ -134,6 +134,16 @@ class ConversationDetailsPage: PageModel { app.buttons[Locators.LastAdminLeaveAlert.deleteGroup.rawValue].firstMatch } + var readReceiptsSwitch: XCUIElement { + app.switches[Locators.ConversationDetailsPage.readReceiptsSwitch.rawValue].firstMatch + } + + @discardableResult + func toggleGroupReadReceipts() -> ConversationDetailsPage { + readReceiptsSwitch.waitAndTap() + return self + } + func appParticipantToConversation() throws -> SelectParticipantsPage { addParticipantsButton.tap() return try SelectParticipantsPage() diff --git a/wire-ios/WireUITests/SettingsTests.swift b/wire-ios/WireUITests/SettingsTests.swift index b7705587add..e5cad8936fb 100644 --- a/wire-ios/WireUITests/SettingsTests.swift +++ b/wire-ios/WireUITests/SettingsTests.swift @@ -150,4 +150,34 @@ final class SettingsTests: WireUITestCase { .verifyLinkPreviewCell() } + @MainActor + func testUpdateReadReceiptSettingOnGroupConversation_TC_8947() async throws { + + // GIVEN - a group conversation (read receipts are on by default) + let groupName = UserGenerator.generateRandomConversationName() + let (team, _, _, _) = try await UserHelper.default.registerTeam( + withMemberCount: 1, + conversation: .group(groupName) + ) + + let activeConversationPage = try app.loginUser(email: team.email, password: team.password) + .acceptPopup() + .openConversation() + + // WHEN - read receipts are turned off + _ = try activeConversationPage + .openConversationDetails() + .toggleGroupReadReceipts() + .closeConversationDetails() + // THEN - a system message confirms read receipts are off + .verifyReadReceiptsSystemMessage(enabled: false) + + // WHEN - read receipts are turned back on + _ = try activeConversationPage + .openConversationDetails() + .toggleGroupReadReceipts() + .closeConversationDetails() + // THEN - a system message confirms read receipts are on + .verifyReadReceiptsSystemMessage(enabled: true) + } }