Skip to content

Commit 684a2c7

Browse files
committed
Add a test to delete, edit and create a custom list
1 parent 0a5b185 commit 684a2c7

18 files changed

+436
-12
lines changed

ios/MullvadVPN.xcodeproj/project.pbxproj

+21-5
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,8 @@
703703
A988A3E22AFE54AC0008D2C7 /* AccountExpiry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6F2FA62AFBB9AE006D0856 /* AccountExpiry.swift */; };
704704
A988DF272ADE86ED00D807EF /* WireGuardObfuscationSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = A988DF252ADE86ED00D807EF /* WireGuardObfuscationSettings.swift */; };
705705
A988DF2A2ADE880300D807EF /* TunnelSettingsV3.swift in Sources */ = {isa = PBXBuildFile; fileRef = A988DF282ADE880300D807EF /* TunnelSettingsV3.swift */; };
706+
A998DA812BD147AD001D61A2 /* ListCustomListsPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A998DA802BD147AD001D61A2 /* ListCustomListsPage.swift */; };
707+
A998DA832BD2B055001D61A2 /* EditCustomListLocationsPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A998DA822BD2B055001D61A2 /* EditCustomListLocationsPage.swift */; };
706708
A99E5EE02B7628150033F241 /* ProblemReportViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A99E5EDF2B7628150033F241 /* ProblemReportViewModel.swift */; };
707709
A99E5EE22B762ED30033F241 /* ProblemReportViewController+ViewManagement.swift in Sources */ = {isa = PBXBuildFile; fileRef = A99E5EE12B762ED30033F241 /* ProblemReportViewController+ViewManagement.swift */; };
708710
A9A1DE792AD5708E0073F689 /* TransportStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9A1DE782AD5708E0073F689 /* TransportStrategy.swift */; };
@@ -808,6 +810,8 @@
808810
A9B6AC1B2ADEA3AD00F7802A /* MemoryCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58BDEB9C2A98F69E00F578F2 /* MemoryCache.swift */; };
809811
A9BA08312BA32FA9005A7A2D /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = A92962582B1F4FDB00DFB93B /* PrivacyInfo.xcprivacy */; };
810812
A9BA08322BA32FB6005A7A2D /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = A92962582B1F4FDB00DFB93B /* PrivacyInfo.xcprivacy */; };
813+
A9BFAFFF2BD004ED00F2BCA1 /* CustomListsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9BFAFFE2BD004ED00F2BCA1 /* CustomListsTests.swift */; };
814+
A9BFB0012BD00B7F00F2BCA1 /* CustomListPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9BFB0002BD00B7F00F2BCA1 /* CustomListPage.swift */; };
811815
A9C342C12ACC37E30045F00E /* TunnelStatusBlockObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9E0317D2ACC32920095D843 /* TunnelStatusBlockObserver.swift */; };
812816
A9C342C32ACC3EE90045F00E /* RelayCacheTracker+Stubs.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C342C22ACC3EE90045F00E /* RelayCacheTracker+Stubs.swift */; };
813817
A9C342C52ACC42130045F00E /* ServerRelaysResponse+Stubs.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C342C42ACC42130045F00E /* ServerRelaysResponse+Stubs.swift */; };
@@ -1966,13 +1970,17 @@
19661970
A98502022B627B120061901E /* LocalNetworkProbe.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalNetworkProbe.swift; sourceTree = "<group>"; };
19671971
A988DF252ADE86ED00D807EF /* WireGuardObfuscationSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WireGuardObfuscationSettings.swift; sourceTree = "<group>"; };
19681972
A988DF282ADE880300D807EF /* TunnelSettingsV3.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelSettingsV3.swift; sourceTree = "<group>"; };
1973+
A998DA802BD147AD001D61A2 /* ListCustomListsPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListCustomListsPage.swift; sourceTree = "<group>"; };
1974+
A998DA822BD2B055001D61A2 /* EditCustomListLocationsPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditCustomListLocationsPage.swift; sourceTree = "<group>"; };
19691975
A99E5EDF2B7628150033F241 /* ProblemReportViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProblemReportViewModel.swift; sourceTree = "<group>"; };
19701976
A99E5EE12B762ED30033F241 /* ProblemReportViewController+ViewManagement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProblemReportViewController+ViewManagement.swift"; sourceTree = "<group>"; };
19711977
A9A1DE782AD5708E0073F689 /* TransportStrategy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransportStrategy.swift; sourceTree = "<group>"; };
19721978
A9A5F9A12ACB003D0083449F /* TunnelManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelManagerTests.swift; sourceTree = "<group>"; };
19731979
A9A8A8EA2A262AB30086D569 /* FileCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileCache.swift; sourceTree = "<group>"; };
19741980
A9B6AC172ADE8F4300F7802A /* MigrationManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigrationManagerTests.swift; sourceTree = "<group>"; };
19751981
A9B6AC192ADE8FBB00F7802A /* InMemorySettingsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InMemorySettingsStore.swift; sourceTree = "<group>"; };
1982+
A9BFAFFE2BD004ED00F2BCA1 /* CustomListsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomListsTests.swift; sourceTree = "<group>"; };
1983+
A9BFB0002BD00B7F00F2BCA1 /* CustomListPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomListPage.swift; sourceTree = "<group>"; };
19761984
A9C342C22ACC3EE90045F00E /* RelayCacheTracker+Stubs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RelayCacheTracker+Stubs.swift"; sourceTree = "<group>"; };
19771985
A9C342C42ACC42130045F00E /* ServerRelaysResponse+Stubs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ServerRelaysResponse+Stubs.swift"; sourceTree = "<group>"; };
19781986
A9CF11FC2A0518E7001D9565 /* AddressCacheTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddressCacheTests.swift; sourceTree = "<group>"; };
@@ -3623,19 +3631,20 @@
36233631
852969262B4D9C1F007EAD4C /* MullvadVPNUITests */ = {
36243632
isa = PBXGroup;
36253633
children = (
3626-
85B267602B849ADB0098E3CD /* mullvad-api.h */,
36273634
852969272B4D9C1F007EAD4C /* AccountTests.swift */,
36283635
8556EB532B9A1D7100D26DD4 /* BridgingHeader.h */,
36293636
85557B112B594FC900795FE1 /* ConnectivityTests.swift */,
3637+
A9BFAFFE2BD004ED00F2BCA1 /* CustomListsTests.swift */,
36303638
852969372B4ED20E007EAD4C /* Info.plist */,
3639+
85B267602B849ADB0098E3CD /* mullvad-api.h */,
36313640
85557B0C2B591B0F00795FE1 /* Networking */,
36323641
852969312B4E9220007EAD4C /* Pages */,
36333642
850201DA2B503D7700EF8C96 /* RelayTests.swift */,
3643+
85D039972BA4711800940E7F /* SettingsMigrationTests.swift */,
3644+
85C7A2E82B89024B00035D5A /* SettingsTests.swift */,
36343645
8518F6392B601910009EB113 /* Test base classes */,
3635-
85557B152B5ABBBE00795FE1 /* XCUIElementQuery+Extensions.swift */,
36363646
85A42B852BB1D627007BABF7 /* XCUIElement+Extensions.swift */,
3637-
85C7A2E82B89024B00035D5A /* SettingsTests.swift */,
3638-
85D039972BA4711800940E7F /* SettingsMigrationTests.swift */,
3647+
85557B152B5ABBBE00795FE1 /* XCUIElementQuery+Extensions.swift */,
36393648
);
36403649
path = MullvadVPNUITests;
36413650
sourceTree = "<group>";
@@ -3647,9 +3656,12 @@
36473656
85557B1F2B5FBBD700795FE1 /* AccountPage.swift */,
36483657
8529693B2B4F0257007EAD4C /* Alert.swift */,
36493658
8587A05C2B84D43100152938 /* ChangeLogAlert.swift */,
3650-
852A26452BA9C9CB006EB9C8 /* DNSSettingsPage.swift */,
3659+
A9BFB0002BD00B7F00F2BCA1 /* CustomListPage.swift */,
36513660
85A42B872BB44D31007BABF7 /* DeviceManagementPage.swift */,
3661+
852A26452BA9C9CB006EB9C8 /* DNSSettingsPage.swift */,
3662+
A998DA822BD2B055001D61A2 /* EditCustomListLocationsPage.swift */,
36523663
85557B1D2B5FB8C700795FE1 /* HeaderBar.swift */,
3664+
A998DA802BD147AD001D61A2 /* ListCustomListsPage.swift */,
36533665
852969342B4E9270007EAD4C /* LoginPage.swift */,
36543666
85139B2C2B84B4A700734217 /* OutOfTimePage.swift */,
36553667
852969322B4E9232007EAD4C /* Page.swift */,
@@ -5639,6 +5651,7 @@
56395651
isa = PBXSourcesBuildPhase;
56405652
buildActionMask = 2147483647;
56415653
files = (
5654+
A9BFB0012BD00B7F00F2BCA1 /* CustomListPage.swift in Sources */,
56425655
8556EB522B9A1C6900D26DD4 /* MullvadApi.swift in Sources */,
56435656
85EC620C2B838D10005AFFB5 /* MullvadAPIWrapper.swift in Sources */,
56445657
A9DF789D2B7D1E8B0094E4AD /* LoggedInWithTimeUITestCase.swift in Sources */,
@@ -5655,7 +5668,9 @@
56555668
8590896F2B61763B003AF5F5 /* LoggedOutUITestCase.swift in Sources */,
56565669
85557B202B5FBBD700795FE1 /* AccountPage.swift in Sources */,
56575670
852969352B4E9270007EAD4C /* LoginPage.swift in Sources */,
5671+
A998DA832BD2B055001D61A2 /* EditCustomListLocationsPage.swift in Sources */,
56585672
8556EB562B9B0AC500D26DD4 /* RevokedDevicePage.swift in Sources */,
5673+
A9BFAFFF2BD004ED00F2BCA1 /* CustomListsTests.swift in Sources */,
56595674
85557B102B59215F00795FE1 /* FirewallRule.swift in Sources */,
56605675
85557B0E2B591B2600795FE1 /* FirewallAPIClient.swift in Sources */,
56615676
852969282B4D9C1F007EAD4C /* AccountTests.swift in Sources */,
@@ -5668,6 +5683,7 @@
56685683
8532E6872B8CCED600ACECD1 /* ProblemReportSubmittedPage.swift in Sources */,
56695684
85FB5A0C2B6903990015DCED /* WelcomePage.swift in Sources */,
56705685
852A26462BA9C9CB006EB9C8 /* DNSSettingsPage.swift in Sources */,
5686+
A998DA812BD147AD001D61A2 /* ListCustomListsPage.swift in Sources */,
56715687
850201DF2B5040A500EF8C96 /* TunnelControlPage.swift in Sources */,
56725688
8542CE242B95F7B9006FCA14 /* VPNSettingsPage.swift in Sources */,
56735689
85557B1E2B5FB8C700795FE1 /* HeaderBar.swift in Sources */,

ios/MullvadVPN/Classes/AccessbilityIdentifier.swift

+18-1
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,21 @@ public enum AccessibilityIdentifier: String {
3737
case restorePurchasesButton
3838
case secureConnectionButton
3939
case selectLocationButton
40+
case closeSelectLocationButton
4041
case settingsButton
4142
case startUsingTheAppButton
4243
case problemReportAppLogsButton
4344
case problemReportSendButton
4445
case relayStatusCollapseButton
4546
case settingsDoneButton
47+
case openCustomListsMenuButton
48+
case addNewCustomListButton
49+
case editCustomListButton
50+
case saveCreateCustomListButton
51+
case confirmDeleteCustomListButton
52+
case cancelDeleteCustomListButton
53+
case customListLocationCheckmarkButton
54+
case listCustomListDoneButton
4655

4756
// Cells
4857
case deviceCell
@@ -60,6 +69,9 @@ public enum AccessibilityIdentifier: String {
6069
case wireGuardObfuscationCell
6170
case udpOverTCPPortCell
6271
case quantumResistantTunnelCell
72+
case customListEditNameFieldCell
73+
case customListEditAddOrEditLocationCell
74+
case customListEditDeleteListCell
6375

6476
// Labels
6577
case accountPagePaidUntilLabel
@@ -71,7 +83,6 @@ public enum AccessibilityIdentifier: String {
7183

7284
// Views
7385
case accountView
74-
case addLocationsView
7586
case alertContainerView
7687
case alertTitle
7788
case changeLogAlert
@@ -91,6 +102,12 @@ public enum AccessibilityIdentifier: String {
91102
case welcomeView
92103
case deleteAccountView
93104
case settingsContainerView
105+
case newCustomListView
106+
case customListEditTableView
107+
case listCustomListsView
108+
case listCustomListsTableView
109+
case editCustomListEditLocationsView
110+
case editCustomListEditLocationsTableView
94111

95112
// Other UI elements
96113
case connectionPanelInAddressRow

ios/MullvadVPN/Coordinators/CustomLists/AddLocationsViewController.swift

+2-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class AddLocationsViewController: UIViewController {
2727
tableView.separatorInset = .zero
2828
tableView.rowHeight = 56
2929
tableView.indicatorStyle = .white
30-
tableView.accessibilityIdentifier = .addLocationsView
30+
tableView.accessibilityIdentifier = .editCustomListEditLocationsTableView
3131
return tableView
3232
}()
3333

@@ -46,6 +46,7 @@ class AddLocationsViewController: UIViewController {
4646

4747
override func viewDidLoad() {
4848
super.viewDidLoad()
49+
view.accessibilityIdentifier = .editCustomListEditLocationsView
4950
tableView.backgroundColor = view.backgroundColor
5051
view.backgroundColor = .secondaryColor
5152
addConstraints()

ios/MullvadVPN/Coordinators/CustomLists/CustomListCellConfiguration.swift

+3
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ struct CustomListCellConfiguration {
7878
contentConfiguration.maxLength = 30
7979
contentConfiguration.editingEvents.onChange = subject.bindTextAction(to: \.name)
8080

81+
cell.accessibilityIdentifier = AccessibilityIdentifier.customListEditNameFieldCell
8182
cell.contentConfiguration = contentConfiguration
8283
}
8384

@@ -86,6 +87,7 @@ struct CustomListCellConfiguration {
8687

8788
contentConfiguration.text = itemIdentifier.text
8889
cell.contentConfiguration = contentConfiguration
90+
cell.accessibilityIdentifier = AccessibilityIdentifier.customListEditAddOrEditLocationCell
8991

9092
if let cell = cell as? CustomCellDisclosureHandling {
9193
cell.disclosureType = .chevron
@@ -101,6 +103,7 @@ struct CustomListCellConfiguration {
101103
onDelete?()
102104
}
103105

106+
cell.accessibilityIdentifier = AccessibilityIdentifier.customListEditDeleteListCell
104107
cell.contentConfiguration = contentConfiguration
105108
}
106109
}

ios/MullvadVPN/Coordinators/CustomLists/CustomListViewController.swift

+6-1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class CustomListViewController: UIViewController {
5858
}
5959
)
6060
barButtonItem.style = .done
61+
barButtonItem.accessibilityIdentifier = AccessibilityIdentifier.saveCreateCustomListButton
6162

6263
return barButtonItem
6364
}()
@@ -86,6 +87,7 @@ class CustomListViewController: UIViewController {
8687
navigationItem.rightBarButtonItem = saveBarButton
8788
view.directionalLayoutMargins = UIMetrics.contentLayoutMargins
8889
view.backgroundColor = .secondaryColor
90+
view.accessibilityIdentifier = .newCustomListView
8991
isModalInPresentation = true
9092

9193
addSubviews()
@@ -102,6 +104,7 @@ class CustomListViewController: UIViewController {
102104
tableView.delegate = dataSourceConfiguration
103105
tableView.backgroundColor = .secondaryColor
104106
tableView.registerReusableViews(from: CustomListItemIdentifier.CellIdentifier.self)
107+
tableView.accessibilityIdentifier = AccessibilityIdentifier.customListEditTableView
105108
}
106109

107110
private func configureDataSource() {
@@ -180,6 +183,7 @@ class CustomListViewController: UIViewController {
180183
comment: ""
181184
),
182185
style: .destructive,
186+
accessibilityId: .confirmDeleteCustomListButton,
183187
handler: {
184188
self.interactor.delete(id: self.subject.value.id)
185189
self.delegate?.customListDidDelete(self.subject.value.customList)
@@ -192,7 +196,8 @@ class CustomListViewController: UIViewController {
192196
value: "Cancel",
193197
comment: ""
194198
),
195-
style: .default
199+
style: .default,
200+
accessibilityId: .cancelDeleteCustomListButton
196201
),
197202
]
198203
)

ios/MullvadVPN/Coordinators/CustomLists/ListCustomListViewController.swift

+4
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class ListCustomListViewController: UIViewController {
5050
super.viewDidLoad()
5151

5252
view.backgroundColor = .secondaryColor
53+
view.accessibilityIdentifier = .listCustomListsView
5354

5455
addSubviews()
5556
configureNavigationItem()
@@ -88,6 +89,7 @@ class ListCustomListViewController: UIViewController {
8889
tableView.separatorStyle = .singleLine
8990
tableView.rowHeight = UIMetrics.SettingsCell.customListsCellHeight
9091
tableView.registerReusableViews(from: CellReuseIdentifier.self)
92+
tableView.accessibilityIdentifier = .listCustomListsTableView
9193
}
9294

9395
private func configureNavigationItem() {
@@ -104,6 +106,8 @@ class ListCustomListViewController: UIViewController {
104106
self?.didFinish?()
105107
})
106108
)
109+
110+
navigationItem.rightBarButtonItem?.accessibilityIdentifier = .listCustomListDoneButton
107111
}
108112

109113
private func configureDataSource() {

ios/MullvadVPN/Coordinators/LocationCoordinator.swift

+5-2
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ extension LocationCoordinator: LocationViewControllerDelegate {
200200
actionSheet.overrideUserInterfaceStyle = .dark
201201
actionSheet.view.tintColor = UIColor(red: 0.0, green: 0.59, blue: 1.0, alpha: 1)
202202

203-
actionSheet.addAction(UIAlertAction(
203+
let addCustomListAction = UIAlertAction(
204204
title: NSLocalizedString(
205205
"CUSTOM_LIST_ACTION_SHEET_ADD_LIST_BUTTON",
206206
tableName: "CustomLists",
@@ -211,7 +211,9 @@ extension LocationCoordinator: LocationViewControllerDelegate {
211211
handler: { [weak self] _ in
212212
self?.showAddCustomList(nodes: nodes)
213213
}
214-
))
214+
)
215+
addCustomListAction.accessibilityIdentifier = AccessibilityIdentifier.addNewCustomListButton
216+
actionSheet.addAction(addCustomListAction)
215217
let editAction = UIAlertAction(
216218
title: NSLocalizedString(
217219
"CUSTOM_LIST_ACTION_SHEET_EDIT_LISTS_BUTTON",
@@ -225,6 +227,7 @@ extension LocationCoordinator: LocationViewControllerDelegate {
225227
}
226228
)
227229
editAction.isEnabled = !customListRepository.fetchAll().isEmpty
230+
editAction.accessibilityIdentifier = AccessibilityIdentifier.editCustomListButton
228231

229232
actionSheet.addAction(editAction)
230233

ios/MullvadVPN/View controllers/SelectLocation/LocationCell.swift

+1
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ extension LocationCell {
314314
locationLabel.text = item.node.name
315315
showsCollapseControl = !item.node.children.isEmpty
316316
isExpanded = item.node.showsChildren
317+
checkboxButton.accessibilityIdentifier = .customListLocationCheckmarkButton
317318
checkboxButton.isSelected = item.isSelected
318319
checkboxButton.tintColor = item.isSelected ? .successColor : .white
319320

ios/MullvadVPN/View controllers/SelectLocation/LocationSectionHeaderView.swift

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@ class LocationSectionHeaderView: UIView, UIContentView {
1616
} set {
1717
guard let newConfiguration = newValue as? Configuration,
1818
actualConfiguration != newConfiguration else { return }
19-
let previousConfiguration = actualConfiguration
2019
actualConfiguration = newConfiguration
21-
apply(configuration: previousConfiguration)
20+
apply(configuration: newConfiguration)
2221
}
2322
}
2423

@@ -66,7 +65,9 @@ class LocationSectionHeaderView: UIView, UIContentView {
6665
let isActionHidden = configuration.primaryAction == nil
6766
nameLabel.text = configuration.name
6867
actionButton.isHidden = isActionHidden
68+
actionButton.accessibilityIdentifier = nil
6969
actualConfiguration.primaryAction.flatMap { [weak self] action in
70+
self?.actionButton.accessibilityIdentifier = .openCustomListsMenuButton
7071
self?.actionButton.addAction(action, for: .touchUpInside)
7172
}
7273
}

ios/MullvadVPN/View controllers/SelectLocation/LocationViewController.swift

+1
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ final class LocationViewController: UIViewController {
8383
self?.didFinish?()
8484
})
8585
)
86+
navigationItem.rightBarButtonItem?.accessibilityIdentifier = .closeSelectLocationButton
8687

8788
setUpDataSources()
8889
setUpTableView()

0 commit comments

Comments
 (0)