diff options
8 files changed, 40 insertions, 21 deletions
diff --git a/ios/MullvadVPN/Classes/AccessbilityIdentifier.swift b/ios/MullvadVPN/Classes/AccessbilityIdentifier.swift index 63f3c87682..0dfb9dbdda 100644 --- a/ios/MullvadVPN/Classes/AccessbilityIdentifier.swift +++ b/ios/MullvadVPN/Classes/AccessbilityIdentifier.swift @@ -13,6 +13,7 @@ public enum AccessibilityIdentifier: Equatable { case addAccessMethodButton case accessMethodAddButton case accessMethodTestButton + case accessMethodConfirmDeleteButton case accountButton case accessMethodUnreachableBackButton case accessMethodUnreachableSaveButton diff --git a/ios/MullvadVPN/Coordinators/Settings/APIAccess/Edit/EditAccessMethodViewController.swift b/ios/MullvadVPN/Coordinators/Settings/APIAccess/Edit/EditAccessMethodViewController.swift index 4d0440fb07..1f1742c1bd 100644 --- a/ios/MullvadVPN/Coordinators/Settings/APIAccess/Edit/EditAccessMethodViewController.swift +++ b/ios/MullvadVPN/Coordinators/Settings/APIAccess/Edit/EditAccessMethodViewController.swift @@ -272,6 +272,7 @@ extension EditAccessMethodViewController: UITableViewDelegate { var contentConfiguration = ButtonCellContentConfiguration() contentConfiguration.style = .tableInsetGroupedDanger contentConfiguration.text = itemIdentifier.text + contentConfiguration.accessibilityIdentifier = .deleteButton contentConfiguration.primaryAction = UIAction { [weak self] _ in self?.onDelete() } @@ -398,6 +399,7 @@ extension EditAccessMethodViewController: UITableViewDelegate { comment: "" ), style: .destructive, + accessibilityId: .accessMethodConfirmDeleteButton, handler: { [weak self] in guard let self else { return } interactor.deleteAccessMethod() diff --git a/ios/MullvadVPN/Coordinators/Settings/APIAccess/List/ListAccessMethodView.swift b/ios/MullvadVPN/Coordinators/Settings/APIAccess/List/ListAccessMethodView.swift index 8c06bea36e..b5f42d4144 100644 --- a/ios/MullvadVPN/Coordinators/Settings/APIAccess/List/ListAccessMethodView.swift +++ b/ios/MullvadVPN/Coordinators/Settings/APIAccess/List/ListAccessMethodView.swift @@ -104,6 +104,7 @@ struct ListAccessMethodView<ViewModel>: View where ViewModel: ListAccessViewMode ) { viewModel.addNewMethod() } + .accessibilityIdentifier(AccessibilityIdentifier.addAccessMethodButton.asString) .padding(.horizontal) Spacer() } diff --git a/ios/MullvadVPN/Views/List/MullvadListNavigationItemView.swift b/ios/MullvadVPN/Views/List/MullvadListNavigationItemView.swift index 0d5223f145..619212184d 100644 --- a/ios/MullvadVPN/Views/List/MullvadListNavigationItemView.swift +++ b/ios/MullvadVPN/Views/List/MullvadListNavigationItemView.swift @@ -68,7 +68,7 @@ struct MullvadListNavigationItemView: View { .primary ) } - .accessibilityIdentifier(accessibilityIdentifier?.asString ?? "") + .accessibilityIdentifier(accessibilityIdentifier?.asString ?? title) .onButtonPressedChange { isPressed in self.isPressed = isPressed } diff --git a/ios/MullvadVPNUITests/ConnectivityTests.swift b/ios/MullvadVPNUITests/ConnectivityTests.swift index 71ec190c78..a0cf389e6d 100644 --- a/ios/MullvadVPNUITests/ConnectivityTests.swift +++ b/ios/MullvadVPNUITests/ConnectivityTests.swift @@ -56,11 +56,6 @@ class ConnectivityTests: LoggedOutUITestCase { /// Get the app into a blocked state by connecting to a relay then applying a filter which don't find this relay, then verify that app can still communicate by logging out and verifying that the device was successfully removed // swiftlint:disable:next function_body_length func testAPIReachableWhenBlocked() throws { - let skipReason = """ - URLSession doesn't work when the app is in a blocked state. - Thus, we should disable this test until we have migrated over to `Rust API client`. - """ - try XCTSkipIf(true, skipReason) let hasTimeAccountNumber = getAccountWithTime() addTeardownBlock { // Reset any filters @@ -99,7 +94,6 @@ class ConnectivityTests: LoggedOutUITestCase { .tapFilterButton() SelectLocationFilterPage(app) - .tapOwnershipCellExpandButton() .tapMullvadOwnershipCell() .tapApplyButton() @@ -121,7 +115,6 @@ class ConnectivityTests: LoggedOutUITestCase { .tapFilterButton() SelectLocationFilterPage(app) - .tapOwnershipCellExpandButton() .tapRentedOwnershipCell() .tapApplyButton() @@ -146,13 +139,8 @@ class ConnectivityTests: LoggedOutUITestCase { // swiftlint:disable function_body_length /// Test that the app is functioning when API is down. To simulate API being down we create a dummy access method func testAppStillFunctioningWhenAPIDown() throws { - let skipReason = """ - This test is currently skipped due to a bug in iOS 18 where ATS shuts down the - connection to the API in the blocked state, despite being explicitly disabled, - and after the checks in SSLPinningURLSessionDelegate return no error. - """ - try XCTSkipIf(true, skipReason) let hasTimeAccountNumber = getAccountWithTime() + let customAccessMethodName = "Disable-access-dummy" addTeardownBlock { HeaderBar(self.app) @@ -162,6 +150,14 @@ class ConnectivityTests: LoggedOutUITestCase { .tapAPIAccessCell() self.toggleAllAccessMethodsEnabledSwitchesIfOff() + + APIAccessPage(self.app) + .editAccessMethod(customAccessMethodName) + + EditAccessMethodPage(self.app) + .tapDeleteButton() + .confirmAccessMethodDeletion() + self.deleteTemporaryAccountWithTime(accountNumber: hasTimeAccountNumber) } @@ -179,8 +175,6 @@ class ConnectivityTests: LoggedOutUITestCase { SettingsPage(app) .tapAPIAccessCell() - toggleAllAccessMethodsEnabledSwitches() - APIAccessPage(app) .tapAddButton() @@ -188,7 +182,7 @@ class ConnectivityTests: LoggedOutUITestCase { AddAccessMethodPage(app) .tapNameCell() - .enterText("Disable-access-dummy") + .enterText(customAccessMethodName) .tapTypeCell() .tapSOCKS5TypeValueCell() .tapServerCell() @@ -203,6 +197,8 @@ class ConnectivityTests: LoggedOutUITestCase { AddAccessMethodAPIUnreachableAlert(app) .tapSaveButton() + disableBuiltinAccessMethods() + SettingsPage(app) .swipeDownToDismissModal() @@ -289,9 +285,15 @@ class ConnectivityTests: LoggedOutUITestCase { // swiftlint:enable function_body_length - /// Toggle enabled switch for all existing access methods. It is a precondition that the app is currently showing API access view. - private func toggleAllAccessMethodsEnabledSwitches() { - for cell in APIAccessPage(app).getAccessMethodCells() { + /// Toggle enabled switch for all existing access methods. + /// Preconditions: + /// - The app is currently showing API access view. + /// - There is one custom access method enabled + /// - The extra access method is not disabled + private func disableBuiltinAccessMethods() { + var accessMethods = APIAccessPage(app).getAccessMethodCells() + accessMethods.removeLast() + for cell in accessMethods { cell.tap() EditAccessMethodPage(app) .tapEnableMethodSwitch() diff --git a/ios/MullvadVPNUITests/Pages/APIAccessPage.swift b/ios/MullvadVPNUITests/Pages/APIAccessPage.swift index b70e5c9d24..ca43cc91f3 100644 --- a/ios/MullvadVPNUITests/Pages/APIAccessPage.swift +++ b/ios/MullvadVPNUITests/Pages/APIAccessPage.swift @@ -29,4 +29,8 @@ class APIAccessPage: Page { func getAccessMethodCell(accessibilityId: AccessibilityIdentifier) -> XCUIElement { app.buttons[accessibilityId] } + + func editAccessMethod(_ named: String) { + app.buttons[named].tap() + } } diff --git a/ios/MullvadVPNUITests/Pages/EditAccessMethodPage.swift b/ios/MullvadVPNUITests/Pages/EditAccessMethodPage.swift index bebcf92d12..77726e9bf0 100644 --- a/ios/MullvadVPNUITests/Pages/EditAccessMethodPage.swift +++ b/ios/MullvadVPNUITests/Pages/EditAccessMethodPage.swift @@ -64,4 +64,13 @@ class EditAccessMethodPage: Page { XCTAssertFalse(app.switches[AccessibilityIdentifier.accessMethodEnableSwitch].isEnabled) return self } + + @discardableResult func tapDeleteButton() -> Self { + app.buttons[AccessibilityIdentifier.deleteButton].tap() + return self + } + + func confirmAccessMethodDeletion() { + app.buttons[.accessMethodConfirmDeleteButton].tap() + } } diff --git a/ios/MullvadVPNUITests/Pages/LoginPage.swift b/ios/MullvadVPNUITests/Pages/LoginPage.swift index e120637a52..6035d844ca 100644 --- a/ios/MullvadVPNUITests/Pages/LoginPage.swift +++ b/ios/MullvadVPNUITests/Pages/LoginPage.swift @@ -50,7 +50,7 @@ class LoginPage: Page { @discardableResult public func verifyFailIconShown() -> Self { let predicate = NSPredicate(format: "identifier == 'statusImageView' AND value == 'fail'") let elementQuery = app.images.containing(predicate) - let elementExists = elementQuery.firstMatch.waitForExistence(timeout: BaseUITestCase.longTimeout) + let elementExists = elementQuery.firstMatch.waitForExistence(timeout: BaseUITestCase.veryLongTimeout) XCTAssertTrue(elementExists, "Fail icon shown") return self } |
