Refactor FXIOS-12796 [Swift 6 Migration] Fix main actor isolation warnings that are Swift 6 errors in the XCUITests suite - Batch 2#15
Refactor FXIOS-12796 [Swift 6 Migration] Fix main actor isolation warnings that are Swift 6 errors in the XCUITests suite - Batch 2#15
Conversation
WalkthroughThe pull request converts XCTest lifecycle methods across the UI test suite from synchronous to asynchronous throwing variants and applies Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (1)
139-142: Compile error: calling async methods from synchronous context.
forceRestartApp()callstearDown()andsetUp()which areasync throws, butforceRestartApp()itself is synchronous. This will fail to compile.Proposed fix
- func forceRestartApp() { - tearDown() - setUp() + func forceRestartApp() async throws { + try await tearDown() + try await setUp() }Call sites at
BookmarksTests.swift:401andAuthenticationTest.swift:52will also need to be updated totry await forceRestartApp().
🤖 Fix all issues with AI agents
In `@firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift`:
- Around line 508-513: The override of setUp() in BaseTestCase calls the
throwing async superclass method without handling errors; change the call inside
the iPad() check to use try await when invoking super.setUp() (i.e., call try
await super.setUp()) so the async throws contract is satisfied and the code
compiles.
In `@firefox-ios/firefox-ios-tests/Tests/XCUITests/FeatureFlaggedTestBase.swift`:
- Around line 46-52: The setup order is wrong: setUpApp() calls
addLaunchArgument(jsonFileName:featureName:) which force-unwraps jsonFileName
and featureName before they are initialized; move the call to
setUpExperimentVariables() to run before setUpApp() in override func setUp()
async throws so jsonFileName and featureName are initialized prior to
addLaunchArgument(...) being invoked; verify setUpExperimentVariables(),
setUpApp(), addLaunchArgument(jsonFileName:featureName:), and the variables
jsonFileName/featureName are referenced correctly after the change.
In `@firefox-ios/firefox-ios-tests/Tests/XCUITests/FxScreenGraph.swift`:
- Around line 132-151: The three functions navigationControllerBackAction(for:),
cancelBackAction(for:), and dismissContextMenuAction(app:) are `@MainActor` but
return unannotated () -> Void closures that can be invoked off-main and trigger
strict-concurrency warnings; update their signatures to return `@MainActor` () ->
Void so the returned closures inherit main-actor isolation (e.g., change the
return type of navigationControllerBackAction, cancelBackAction, and
dismissContextMenuAction to `@MainActor` () -> Void) and keep the existing closure
bodies that call app.waitAndTap()/tap()/coordinate().
In
`@firefox-ios/firefox-ios-tests/Tests/XCUITests/registerSettingsNavigation.swift`:
- Around line 8-9: The SwiftLint disable directive is placed as a trailing
comment after the `@MainActor` attribute so it isn't applied to
registerSettingsNavigation; move the directive `// swiftlint:disable:next
function_body_length` onto its own line directly between the `@MainActor`
attribute and the `func registerSettingsNavigation(in map:
MMScreenGraph<FxUserState>, app: XCUIApplication)` declaration so SwiftLint
recognizes and suppresses the function_body_length rule for that function.
🧹 Nitpick comments (2)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BrowsingPDFTests.swift (1)
25-25: Stale comment detected.Line 25 contains a comment about parsing the test name (
"Test name looks like: ..."), but unlike other files with this comment (e.g.,HistoryTests,ActivityStreamTest), there's no corresponding test-name parsing logic here. This appears to be a leftover from a copy-paste.🧹 Suggested cleanup
override func setUp() async throws { - // Test name looks like: "[Class testFunc]", parse out the function name try await super.setUp()firefox-ios/firefox-ios-tests/Tests/XCUITests/PerformanceTests.swift (1)
38-40: Avoid double lookup and force unwrap when selecting fixtures.
Line 38-40 can be simplified to a single lookup, improving clarity and removing the!even though the guard is currently safe.♻️ Suggested refactor
- if fixtures.keys.contains(functionName) { - launchArguments.append(LaunchArguments.LoadTabsStateArchive + fixtures[functionName]!) - launchArguments.append(LaunchArguments.LoadDatabasePrefix + fixtures[functionName]!) - } + if let fixture = fixtures[functionName] { + launchArguments.append(LaunchArguments.LoadTabsStateArchive + fixture) + launchArguments.append(LaunchArguments.LoadDatabasePrefix + fixture) + }
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (51)
firefox-ios/firefox-ios-tests/Tests/XCUITests/A11yOnboardingTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/A11yUtils.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/ActivityStreamTest.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/BookmarksTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/BrowsingPDFTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/C_AddressesTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/CookiePersistenceTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/DatabaseFixtureTest.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/DesktopModeTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/DisplaySettingsTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/DomainAutocompleteTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/DragAndDropTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/EngagementNotificationTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/FeatureFlaggedTestBase.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/FxScreenGraph.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/HistoryTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/HomePageSettingsUITest.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/InactiveTabsTest.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/IntegrationTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/LoginsTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/MicrosurveyTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/MultiWindowTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/NavigationRegistry.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/OnboardingTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/PerformanceTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/PhotonActionSheetTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/PrivateBrowsingTest.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/ReadingListTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/ScreenGraphTest.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/TabsTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/TodayWidgetTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/ToolbarTest.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/URLValidationTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/ZoomingTests.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/registerCommonNavigation.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/registerContextMenuNavigation.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/registerFxAccountNavigation.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/registerHomePanelNavigation.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/registerLibraryPanelNavigation.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/registerMiscellanousActions.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/registerMiscellanousNavigation.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/registerMobileNavigation.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/registerOnboardingNavigation.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/registerSettingsNavigation.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/registerTabMenuNavigation.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/registerTabTrayNavigation.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/registerToolbarNavigation.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/registerTrackingProtection.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/registerUrlBarNavigation.swiftfirefox-ios/firefox-ios-tests/Tests/XCUITests/registerZoomNavigation.swift
🧰 Additional context used
🧬 Code graph analysis (20)
firefox-ios/firefox-ios-tests/Tests/XCUITests/ToolbarTest.swift (5)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (4)
setUp(112-117)setUp(508-513)setUp(517-522)tearDown(119-122)firefox-ios/firefox-ios-tests/Tests/XCUITests/PrivateBrowsingTest.swift (1)
setUp(301-306)firefox-ios/firefox-ios-tests/Tests/XCUITests/A11yOnboardingTests.swift (1)
tearDown(22-25)firefox-ios/firefox-ios-tests/Tests/XCUITests/OnboardingTests.swift (1)
tearDown(27-33)firefox-ios/firefox-ios-tests/Tests/XCUITests/SettingsTests.swift (1)
tearDown(10-19)
firefox-ios/firefox-ios-tests/Tests/XCUITests/HomePageSettingsUITest.swift (4)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (3)
setUp(112-117)setUp(508-513)setUp(517-522)firefox-ios/firefox-ios-tests/Tests/XCUITests/DesktopModeTests.swift (1)
setUp(96-104)firefox-ios/firefox-ios-tests/Tests/XCUITests/LoginsTests.swift (1)
setUp(36-52)firefox-ios/firefox-ios-tests/Tests/XCUITests/TabsTests.swift (1)
setUp(635-644)
firefox-ios/firefox-ios-tests/Tests/XCUITests/ReadingListTests.swift (11)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (3)
setUp(112-117)setUp(508-513)setUp(517-522)firefox-ios/firefox-ios-tests/Tests/XCUITests/ActivityStreamTest.swift (1)
setUp(31-51)firefox-ios/firefox-ios-tests/Tests/XCUITests/BookmarksTests.swift (1)
setUp(21-29)firefox-ios/firefox-ios-tests/Tests/XCUITests/DesktopModeTests.swift (1)
setUp(96-104)firefox-ios/firefox-ios-tests/Tests/XCUITests/DragAndDropTests.swift (1)
setUp(294-308)firefox-ios/firefox-ios-tests/Tests/XCUITests/HistoryTests.swift (1)
setUp(46-65)firefox-ios/firefox-ios-tests/Tests/XCUITests/HomePageSettingsUITest.swift (1)
setUp(25-39)firefox-ios/firefox-ios-tests/Tests/XCUITests/LoginsTests.swift (1)
setUp(36-52)firefox-ios/firefox-ios-tests/Tests/XCUITests/OnboardingTests.swift (1)
setUp(16-25)firefox-ios/firefox-ios-tests/Tests/XCUITests/PrivateBrowsingTest.swift (1)
setUp(301-306)firefox-ios/firefox-ios-tests/Tests/XCUITests/TabsTests.swift (1)
setUp(635-644)
firefox-ios/firefox-ios-tests/Tests/XCUITests/CookiePersistenceTests.swift (1)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (3)
setUp(112-117)setUp(508-513)setUp(517-522)
firefox-ios/firefox-ios-tests/Tests/XCUITests/PrivateBrowsingTest.swift (3)
firefox-ios/firefox-ios-tests/Tests/XCUITests/DesktopModeTests.swift (1)
setUp(96-104)firefox-ios/firefox-ios-tests/Tests/XCUITests/TabsTests.swift (1)
setUp(635-644)firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (1)
iPad(357-362)
firefox-ios/firefox-ios-tests/Tests/XCUITests/InactiveTabsTest.swift (4)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (2)
setUp(112-117)setUp(508-513)firefox-ios/firefox-ios-tests/Tests/XCUITests/PrivateBrowsingTest.swift (1)
setUp(301-306)firefox-ios/firefox-ios-tests/Tests/XCUITests/TabsTests.swift (1)
setUp(635-644)firefox-ios/firefox-ios-tests/Tests/XCUITests/ZoomingTests.swift (1)
setUp(10-16)
firefox-ios/firefox-ios-tests/Tests/XCUITests/EngagementNotificationTests.swift (3)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (4)
setUp(112-117)setUp(508-513)setUp(517-522)removeApp(72-85)firefox-ios/firefox-ios-tests/Tests/XCUITests/CookiePersistenceTests.swift (1)
setUp(11-20)firefox-ios/firefox-ios-tests/Tests/XCUITests/DisplaySettingsTests.swift (1)
setUp(8-18)
firefox-ios/firefox-ios-tests/Tests/XCUITests/TabsTests.swift (10)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (4)
setUp(112-117)setUp(508-513)setUp(517-522)iPad(357-362)firefox-ios/firefox-ios-tests/Tests/XCUITests/ActivityStreamTest.swift (1)
setUp(31-51)firefox-ios/firefox-ios-tests/Tests/XCUITests/BrowsingPDFTests.swift (1)
setUp(24-32)firefox-ios/firefox-ios-tests/Tests/XCUITests/DesktopModeTests.swift (1)
setUp(96-104)firefox-ios/firefox-ios-tests/Tests/XCUITests/HistoryTests.swift (1)
setUp(46-65)firefox-ios/firefox-ios-tests/Tests/XCUITests/InactiveTabsTest.swift (1)
setUp(9-29)firefox-ios/firefox-ios-tests/Tests/XCUITests/PrivateBrowsingTest.swift (1)
setUp(301-306)firefox-ios/firefox-ios-tests/Tests/XCUITests/ReadingListTests.swift (1)
setUp(13-18)firefox-ios/firefox-ios-tests/Tests/XCUITests/ToolbarTest.swift (1)
setUp(16-19)firefox-ios/firefox-ios-tests/Tests/XCUITests/ZoomingTests.swift (1)
setUp(10-16)
firefox-ios/firefox-ios-tests/Tests/XCUITests/PerformanceTests.swift (10)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (3)
setUp(112-117)setUp(508-513)setUp(517-522)firefox-ios/firefox-ios-tests/Tests/XCUITests/ScreenGraphTest.swift (1)
setUp(34-47)firefox-ios/firefox-ios-tests/Tests/XCUITests/A11yOnboardingTests.swift (1)
setUp(14-20)firefox-ios/firefox-ios-tests/Tests/XCUITests/ActivityStreamTest.swift (1)
setUp(31-51)firefox-ios/firefox-ios-tests/Tests/XCUITests/C_AddressesTests.swift (1)
setUp(16-36)firefox-ios/firefox-ios-tests/Tests/XCUITests/CookiePersistenceTests.swift (1)
setUp(11-20)firefox-ios/firefox-ios-tests/Tests/XCUITests/DatabaseFixtureTest.swift (1)
setUp(14-25)firefox-ios/firefox-ios-tests/Tests/XCUITests/DisplaySettingsTests.swift (1)
setUp(8-18)firefox-ios/firefox-ios-tests/Tests/XCUITests/DomainAutocompleteTests.swift (1)
setUp(31-45)firefox-ios/firefox-ios-tests/Tests/XCUITests/DragAndDropTests.swift (1)
setUp(294-308)
firefox-ios/firefox-ios-tests/Tests/XCUITests/OnboardingTests.swift (12)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (4)
setUp(112-117)setUp(508-513)setUp(517-522)tearDown(119-122)firefox-ios/firefox-ios-tests/Tests/XCUITests/ScreenGraphTest.swift (1)
setUp(34-47)firefox-ios/firefox-ios-tests/Tests/XCUITests/A11yOnboardingTests.swift (2)
setUp(14-20)tearDown(22-25)firefox-ios/firefox-ios-tests/Tests/XCUITests/ActivityStreamTest.swift (2)
setUp(31-51)tearDown(53-56)firefox-ios/firefox-ios-tests/Tests/XCUITests/BrowsingPDFTests.swift (1)
setUp(24-32)firefox-ios/firefox-ios-tests/Tests/XCUITests/CookiePersistenceTests.swift (1)
setUp(11-20)firefox-ios/firefox-ios-tests/Tests/XCUITests/DesktopModeTests.swift (1)
setUp(96-104)firefox-ios/firefox-ios-tests/Tests/XCUITests/DisplaySettingsTests.swift (1)
setUp(8-18)firefox-ios/firefox-ios-tests/Tests/XCUITests/ReadingListTests.swift (1)
setUp(13-18)firefox-ios/firefox-ios-tests/Tests/XCUITests/ToolbarTest.swift (1)
tearDown(21-24)firefox-ios/firefox-ios-tests/Tests/XCUITests/ZoomingTests.swift (1)
tearDown(18-21)firefox-ios/firefox-ios-tests/Tests/ClientTests/Coordinators/BrowserCoordinatorTests.swift (1)
tearDown(47-60)
firefox-ios/firefox-ios-tests/Tests/XCUITests/A11yOnboardingTests.swift (5)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (4)
setUp(112-117)setUp(508-513)setUp(517-522)tearDown(119-122)firefox-ios/firefox-ios-tests/Tests/XCUITests/BrowsingPDFTests.swift (1)
setUp(24-32)firefox-ios/firefox-ios-tests/Tests/XCUITests/DisplaySettingsTests.swift (1)
setUp(8-18)firefox-ios/firefox-ios-tests/Tests/XCUITests/DragAndDropTests.swift (3)
setUp(294-308)tearDown(28-31)tearDown(310-313)firefox-ios/firefox-ios-tests/Tests/XCUITests/OnboardingTests.swift (1)
tearDown(27-33)
firefox-ios/firefox-ios-tests/Tests/XCUITests/HistoryTests.swift (3)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (3)
setUp(112-117)setUp(508-513)setUp(517-522)firefox-ios/firefox-ios-tests/Tests/XCUITests/BrowsingPDFTests.swift (1)
setUp(24-32)firefox-ios/firefox-ios-tests/Tests/XCUITests/ReadingListTests.swift (1)
setUp(13-18)
firefox-ios/firefox-ios-tests/Tests/XCUITests/PhotonActionSheetTests.swift (4)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (3)
setUp(112-117)setUp(508-513)setUp(517-522)firefox-ios/firefox-ios-tests/Tests/XCUITests/HomePageSettingsUITest.swift (1)
setUp(25-39)firefox-ios/firefox-ios-tests/Tests/XCUITests/ReadingListTests.swift (1)
setUp(13-18)firefox-ios/firefox-ios-tests/Tests/XCUITests/TabsTests.swift (1)
setUp(635-644)
firefox-ios/firefox-ios-tests/Tests/XCUITests/ScreenGraphTest.swift (3)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (3)
setUp(112-117)setUp(508-513)setUp(517-522)firefox-ios/firefox-ios-tests/Tests/XCUITests/CookiePersistenceTests.swift (1)
setUp(11-20)firefox-ios/firefox-ios-tests/Tests/XCUITests/ZoomingTests.swift (1)
setUp(10-16)
firefox-ios/firefox-ios-tests/Tests/XCUITests/LoginsTests.swift (4)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (3)
setUp(112-117)setUp(508-513)setUp(517-522)firefox-ios/firefox-ios-tests/Tests/XCUITests/DisplaySettingsTests.swift (1)
setUp(8-18)firefox-ios/firefox-ios-tests/Tests/XCUITests/InactiveTabsTest.swift (1)
setUp(9-29)firefox-ios/firefox-ios-tests/Tests/XCUITests/PrivateBrowsingTest.swift (1)
setUp(301-306)
firefox-ios/firefox-ios-tests/Tests/XCUITests/FxScreenGraph.swift (1)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (2)
waitAndTap(626-629)tap(532-541)
firefox-ios/firefox-ios-tests/Tests/XCUITests/URLValidationTests.swift (6)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (3)
setUp(112-117)setUp(508-513)setUp(517-522)firefox-ios/firefox-ios-tests/Tests/XCUITests/BrowsingPDFTests.swift (1)
setUp(24-32)firefox-ios/firefox-ios-tests/Tests/XCUITests/DesktopModeTests.swift (1)
setUp(96-104)firefox-ios/firefox-ios-tests/Tests/XCUITests/DomainAutocompleteTests.swift (1)
setUp(31-45)firefox-ios/firefox-ios-tests/Tests/XCUITests/HomePageSettingsUITest.swift (1)
setUp(25-39)firefox-ios/firefox-ios-tests/Tests/XCUITests/PrivateBrowsingTest.swift (1)
setUp(301-306)
firefox-ios/firefox-ios-tests/Tests/XCUITests/DesktopModeTests.swift (3)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (4)
setUp(112-117)setUp(508-513)setUp(517-522)iPad(357-362)firefox-ios/firefox-ios-tests/Tests/XCUITests/PrivateBrowsingTest.swift (1)
setUp(301-306)firefox-ios/firefox-ios-tests/Tests/XCUITests/TabsTests.swift (1)
setUp(635-644)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BookmarksTests.swift (3)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (4)
setUp(112-117)setUp(508-513)setUp(517-522)tearDown(119-122)firefox-ios/firefox-ios-tests/Tests/XCUITests/PrivateBrowsingTest.swift (1)
setUp(301-306)firefox-ios/firefox-ios-tests/Tests/XCUITests/ZoomingTests.swift (1)
tearDown(18-21)
firefox-ios/firefox-ios-tests/Tests/XCUITests/DisplaySettingsTests.swift (10)
firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (3)
setUp(112-117)setUp(508-513)setUp(517-522)firefox-ios/firefox-ios-tests/Tests/XCUITests/ScreenGraphTest.swift (1)
setUp(34-47)firefox-ios/firefox-ios-tests/Tests/XCUITests/A11yOnboardingTests.swift (1)
setUp(14-20)firefox-ios/firefox-ios-tests/Tests/XCUITests/ActivityStreamTest.swift (1)
setUp(31-51)firefox-ios/firefox-ios-tests/Tests/XCUITests/BookmarksTests.swift (1)
setUp(21-29)firefox-ios/firefox-ios-tests/Tests/XCUITests/BrowsingPDFTests.swift (1)
setUp(24-32)firefox-ios/firefox-ios-tests/Tests/XCUITests/C_AddressesTests.swift (1)
setUp(16-36)firefox-ios/firefox-ios-tests/Tests/XCUITests/CookiePersistenceTests.swift (1)
setUp(11-20)firefox-ios/firefox-ios-tests/Tests/XCUITests/DesktopModeTests.swift (1)
setUp(96-104)firefox-ios/firefox-ios-tests/Tests/XCUITests/LoginsTests.swift (1)
setUp(36-52)
🔇 Additional comments (62)
firefox-ios/firefox-ios-tests/Tests/XCUITests/DesktopModeTests.swift (1)
96-100: LGTM — async/throws migration looks consistent.No concerns with the async lifecycle or the guarded
super.setUp()call.firefox-ios/firefox-ios-tests/Tests/XCUITests/CookiePersistenceTests.swift (1)
11-20: LGTM!The
setUp()method correctly migrates to the async throwing pattern. The ordering is appropriate—removeApp()executes beforesuper.setUp()to ensure a fresh install state before the base class initialization runs.firefox-ios/firefox-ios-tests/Tests/XCUITests/EngagementNotificationTests.swift (1)
8-16: LGTM!The async throwing
setUp()migration is correct and follows the established pattern used across other test files in this PR.firefox-ios/firefox-ios-tests/Tests/XCUITests/A11yUtils.swift (1)
3-4: LGTM!Adding
@MainActortoA11yUtilsis appropriate since all its methods interact withXCUIElementandXCTContext, which require main-thread execution. This aligns with Swift 6 concurrency requirements.firefox-ios/firefox-ios-tests/Tests/XCUITests/URLValidationTests.swift (1)
14-23: LGTM!The async throwing
setUp()migration is correct. ThecontinueAfterFailure = truesetting is appropriate here to allow all URL validation cases to execute even if individual assertions fail.firefox-ios/firefox-ios-tests/Tests/XCUITests/DomainAutocompleteTests.swift (1)
31-45: LGTM!The async throwing
setUp()migration is correct and maintains the existing logic for conditionally settinglaunchArgumentsbased on the test name before callingsuper.setUp().firefox-ios/firefox-ios-tests/Tests/XCUITests/ReadingListTests.swift (1)
13-18: LGTM!The async throws migration follows the established pattern from
BaseTestCaseand other test files in the suite. Screen objects are correctly initialized aftersuper.setUp()completes.firefox-ios/firefox-ios-tests/Tests/XCUITests/DisplaySettingsTests.swift (1)
8-18: LGTM!The migration correctly preserves the conditional
removeApp()logic before the asyncsuper.setUp()call, matching the pattern used in similar tests likeCookiePersistenceTestsandLoginsTests.firefox-ios/firefox-ios-tests/Tests/XCUITests/HomePageSettingsUITest.swift (1)
25-39: LGTM!The migration preserves the test-name-based conditional
launchArgumentssetup beforesuper.setUp(), consistent with the pattern inHistoryTests,ActivityStreamTest, andDragAndDropTests.firefox-ios/firefox-ios-tests/Tests/XCUITests/DatabaseFixtureTest.swift (1)
14-25: LGTM!The async throws migration is correct and follows the established pattern for fixture-loading tests.
firefox-ios/firefox-ios-tests/Tests/XCUITests/PhotonActionSheetTests.swift (1)
14-20: LGTM!The migration follows the standard pattern with screen objects correctly initialized after
super.setUp()completes.firefox-ios/firefox-ios-tests/Tests/XCUITests/BrowsingPDFTests.swift (1)
24-32: LGTM!The async throws migration is correct and follows the established pattern.
firefox-ios/firefox-ios-tests/Tests/XCUITests/TabsTests.swift (1)
635-639: Looks good — async lifecycle migration is consistent.
setUp()now usesasync throwsandtry await super.setUp()as expected.firefox-ios/firefox-ios-tests/Tests/XCUITests/MicrosurveyTests.swift (1)
9-15: LGTM for async setUp migration.
The lifecycle update matches the rest of the suite.firefox-ios/firefox-ios-tests/Tests/XCUITests/DragAndDropTests.swift (1)
294-312: Async setUp/tearDown updates look correct.
try awaitsuper calls are consistent with Swift 6 migration.firefox-ios/firefox-ios-tests/Tests/XCUITests/PrivateBrowsingTest.swift (1)
301-305: Async setUp migration looks good.
Consistent with BaseTestCase async lifecycle.firefox-ios/firefox-ios-tests/Tests/XCUITests/A11yOnboardingTests.swift (1)
14-25: Async lifecycle updates look solid.
setUp/tearDownnow align with Swift 6 async/throws expectations.firefox-ios/firefox-ios-tests/Tests/XCUITests/ToolbarTest.swift (2)
16-18: Async setUp migration looks consistent.
21-23: Async tearDown migration looks consistent.firefox-ios/firefox-ios-tests/Tests/XCUITests/MultiWindowTests.swift (2)
13-15: Async setUp migration looks consistent.
21-25: Async tearDown migration looks consistent.firefox-ios/firefox-ios-tests/Tests/XCUITests/C_AddressesTests.swift (2)
16-18: Async setUp migration looks consistent.
38-45: Async tearDown migration looks consistent.firefox-ios/firefox-ios-tests/Tests/XCUITests/IntegrationTests.swift (1)
23-44: Async setUp migration looks consistent.firefox-ios/firefox-ios-tests/Tests/XCUITests/ZoomingTests.swift (2)
10-15: Async setUp migration looks consistent.
18-21: Async tearDown migration looks consistent.firefox-ios/firefox-ios-tests/Tests/XCUITests/OnboardingTests.swift (2)
16-23: Async setUp migration looks consistent.
27-33: Async tearDown migration looks consistent.firefox-ios/firefox-ios-tests/Tests/XCUITests/FxScreenGraph.swift (3)
10-26: LGTM!The
@MainActorannotation oncreateScreenGraphis appropriate since it interacts withXCUIApplicationand UI-related code that must run on the main thread under Swift 6 concurrency.
127-130: LGTM!
@MainActoron these top-levelXCUIApplicationconstants ensures thread-safe access under Swift 6 strict concurrency.
153-163: LGTM!These helper functions correctly use
@MainActorfor direct UI interactions withXCUIApplication.firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift (4)
13-16: LGTM!
@MainActoron theseXCUIElementreferences ensures main-thread access under Swift 6 strict concurrency.
112-117: LGTM!The
async throwssignature andtry await super.setUp()correctly adopt XCTest's async lifecycle for Swift 6.
119-122: LGTM!The
async throwstearDown withtry await super.tearDown()is correct.
516-522: LGTM!
IphoneOnlyTestCase.setUpcorrectly usestry await super.setUp().firefox-ios/firefox-ios-tests/Tests/XCUITests/InactiveTabsTest.swift (1)
9-29: LGTM!The
async throwssignature andtry await super.setUp()correctly follow the migration pattern. The doubleapp.launch()appears intentional per the workaround comment on line 24.firefox-ios/firefox-ios-tests/Tests/XCUITests/LoginsTests.swift (1)
36-52: LGTM!The
async throwslifecycle migration is correct and consistent with the PR-wide pattern.firefox-ios/firefox-ios-tests/Tests/XCUITests/BookmarksTests.swift (2)
21-29: LGTM!The
async throwssetUp correctly callstry await super.setUp()before initializing screen objects.
31-34: LGTM!The
async throwstearDown correctly resets device orientation before callingtry await super.tearDown().firefox-ios/firefox-ios-tests/Tests/XCUITests/ActivityStreamTest.swift (2)
30-51: LGTM!The
async throwssetUp correctly follows the migration pattern withtry await super.setUp()and subsequent screen object initialization.
53-56: LGTM!The
async throwstearDown correctly resets device orientation and callstry await super.tearDown().firefox-ios/firefox-ios-tests/Tests/XCUITests/HistoryTests.swift (1)
46-65: Async setUp migration looks good.The async/throws override with an awaited super call keeps the launch-argument setup in the right place. Please confirm this target builds cleanly with the Swift 6 XCTest async lifecycle enabled.
firefox-ios/firefox-ios-tests/Tests/XCUITests/TodayWidgetTests.swift (2)
15-41: Main-actor isolation for widget globals is appropriate.These values touch Springboard UI state, so keeping them main-actor bound avoids isolation warnings. Please confirm the test class inherits main-actor isolation (e.g., via BaseTestCase) so accesses don’t require extra
await.
49-122: Main-actor isolation on widget helpers looks good.All helpers interact with Springboard UI and should stay on the main actor. Please verify the Swift 6 build has no remaining actor-isolation errors in this file.
firefox-ios/firefox-ios-tests/Tests/XCUITests/NavigationRegistry.swift (1)
9-10: Main-actor registry function looks consistent.Keeping navigation registration on the main thread aligns with other UI helpers. Please verify the Swift 6 build remains clean after this isolation change.
firefox-ios/firefox-ios-tests/Tests/XCUITests/ScreenGraphTest.swift (2)
10-35: Main-actor test class + async setUp align with migration.Awaiting super.setUp in the async override keeps lifecycle consistent. Please confirm XCTest async lifecycle support is enabled for this target under Swift 6.
54-55: Spacing-only change — no review needed.firefox-ios/firefox-ios-tests/Tests/XCUITests/registerTabMenuNavigation.swift (1)
8-9: Main-actor isolation for tab menu registration looks fine.UI graph setup stays on the main thread; please verify the Swift 6 build has no actor-isolation call-site errors.
firefox-ios/firefox-ios-tests/Tests/XCUITests/registerFxAccountNavigation.swift (1)
8-9: Main-actor isolation for FxAccount navigation looks fine.Keeps UI registrations on the main thread; please verify the Swift 6 build remains clean after this change.
firefox-ios/firefox-ios-tests/Tests/XCUITests/registerZoomNavigation.swift (1)
8-9: LGTM: Main-actor isolation is appropriate for UI navigation helpers.firefox-ios/firefox-ios-tests/Tests/XCUITests/registerToolbarNavigation.swift (1)
8-55: LGTM: Consistent@MainActorisolation across toolbar helpers.firefox-ios/firefox-ios-tests/Tests/XCUITests/registerHomePanelNavigation.swift (1)
8-9: LGTM: Main-actor isolation fits UI test navigation.firefox-ios/firefox-ios-tests/Tests/XCUITests/registerLibraryPanelNavigation.swift (1)
8-9: LGTM: Main-actor isolation is appropriate here.firefox-ios/firefox-ios-tests/Tests/XCUITests/registerCommonNavigation.swift (1)
8-9: LGTM:@MainActorfits UI navigation registration.firefox-ios/firefox-ios-tests/Tests/XCUITests/registerOnboardingNavigation.swift (1)
8-9: LGTM: Main-actor isolation is appropriate for onboarding navigation.firefox-ios/firefox-ios-tests/Tests/XCUITests/registerMobileNavigation.swift (1)
8-9: LGTM!The
@MainActorannotation is correctly applied to ensure main-thread execution for this UI navigation helper that interacts withXCUIApplicationelements. This aligns with the Swift 6 migration pattern applied consistently across other navigation registration functions in this PR.firefox-ios/firefox-ios-tests/Tests/XCUITests/registerMiscellanousActions.swift (1)
8-9: LGTM!The
@MainActorannotation ensures this function is consistent with other navigation registration helpers in the test suite. This is necessary for Swift 6 compliance when the function is called from@MainActor-isolated contexts likecreateScreenGraph.firefox-ios/firefox-ios-tests/Tests/XCUITests/registerTabTrayNavigation.swift (1)
9-10: LGTM!The
@MainActorannotation is correctly applied to this UI navigation helper that extensively interacts withXCUIApplicationelements for tab tray management. This ensures thread-safe access to UI elements under Swift 6 concurrency rules.firefox-ios/firefox-ios-tests/Tests/XCUITests/registerMiscellanousNavigation.swift (1)
8-9: LGTM!The
@MainActorannotation is necessary here since this function interacts withXCUIApplicationUI elements and calls other@MainActor-isolated helpers likecancelBackAction(for:)andnavigationControllerBackAction(for:).firefox-ios/firefox-ios-tests/Tests/XCUITests/registerTrackingProtection.swift (1)
8-9: LGTM!The
@MainActorannotation correctly ensures main-thread execution for this tracking protection navigation helper that interacts withXCUIApplicationUI elements.firefox-ios/firefox-ios-tests/Tests/XCUITests/registerUrlBarNavigation.swift (1)
10-11: LGTM!The
@MainActorannotation is correctly applied to this URL bar navigation helper that interacts withXCUIApplicationUI elements andUIPasteboard. This ensures proper main-thread confinement under Swift 6 concurrency rules.firefox-ios/firefox-ios-tests/Tests/XCUITests/registerContextMenuNavigation.swift (1)
8-9: LGTM — main-actor isolation fits UI test helpers.
✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.
| override func setUp() async throws { | ||
| specificForPlatform = .pad | ||
| if iPad() { | ||
| super.setUp() | ||
| await super.setUp() | ||
| } | ||
| } |
There was a problem hiding this comment.
Missing try when calling throwing superclass method.
super.setUp() is async throws, but line 511 uses await super.setUp() without try. This will cause a compile error.
🐛 Proposed fix
override func setUp() async throws {
specificForPlatform = .pad
if iPad() {
- await super.setUp()
+ try await super.setUp()
}
}🤖 Prompt for AI Agents
In `@firefox-ios/firefox-ios-tests/Tests/XCUITests/BaseTestCase.swift` around
lines 508 - 513, The override of setUp() in BaseTestCase calls the throwing
async superclass method without handling errors; change the call inside the
iPad() check to use try await when invoking super.setUp() (i.e., call try await
super.setUp()) so the async throws contract is satisfied and the code compiles.
| override func setUp() async throws { | ||
| continueAfterFailure = false | ||
| setUpExperimentVariables() | ||
| setUpApp() | ||
| setUpExperimentVariables() | ||
| setUpLaunchArguments() | ||
| setUpScreenGraph() | ||
| } |
There was a problem hiding this comment.
Critical: setUpExperimentVariables() called after setUpApp() causes nil access.
The setUpApp() method at line 43 calls addLaunchArgument(jsonFileName: jsonFileName, featureName: featureName), which uses jsonFileName and featureName. However, these variables are supposed to be initialized by setUpExperimentVariables(), which is now called after setUpApp() on line 49.
This ordering will cause a crash when jsonFileName! and featureName! are force-unwrapped as nil.
🐛 Proposed fix to restore correct call order
override func setUp() async throws {
continueAfterFailure = false
- setUpApp()
setUpExperimentVariables()
+ setUpApp()
setUpLaunchArguments()
setUpScreenGraph()
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| override func setUp() async throws { | |
| continueAfterFailure = false | |
| setUpExperimentVariables() | |
| setUpApp() | |
| setUpExperimentVariables() | |
| setUpLaunchArguments() | |
| setUpScreenGraph() | |
| } | |
| override func setUp() async throws { | |
| continueAfterFailure = false | |
| setUpExperimentVariables() | |
| setUpApp() | |
| setUpLaunchArguments() | |
| setUpScreenGraph() | |
| } |
🤖 Prompt for AI Agents
In `@firefox-ios/firefox-ios-tests/Tests/XCUITests/FeatureFlaggedTestBase.swift`
around lines 46 - 52, The setup order is wrong: setUpApp() calls
addLaunchArgument(jsonFileName:featureName:) which force-unwraps jsonFileName
and featureName before they are initialized; move the call to
setUpExperimentVariables() to run before setUpApp() in override func setUp()
async throws so jsonFileName and featureName are initialized prior to
addLaunchArgument(...) being invoked; verify setUpExperimentVariables(),
setUpApp(), addLaunchArgument(jsonFileName:featureName:), and the variables
jsonFileName/featureName are referenced correctly after the change.
| @MainActor | ||
| func navigationControllerBackAction(for app: XCUIApplication) -> () -> Void { | ||
| return { | ||
| app.navigationBars.element(boundBy: 0).buttons.element(boundBy: 0).waitAndTap() | ||
| } | ||
| } | ||
|
|
||
| @MainActor | ||
| func cancelBackAction(for app: XCUIApplication) -> () -> Void { | ||
| return { | ||
| app.otherElements["PopoverDismissRegion"].waitAndTap() | ||
| } | ||
| } | ||
|
|
||
| @MainActor | ||
| func dismissContextMenuAction(app: XCUIApplication) -> () -> Void { | ||
| return { | ||
| app.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.25)).tap() | ||
| } | ||
| } |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
rg -n "backAction" --type swift -C 3Repository: qodo-benchmark/firefox-ios-combined-coderabbit
Length of output: 32037
🏁 Script executed:
rg -n "var backAction" --type swift -B 2 -A 2Repository: qodo-benchmark/firefox-ios-combined-coderabbit
Length of output: 72
🏁 Script executed:
rg -n "class.*ScreenState|struct.*ScreenState" --type swift -A 5Repository: qodo-benchmark/firefox-ios-combined-coderabbit
Length of output: 14542
🏁 Script executed:
rg -n "MMScreenState|import.*Mappamundi" --type swift -A 3Repository: qodo-benchmark/firefox-ios-combined-coderabbit
Length of output: 2598
🏁 Script executed:
rg -n "\.backAction\(\)|backAction()" --type swift -B 2 -A 2Repository: qodo-benchmark/firefox-ios-combined-coderabbit
Length of output: 24071
🏁 Script executed:
fd -n "Package.swift|project.pbxproj|build.settings" -type f | head -5Repository: qodo-benchmark/firefox-ios-combined-coderabbit
Length of output: 320
🏁 Script executed:
fd "Package.swift|project.pbxproj|build.settings" --type f | head -5Repository: qodo-benchmark/firefox-ios-combined-coderabbit
Length of output: 296
🏁 Script executed:
cat Package.swift | head -50Repository: qodo-benchmark/firefox-ios-combined-coderabbit
Length of output: 941
🏁 Script executed:
find . -name "*.pbxproj" -type f | grep -E "firefox-ios|firefox" | head -3Repository: qodo-benchmark/firefox-ios-combined-coderabbit
Length of output: 205
🏁 Script executed:
grep -i "swift.*concurrency\|SWIFT_STRICT\|strict" ./firefox-ios/Client.xcodeproj/project.pbxproj | head -20Repository: qodo-benchmark/firefox-ios-combined-coderabbit
Length of output: 1173
🏁 Script executed:
rg -n "import.*Mappamundi|backAction\(\)" --type swift | head -20Repository: qodo-benchmark/firefox-ios-combined-coderabbit
Length of output: 72
🏁 Script executed:
cat firefox-ios/firefox-ios-tests/Tests/XCUITests/FxScreenGraph.swift | head -160Repository: qodo-benchmark/firefox-ios-combined-coderabbit
Length of output: 5550
Returned closures from @MainActor functions lack actor isolation.
The functions navigationControllerBackAction, cancelBackAction, and dismissContextMenuAction are marked @MainActor, but return plain () -> Void closures. These closures capture and invoke UI methods on the app parameter (waitAndTap(), tap(), coordinate()). Under Swift 6 with SWIFT_STRICT_CONCURRENCY = complete, if Mappamundi invokes these closures from a non-MainActor context, the code will trigger concurrency warnings.
Annotate the return types as @MainActor () -> Void to ensure the closures inherit main-actor isolation from their parent functions.
🤖 Prompt for AI Agents
In `@firefox-ios/firefox-ios-tests/Tests/XCUITests/FxScreenGraph.swift` around
lines 132 - 151, The three functions navigationControllerBackAction(for:),
cancelBackAction(for:), and dismissContextMenuAction(app:) are `@MainActor` but
return unannotated () -> Void closures that can be invoked off-main and trigger
strict-concurrency warnings; update their signatures to return `@MainActor` () ->
Void so the returned closures inherit main-actor isolation (e.g., change the
return type of navigationControllerBackAction, cancelBackAction, and
dismissContextMenuAction to `@MainActor` () -> Void) and keep the existing closure
bodies that call app.waitAndTap()/tap()/coordinate().
| @MainActor // swiftlint:disable:next function_body_length | ||
| func registerSettingsNavigation(in map: MMScreenGraph<FxUserState>, app: XCUIApplication) { |
There was a problem hiding this comment.
🧩 Analysis chain
🌐 Web query:
SwiftLint "swiftlint:disable:next" trailing comment after attribute @MainActor``
💡 Result:
Short answer: this is a known SwiftLint limitation — a leading attribute (like @MainActor) or intervening comments can stop a preceding // swiftlint:disable:next from applying to the real declaration because SwiftLint matches the “next” token/line against the immediate next source-line/trivia rather than the underlying decl. See the GitHub issue and the SwiftLint docs. [1][2]
Workarounds (pick one):
- Move the disable so it applies to the declaration itself: put the directive on the same logical line using disable:this or an end-of-line disable after the declaration, e.g. add // swiftlint:disable:this at the end of the declaration line. [2]
- Place the swiftlint directive immediately before the doc-comment (or remove the trailing comment), so the directive is truly the next comment before the declaration. [1][3]
- Use a file-level disable/enable around the declaration if acceptable. [2]
References:
- SwiftLint GitHub issue discussing // swiftlint:disable:next not working with doc comments. [1]
- SwiftLint documentation on inline disable/enable and :next/:this/:previous usage. [2]
- Swift Forums discussion about attributes, comments and trivia when inserting
@MainActor(explanation of trivia/positioning). [3]
If you want, paste a small code example you have and I’ll show the exact change that will make the disable work.
🏁 Script executed:
# Search for SwiftLint directive patterns in the codebase
rg "swiftlint:disable" --type swift -B 2 -A 2 | head -100Repository: qodo-benchmark/firefox-ios-combined-coderabbit
Length of output: 10525
🏁 Script executed:
# Look for other `@MainActor` usages to see if there's a pattern
rg "@MainActor" --type swift -B 1 -A 1 | head -80Repository: qodo-benchmark/firefox-ios-combined-coderabbit
Length of output: 5450
Move the SwiftLint directive to its own line — the trailing comment placement does not work.
SwiftLint does not honor // swiftlint:disable:next when placed as a trailing comment after an attribute like @MainActor. This is a known SwiftLint limitation: the directive matching logic checks the immediate next source-line/trivia, not the underlying declaration. As a result, the function_body_length rule suppression is not being applied. Move the directive to a standalone line between the attribute and function for it to take effect.
Fix
-@MainActor // swiftlint:disable:next function_body_length
-func registerSettingsNavigation(in map: MMScreenGraph<FxUserState>, app: XCUIApplication) {
+@MainActor
+// swiftlint:disable:next function_body_length
+func registerSettingsNavigation(in map: MMScreenGraph<FxUserState>, app: XCUIApplication) {📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| @MainActor // swiftlint:disable:next function_body_length | |
| func registerSettingsNavigation(in map: MMScreenGraph<FxUserState>, app: XCUIApplication) { | |
| `@MainActor` | |
| // swiftlint:disable:next function_body_length | |
| func registerSettingsNavigation(in map: MMScreenGraph<FxUserState>, app: XCUIApplication) { |
🤖 Prompt for AI Agents
In
`@firefox-ios/firefox-ios-tests/Tests/XCUITests/registerSettingsNavigation.swift`
around lines 8 - 9, The SwiftLint disable directive is placed as a trailing
comment after the `@MainActor` attribute so it isn't applied to
registerSettingsNavigation; move the directive `// swiftlint:disable:next
function_body_length` onto its own line directly between the `@MainActor`
attribute and the `func registerSettingsNavigation(in map:
MMScreenGraph<FxUserState>, app: XCUIApplication)` declaration so SwiftLint
recognizes and suppresses the function_body_length rule for that function.
Benchmark PR from qodo-benchmark#240
Summary by CodeRabbit
Tests
✏️ Tip: You can customize this high-level summary in your review settings.