Skip to content

Commit 6f75334

Browse files
Move iOS end to end tests to staging environment
1 parent afe5e5a commit 6f75334

File tree

55 files changed

+882
-202
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+882
-202
lines changed

.github/actions/ios-end-to-end-tests/action.yml

+34-4
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,22 @@ inputs:
1919
xcode_test_plan:
2020
description: 'Xcode Test Plan to run'
2121
required: true
22+
partner_api_token:
23+
description: 'Partner API Token'
24+
required: true
25+
test_name:
26+
description: 'Test case/suite name. Will run all tests in the test plan if not provided.'
27+
required: false
2228

2329
runs:
2430
using: 'composite'
2531
steps:
32+
- name: Make sure app is not installed
33+
run: ios-deploy --id $IOS_TEST_DEVICE_UDID --uninstall_only --bundle_id net.mullvad.MullvadVPN
34+
shell: bash
35+
env:
36+
IOS_TEST_DEVICE_UDID: ${{ inputs.test_device_udid }}
37+
2638
- name: Configure Xcode project
2739
run: |
2840
for file in *.xcconfig.template ; do cp $file ${file//.template/} ; done
@@ -34,26 +46,44 @@ runs:
3446
sed -i "" \
3547
"/TEST_DEVICE_IDENTIFIER_UUID =/ s/= .*/= $TEST_DEVICE_IDENTIFIER_UUID/" \
3648
UITests.xcconfig
37-
echo -e "\nHAS_TIME_ACCOUNT_NUMBER = $HAS_TIME_ACCOUNT_NUMBER" >> UITests.xcconfig
38-
echo "NO_TIME_ACCOUNT_NUMBER = $NO_TIME_ACCOUNT_NUMBER" >> UITests.xcconfig
49+
sed -i "" \
50+
"/PARTNER_API_TOKEN =/ s#= .*#= $PARTNER_API_TOKEN#" \
51+
UITests.xcconfig
52+
sed -i "" \
53+
"/ATTACH_APP_LOGS_ON_FAILURE =/ s#= .*#= 1#" \
54+
UITests.xcconfig
3955
shell: bash
4056
working-directory: ios/Configurations
4157
env:
4258
IOS_DEVICE_PIN_CODE: ${{ inputs.ios_device_pin_code }}
4359
TEST_DEVICE_IDENTIFIER_UUID: ${{ inputs.test_device_identifier_uuid }}
4460
HAS_TIME_ACCOUNT_NUMBER: ${{ inputs.has_time_account_number }}
4561
NO_TIME_ACCOUNT_NUMBER: ${{ inputs.no_time_account_number }}
62+
PARTNER_API_TOKEN: ${{ inputs.partner_api_token }}
4663

4764
- name: Run end-to-end-tests
4865
run: |
66+
if [ -n "$TEST_NAME" ]; then
67+
TEST_NAME_ARGUMENT=" -only-testing $TEST_NAME"
68+
else
69+
TEST_NAME_ARGUMENT=""
70+
fi
4971
set -o pipefail && env NSUnbufferedIO=YES xcodebuild \
5072
-project MullvadVPN.xcodeproj \
5173
-scheme MullvadVPNUITests \
52-
-testPlan $XCODE_TEST_PLAN \
74+
-testPlan $XCODE_TEST_PLAN $TEST_NAME_ARGUMENT \
75+
-resultBundlePath xcode-test-report \
5376
-destination "platform=iOS,id=$TEST_DEVICE_UDID" \
54-
clean test 2>&1 | xcbeautify --report junit --report-path test-report
77+
clean test 2>&1 | xcbeautify --report junit --report-path junit-test-report
5578
shell: bash
5679
working-directory: ios/
5780
env:
5881
XCODE_TEST_PLAN: ${{ inputs.xcode_test_plan }}
5982
TEST_DEVICE_UDID: ${{ inputs.test_device_udid }}
83+
TEST_NAME: ${{ inputs.test_name }}
84+
85+
- name: Uninstall app if still installed
86+
run: ios-deploy --id $IOS_TEST_DEVICE_UDID --uninstall_only --bundle_id net.mullvad.MullvadVPN
87+
shell: bash
88+
env:
89+
IOS_TEST_DEVICE_UDID: ${{ inputs.test_device_udid }}

.github/workflows/ios-end-to-end-tests-settings-migration.yml

+4
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ jobs:
4242
no_time_account_number: ${{ secrets.IOS_NO_TIME_ACCOUNT_NUMBER_PRODUCTION }}
4343
test_device_udid: ${{ secrets.IOS_TEST_DEVICE_UDID }}
4444
xcode_test_plan: 'MullvadVPNUITestsChangeDNSSettings'
45+
partner_api_token: ${{ secrets.STAGEMOLE_PARTNER_AUTH }}
4546

4647
- name: Store test report for changing DNS settings
4748
uses: actions/upload-artifact@v4
@@ -62,6 +63,7 @@ jobs:
6263
has_time_account_number: ${{ secrets.IOS_HAS_TIME_ACCOUNT_NUMBER_PRODUCTION }}
6364
no_time_account_number: ${{ secrets.IOS_NO_TIME_ACCOUNT_NUMBER_PRODUCTION }}
6465
test_device_udid: ${{ secrets.IOS_TEST_DEVICE_UDID }}
66+
partner_api_token: ${{ secrets.STAGEMOLE_PARTNER_AUTH }}
6567
xcode_test_plan: 'MullvadVPNUITestsVerifyDNSSettingsChanged'
6668

6769
- name: Store test report for verifying DNS settings
@@ -85,6 +87,7 @@ jobs:
8587
has_time_account_number: ${{ secrets.IOS_HAS_TIME_ACCOUNT_NUMBER_PRODUCTION }}
8688
no_time_account_number: ${{ secrets.IOS_NO_TIME_ACCOUNT_NUMBER_PRODUCTION }}
8789
test_device_udid: ${{ secrets.IOS_TEST_DEVICE_UDID }}
90+
partner_api_token: ${{ secrets.STAGEMOLE_PARTNER_AUTH }}
8891
xcode_test_plan: 'MullvadVPNUITestsChangeSettings'
8992

9093
- name: Store test report for changing all settings
@@ -106,6 +109,7 @@ jobs:
106109
has_time_account_number: ${{ secrets.IOS_HAS_TIME_ACCOUNT_NUMBER_PRODUCTION }}
107110
no_time_account_number: ${{ secrets.IOS_NO_TIME_ACCOUNT_NUMBER_PRODUCTION }}
108111
test_device_udid: ${{ secrets.IOS_TEST_DEVICE_UDID }}
112+
partner_api_token: ${{ secrets.STAGEMOLE_PARTNER_AUTH }}
109113
xcode_test_plan: 'MullvadVPNUITestsVerifySettingsChanged'
110114

111115
- name: Store test report for verifying all other settings

.github/workflows/ios-end-to-end-tests.yml

+20-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ on:
1414
- .github/workflows/ios-end-to-end-tests.yml
1515
- ios/**
1616
workflow_dispatch:
17+
inputs:
18+
# Optionally specify a test case or suite to run.
19+
# Must be in the format MullvadVPNUITest/<test-suite-name>/<test-case-name> where test case name is optional.
20+
test_name:
21+
description: 'Only run test case/suite'
22+
required: false
1723
schedule:
1824
# At midnight every day.
1925
# Notifications for scheduled workflows are sent to the user who last modified the cron
@@ -26,6 +32,7 @@ jobs:
2632
if: github.event.pull_request.merged || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule'
2733
name: End to end tests
2834
runs-on: [self-hosted, macOS, ios-test]
35+
timeout-minutes: 60
2936
steps:
3037
- name: Configure Rust
3138
uses: actions-rs/toolchain@v1
@@ -50,11 +57,13 @@ jobs:
5057
uses: ./.github/actions/ios-end-to-end-tests
5158
with:
5259
xcode_test_plan: ${{ env.XCODE_TEST_PLAN }}
60+
test_name: ${{ github.event.inputs.test_name }}
5361
ios_device_pin_code: ${{ secrets.IOS_DEVICE_PIN_CODE }}
5462
test_device_identifier_uuid: ${{ secrets.IOS_TEST_DEVICE_IDENTIFIER_UUID }}
5563
has_time_account_number: ${{ secrets.IOS_HAS_TIME_ACCOUNT_NUMBER_PRODUCTION }}
5664
no_time_account_number: ${{ secrets.IOS_NO_TIME_ACCOUNT_NUMBER_PRODUCTION }}
5765
test_device_udid: ${{ secrets.IOS_TEST_DEVICE_UDID }}
66+
partner_api_token: ${{ secrets.STAGEMOLE_PARTNER_AUTH }}
5867

5968
- name: Comment PR on test failure
6069
if: failure() && github.event_name == 'pull_request'
@@ -76,5 +85,14 @@ jobs:
7685
if: always()
7786
uses: actions/upload-artifact@v4
7887
with:
79-
name: test-report
80-
path: ios/test-report/junit.xml
88+
name: test-results
89+
path: |
90+
ios/junit-test-report/junit.xml
91+
ios/xcode-test-report.xcresult
92+
93+
- name: Store app log artifacts
94+
if: always()
95+
uses: actions/upload-artifact@v4
96+
with:
97+
name: app-logs
98+
path: ios/xcode-test-report/**/app-log-*.log

ios/Configurations/Api.xcconfig.template

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ API_HOST_NAME[config=Staging] = api.stagemole.eu
66
API_ENDPOINT[config=Debug] = 45.83.223.196:443
77
API_ENDPOINT[config=Release] = 45.83.223.196:443
88
API_ENDPOINT[config=MockRelease] = 45.83.223.196:443
9-
API_ENDPOINT[config=Staging] = 85.203.53.95:443
9+
API_ENDPOINT[config=Staging] = 185.217.116.129:443

ios/Configurations/UITests.xcconfig.template

+9-1
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ IOS_DEVICE_PIN_CODE =
66
// UUID to identify test runs. Should be unique per test device. Generate with for example uuidgen on macOS.
77
TEST_DEVICE_IDENTIFIER_UUID =
88

9+
// Base64 encoded token for the partner API. Will only be used if account numbers are not configured.
10+
PARTNER_API_TOKEN =
11+
912
// Mullvad accounts used by UI tests
1013
HAS_TIME_ACCOUNT_NUMBER[config=Debug] =
1114
HAS_TIME_ACCOUNT_NUMBER[config=Staging] =
12-
FIVE_WIREGUARD_KEYS_ACCOUNT_NUMBER =
1315

1416
// Ad serving domain used when testing ad blocking. Note that we are assuming there's an HTTP server running on the host.
1517
AD_SERVING_DOMAIN = vpnlist.to
@@ -19,3 +21,9 @@ SHOULD_BE_REACHABLE_DOMAIN = mullvad.net
1921

2022
// Base URL for the firewall API, Note that // will be treated as a comment, therefor you need to insert a ${} between the slashes for example http:/${}/8.8.8.8
2123
FIREWALL_API_BASE_URL = http:/${}/8.8.8.8
24+
25+
// URL for Mullvad provided JSON data with information about the connection. https://am.i.mullvad.net/json for production, https://am.i.stagemole.eu/json for staging.
26+
AM_I_JSON_URL = https:/${}/am.i.stagemole.eu/json
27+
28+
// Specify whether app logs should be extracted and attached to test report for failing tests
29+
ATTACH_APP_LOGS_ON_FAILURE = 0

ios/MullvadVPN.xcodeproj/project.pbxproj

+8
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,7 @@
620620
850201DB2B503D7700EF8C96 /* RelayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850201DA2B503D7700EF8C96 /* RelayTests.swift */; };
621621
850201DD2B503D8C00EF8C96 /* SelectLocationPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850201DC2B503D8C00EF8C96 /* SelectLocationPage.swift */; };
622622
850201DF2B5040A500EF8C96 /* TunnelControlPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850201DE2B5040A500EF8C96 /* TunnelControlPage.swift */; };
623+
85021CAE2BDBC4290098B400 /* AppLogsPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85021CAD2BDBC4290098B400 /* AppLogsPage.swift */; };
623624
85139B2D2B84B4A700734217 /* OutOfTimePage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85139B2C2B84B4A700734217 /* OutOfTimePage.swift */; };
624625
852969282B4D9C1F007EAD4C /* AccountTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852969272B4D9C1F007EAD4C /* AccountTests.swift */; };
625626
852969332B4E9232007EAD4C /* Page.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852969322B4E9232007EAD4C /* Page.swift */; };
@@ -647,6 +648,7 @@
647648
8556EB542B9A1D7100D26DD4 /* BridgingHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 8556EB532B9A1D7100D26DD4 /* BridgingHeader.h */; };
648649
8556EB562B9B0AC500D26DD4 /* RevokedDevicePage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8556EB552B9B0AC500D26DD4 /* RevokedDevicePage.swift */; };
649650
855D9F5B2B63E56B00D7C64D /* ProblemReportPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855D9F5A2B63E56B00D7C64D /* ProblemReportPage.swift */; };
651+
856952DC2BD2922A008C1F84 /* PartnerAPIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 856952DB2BD2922A008C1F84 /* PartnerAPIClient.swift */; };
650652
856952E22BD6B04C008C1F84 /* XCUIElement+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 856952E12BD6B04C008C1F84 /* XCUIElement+Extensions.swift */; };
651653
8585CBE32BC684180015B6A4 /* EditAccessMethodPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8585CBE22BC684180015B6A4 /* EditAccessMethodPage.swift */; };
652654
8587A05D2B84D43100152938 /* ChangeLogAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8587A05C2B84D43100152938 /* ChangeLogAlert.swift */; };
@@ -1950,6 +1952,7 @@
19501952
850201DC2B503D8C00EF8C96 /* SelectLocationPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectLocationPage.swift; sourceTree = "<group>"; };
19511953
850201DE2B5040A500EF8C96 /* TunnelControlPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelControlPage.swift; sourceTree = "<group>"; };
19521954
850201E22B51A93C00EF8C96 /* SettingsPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsPage.swift; sourceTree = "<group>"; };
1955+
85021CAD2BDBC4290098B400 /* AppLogsPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLogsPage.swift; sourceTree = "<group>"; };
19531956
85139B2C2B84B4A700734217 /* OutOfTimePage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutOfTimePage.swift; sourceTree = "<group>"; };
19541957
852969252B4D9C1F007EAD4C /* MullvadVPNUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MullvadVPNUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
19551958
852969272B4D9C1F007EAD4C /* AccountTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountTests.swift; sourceTree = "<group>"; };
@@ -1981,6 +1984,7 @@
19811984
8556EB532B9A1D7100D26DD4 /* BridgingHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BridgingHeader.h; sourceTree = "<group>"; };
19821985
8556EB552B9B0AC500D26DD4 /* RevokedDevicePage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RevokedDevicePage.swift; sourceTree = "<group>"; };
19831986
855D9F5A2B63E56B00D7C64D /* ProblemReportPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProblemReportPage.swift; sourceTree = "<group>"; };
1987+
856952DB2BD2922A008C1F84 /* PartnerAPIClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartnerAPIClient.swift; sourceTree = "<group>"; };
19841988
856952E12BD6B04C008C1F84 /* XCUIElement+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "XCUIElement+Extensions.swift"; sourceTree = "<group>"; };
19851989
8585CBE22BC684180015B6A4 /* EditAccessMethodPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditAccessMethodPage.swift; sourceTree = "<group>"; };
19861990
8587A05C2B84D43100152938 /* ChangeLogAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeLogAlert.swift; sourceTree = "<group>"; };
@@ -3928,6 +3932,7 @@
39283932
852D054C2BC3DE3A008578D2 /* APIAccessPage.swift */,
39293933
852D054E2BC43DF7008578D2 /* AddAccessMethodPage.swift */,
39303934
8585CBE22BC684180015B6A4 /* EditAccessMethodPage.swift */,
3935+
85021CAD2BDBC4290098B400 /* AppLogsPage.swift */,
39313936
);
39323937
path = Pages;
39333938
sourceTree = "<group>";
@@ -3939,6 +3944,7 @@
39393944
85557B0F2B59215F00795FE1 /* FirewallRule.swift */,
39403945
85557B132B5983CF00795FE1 /* MullvadAPIWrapper.swift */,
39413946
85E3BDE42B70E18C00FA71FD /* Networking.swift */,
3947+
856952DB2BD2922A008C1F84 /* PartnerAPIClient.swift */,
39423948
);
39433949
path = Networking;
39443950
sourceTree = "<group>";
@@ -6066,6 +6072,7 @@
60666072
8542F7532BCFBD050035C042 /* SelectLocationFilterPage.swift in Sources */,
60676073
850201DD2B503D8C00EF8C96 /* SelectLocationPage.swift in Sources */,
60686074
85D039982BA4711800940E7F /* SettingsMigrationTests.swift in Sources */,
6075+
85021CAE2BDBC4290098B400 /* AppLogsPage.swift in Sources */,
60696076
850201DB2B503D7700EF8C96 /* RelayTests.swift in Sources */,
60706077
852D054D2BC3DE3A008578D2 /* APIAccessPage.swift in Sources */,
60716078
85139B2D2B84B4A700734217 /* OutOfTimePage.swift in Sources */,
@@ -6084,6 +6091,7 @@
60846091
852969282B4D9C1F007EAD4C /* AccountTests.swift in Sources */,
60856092
8587A05D2B84D43100152938 /* ChangeLogAlert.swift in Sources */,
60866093
85FB5A102B6960A30015DCED /* AccountDeletionPage.swift in Sources */,
6094+
856952DC2BD2922A008C1F84 /* PartnerAPIClient.swift in Sources */,
60876095
85557B162B5ABBBE00795FE1 /* XCUIElementQuery+Extensions.swift in Sources */,
60886096
855D9F5B2B63E56B00D7C64D /* ProblemReportPage.swift in Sources */,
60896097
8529693A2B4F0238007EAD4C /* TermsOfServicePage.swift in Sources */,

ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/MullvadVPNUITests.xcscheme

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
buildImplicitDependencies = "YES">
88
</BuildAction>
99
<TestAction
10-
buildConfiguration = "Debug"
10+
buildConfiguration = "Staging"
1111
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
1212
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
1313
shouldUseLaunchSchemeArgsEnv = "YES">
@@ -46,7 +46,7 @@
4646
</Testables>
4747
</TestAction>
4848
<LaunchAction
49-
buildConfiguration = "Debug"
49+
buildConfiguration = "Staging"
5050
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
5151
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
5252
launchStyle = "0"

ios/MullvadVPN/Classes/AccessbilityIdentifier.swift

+10
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ public enum AccessibilityIdentifier: String {
1717
case accessMethodUnreachableSaveButton
1818
case agreeButton
1919
case alertOkButton
20+
case appLogsDoneButton
21+
case appLogsShareButton
2022
case applyButton
2123
case cancelButton
2224
case connectionPanelButton
@@ -57,6 +59,7 @@ public enum AccessibilityIdentifier: String {
5759
case customListLocationCheckmarkButton
5860
case listCustomListDoneButton
5961
case selectLocationFilterButton
62+
case relayFilterChipCloseButton
6063

6164
// Cells
6265
case deviceCell
@@ -97,9 +100,11 @@ public enum AccessibilityIdentifier: String {
97100
case addAccessMethodTestStatusUnreachableLabel
98101
case headerDeviceNameLabel
99102
case connectionStatusConnectedLabel
103+
case connectionStatusConnectingLabel
100104
case connectionStatusNotConnectedLabel
101105
case welcomeAccountNumberLabel
102106
case connectionPanelDetailLabel
107+
case relayFilterChipLabel
103108

104109
// Views
105110
case accessMethodProtocolPickerView
@@ -110,6 +115,7 @@ public enum AccessibilityIdentifier: String {
110115
case apiAccessView
111116
case alertContainerView
112117
case alertTitle
118+
case appLogsView
113119
case changeLogAlert
114120
case deviceManagementView
115121
case editAccessMethodView
@@ -135,6 +141,8 @@ public enum AccessibilityIdentifier: String {
135141
case listCustomListsTableView
136142
case editCustomListEditLocationsView
137143
case editCustomListEditLocationsTableView
144+
case relayFilterChipView
145+
case dnsSettingsTableView
138146

139147
// Other UI elements
140148
case accessMethodEnableSwitch
@@ -151,10 +159,12 @@ public enum AccessibilityIdentifier: String {
151159
case loginStatusIconSuccess
152160
case loginTextField
153161
case selectLocationSearchTextField
162+
case problemReportAppLogsTextView
154163
case problemReportEmailTextField
155164
case problemReportMessageTextView
156165
case deleteAccountTextField
157166
case socks5AuthenticationSwitch
167+
case statusImageView
158168

159169
// DNS settings
160170
case dnsSettings

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class SwitchCellContentView: UIView, UIContentView, UITextFieldDelegate {
7676
private func configureSwitch() {
7777
switchContainer.control.isOn = actualConfiguration.isOn
7878
switchContainer.transform = CGAffineTransform(scaleX: 0.85, y: 0.85)
79-
switchContainer.accessibilityIdentifier = accessibilityIdentifier
79+
switchContainer.accessibilityIdentifier = actualConfiguration.accessibilityIdentifier
8080
}
8181

8282
private func addSubviews() {

ios/MullvadVPN/Supporting Files/Info.plist

+5
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@
4242
<true/>
4343
<key>NSExceptionDomains</key>
4444
<dict>
45+
<key>185.217.116.129</key>
46+
<dict>
47+
<key>NSExceptionAllowsInsecureHTTPLoads</key>
48+
<true/>
49+
</dict>
4550
<key>127.0.0.1</key>
4651
<dict>
4752
<key>NSExceptionAllowsInsecureHTTPLoads</key>

ios/MullvadVPN/View controllers/ProblemReport/ProblemReportReviewViewController.swift

+5
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ class ProblemReportReviewViewController: UIViewController {
2424
override func viewDidLoad() {
2525
super.viewDidLoad()
2626

27+
view.accessibilityIdentifier = .appLogsView
28+
2729
navigationItem.title = NSLocalizedString(
2830
"NAVIGATION_TITLE",
2931
tableName: "ProblemReportReview",
@@ -37,6 +39,7 @@ class ProblemReportReviewViewController: UIViewController {
3739
self?.dismiss(animated: true)
3840
})
3941
)
42+
navigationItem.rightBarButtonItem?.accessibilityIdentifier = .appLogsDoneButton
4043

4144
#if DEBUG
4245
navigationItem.leftBarButtonItem = UIBarButtonItem(
@@ -45,8 +48,10 @@ class ProblemReportReviewViewController: UIViewController {
4548
self?.share()
4649
})
4750
)
51+
navigationItem.leftBarButtonItem?.accessibilityIdentifier = .appLogsShareButton
4852
#endif
4953

54+
textView.accessibilityIdentifier = .problemReportAppLogsTextView
5055
textView.translatesAutoresizingMaskIntoConstraints = false
5156
textView.text = reportString
5257
textView.isEditable = false

0 commit comments

Comments
 (0)