Skip to content

Commit

Permalink
Move iOS end to end tests to staging environment
Browse files Browse the repository at this point in the history
  • Loading branch information
niklasberglund committed Jun 10, 2024
1 parent e47cddf commit 64e3126
Show file tree
Hide file tree
Showing 54 changed files with 908 additions and 211 deletions.
38 changes: 34 additions & 4 deletions .github/actions/ios-end-to-end-tests/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,22 @@ inputs:
xcode_test_plan:
description: 'Xcode Test Plan to run'
required: true
partner_api_token:
description: 'Partner API Token'
required: true
test_name:
description: 'Test case/suite name. Will run all tests in the test plan if not provided.'
required: false

runs:
using: 'composite'
steps:
- name: Make sure app is not installed
run: ios-deploy --id $IOS_TEST_DEVICE_UDID --uninstall_only --bundle_id net.mullvad.MullvadVPN
shell: bash
env:
IOS_TEST_DEVICE_UDID: ${{ inputs.test_device_udid }}

- name: Configure Xcode project
run: |
for file in *.xcconfig.template ; do cp $file ${file//.template/} ; done
Expand All @@ -34,26 +46,44 @@ runs:
sed -i "" \
"/TEST_DEVICE_IDENTIFIER_UUID =/ s/= .*/= $TEST_DEVICE_IDENTIFIER_UUID/" \
UITests.xcconfig
echo -e "\nHAS_TIME_ACCOUNT_NUMBER = $HAS_TIME_ACCOUNT_NUMBER" >> UITests.xcconfig
echo "NO_TIME_ACCOUNT_NUMBER = $NO_TIME_ACCOUNT_NUMBER" >> UITests.xcconfig
sed -i "" \
"/PARTNER_API_TOKEN =/ s#= .*#= $PARTNER_API_TOKEN#" \
UITests.xcconfig
sed -i "" \
"/ATTACH_APP_LOGS_ON_FAILURE =/ s#= .*#= 1#" \
UITests.xcconfig
shell: bash
working-directory: ios/Configurations
env:
IOS_DEVICE_PIN_CODE: ${{ inputs.ios_device_pin_code }}
TEST_DEVICE_IDENTIFIER_UUID: ${{ inputs.test_device_identifier_uuid }}
HAS_TIME_ACCOUNT_NUMBER: ${{ inputs.has_time_account_number }}
NO_TIME_ACCOUNT_NUMBER: ${{ inputs.no_time_account_number }}
PARTNER_API_TOKEN: ${{ inputs.partner_api_token }}

- name: Run end-to-end-tests
run: |
if [ -n "$TEST_NAME" ]; then
TEST_NAME_ARGUMENT=" -only-testing $TEST_NAME"
else
TEST_NAME_ARGUMENT=""
fi
set -o pipefail && env NSUnbufferedIO=YES xcodebuild \
-project MullvadVPN.xcodeproj \
-scheme MullvadVPNUITests \
-testPlan $XCODE_TEST_PLAN \
-testPlan $XCODE_TEST_PLAN $TEST_NAME_ARGUMENT \
-resultBundlePath xcode-test-report \
-destination "platform=iOS,id=$TEST_DEVICE_UDID" \
clean test 2>&1 | xcbeautify --report junit --report-path test-report
clean test 2>&1 | xcbeautify --report junit --report-path junit-test-report
shell: bash
working-directory: ios/
env:
XCODE_TEST_PLAN: ${{ inputs.xcode_test_plan }}
TEST_DEVICE_UDID: ${{ inputs.test_device_udid }}
TEST_NAME: ${{ inputs.test_name }}

- name: Uninstall app if still installed
run: ios-deploy --id $IOS_TEST_DEVICE_UDID --uninstall_only --bundle_id net.mullvad.MullvadVPN
shell: bash
env:
IOS_TEST_DEVICE_UDID: ${{ inputs.test_device_udid }}
4 changes: 4 additions & 0 deletions .github/workflows/ios-end-to-end-tests-settings-migration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ jobs:
no_time_account_number: ${{ secrets.IOS_NO_TIME_ACCOUNT_NUMBER_PRODUCTION }}
test_device_udid: ${{ secrets.IOS_TEST_DEVICE_UDID }}
xcode_test_plan: 'MullvadVPNUITestsChangeDNSSettings'
partner_api_token: ${{ secrets.STAGEMOLE_PARTNER_AUTH }}

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

- name: Store test report for verifying DNS settings
Expand All @@ -85,6 +87,7 @@ jobs:
has_time_account_number: ${{ secrets.IOS_HAS_TIME_ACCOUNT_NUMBER_PRODUCTION }}
no_time_account_number: ${{ secrets.IOS_NO_TIME_ACCOUNT_NUMBER_PRODUCTION }}
test_device_udid: ${{ secrets.IOS_TEST_DEVICE_UDID }}
partner_api_token: ${{ secrets.STAGEMOLE_PARTNER_AUTH }}
xcode_test_plan: 'MullvadVPNUITestsChangeSettings'

- name: Store test report for changing all settings
Expand All @@ -106,6 +109,7 @@ jobs:
has_time_account_number: ${{ secrets.IOS_HAS_TIME_ACCOUNT_NUMBER_PRODUCTION }}
no_time_account_number: ${{ secrets.IOS_NO_TIME_ACCOUNT_NUMBER_PRODUCTION }}
test_device_udid: ${{ secrets.IOS_TEST_DEVICE_UDID }}
partner_api_token: ${{ secrets.STAGEMOLE_PARTNER_AUTH }}
xcode_test_plan: 'MullvadVPNUITestsVerifySettingsChanged'

- name: Store test report for verifying all other settings
Expand Down
22 changes: 20 additions & 2 deletions .github/workflows/ios-end-to-end-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ on:
- .github/workflows/ios-end-to-end-tests.yml
- ios/**
workflow_dispatch:
inputs:
# Optionally specify a test case or suite to run.
# Must be in the format MullvadVPNUITest/<test-suite-name>/<test-case-name> where test case name is optional.
test_name:
description: 'Only run test case/suite'
required: false
schedule:
# At midnight every day.
# Notifications for scheduled workflows are sent to the user who last modified the cron
Expand All @@ -26,6 +32,7 @@ jobs:
if: github.event.pull_request.merged || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule'
name: End to end tests
runs-on: [self-hosted, macOS, ios-test]
timeout-minutes: 60
steps:
- name: Configure Rust
uses: actions-rs/toolchain@v1
Expand All @@ -50,11 +57,13 @@ jobs:
uses: ./.github/actions/ios-end-to-end-tests
with:
xcode_test_plan: ${{ env.XCODE_TEST_PLAN }}
test_name: ${{ github.event.inputs.test_name }}
ios_device_pin_code: ${{ secrets.IOS_DEVICE_PIN_CODE }}
test_device_identifier_uuid: ${{ secrets.IOS_TEST_DEVICE_IDENTIFIER_UUID }}
has_time_account_number: ${{ secrets.IOS_HAS_TIME_ACCOUNT_NUMBER_PRODUCTION }}
no_time_account_number: ${{ secrets.IOS_NO_TIME_ACCOUNT_NUMBER_PRODUCTION }}
test_device_udid: ${{ secrets.IOS_TEST_DEVICE_UDID }}
partner_api_token: ${{ secrets.STAGEMOLE_PARTNER_AUTH }}

- name: Comment PR on test failure
if: failure() && github.event_name == 'pull_request'
Expand All @@ -76,5 +85,14 @@ jobs:
if: always()
uses: actions/upload-artifact@v4
with:
name: test-report
path: ios/test-report/junit.xml
name: test-results
path: |
ios/junit-test-report/junit.xml
ios/xcode-test-report.xcresult
- name: Store app log artifacts
if: always()
uses: actions/upload-artifact@v4
with:
name: app-logs
path: ios/xcode-test-report/**/app-log-*.log
2 changes: 1 addition & 1 deletion ios/Configurations/Api.xcconfig.template
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@ API_HOST_NAME[config=Staging] = api.$(HOST_NAME)
API_ENDPOINT[config=Debug] = 45.83.223.196:443
API_ENDPOINT[config=Release] = 45.83.223.196:443
API_ENDPOINT[config=MockRelease] = 45.83.223.196:443
API_ENDPOINT[config=Staging] = 85.203.53.95:443
API_ENDPOINT[config=Staging] = 185.217.116.129:443
10 changes: 9 additions & 1 deletion ios/Configurations/UITests.xcconfig.template
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@ IOS_DEVICE_PIN_CODE =
// UUID to identify test runs. Should be unique per test device. Generate with for example uuidgen on macOS.
TEST_DEVICE_IDENTIFIER_UUID =

// Base64 encoded token for the partner API. Will only be used if account numbers are not configured.
PARTNER_API_TOKEN =

// Mullvad accounts used by UI tests
HAS_TIME_ACCOUNT_NUMBER[config=Debug] =
HAS_TIME_ACCOUNT_NUMBER[config=Staging] =
FIVE_WIREGUARD_KEYS_ACCOUNT_NUMBER =

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

// 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
FIREWALL_API_BASE_URL = http:/${}/8.8.8.8

// 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.
AM_I_JSON_URL = https:/${}/am.i.stagemole.eu/json

// Specify whether app logs should be extracted and attached to test report for failing tests
ATTACH_APP_LOGS_ON_FAILURE = 0
13 changes: 13 additions & 0 deletions ios/MullvadVPN.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -620,6 +620,7 @@
850201DB2B503D7700EF8C96 /* RelayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850201DA2B503D7700EF8C96 /* RelayTests.swift */; };
850201DD2B503D8C00EF8C96 /* SelectLocationPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850201DC2B503D8C00EF8C96 /* SelectLocationPage.swift */; };
850201DF2B5040A500EF8C96 /* TunnelControlPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850201DE2B5040A500EF8C96 /* TunnelControlPage.swift */; };
85021CAE2BDBC4290098B400 /* AppLogsPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85021CAD2BDBC4290098B400 /* AppLogsPage.swift */; };
85139B2D2B84B4A700734217 /* OutOfTimePage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85139B2C2B84B4A700734217 /* OutOfTimePage.swift */; };
852969282B4D9C1F007EAD4C /* AccountTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852969272B4D9C1F007EAD4C /* AccountTests.swift */; };
852969332B4E9232007EAD4C /* Page.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852969322B4E9232007EAD4C /* Page.swift */; };
Expand Down Expand Up @@ -647,6 +648,7 @@
8556EB542B9A1D7100D26DD4 /* BridgingHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 8556EB532B9A1D7100D26DD4 /* BridgingHeader.h */; };
8556EB562B9B0AC500D26DD4 /* RevokedDevicePage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8556EB552B9B0AC500D26DD4 /* RevokedDevicePage.swift */; };
855D9F5B2B63E56B00D7C64D /* ProblemReportPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855D9F5A2B63E56B00D7C64D /* ProblemReportPage.swift */; };
856952DC2BD2922A008C1F84 /* PartnerAPIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 856952DB2BD2922A008C1F84 /* PartnerAPIClient.swift */; };
856952E22BD6B04C008C1F84 /* XCUIElement+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 856952E12BD6B04C008C1F84 /* XCUIElement+Extensions.swift */; };
8585CBE32BC684180015B6A4 /* EditAccessMethodPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8585CBE22BC684180015B6A4 /* EditAccessMethodPage.swift */; };
8587A05D2B84D43100152938 /* ChangeLogAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8587A05C2B84D43100152938 /* ChangeLogAlert.swift */; };
Expand Down Expand Up @@ -1953,6 +1955,7 @@
850201DC2B503D8C00EF8C96 /* SelectLocationPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectLocationPage.swift; sourceTree = "<group>"; };
850201DE2B5040A500EF8C96 /* TunnelControlPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelControlPage.swift; sourceTree = "<group>"; };
850201E22B51A93C00EF8C96 /* SettingsPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsPage.swift; sourceTree = "<group>"; };
85021CAD2BDBC4290098B400 /* AppLogsPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLogsPage.swift; sourceTree = "<group>"; };
85139B2C2B84B4A700734217 /* OutOfTimePage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutOfTimePage.swift; sourceTree = "<group>"; };
852969252B4D9C1F007EAD4C /* MullvadVPNUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MullvadVPNUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
852969272B4D9C1F007EAD4C /* AccountTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountTests.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1984,6 +1987,7 @@
8556EB532B9A1D7100D26DD4 /* BridgingHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BridgingHeader.h; sourceTree = "<group>"; };
8556EB552B9B0AC500D26DD4 /* RevokedDevicePage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RevokedDevicePage.swift; sourceTree = "<group>"; };
855D9F5A2B63E56B00D7C64D /* ProblemReportPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProblemReportPage.swift; sourceTree = "<group>"; };
856952DB2BD2922A008C1F84 /* PartnerAPIClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartnerAPIClient.swift; sourceTree = "<group>"; };
856952E12BD6B04C008C1F84 /* XCUIElement+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "XCUIElement+Extensions.swift"; sourceTree = "<group>"; };
8585CBE22BC684180015B6A4 /* EditAccessMethodPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditAccessMethodPage.swift; sourceTree = "<group>"; };
8587A05C2B84D43100152938 /* ChangeLogAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeLogAlert.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -3911,6 +3915,7 @@
850201DA2B503D7700EF8C96 /* RelayTests.swift */,
85D039972BA4711800940E7F /* SettingsMigrationTests.swift */,
85C7A2E82B89024B00035D5A /* SettingsTests.swift */,
8518F6392B601910009EB113 /* Test base classes */,
856952E12BD6B04C008C1F84 /* XCUIElement+Extensions.swift */,
85557B152B5ABBBE00795FE1 /* XCUIElementQuery+Extensions.swift */,
);
Expand Down Expand Up @@ -3947,6 +3952,11 @@
850201DE2B5040A500EF8C96 /* TunnelControlPage.swift */,
8542CE232B95F7B9006FCA14 /* VPNSettingsPage.swift */,
85FB5A0B2B6903990015DCED /* WelcomePage.swift */,
8542F7522BCFBD050035C042 /* SelectLocationFilterPage.swift */,
852D054C2BC3DE3A008578D2 /* APIAccessPage.swift */,
852D054E2BC43DF7008578D2 /* AddAccessMethodPage.swift */,
8585CBE22BC684180015B6A4 /* EditAccessMethodPage.swift */,
85021CAD2BDBC4290098B400 /* AppLogsPage.swift */,
);
path = Pages;
sourceTree = "<group>";
Expand All @@ -3958,6 +3968,7 @@
85557B0F2B59215F00795FE1 /* FirewallRule.swift */,
85557B132B5983CF00795FE1 /* MullvadAPIWrapper.swift */,
85E3BDE42B70E18C00FA71FD /* Networking.swift */,
856952DB2BD2922A008C1F84 /* PartnerAPIClient.swift */,
);
path = Networking;
sourceTree = "<group>";
Expand Down Expand Up @@ -6070,6 +6081,7 @@
8542F7532BCFBD050035C042 /* SelectLocationFilterPage.swift in Sources */,
850201DD2B503D8C00EF8C96 /* SelectLocationPage.swift in Sources */,
85D039982BA4711800940E7F /* SettingsMigrationTests.swift in Sources */,
85021CAE2BDBC4290098B400 /* AppLogsPage.swift in Sources */,
850201DB2B503D7700EF8C96 /* RelayTests.swift in Sources */,
7A45CFC62C05FF6A00D80B21 /* ScreenshotTests.swift in Sources */,
852D054D2BC3DE3A008578D2 /* APIAccessPage.swift in Sources */,
Expand All @@ -6091,6 +6103,7 @@
8587A05D2B84D43100152938 /* ChangeLogAlert.swift in Sources */,
85FB5A102B6960A30015DCED /* AccountDeletionPage.swift in Sources */,
7A45CFC72C071DD400D80B21 /* SnapshotHelper.swift in Sources */,
856952DC2BD2922A008C1F84 /* PartnerAPIClient.swift in Sources */,
85557B162B5ABBBE00795FE1 /* XCUIElementQuery+Extensions.swift in Sources */,
855D9F5B2B63E56B00D7C64D /* ProblemReportPage.swift in Sources */,
8529693A2B4F0238007EAD4C /* TermsOfServicePage.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
buildImplicitDependencies = "YES">
</BuildAction>
<TestAction
buildConfiguration = "Debug"
buildConfiguration = "Staging"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
Expand Down Expand Up @@ -46,7 +46,7 @@
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
buildConfiguration = "Staging"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
Expand Down
10 changes: 10 additions & 0 deletions ios/MullvadVPN/Classes/AccessbilityIdentifier.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ public enum AccessibilityIdentifier: String {
case accessMethodUnreachableSaveButton
case agreeButton
case alertOkButton
case appLogsDoneButton
case appLogsShareButton
case applyButton
case cancelButton
case connectionPanelButton
Expand Down Expand Up @@ -57,6 +59,7 @@ public enum AccessibilityIdentifier: String {
case customListLocationCheckmarkButton
case listCustomListDoneButton
case selectLocationFilterButton
case relayFilterChipCloseButton

// Cells
case deviceCell
Expand Down Expand Up @@ -97,9 +100,11 @@ public enum AccessibilityIdentifier: String {
case addAccessMethodTestStatusUnreachableLabel
case headerDeviceNameLabel
case connectionStatusConnectedLabel
case connectionStatusConnectingLabel
case connectionStatusNotConnectedLabel
case welcomeAccountNumberLabel
case connectionPanelDetailLabel
case relayFilterChipLabel

// Views
case accessMethodProtocolPickerView
Expand All @@ -110,6 +115,7 @@ public enum AccessibilityIdentifier: String {
case apiAccessView
case alertContainerView
case alertTitle
case appLogsView
case changeLogAlert
case deviceManagementView
case editAccessMethodView
Expand All @@ -135,6 +141,8 @@ public enum AccessibilityIdentifier: String {
case listCustomListsTableView
case editCustomListEditLocationsView
case editCustomListEditLocationsTableView
case relayFilterChipView
case dnsSettingsTableView

// Other UI elements
case accessMethodEnableSwitch
Expand All @@ -151,10 +159,12 @@ public enum AccessibilityIdentifier: String {
case loginStatusIconSuccess
case loginTextField
case selectLocationSearchTextField
case problemReportAppLogsTextView
case problemReportEmailTextField
case problemReportMessageTextView
case deleteAccountTextField
case socks5AuthenticationSwitch
case statusImageView

// DNS settings
case dnsSettings
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ class SwitchCellContentView: UIView, UIContentView, UITextFieldDelegate {
private func configureSwitch() {
switchContainer.control.isOn = actualConfiguration.isOn
switchContainer.transform = CGAffineTransform(scaleX: 0.85, y: 0.85)
switchContainer.accessibilityIdentifier = accessibilityIdentifier
switchContainer.accessibilityIdentifier = actualConfiguration.accessibilityIdentifier
}

private func addSubviews() {
Expand Down
5 changes: 5 additions & 0 deletions ios/MullvadVPN/Supporting Files/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>185.217.116.129</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
<key>127.0.0.1</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ class ProblemReportReviewViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()

view.accessibilityIdentifier = .appLogsView

navigationItem.title = NSLocalizedString(
"NAVIGATION_TITLE",
tableName: "ProblemReportReview",
Expand All @@ -37,6 +39,7 @@ class ProblemReportReviewViewController: UIViewController {
self?.dismiss(animated: true)
})
)
navigationItem.rightBarButtonItem?.accessibilityIdentifier = .appLogsDoneButton

#if DEBUG
navigationItem.leftBarButtonItem = UIBarButtonItem(
Expand All @@ -45,8 +48,10 @@ class ProblemReportReviewViewController: UIViewController {
self?.share()
})
)
navigationItem.leftBarButtonItem?.accessibilityIdentifier = .appLogsShareButton
#endif

textView.accessibilityIdentifier = .problemReportAppLogsTextView
textView.translatesAutoresizingMaskIntoConstraints = false
textView.isEditable = false
textView.font = UIFont.monospacedSystemFont(
Expand Down
Loading

0 comments on commit 64e3126

Please sign in to comment.