Skip to content

Commit 706fc74

Browse files
author
Jon Petersson
committed
Add end-to-end tests for Enrypted DNS proxy
1 parent 980c837 commit 706fc74

11 files changed

+90
-5
lines changed

ios/MullvadSettings/AccessMethodRepository.swift

+7-3
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,28 @@ import MullvadLogging
1212
import MullvadTypes
1313

1414
public class AccessMethodRepository: AccessMethodRepositoryProtocol {
15+
public static let directMethodId = "C9DB7457-2A55-42C3-A926-C07F82131994"
16+
public static let bridgeMethodId = "8586E75A-CA7B-4432-B70D-EE65F3F95084"
17+
public static let encryptedDNSMethodId = "831CB1F8-1829-42DD-B9DC-82902F298EC0"
18+
1519
private let logger = Logger(label: "AccessMethodRepository")
1620

1721
private let direct = PersistentAccessMethod(
18-
id: UUID(uuidString: "C9DB7457-2A55-42C3-A926-C07F82131994")!,
22+
id: UUID(uuidString: AccessMethodRepository.directMethodId)!,
1923
name: "Direct",
2024
isEnabled: true,
2125
proxyConfiguration: .direct
2226
)
2327

2428
private let bridge = PersistentAccessMethod(
25-
id: UUID(uuidString: "8586E75A-CA7B-4432-B70D-EE65F3F95084")!,
29+
id: UUID(uuidString: bridgeMethodId)!,
2630
name: "Mullvad bridges",
2731
isEnabled: true,
2832
proxyConfiguration: .bridges
2933
)
3034

3135
private let encryptedDNS = PersistentAccessMethod(
32-
id: UUID(uuidString: "831CB1F8-1829-42DD-B9DC-82902F298EC0")!,
36+
id: UUID(uuidString: encryptedDNSMethodId)!,
3337
name: "Encrypted DNS proxy",
3438
isEnabled: true,
3539
proxyConfiguration: .encryptedDNS

ios/MullvadVPN.xcodeproj/project.pbxproj

+4
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,7 @@
575575
7A9CCCC22A96302800DD6A34 /* SafariCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9CCCB02A96302800DD6A34 /* SafariCoordinator.swift */; };
576576
7A9CCCC32A96302800DD6A34 /* ApplicationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9CCCB12A96302800DD6A34 /* ApplicationCoordinator.swift */; };
577577
7A9CCCC42A96302800DD6A34 /* TunnelCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9CCCB22A96302800DD6A34 /* TunnelCoordinator.swift */; };
578+
7A9F29352CAA8829005F2089 /* AccessMethodsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9F29342CAA8823005F2089 /* AccessMethodsTests.swift */; };
578579
7A9FA1422A2E3306000B728D /* CheckboxView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9FA1412A2E3306000B728D /* CheckboxView.swift */; };
579580
7A9FA1442A2E3FE5000B728D /* CheckableSettingsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9FA1432A2E3FE5000B728D /* CheckableSettingsCell.swift */; };
580581
7AA513862BC91C6B00D081A4 /* LogRotationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AA513852BC91C6B00D081A4 /* LogRotationTests.swift */; };
@@ -1891,6 +1892,7 @@
18911892
7A9CCCB02A96302800DD6A34 /* SafariCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SafariCoordinator.swift; sourceTree = "<group>"; };
18921893
7A9CCCB12A96302800DD6A34 /* ApplicationCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApplicationCoordinator.swift; sourceTree = "<group>"; };
18931894
7A9CCCB22A96302800DD6A34 /* TunnelCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TunnelCoordinator.swift; sourceTree = "<group>"; };
1895+
7A9F29342CAA8823005F2089 /* AccessMethodsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessMethodsTests.swift; sourceTree = "<group>"; };
18941896
7A9FA1412A2E3306000B728D /* CheckboxView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckboxView.swift; sourceTree = "<group>"; };
18951897
7A9FA1432A2E3FE5000B728D /* CheckableSettingsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckableSettingsCell.swift; sourceTree = "<group>"; };
18961898
7AA513852BC91C6B00D081A4 /* LogRotationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogRotationTests.swift; sourceTree = "<group>"; };
@@ -3928,6 +3930,7 @@
39283930
852969372B4ED20E007EAD4C /* Info.plist */,
39293931
8556EB532B9A1D7100D26DD4 /* BridgingHeader.h */,
39303932
85B267602B849ADB0098E3CD /* mullvad-api.h */,
3933+
7A9F29342CAA8823005F2089 /* AccessMethodsTests.swift */,
39313934
852969272B4D9C1F007EAD4C /* AccountTests.swift */,
39323935
85557B112B594FC900795FE1 /* ConnectivityTests.swift */,
39333936
A9BFAFFE2BD004ED00F2BCA1 /* CustomListsTests.swift */,
@@ -6112,6 +6115,7 @@
61126115
85D039982BA4711800940E7F /* SettingsMigrationTests.swift in Sources */,
61136116
85021CAE2BDBC4290098B400 /* AppLogsPage.swift in Sources */,
61146117
850201DB2B503D7700EF8C96 /* RelayTests.swift in Sources */,
6118+
7A9F29352CAA8829005F2089 /* AccessMethodsTests.swift in Sources */,
61156119
7A45CFC62C05FF6A00D80B21 /* ScreenshotTests.swift in Sources */,
61166120
852D054D2BC3DE3A008578D2 /* APIAccessPage.swift in Sources */,
61176121
85139B2D2B84B4A700734217 /* OutOfTimePage.swift in Sources */,

ios/MullvadVPN/Classes/AccessbilityIdentifier.swift

+4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public enum AccessibilityIdentifier: String {
1212
// Buttons
1313
case addAccessMethodButton
1414
case accessMethodAddButton
15+
case accessMethodTestButton
1516
case accountButton
1617
case accessMethodUnreachableBackButton
1718
case accessMethodUnreachableSaveButton
@@ -63,6 +64,9 @@ public enum AccessibilityIdentifier: String {
6364

6465
// Cells
6566
case deviceCell
67+
case accessMethodDirectCell
68+
case accessMethodBridgesCell
69+
case accessMethodEncryptedDNSCell
6670
case accessMethodProtocolSelectionCell
6771
case vpnSettingsCell
6872
case dnsSettingsAddServerCell

ios/MullvadVPN/Coordinators/Settings/APIAccess/Cells/ButtonCellContentConfiguration.swift

+3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ struct ButtonCellContentConfiguration: UIContentConfiguration, Equatable {
2525
/// The button content edge insets.
2626
var directionalContentEdgeInsets: NSDirectionalEdgeInsets = UIMetrics.SettingsCell.insetLayoutMargins
2727

28+
// Accessibiliry identifier.
29+
var accessibilityIdentifier: AccessibilityIdentifier?
30+
2831
func makeContentView() -> UIView & UIContentView {
2932
return ButtonCellContentView(configuration: self)
3033
}

ios/MullvadVPN/Coordinators/Settings/APIAccess/Edit/EditAccessMethodViewController.swift

+2
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ class EditAccessMethodViewController: UITableViewController {
172172

173173
private func configureTestMethod(_ cell: UITableViewCell, itemIdentifier: EditAccessMethodItemIdentifier) {
174174
var contentConfiguration = ButtonCellContentConfiguration()
175+
contentConfiguration.accessibilityIdentifier = .accessMethodTestButton
175176
contentConfiguration.text = itemIdentifier.text
176177
contentConfiguration.isEnabled = subject.value.testingStatus != .inProgress
177178
contentConfiguration.primaryAction = UIAction { [weak self] _ in
@@ -182,6 +183,7 @@ class EditAccessMethodViewController: UITableViewController {
182183

183184
private func configureCancelTest(_ cell: UITableViewCell, itemIdentifier: EditAccessMethodItemIdentifier) {
184185
var contentConfiguration = ButtonCellContentConfiguration()
186+
contentConfiguration.accessibilityIdentifier = .accessMethodTestButton
185187
contentConfiguration.text = itemIdentifier.text
186188
contentConfiguration.isEnabled = subject.value.testingStatus == .inProgress
187189
contentConfiguration.primaryAction = UIAction { [weak self] _ in

ios/MullvadVPN/Coordinators/Settings/APIAccess/List/ListAccessMethodInteractor.swift

+12
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,20 @@ extension PersistentAccessMethod {
4747
let sanitizedName = name.trimmingCharacters(in: .whitespaces)
4848
let itemName = sanitizedName.isEmpty ? kind.localizedDescription : sanitizedName
4949

50+
let accessibilityId: AccessibilityIdentifier? = switch id.uuidString {
51+
case AccessMethodRepository.directMethodId:
52+
AccessibilityIdentifier.accessMethodDirectCell
53+
case AccessMethodRepository.bridgeMethodId:
54+
AccessibilityIdentifier.accessMethodBridgesCell
55+
case AccessMethodRepository.encryptedDNSMethodId:
56+
AccessibilityIdentifier.accessMethodEncryptedDNSCell
57+
default:
58+
nil
59+
}
60+
5061
return ListAccessMethodItem(
5162
id: id,
63+
accessibilityId: accessibilityId,
5264
name: itemName,
5365
detail: isEnabled
5466
? kind.localizedDescription

ios/MullvadVPN/Coordinators/Settings/APIAccess/List/ListAccessMethodItem.swift

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import Foundation
1111
/// A concrete implementation of an API access list item.
1212
struct ListAccessMethodItem: Hashable, Identifiable, Equatable {
1313
let id: UUID
14+
let accessibilityId: AccessibilityIdentifier?
1415

1516
/// The localized name of an API method.
1617
let name: String

ios/MullvadVPN/Coordinators/Settings/APIAccess/List/ListAccessMethodViewController.swift

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ enum ListAccessMethodSectionIdentifier: Hashable {
1616
}
1717

1818
struct ListAccessMethodItemIdentifier: Hashable {
19-
var id: UUID
19+
let id: UUID
2020
}
2121

2222
/// View controller presenting a list of API access methods.
@@ -201,6 +201,8 @@ class ListAccessMethodViewController: UIViewController, UITableViewDelegate {
201201
cell.disclosureType = .chevron
202202
}
203203

204+
cell.accessibilityIdentifier = item.accessibilityId
205+
204206
return cell
205207
}
206208

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//
2+
// AccessMethodsTests.swift
3+
// MullvadVPN
4+
//
5+
// Created by Jon Petersson on 2024-09-30.
6+
// Copyright © 2024 Mullvad VPN AB. All rights reserved.
7+
//
8+
9+
import XCTest
10+
11+
class AccessMethodsTests: LoggedOutUITestCase {
12+
func testEncryptedDNS() throws {
13+
HeaderBar(app)
14+
.tapSettingsButton()
15+
16+
SettingsPage(app)
17+
.tapAPIAccessCell()
18+
19+
let cell = APIAccessPage(app)
20+
.getAccessMethodCell(accessibilityId: AccessibilityIdentifier.accessMethodEncryptedDNSCell)
21+
22+
XCTAssertFalse(APIAccessPage(app).getMethodIsDisabled(cell))
23+
24+
cell.tap()
25+
26+
EditAccessMethodPage(app)
27+
.tapEnableMethodSwitch()
28+
.tapBackButton()
29+
30+
XCTAssertTrue(APIAccessPage(app).getMethodIsDisabled(cell))
31+
}
32+
}

ios/MullvadVPNUITests/Pages/APIAccessPage.swift

+17-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,22 @@ class APIAccessPage: Page {
2323
}
2424

2525
func getAccessMethodCells() -> [XCUIElement] {
26-
return app.otherElements[AccessibilityIdentifier.apiAccessView].cells.allElementsBoundByIndex
26+
app.otherElements[AccessibilityIdentifier.apiAccessView].cells.allElementsBoundByIndex
27+
}
28+
29+
func getAccessMethodCell(accessibilityId: AccessibilityIdentifier) -> XCUIElement {
30+
app.otherElements[AccessibilityIdentifier.apiAccessView].cells[accessibilityId]
31+
}
32+
33+
func getMethodIsInUse(_ cell: XCUIElement) -> Bool {
34+
cell.staticTexts.allElementsBoundByIndex.contains { element in
35+
element.label == "In use"
36+
}
37+
}
38+
39+
func getMethodIsDisabled(_ cell: XCUIElement) -> Bool {
40+
cell.staticTexts.allElementsBoundByIndex.contains { element in
41+
element.label == "Disabled"
42+
}
2743
}
2844
}

ios/MullvadVPNUITests/Pages/EditAccessMethodPage.swift

+5
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ class EditAccessMethodPage: Page {
3131
return self
3232
}
3333

34+
@discardableResult func tapTestMethodButton() -> Self {
35+
app.buttons[AccessibilityIdentifier.accessMethodTestButton].tap()
36+
return self
37+
}
38+
3439
@discardableResult func tapBackButton() -> Self {
3540
// Workaround due to the way automatically managed back buttons work. Back button needs to be nil for the automatic back button behaviour in iOS, and since its nil we cannot set accessibilityIdentifier for it
3641
let backButton = app.navigationBars.firstMatch.buttons.firstMatch

0 commit comments

Comments
 (0)