diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b4f451c..238c847 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -7,10 +7,21 @@ on: jobs: test: - name: Run all tests on iOS + name: Test on ${{ matrix.device }} runs-on: macos-26 timeout-minutes: 30 + strategy: + # Run every device leg to completion: an iPad failure shouldn't hide the + # iPhone result (or vice versa). + fail-fast: false + matrix: + include: + - device: iPhone 17 Pro + slug: iphone + - device: iPad Pro 11-inch (M5) + slug: ipad + steps: - name: Checkout current repository uses: actions/checkout@v4 @@ -24,7 +35,7 @@ jobs: xcodebuild build-for-testing \ -project OpenAppLock.xcodeproj \ -scheme OpenAppLock \ - -destination 'platform=iOS Simulator,name=iPhone 17 Pro' \ + -destination 'platform=iOS Simulator,name=${{ matrix.device }}' \ -xcconfig Config/CI.xcconfig - name: Run tests @@ -34,7 +45,7 @@ jobs: xcodebuild test-without-building \ -project OpenAppLock.xcodeproj \ -scheme OpenAppLock \ - -destination 'platform=iOS Simulator,name=iPhone 17 Pro' \ + -destination 'platform=iOS Simulator,name=${{ matrix.device }}' \ -resultBundlePath ./output/test-result.xcresult \ -xcconfig Config/CI.xcconfig @@ -45,11 +56,11 @@ jobs: - name: Upload test result uses: actions/upload-artifact@v4 with: - name: test-result + name: test-result-${{ matrix.slug }} path: output/test-result.zip - name: Check for test failure if: steps.tests.outcome == 'failure' run: | - echo "Tests failed. Check the uploaded artifacts for details." + echo "Tests failed on ${{ matrix.device }}. Check the uploaded artifacts for details." exit 1 diff --git a/AGENTS.md b/AGENTS.md index 851abca..e4862db 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -82,8 +82,9 @@ off-limits to agent edits. - Shields: one `ManagedSettingsStore` per rule (`rule-`), tracked in UserDefaults for stray cleanup. `blockAdultContent` engages `webContent.blockedByFilter = .auto()` alongside the shield. -- `RuleEnforcer.refresh` is the only place shields change; the home view runs - it on rule changes and a 30s loop while visible. +- `RuleEnforcer.refresh` is the only place shields change; the post-onboarding + shell (`MainView`) runs it on rule changes and a 30s loop while the app is open, + regardless of the active layout (compact `TabView` vs regular-width sidebar). ## Build & test @@ -156,7 +157,8 @@ them): `newRuleButton`, `ruleCard-`, `ruleStatus-`, `maxOpensStepper(+Value)`, `commitRuleButton`, `doneButton`, `toggleEnabledButton`, `deleteRuleButton`, `closeDetailButton`, `detailRuleName`, `detailStatusLabel`, `detailRow-