From 55b662d8cb9eda23d77a157c740c856c1d60d654 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Mon, 25 May 2026 14:33:03 -0600 Subject: [PATCH 01/60] =?UTF-8?q?=F0=9F=A7=AA=20test(swift):=20add=20visua?= =?UTF-8?q?l=20screenshot=20capture?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tests/PackRatMacOSUITests/Info.plist | 2 + apps/swift/Tests/PackRatUITests/Info.plist | 2 + .../VisualScreenshotTests.swift | 436 +++++++++++++++ .../scripts/capture-visual-screenshots.ts | 522 ++++++++++++++++++ package.json | 1 + 5 files changed, 963 insertions(+) create mode 100644 apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift create mode 100644 apps/swift/scripts/capture-visual-screenshots.ts diff --git a/apps/swift/Tests/PackRatMacOSUITests/Info.plist b/apps/swift/Tests/PackRatMacOSUITests/Info.plist index aa219d2e4f..fd1416d4b0 100644 --- a/apps/swift/Tests/PackRatMacOSUITests/Info.plist +++ b/apps/swift/Tests/PackRatMacOSUITests/Info.plist @@ -22,5 +22,7 @@ $(PACKRAT_E2E_EMAIL) PACKRAT_E2E_PASSWORD $(PACKRAT_E2E_PASSWORD) + PACKRAT_SCREENSHOT_DIR + $(PACKRAT_SCREENSHOT_DIR) diff --git a/apps/swift/Tests/PackRatUITests/Info.plist b/apps/swift/Tests/PackRatUITests/Info.plist index aa219d2e4f..fd1416d4b0 100644 --- a/apps/swift/Tests/PackRatUITests/Info.plist +++ b/apps/swift/Tests/PackRatUITests/Info.plist @@ -22,5 +22,7 @@ $(PACKRAT_E2E_EMAIL) PACKRAT_E2E_PASSWORD $(PACKRAT_E2E_PASSWORD) + PACKRAT_SCREENSHOT_DIR + $(PACKRAT_SCREENSHOT_DIR) diff --git a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift new file mode 100644 index 0000000000..5628bcb69f --- /dev/null +++ b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift @@ -0,0 +1,436 @@ +import XCTest + +final class VisualScreenshotTests: XCTestCase { + private var app: XCUIApplication! + private var screenshotDirectory: URL! + + override var executionTimeAllowance: TimeInterval { + get { 10 * 60 } + set { _ = newValue } + } + + override func setUpWithError() throws { + continueAfterFailure = false + let bundle = Bundle(for: VisualScreenshotTests.self) + let environmentDirectory = ProcessInfo.processInfo.environment["PACKRAT_SCREENSHOT_DIR"] ?? "" + let bundleDirectory = (bundle.object(forInfoDictionaryKey: "PACKRAT_SCREENSHOT_DIR") as? String) ?? "" + let directory = environmentDirectory.isEmpty ? bundleDirectory : environmentDirectory + guard !directory.isEmpty else { + throw XCTSkip("Set PACKRAT_SCREENSHOT_DIR to enable visual screenshot capture.") + } + + screenshotDirectory = URL(fileURLWithPath: directory, isDirectory: true) + try? FileManager.default.createDirectory( + at: screenshotDirectory, + withIntermediateDirectories: true + ) + + launchLoggedOut() + } + + func testGuestVisualSurface() throws { + capture("00-unauth-welcome") + captureRegisterAndLoginStates() + enterGuestMode() + capture("03-guest-home") + + #if os(iOS) + capturePhoneSurface(mode: .guest) + #elseif os(macOS) + captureMacSurface(mode: .guest) + #endif + } + + func testGuestModalSurface() throws { + enterGuestMode() + + #if os(iOS) + capturePhoneModalSurface(mode: .guest) + #elseif os(macOS) + captureMacModalSurface(mode: .guest) + #endif + } + + func testAuthenticatedVisualSurface() throws { + try signIn() + capture("20-auth-home") + + #if os(iOS) + capturePhoneSurface(mode: .authenticated) + #elseif os(macOS) + captureMacSurface(mode: .authenticated) + #endif + } + + func testAuthenticatedModalSurface() throws { + try signIn() + + #if os(iOS) + capturePhoneModalSurface(mode: .authenticated) + #elseif os(macOS) + captureMacModalSurface(mode: .authenticated) + #endif + } + + private func captureRegisterAndLoginStates() { + if app.buttons["auth_signup_free"].waitForExistence(timeout: 5) { + app.buttons["auth_signup_free"].tap() + capture("01-unauth-register") + restartLoggedOut() + } + + if app.buttons["auth_sign_in"].waitForExistence(timeout: 5) { + app.buttons["auth_sign_in"].tap() + capture("02-unauth-login") + if app.buttons["forgot_password_link"].waitForExistence(timeout: 3) { + app.buttons["forgot_password_link"].tap() + capture("02a-unauth-forgot-password") + } + restartLoggedOut() + } + } + + private func enterGuestMode() { + let guestButton = app.buttons["auth_continue_without_login"] + XCTAssertTrue(guestButton.waitForExistence(timeout: 10)) + guestButton.tap() + + #if os(iOS) + XCTAssertTrue(app.tabBars.firstMatch.waitForExistence(timeout: 10)) + #elseif os(macOS) + XCTAssertTrue(app.buttons["nav_home"].waitForExistence(timeout: 10)) + #endif + } + + #if os(iOS) + private func capturePhoneSurface(mode: VisualMode) { + let prefix = mode.prefix + let suffix = mode.suffix + captureTab("Packs", name: "\(prefix)-packs\(suffix)") + captureTab("Trips", name: "\(prefix)-trips\(suffix)") + captureTab("Assistant", name: "\(prefix)-assistant\(suffix)") + + captureHomeAction("Gear Inventory", name: "\(prefix)-gear-inventory\(suffix)") + captureHomeAction("Season Suggestions", name: "\(prefix)-season-suggestions\(suffix)") + captureHomeAction("Pack Templates", name: "\(prefix)-pack-templates\(suffix)") + captureHomeAction("Guides", name: "\(prefix)-guides\(suffix)") + captureHomeAction("Catalog", name: "\(prefix)-catalog\(suffix)") + captureHomeAction("Community Feed", name: "\(prefix)-feed\(suffix)") + captureHomeAction("Trail Conditions", name: "\(prefix)-trail-conditions\(suffix)") + captureHomeAction("Weather", name: "\(prefix)-weather\(suffix)") + captureHomeAction("Wildlife ID", name: "\(prefix)-wildlife\(suffix)") + } + + private func capturePhoneModalSurface(mode: VisualMode) { + let prefix = mode.modalPrefix + captureGlobalSearch(name: "\(prefix)-global-search") + if mode == .guest { + restartLoggedOut() + enterGuestMode() + } + + captureTab("Packs", name: "\(prefix)-packs-before-new-pack") + tapAndCapture(button: "New Pack", name: "\(prefix)-new-pack-sheet") + + captureTab("Trips", name: "\(prefix)-trips-before-new-trip") + tapAndCapture(button: "Plan Trip", name: "\(prefix)-new-trip-sheet") + + captureHomeAction("Pack Templates", name: "\(prefix)-templates-before-new-template") + tapAndCapture(button: "New Template", name: "\(prefix)-new-template-sheet") + + captureHomeAction("Trail Conditions", name: "\(prefix)-trail-conditions-before-submit") + tapAndCapture(button: "Submit Report", name: "\(prefix)-trail-report-sheet") + + captureHomeAction("Weather", name: "\(prefix)-weather-before-alerts") + tapAndCapture(identifier: "weather_alerts_button", name: "\(prefix)-weather-alerts-sheet") + + if mode == .authenticated { + captureHomeAction("Community Feed", name: "\(prefix)-feed-before-compose") + tapAndCapture(button: "New Post", name: "\(prefix)-feed-compose-sheet") + } + } + + private func captureTab(_ label: String, name: String) { + let tab = app.tabBars.buttons[label] + if tab.waitForExistence(timeout: 5) { + tab.tap() + capture(name) + } + } + + private func captureHomeAction(_ title: String, name: String) { + captureTab("Home", name: "home-before-\(name)") + + let identifier = "home_action_\(title.lowercased().filter { $0.isLetter || $0.isNumber })" + let action = app.buttons[identifier] + + for _ in 0..<8 { + if action.exists, action.isHittable { + action.tap() + capture(name) + dismissPhoneDestination() + return + } + app.swipeUp() + } + } + + private func dismissPhoneDestination() { + if app.buttons["Done"].exists { + app.buttons["Done"].tap() + } else if app.navigationBars.buttons.firstMatch.exists { + app.navigationBars.buttons.firstMatch.tap() + } + } + #endif + + #if os(macOS) + private func captureMacSurface(mode: VisualMode) { + let prefix = mode.prefix + let suffix = mode.suffix + let entries = [ + ("Home", "\(prefix)-home\(suffix)"), + ("Packs", "\(prefix)-packs\(suffix)"), + ("Trips", "\(prefix)-trips\(suffix)"), + ("Weather", "\(prefix)-weather\(suffix)"), + ("Assistant", "\(prefix)-assistant\(suffix)"), + ("Catalog", "\(prefix)-catalog\(suffix)"), + ("Templates", "\(prefix)-pack-templates\(suffix)"), + ("Trail Conditions", "\(prefix)-trail-conditions\(suffix)"), + ("Feed", "\(prefix)-feed\(suffix)"), + ("Guides", "\(prefix)-guides\(suffix)"), + ("Gear Inventory", "\(prefix)-gear-inventory\(suffix)"), + ("Wildlife", "\(prefix)-wildlife\(suffix)"), + ("AI Packs", "\(prefix)-ai-packs\(suffix)"), + ] + + for (label, name) in entries { + selectSidebar(label) + capture(name) + } + } + + private func captureMacModalSurface(mode: VisualMode) { + let prefix = mode.modalPrefix + captureGlobalSearch(name: "\(prefix)-global-search") + + selectSidebar("Packs") + tapAndCapture(button: "New Pack", name: "\(prefix)-new-pack-sheet") + + selectSidebar("Trips") + tapAndCapture(button: "Plan Trip", name: "\(prefix)-new-trip-sheet") + + selectSidebar("Templates") + tapAndCapture(button: "New Template", name: "\(prefix)-new-template-sheet") + + selectSidebar("Trail Conditions") + tapAndCapture(button: "Submit Report", name: "\(prefix)-trail-report-sheet") + + selectSidebar("Weather") + tapAndCapture(identifier: "weather_alerts_button", name: "\(prefix)-weather-alerts-sheet") + + if mode == .authenticated { + selectSidebar("Feed") + tapAndCapture(button: "New Post", name: "\(prefix)-feed-compose-sheet") + } + } + + private func selectSidebar(_ label: String) { + let identifierByLabel: [String: String] = [ + "Home": "nav_home", + "Packs": "nav_packs", + "Trips": "nav_trips", + "Weather": "nav_weather", + "Assistant": "nav_chat", + "Catalog": "nav_catalog", + "Templates": "nav_templates", + "Trail Conditions": "nav_trailConditions", + "Feed": "nav_feed", + "Guides": "nav_guides", + "Gear Inventory": "nav_gearInventory", + "Wildlife": "nav_wildlife", + "AI Packs": "nav_aiPacks", + ] + + if let identifier = identifierByLabel[label] { + let button = app.buttons[identifier] + if button.waitForExistence(timeout: 5) { + if button.isHittable { + button.tap() + } else { + button.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).click() + } + return + } + } + } + #endif + + private func captureGlobalSearch(name: String) { + #if os(macOS) + app.typeKey("f", modifierFlags: [.command]) + #else + captureTab("Home", name: "home-before-\(name)") + app.buttons["Search"].tapIfExists() + #endif + capture(name) + dismissPresentedSurface() + } + + private func tapAndCapture(button label: String, name: String) { + let button = app.buttons[label] + guard button.waitForExistence(timeout: 3) else { return } + if button.isHittable { + button.tap() + } else { + activate(button) + } + capture(name) + dismissPresentedSurface() + } + + private func tapAndCapture(identifier: String, name: String) { + let button = app.buttons[identifier] + guard button.waitForExistence(timeout: 3) else { return } + if button.isHittable { + button.tap() + } else { + activate(button) + } + capture(name) + dismissPresentedSurface() + } + + private func activate(_ element: XCUIElement) { + #if os(macOS) + element.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).click() + #else + element.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).tap() + #endif + } + + private func dismissPresentedSurface() { + #if os(macOS) + app.typeKey(XCUIKeyboardKey.escape.rawValue, modifierFlags: []) + #endif + for label in ["Cancel", "Done", "Close"] { + let button = app.buttons[label] + if button.exists { + button.tap() + return + } + } + #if os(iOS) + app.swipeDown() + app.swipeDown() + if app.navigationBars.buttons.firstMatch.exists { + app.navigationBars.buttons.firstMatch.tap() + } + #endif + } + + private func signIn() throws { + let bundle = Bundle(for: VisualScreenshotTests.self) + let email = (bundle.object(forInfoDictionaryKey: "PACKRAT_E2E_EMAIL") as? String) ?? "" + let password = (bundle.object(forInfoDictionaryKey: "PACKRAT_E2E_PASSWORD") as? String) ?? "" + guard !email.isEmpty, !password.isEmpty else { + throw XCTSkip("PACKRAT_E2E_EMAIL / PACKRAT_E2E_PASSWORD are required for authenticated screenshots.") + } + + let signIn = app.buttons["auth_sign_in"] + XCTAssertTrue(signIn.waitForExistence(timeout: 10)) + signIn.tap() + + let emailField = app.textFields["login_email"] + XCTAssertTrue(emailField.waitForExistence(timeout: 10)) + emailField.tap() + emailField.typeText(email) + + let passwordField = app.secureTextFields["login_password"] + passwordField.tap() + passwordField.typeText(password) + + #if os(macOS) + app.typeText("\u{1b}") + #endif + app.buttons["login_submit"].tap() + + guard waitForAuthenticatedShell() else { + capture("20-auth-sign-in-blocked") + throw XCTSkip("Authenticated visual surface unavailable: sign-in did not reach the app shell.") + } + } + + private func waitForAuthenticatedShell() -> Bool { + #if os(iOS) + return app.tabBars.firstMatch.waitForExistence(timeout: 20) + #elseif os(macOS) + return app.otherElements["app_navigation"].waitForExistence(timeout: 20) + || app.outlines["app_sidebar"].waitForExistence(timeout: 1) + || app.buttons["nav_home"].waitForExistence(timeout: 1) + #endif + } + + private func launchLoggedOut() { + app = XCUIApplication() + app.launchArguments = [ + "--disable-animations", + "--use-userdefaults-auth", + "--reset-auth", + ] + app.launchEnvironment["PACKRAT_VISUAL_SCREENSHOTS"] = "1" + app.launch() + #if os(macOS) + app.activate() + #endif + } + + private func restartLoggedOut() { + app.terminate() + launchLoggedOut() + } + + private func capture(_ name: String) { + Thread.sleep(forTimeInterval: 0.35) + let screenshot = app.screenshot() + let url = screenshotDirectory.appendingPathComponent("\(name).png") + try? screenshot.pngRepresentation.write(to: url, options: .atomic) + + let attachment = XCTAttachment(screenshot: screenshot) + attachment.name = name + attachment.lifetime = .keepAlways + add(attachment) + } +} + +private enum VisualMode { + case guest + case authenticated + + var prefix: String { + switch self { + case .guest: + return "10-guest" + case .authenticated: + return "30-auth" + } + } + + var suffix: String { + switch self { + case .guest: + return "-guest" + case .authenticated: + return "-auth" + } + } + + var modalPrefix: String { + switch self { + case .guest: + return "50-guest-modal" + case .authenticated: + return "60-auth-modal" + } + } +} diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts new file mode 100644 index 0000000000..8260802459 --- /dev/null +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -0,0 +1,522 @@ +#!/usr/bin/env bun +import { spawn, spawnSync } from 'node:child_process'; +import { + cpSync, + existsSync, + mkdirSync, + readdirSync, + readFileSync, + rmSync, + writeFileSync, +} from 'node:fs'; +import { basename, resolve } from 'node:path'; +import { pathToFileURL } from 'node:url'; +import { listBooted } from './lib/simctl'; +import { formatSummaryLine, readSummary, XcResultError } from './lib/xcresult'; + +type Platform = 'ios' | 'macos'; + +type Options = { + platforms: Platform[]; + outDir: string; + skipTests: boolean; +}; + +const REPO_ROOT = resolve(import.meta.dir, '../../..'); +const SWIFT_DIR = resolve(REPO_ROOT, 'apps/swift'); +const RESULTS_DIR = resolve(SWIFT_DIR, 'TestResults'); +const DEFAULT_OUT_DIR = resolve(REPO_ROOT, 'artifacts/screenshots'); +const HTML_ESCAPE_RE = /[&<>"']/g; +const QUOTE_RE = /^["']|["']$/g; +const LEADING_DIGIT_RE = /^\d/; +const SCREENSHOT_PREFIX_RE = /^\d+[a-z]?-/i; +const SIPS_PIXEL_WIDTH_RE = /pixelWidth:\s*(\d+)/; +const SIPS_PIXEL_HEIGHT_RE = /pixelHeight:\s*(\d+)/; +const CHROME_CANDIDATES = [ + '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', + '/Applications/Chromium.app/Contents/MacOS/Chromium', + '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge', + '/Applications/Brave Browser.app/Contents/MacOS/Brave Browser', +]; + +function usage(): never { + console.log(`Usage: + bun swift:screenshots + bun swift:screenshots --platform ios + bun swift:screenshots --platform macos + bun swift:screenshots --skip-tests + bun swift:screenshots --out artifacts/screenshots + +Captures guest and authenticated visual surfaces through VisualScreenshotTests and assembles: + artifacts/screenshots/ios-contact-sheet.png + artifacts/screenshots/macos-contact-sheet.png`); + process.exit(0); +} + +function parseArgs(argv: readonly string[]): Options { + let platforms: Platform[] = ['ios', 'macos']; + let outDir = DEFAULT_OUT_DIR; + let skipTests = false; + + for (let i = 0; i < argv.length; i++) { + const arg = argv[i]; + if (!arg) continue; + if (arg === '--help' || arg === '-h') usage(); + if (arg === '--skip-tests') { + skipTests = true; + continue; + } + if (arg === '--platform') { + const value = argv[++i]; + if (!value) throw new Error('--platform requires ios, macos, or both'); + platforms = parsePlatforms(value); + continue; + } + if (arg.startsWith('--platform=')) { + platforms = parsePlatforms(arg.slice('--platform='.length)); + continue; + } + if (arg === '--out') { + const value = argv[++i]; + if (!value) throw new Error('--out requires a directory'); + outDir = resolve(REPO_ROOT, value); + continue; + } + if (arg.startsWith('--out=')) { + outDir = resolve(REPO_ROOT, arg.slice('--out='.length)); + continue; + } + throw new Error(`Unknown argument: ${arg}`); + } + + return { platforms, outDir, skipTests }; +} + +function parsePlatforms(value: string): Platform[] { + const normalized = value.toLowerCase(); + if (normalized === 'both') return ['ios', 'macos']; + if (normalized === 'ios') return ['ios']; + if (normalized === 'macos') return ['macos']; + throw new Error(`Unknown platform "${value}". Expected ios, macos, or both.`); +} + +function loadDotEnv(): void { + loadEnvFile(resolve(REPO_ROOT, '.env.local')); + loadEnvFile(resolve(REPO_ROOT, 'packages/api/.dev.vars.e2e')); +} + +function loadEnvFile(envFile: string): void { + if (!existsSync(envFile)) return; + for (const line of readFileSync(envFile, 'utf8').split('\n')) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith('#')) continue; + const eq = trimmed.indexOf('='); + if (eq === -1) continue; + const key = trimmed.slice(0, eq).trim(); + const value = trimmed + .slice(eq + 1) + .trim() + .replace(QUOTE_RE, ''); + if (process.env[key] === undefined) process.env[key] = value; + } +} + +function pickIOSDestination(): string { + try { + const booted = listBooted(); + if (booted.length > 0) return `platform=iOS Simulator,id=${booted[0]}`; + } catch {} + return 'platform=iOS Simulator,name=iPhone 17 Pro'; +} + +function allocateResultBundle(platform: Platform): string { + if (!existsSync(RESULTS_DIR)) mkdirSync(RESULTS_DIR, { recursive: true }); + const stamp = new Date().toISOString().replaceAll(':', '-').replaceAll('.', '-'); + const prefix = platform === 'ios' ? 'visual-iOS' : 'visual-macOS'; + const path = resolve(RESULTS_DIR, `${prefix}-${stamp}.xcresult`); + if (existsSync(path)) rmSync(path, { recursive: true, force: true }); + return path; +} + +function runXcodeVisualTest(platform: Platform, screenshotDir: string): Promise { + const resultBundle = allocateResultBundle(platform); + const writableScreenshotDir = allocateWritableScreenshotDir(platform); + const credentials = e2eBuildSettings(); + const commonArgs = [ + 'test', + '-resultBundlePath', + resultBundle, + `PACKRAT_SCREENSHOT_DIR=${writableScreenshotDir}`, + ]; + const args = + platform === 'ios' + ? [ + ...commonArgs, + '-scheme', + 'PackRat-iOS', + '-destination', + pickIOSDestination(), + '-only-testing:PackRatUITests/VisualScreenshotTests', + ...credentials, + ] + : [ + ...commonArgs, + '-scheme', + 'PackRat-macOS', + '-destination', + 'platform=macOS,arch=arm64', + '-only-testing:PackRatMacOSUITests/VisualScreenshotTests', + 'CODE_SIGN_STYLE=Manual', + 'DEVELOPMENT_TEAM=', + 'CODE_SIGN_IDENTITY=-', + 'CODE_SIGNING_ALLOWED=YES', + 'CODE_SIGNING_REQUIRED=NO', + ...credentials, + ]; + + console.log(`→ Capturing ${platform} screenshots`); + console.log(`→ Screenshot dir: ${screenshotDir}`); + console.log(`→ XCTest write dir: ${writableScreenshotDir}`); + console.log(`→ Result bundle: ${resultBundle}`); + + if (platform === 'macos') assertAutomationModeAvailable(); + + return new Promise((resolvePromise, reject) => { + const child = spawn('xcodebuild', args, { + cwd: SWIFT_DIR, + env: { + ...process.env, + PACKRAT_ENV: process.env.PACKRAT_ENV ?? 'local', + PACKRAT_SCREENSHOT_DIR: writableScreenshotDir, + }, + }); + + child.stdout.on('data', (chunk) => process.stdout.write(chunk)); + child.stderr.on('data', (chunk) => process.stderr.write(chunk)); + child.on('error', reject); + child.on('close', (code) => { + summarizeResult(resultBundle); + copyScreenshots(writableScreenshotDir, screenshotDir); + if (code === 0) { + resolvePromise(); + } else { + reject(new Error(`xcodebuild exited with ${code ?? 'unknown status'} for ${platform}`)); + } + }); + }); +} + +function allocateWritableScreenshotDir(platform: Platform): string { + const stamp = new Date().toISOString().replaceAll(':', '-').replaceAll('.', '-'); + const dir = resolve('/tmp', `packrat-${platform}-visual-${stamp}`); + rmSync(dir, { recursive: true, force: true }); + mkdirSync(dir, { recursive: true }); + return dir; +} + +function copyScreenshots(fromDir: string, toDir: string): void { + if (!existsSync(fromDir)) return; + mkdirSync(toDir, { recursive: true }); + for (const file of readdirSync(fromDir)) { + if (!file.toLowerCase().endsWith('.png')) continue; + cpSync(resolve(fromDir, file), resolve(toDir, file), { force: true }); + } +} + +function e2eBuildSettings(): string[] { + const email = process.env.E2E_TEST_EMAIL ?? process.env.E2E_EMAIL; + const password = process.env.E2E_TEST_PASSWORD ?? process.env.E2E_PASSWORD; + if (!email || !password) { + console.warn( + 'Warning: E2E_EMAIL/E2E_PASSWORD are not set; authenticated screenshot test will be skipped.', + ); + return []; + } + return [`PACKRAT_E2E_EMAIL=${email}`, `PACKRAT_E2E_PASSWORD=${password}`]; +} + +function assertAutomationModeAvailable(): void { + const result = spawnSync('automationmodetool', ['help'], { encoding: 'utf8' }); + const output = `${result.stdout ?? ''}${result.stderr ?? ''}`; + if ( + output.includes('Automation Mode is disabled') && + !output.includes('DOES NOT REQUIRE user authentication') + ) { + throw new Error( + 'macOS Automation Mode is disabled. Run `automationmodetool enable-automationmode-without-authentication` once, then retry.', + ); + } +} + +function summarizeResult(resultBundle: string): void { + try { + console.log(formatSummaryLine(readSummary(resultBundle))); + } catch (err) { + if (err instanceof XcResultError) { + console.warn(`Warning: ${err.message}`); + } else { + throw err; + } + } +} + +function screenshotDirFor(outDir: string, platform: Platform): string { + return resolve(outDir, `${platform}-xctest`); +} + +function contactSheetPathFor(outDir: string, platform: Platform): string { + return resolve(outDir, `${platform}-contact-sheet.png`); +} + +function listScreenshots(dir: string): string[] { + if (!existsSync(dir)) return []; + return readdirSync(dir) + .filter((file) => file.toLowerCase().endsWith('.png')) + .filter((file) => LEADING_DIGIT_RE.test(file)) + .sort((a, b) => a.localeCompare(b)) + .map((file) => resolve(dir, file)); +} + +function humanize(filePath: string): string { + return basename(filePath, '.png') + .replace(SCREENSHOT_PREFIX_RE, '') + .split('-') + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' '); +} + +function escapeHtml(value: string): string { + return value.replace(HTML_ESCAPE_RE, (char) => { + switch (char) { + case '&': + return '&'; + case '<': + return '<'; + case '>': + return '>'; + case '"': + return '"'; + case "'": + return '''; + default: + return char; + } + }); +} + +function buildHtml({ images, platform }: { images: string[]; platform: Platform }): string { + const isMac = platform === 'macos'; + const cardWidth = isMac ? 520 : 300; + const title = platform === 'ios' ? 'PackRat iOS Screens' : 'PackRat macOS Screens'; + const cards = images + .map((image) => { + const label = humanize(image); + return `
${escapeHtml(label)}
${escapeHtml(label)}
`; + }) + .join('\n'); + + return ` + + + + + + +

${escapeHtml(title)}

+
${cards}
+ +`; +} + +async function renderContactSheet(platform: Platform, outDir: string): Promise { + const screenshotDir = screenshotDirFor(outDir, platform); + const images = listScreenshots(screenshotDir); + if (images.length === 0) { + throw new Error(`No named screenshots found in ${screenshotDir}`); + } + + const htmlPath = resolve(outDir, `${platform}-contact-sheet.html`); + const outputPath = contactSheetPathFor(outDir, platform); + writeFileSync(htmlPath, buildHtml({ images, platform })); + + await screenshotHtml({ + htmlPath, + images, + outputPath, + platform, + }); + + return outputPath; +} + +async function screenshotHtml({ + htmlPath, + images, + outputPath, + platform, +}: { + htmlPath: string; + images: string[]; + outputPath: string; + platform: Platform; +}): Promise { + try { + const { chromium } = await import('@playwright/test'); + const browser = await chromium.launch(); + try { + const page = await browser.newPage({ + viewport: { width: platform === 'macos' ? 1800 : 1600, height: 1200 }, + deviceScaleFactor: 1, + }); + await page.goto(pathToFileURL(htmlPath).href); + await page.screenshot({ path: outputPath, fullPage: true }); + return; + } finally { + await browser.close(); + } + } catch (err) { + console.warn( + `Playwright screenshot unavailable; falling back to system Chrome. ${formatError(err)}`, + ); + } + + const chrome = CHROME_CANDIDATES.find((candidate) => existsSync(candidate)); + if (!chrome) { + throw new Error( + `No browser renderer found. Open ${htmlPath} manually, or run \`bunx playwright install chromium\`.`, + ); + } + + const width = platform === 'macos' ? 1800 : 1600; + const height = estimateContactSheetHeight({ images, platform, width }); + const result = spawnSync( + chrome, + [ + '--headless=new', + '--disable-gpu', + '--hide-scrollbars', + `--window-size=${width},${height}`, + `--screenshot=${outputPath}`, + pathToFileURL(htmlPath).href, + ], + { encoding: 'utf8' }, + ); + + if (result.status !== 0) { + throw new Error( + `Chrome screenshot failed: ${result.stderr || result.stdout || `exit ${result.status}`}`, + ); + } +} + +function estimateContactSheetHeight({ + images, + platform, + width, +}: { + images: string[]; + platform: Platform; + width: number; +}): number { + const horizontalPadding = 64; + const gridGap = 18; + const cardWidth = platform === 'macos' ? 520 : 300; + const columns = Math.max( + 1, + Math.floor((width - horizontalPadding + gridGap) / (cardWidth + gridGap)), + ); + const cardHeights = images.map((image) => { + const size = readImageSize(image); + if (!size) return platform === 'macos' ? 420 : 720; + return Math.ceil((size.height / size.width) * cardWidth) + 42; + }); + const rows: number[] = []; + for (let index = 0; index < cardHeights.length; index += columns) { + rows.push(Math.max(...cardHeights.slice(index, index + columns))); + } + return Math.max(1200, 116 + rows.reduce((sum, row) => sum + row, 0) + gridGap * rows.length); +} + +function readImageSize(image: string): { width: number; height: number } | null { + const result = spawnSync('sips', ['-g', 'pixelWidth', '-g', 'pixelHeight', image], { + encoding: 'utf8', + }); + if (result.status !== 0) return null; + const width = result.stdout.match(SIPS_PIXEL_WIDTH_RE)?.[1]; + const height = result.stdout.match(SIPS_PIXEL_HEIGHT_RE)?.[1]; + if (!width || !height) return null; + return { width: Number(width), height: Number(height) }; +} + +function formatError(err: unknown): string { + return err instanceof Error ? err.message : String(err); +} + +async function main() { + loadDotEnv(); + const options = parseArgs(process.argv.slice(2)); + mkdirSync(options.outDir, { recursive: true }); + + for (const platform of options.platforms) { + const dir = screenshotDirFor(options.outDir, platform); + mkdirSync(dir, { recursive: true }); + if (!options.skipTests) { + rmSync(dir, { recursive: true, force: true }); + mkdirSync(dir, { recursive: true }); + await runXcodeVisualTest(platform, dir); + } + const contactSheet = await renderContactSheet(platform, options.outDir); + console.log(`✓ ${platform} contact sheet: ${contactSheet}`); + } +} + +main().catch((err) => { + console.error(err instanceof Error ? err.message : String(err)); + process.exit(1); +}); diff --git a/package.json b/package.json index 2c1750d3d8..9c8f2fd6b7 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "swift:codegen": "swift package --package-path apps/swift/PackRatAPIClient plugin --allow-writing-to-package-directory generate-code-from-openapi && cp apps/swift/PackRatAPIClient/Sources/PackRatAPIClient/GeneratedSources/Client.swift apps/swift/Sources/PackRat/API/Client.swift && cp apps/swift/PackRatAPIClient/Sources/PackRatAPIClient/GeneratedSources/Types.swift apps/swift/Sources/PackRat/API/Types.swift", "swift:models": "bun run apps/swift/scripts/generate-swift-models.ts", "swift:quicktype": "bun run apps/swift/scripts/generate-quicktype-models.ts", + "swift:screenshots": "bun run apps/swift/scripts/capture-visual-screenshots.ts", "test:api:unit": "vitest run --config packages/api/vitest.unit.config.ts", "test:e2e:android": "bash .github/scripts/e2e.sh android", "test:e2e:ios": "bash .github/scripts/e2e.sh ios", From 09683a168ead552f7987e4a0b5db73227e890d56 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Mon, 25 May 2026 14:36:23 -0600 Subject: [PATCH 02/60] =?UTF-8?q?=F0=9F=99=88=20chore:=20ignore=20generate?= =?UTF-8?q?d=20artifacts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 66a3c6e390..323e4e8742 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ node_modules # output out dist +artifacts/ *.tgz # code coverage From 4153502e11463889b6cc4d0450d6ae7d008f89ac Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Mon, 25 May 2026 15:01:37 -0600 Subject: [PATCH 03/60] =?UTF-8?q?=F0=9F=A7=AA=20test(web):=20add=20visual?= =?UTF-8?q?=20screenshot=20matrix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/expo/package.json | 1 + .../playwright/capture-web-screenshots.ts | 115 ++++++++++++++++++ .../playwright/playwright.visual.config.ts | 22 ++++ apps/expo/playwright/tests/visual.spec.ts | 115 ++++++++++++++++++ package.json | 1 + 5 files changed, 254 insertions(+) create mode 100644 apps/expo/playwright/capture-web-screenshots.ts create mode 100644 apps/expo/playwright/playwright.visual.config.ts create mode 100644 apps/expo/playwright/tests/visual.spec.ts diff --git a/apps/expo/package.json b/apps/expo/package.json index 155d5f5b18..fea4588c63 100644 --- a/apps/expo/package.json +++ b/apps/expo/package.json @@ -36,6 +36,7 @@ "test": "vitest run", "test:coverage": "vitest run --coverage", "test:web": "playwright test --config playwright/playwright.config.ts", + "screenshots:web": "bun run playwright/capture-web-screenshots.ts", "test:web:ui": "playwright test --config playwright/playwright.config.ts --ui", "update:development": "APP_VARIANT=development eas update --branch development --environment development", "update:preview": "APP_VARIANT=preview eas update --branch preview --environment preview", diff --git a/apps/expo/playwright/capture-web-screenshots.ts b/apps/expo/playwright/capture-web-screenshots.ts new file mode 100644 index 0000000000..ede9c7e035 --- /dev/null +++ b/apps/expo/playwright/capture-web-screenshots.ts @@ -0,0 +1,115 @@ +#!/usr/bin/env bun +import { spawnSync } from 'node:child_process'; +import { mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; +import { basename, resolve } from 'node:path'; +import { pathToFileURL } from 'node:url'; +import { chromium } from '@playwright/test'; + +const REPO_ROOT = resolve(import.meta.dir, '../../..'); +const EXPO_DIR = resolve(REPO_ROOT, 'apps/expo'); +const OUT_DIR = resolve(REPO_ROOT, 'artifacts/screenshots'); +const WEB_DIR = resolve(OUT_DIR, 'web-playwright'); +const CONTACT_SHEET_HTML = resolve(OUT_DIR, 'web-contact-sheet.html'); +const CONTACT_SHEET_PNG = resolve(OUT_DIR, 'web-contact-sheet.png'); +const SORT_PREFIX_RE = /^\d+-/; +const WORD_START_RE = /\b\w/g; + +rmSync(WEB_DIR, { recursive: true, force: true }); +mkdirSync(WEB_DIR, { recursive: true }); + +const result = spawnSync( + 'bunx', + [ + 'playwright', + 'test', + '--config', + 'playwright/playwright.visual.config.ts', + '--grep', + 'Web visual screenshot matrix', + ], + { + cwd: EXPO_DIR, + env: { + ...process.env, + PACKRAT_VISUAL_SCREENSHOTS: '1', + }, + stdio: 'inherit', + }, +); + +await renderContactSheet(); + +if (result.status !== 0) { + process.exit(result.status ?? 1); +} + +async function renderContactSheet() { + const screenshots = readdirSync(WEB_DIR) + .filter((file) => file.endsWith('.png')) + .sort() + .map((file) => resolve(WEB_DIR, file)); + if (screenshots.length === 0) return; + + const cards = screenshots + .map((file) => { + const src = pathToFileURL(file).href; + const label = basename(file, '.png') + .replace(SORT_PREFIX_RE, '') + .replaceAll('-', ' ') + .replace(WORD_START_RE, (char) => char.toUpperCase()); + return `
${escapeHtml(label)}
`; + }) + .join('\n'); + + const html = ` + + + + + + +

PackRat Web Screens

+
${cards}
+ +`; + + writeFileSync(CONTACT_SHEET_HTML, html); + const browser = await chromium.launch({ headless: true }); + const page = await browser.newPage({ + viewport: { width: 1800, height: estimateHeight(screenshots) }, + }); + await page.goto(pathToFileURL(CONTACT_SHEET_HTML).href); + await page.screenshot({ path: CONTACT_SHEET_PNG, fullPage: true }); + await browser.close(); + + const bytes = readFileSync(CONTACT_SHEET_PNG).byteLength; + console.log(`✓ Wrote ${CONTACT_SHEET_PNG} (${Math.round(bytes / 1024)} KB)`); +} + +function estimateHeight(screenshots: string[]): number { + return Math.max(1200, Math.ceil(screenshots.length / 3) * 700 + 120); +} + +function escapeHtml(value: string): string { + return value.replace(/[&<>"']/g, (char) => { + switch (char) { + case '&': + return '&'; + case '<': + return '<'; + case '>': + return '>'; + case '"': + return '"'; + default: + return '''; + } + }); +} diff --git a/apps/expo/playwright/playwright.visual.config.ts b/apps/expo/playwright/playwright.visual.config.ts new file mode 100644 index 0000000000..943bd0c65a --- /dev/null +++ b/apps/expo/playwright/playwright.visual.config.ts @@ -0,0 +1,22 @@ +import { defineConfig, devices } from '@playwright/test'; + +const BASE_URL = process.env.BASE_URL ?? 'http://localhost:8081'; + +export default defineConfig({ + testDir: './tests', + timeout: 30_000, + expect: { timeout: 10_000 }, + fullyParallel: false, + workers: 1, + reporter: [['list']], + use: { + baseURL: BASE_URL, + headless: true, + }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], +}); diff --git a/apps/expo/playwright/tests/visual.spec.ts b/apps/expo/playwright/tests/visual.spec.ts new file mode 100644 index 0000000000..0ba870bbda --- /dev/null +++ b/apps/expo/playwright/tests/visual.spec.ts @@ -0,0 +1,115 @@ +import * as fs from 'node:fs'; +import * as path from 'node:path'; +import { expect, test } from '@playwright/test'; + +const REPO_ROOT = path.resolve(__dirname, '../../../..'); +const OUT_DIR = path.resolve(REPO_ROOT, 'artifacts/screenshots/web-playwright'); +const SHOULD_CAPTURE = process.env.PACKRAT_VISUAL_SCREENSHOTS === '1'; +const BASE_URL = process.env.BASE_URL ?? 'http://localhost:8081'; + +const routes = { + unauth: [ + ['00-unauth-welcome', '/auth?showSkipLoginBtn=true'], + ['01-unauth-login', '/auth/(login)'], + ['02-unauth-register-name', '/auth/(create-account)'], + ['03-unauth-register-credentials', '/auth/(create-account)/credentials'], + ['04-unauth-forgot-password', '/auth/(login)/forgot-password'], + ], + guest: [ + ['10-guest-home', '/'], + ['11-guest-packs', '/packs'], + ['12-guest-trips', '/trips'], + ['13-guest-catalog', '/catalog'], + ['14-guest-feed', '/feed'], + ['15-guest-profile', '/profile'], + ], + authenticated: [ + ['20-auth-home', '/'], + ['21-auth-packs', '/packs'], + ['22-auth-new-pack', '/pack/new'], + ['23-auth-trips', '/trips'], + ['24-auth-new-trip', '/trip/new'], + ['25-auth-catalog', '/catalog'], + ['26-auth-feed', '/feed'], + ['27-auth-compose-post', '/feed/create'], + ['28-auth-profile', '/profile'], + ['29-auth-settings', '/settings'], + ['30-auth-assistant', '/ai-chat'], + ['31-auth-weather', '/weather'], + ['32-auth-gear-inventory', '/gear-inventory'], + ['33-auth-pack-templates', '/pack-templates'], + ['34-auth-trail-conditions', '/trail-conditions'], + ['35-auth-guides', '/guides'], + ['36-auth-wildlife', '/wildlife'], + ['37-auth-season-suggestions', '/season-suggestions'], + ], +} as const; + +test.describe('Web visual screenshot matrix', () => { + test.skip(!SHOULD_CAPTURE, 'Set PACKRAT_VISUAL_SCREENSHOTS=1 to capture web screenshots.'); + + test.beforeAll(() => { + fs.rmSync(OUT_DIR, { recursive: true, force: true }); + fs.mkdirSync(OUT_DIR, { recursive: true }); + }); + + test('captures unauthenticated screens', async ({ page }) => { + await page.setViewportSize({ width: 1440, height: 1100 }); + for (const [name, route] of routes.unauth) { + await captureRoute(page, { name, route }); + } + }); + + test('captures guest screens', async ({ page }) => { + await page.setViewportSize({ width: 1440, height: 1100 }); + await page.goto(BASE_URL); + await page.evaluate(() => { + window.localStorage.clear(); + window.localStorage.setItem('skipped_login', 'true'); + }); + + for (const [name, route] of routes.guest) { + await captureRoute(page, { name, route }); + } + }); + + test('captures authenticated screens', async ({ page }) => { + await page.setViewportSize({ width: 1440, height: 1100 }); + await page.goto(BASE_URL); + await page.evaluate(() => { + window.localStorage.clear(); + window.localStorage.setItem('access_token', 'packrat-e2e-session'); + window.localStorage.setItem('refresh_token', 'packrat-e2e-refresh'); + window.localStorage.setItem( + 'user', + JSON.stringify({ + id: '00000000-0000-4000-8000-000000000001', + email: 'e2e@packrat.test', + name: 'E2E User', + firstName: 'E2E', + lastName: 'User', + role: 'user', + emailVerified: true, + }), + ); + }); + + for (const [name, route] of routes.authenticated) { + await captureRoute(page, { name, route }); + } + }); +}); + +async function captureRoute( + page: import('@playwright/test').Page, + { name, route }: { name: string; route: string }, +) { + await page.goto(`${BASE_URL}${route}`); + await page.waitForLoadState('domcontentloaded'); + await page.waitForLoadState('networkidle').catch(() => undefined); + await expect(page.locator('body')).toBeVisible(); + await page.screenshot({ + path: path.join(OUT_DIR, `${name}.png`), + fullPage: true, + }); +} diff --git a/package.json b/package.json index 9c8f2fd6b7..3128457ca9 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "swift:models": "bun run apps/swift/scripts/generate-swift-models.ts", "swift:quicktype": "bun run apps/swift/scripts/generate-quicktype-models.ts", "swift:screenshots": "bun run apps/swift/scripts/capture-visual-screenshots.ts", + "web:screenshots": "bun run --cwd apps/expo screenshots:web", "test:api:unit": "vitest run --config packages/api/vitest.unit.config.ts", "test:e2e:android": "bash .github/scripts/e2e.sh android", "test:e2e:ios": "bash .github/scripts/e2e.sh ios", From f0d1c0dc4b1c46f4356bca045b3fcbdc079ab546 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Mon, 25 May 2026 15:01:50 -0600 Subject: [PATCH 04/60] =?UTF-8?q?=F0=9F=A7=AA=20test(swift):=20capture=20a?= =?UTF-8?q?uthenticated=20visual=20states?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/PackRat/Network/AuthManager.swift | 210 +++++++++++++++++- .../VisualScreenshotTests.swift | 97 ++++---- 2 files changed, 262 insertions(+), 45 deletions(-) diff --git a/apps/swift/Sources/PackRat/Network/AuthManager.swift b/apps/swift/Sources/PackRat/Network/AuthManager.swift index 7c34e67daa..d460b8cef3 100644 --- a/apps/swift/Sources/PackRat/Network/AuthManager.swift +++ b/apps/swift/Sources/PackRat/Network/AuthManager.swift @@ -1,12 +1,20 @@ import Foundation import Observation +#if os(iOS) +import AuthenticationServices +import GoogleSignIn +import UIKit +#endif @Observable final class AuthManager { var currentUser: User? + var isGuest = false var isAuthenticated: Bool { currentUser != nil } + var canUseApp: Bool { isAuthenticated || isGuest } private let apiClient: APIClient + private let skippedLoginKey = "skipped_login" init(apiClient: APIClient = .shared) { self.apiClient = apiClient @@ -14,6 +22,12 @@ final class AuthManager { // starts at the login screen. if ProcessInfo.processInfo.arguments.contains("--reset-auth") { KeychainService.shared.clearTokens() + UserDefaults.standard.removeObject(forKey: "current_user") + UserDefaults.standard.removeObject(forKey: skippedLoginKey) + } + if ProcessInfo.processInfo.arguments.contains("--seed-e2e-auth") { + seedE2EAuthenticatedUser() + return } loadStoredUser() } @@ -47,6 +61,117 @@ final class AuthManager { SentryConfig.setUser(id: response.user.id, email: response.user.email) } + func continueWithoutLogin() { + KeychainService.shared.clearTokens() + UserDefaults.standard.set(true, forKey: skippedLoginKey) + currentUser = nil + isGuest = true + SentryConfig.clearUser() + } + + func loginWithSocialIDToken( + provider: SocialProvider, + token: String, + firstName: String? = nil, + lastName: String? = nil, + email: String? = nil + ) async throws { + struct SocialBody: Encodable { + struct IDToken: Encodable { + struct ProviderUser: Encodable { + struct Name: Encodable { + let firstName: String? + let lastName: String? + } + + let name: Name? + let email: String? + } + + let token: String + let user: ProviderUser? + } + + let provider: String + let idToken: IDToken + } + struct SocialResponse: Decodable { + let token: String? + let user: User + } + + let providerUser: SocialBody.IDToken.ProviderUser? + if firstName != nil || lastName != nil || email != nil { + providerUser = SocialBody.IDToken.ProviderUser( + name: .init(firstName: firstName, lastName: lastName), + email: email + ) + } else { + providerUser = nil + } + + let endpoint = Endpoint( + .post, + "/api/auth/sign-in/social", + body: SocialBody( + provider: provider.rawValue, + idToken: .init(token: token, user: providerUser) + ), + requiresAuth: false + ) + let response: SocialResponse = try await apiClient.send(endpoint) + + if let token = response.token, !token.isEmpty { + KeychainService.shared.saveSessionToken(token) + } + UserDefaults.standard.removeObject(forKey: skippedLoginKey) + await MainActor.run { + isGuest = false + currentUser = response.user + } + persistUser(response.user) + SentryConfig.setUser(id: response.user.id, email: response.user.email) + } + + #if os(iOS) + @MainActor + func loginWithApple(credential: ASAuthorizationAppleIDCredential) async throws { + guard let data = credential.identityToken, + let token = String(data: data, encoding: .utf8), + !token.isEmpty + else { + throw PackRatError.httpError(statusCode: 400, message: "Apple did not return an identity token.") + } + + try await loginWithSocialIDToken( + provider: .apple, + token: token, + firstName: credential.fullName?.givenName, + lastName: credential.fullName?.familyName, + email: credential.email + ) + } + + @MainActor + func loginWithGoogle() async throws { + guard let clientID = Bundle.main.object(forInfoDictionaryKey: "GOOGLE_IOS_CLIENT_ID") as? String, + !clientID.isEmpty + else { + throw PackRatError.httpError(statusCode: 500, message: "Missing Google iOS client ID.") + } + guard let presenting = UIApplication.shared.firstKeyWindow?.rootViewController else { + throw PackRatError.httpError(statusCode: 500, message: "Unable to present Google sign-in.") + } + + GIDSignIn.sharedInstance.configuration = GIDConfiguration(clientID: clientID) + let result = try await GIDSignIn.sharedInstance.signIn(withPresenting: presenting) + guard let token = result.user.idToken?.tokenString, !token.isEmpty else { + throw PackRatError.httpError(statusCode: 400, message: "Google did not return an identity token.") + } + try await loginWithSocialIDToken(provider: .google, token: token) + } + #endif + /// Creates a new account via Better Auth's email/password sign-up. /// Better Auth requires a `name` field; we synthesize it from /// firstName + lastName and also pass each piece through the @@ -95,6 +220,42 @@ final class AuthManager { SentryConfig.setUser(id: response.user.id, email: response.user.email) } + func requestPasswordReset(email: String) async throws { + struct ResetRequestBody: Encodable { let email: String } + struct ResetResponse: Decodable { + let success: Bool + let message: String + } + + let endpoint = Endpoint( + .post, + "/api/password-reset/request", + body: ResetRequestBody(email: email), + requiresAuth: false + ) + _ = try await apiClient.send(endpoint, as: ResetResponse.self) + } + + func resetPassword(email: String, code: String, newPassword: String) async throws { + struct ResetVerifyBody: Encodable { + let email: String + let code: String + let newPassword: String + } + struct ResetResponse: Decodable { + let success: Bool + let message: String + } + + let endpoint = Endpoint( + .post, + "/api/password-reset/verify", + body: ResetVerifyBody(email: email, code: code, newPassword: newPassword), + requiresAuth: false + ) + _ = try await apiClient.send(endpoint, as: ResetResponse.self) + } + /// Signs out via Better Auth. We ignore failures so a stale/expired /// session token still clears local state. func logout() async throws { @@ -123,6 +284,8 @@ final class AuthManager { func signOut() { KeychainService.shared.clearTokens() UserDefaults.standard.removeObject(forKey: "current_user") + UserDefaults.standard.removeObject(forKey: skippedLoginKey) + isGuest = false currentUser = nil SentryConfig.clearUser() } @@ -139,8 +302,53 @@ final class AuthManager { guard KeychainService.shared.sessionToken != nil, let data = UserDefaults.standard.data(forKey: "current_user"), let user = try? JSONDecoder().decode(User.self, from: data) - else { return } + else { + isGuest = UserDefaults.standard.bool(forKey: skippedLoginKey) + return + } + currentUser = user + isGuest = false + SentryConfig.setUser(id: user.id, email: user.email) + } + + private func seedE2EAuthenticatedUser() { + let environment = ProcessInfo.processInfo.environment + let email = environment["PACKRAT_E2E_EMAIL"] ?? "e2e@packrat.test" + let user = User( + id: environment["PACKRAT_E2E_USER_ID"] ?? "00000000-0000-4000-8000-000000000001", + email: email, + name: environment["PACKRAT_E2E_NAME"] ?? "E2E User", + firstName: environment["PACKRAT_E2E_FIRST_NAME"] ?? "E2E", + lastName: environment["PACKRAT_E2E_LAST_NAME"] ?? "User", + role: environment["PACKRAT_E2E_ROLE"] ?? "user", + emailVerified: true, + avatarUrl: nil, + createdAt: nil, + updatedAt: nil + ) + + KeychainService.shared.saveSessionToken( + environment["PACKRAT_E2E_SESSION_TOKEN"] ?? "packrat-e2e-session" + ) + persistUser(user) + isGuest = false currentUser = user SentryConfig.setUser(id: user.id, email: user.email) } } + +enum SocialProvider: String { + case apple + case google +} + +#if os(iOS) +private extension UIApplication { + var firstKeyWindow: UIWindow? { + connectedScenes + .compactMap { $0 as? UIWindowScene } + .flatMap(\.windows) + .first { $0.isKeyWindow } + } +} +#endif diff --git a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift index 5628bcb69f..4262f33f20 100644 --- a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift +++ b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift @@ -52,7 +52,7 @@ final class VisualScreenshotTests: XCTestCase { } func testAuthenticatedVisualSurface() throws { - try signIn() + launchAuthenticated() capture("20-auth-home") #if os(iOS) @@ -63,7 +63,7 @@ final class VisualScreenshotTests: XCTestCase { } func testAuthenticatedModalSurface() throws { - try signIn() + launchAuthenticated() #if os(iOS) capturePhoneModalSurface(mode: .authenticated) @@ -278,34 +278,50 @@ final class VisualScreenshotTests: XCTestCase { } private func tapAndCapture(button label: String, name: String) { - let button = app.buttons[label] - guard button.waitForExistence(timeout: 3) else { return } - if button.isHittable { - button.tap() - } else { - activate(button) - } + guard let button = findButton(label: label, timeout: 3) else { return } + activate(button) capture(name) dismissPresentedSurface() } private func tapAndCapture(identifier: String, name: String) { - let button = app.buttons[identifier] - guard button.waitForExistence(timeout: 3) else { return } - if button.isHittable { - button.tap() - } else { - activate(button) - } + guard let button = findButton(identifier: identifier, timeout: 3) else { return } + activate(button) capture(name) dismissPresentedSurface() } + private func findButton(label: String, timeout: TimeInterval) -> XCUIElement? { + let query = app.buttons.matching(NSPredicate(format: "label == %@", label)) + return findConcreteElement(in: query, timeout: timeout) + } + + private func findButton(identifier: String, timeout: TimeInterval) -> XCUIElement? { + let query = app.buttons.matching(identifier: identifier) + return findConcreteElement(in: query, timeout: timeout) + } + + private func findConcreteElement(in query: XCUIElementQuery, timeout: TimeInterval) -> XCUIElement? { + guard query.firstMatch.waitForExistence(timeout: timeout) else { return nil } + for element in query.allElementsBoundByIndex where element.exists && element.isHittable { + return element + } + return query.firstMatch.exists ? query.firstMatch : nil + } + private func activate(_ element: XCUIElement) { #if os(macOS) - element.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).click() + if element.isHittable { + element.click() + } else { + element.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).click() + } #else - element.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).tap() + if element.isHittable { + element.tap() + } else { + element.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).tap() + } #endif } @@ -329,36 +345,29 @@ final class VisualScreenshotTests: XCTestCase { #endif } - private func signIn() throws { + private func launchAuthenticated() { let bundle = Bundle(for: VisualScreenshotTests.self) - let email = (bundle.object(forInfoDictionaryKey: "PACKRAT_E2E_EMAIL") as? String) ?? "" - let password = (bundle.object(forInfoDictionaryKey: "PACKRAT_E2E_PASSWORD") as? String) ?? "" - guard !email.isEmpty, !password.isEmpty else { - throw XCTSkip("PACKRAT_E2E_EMAIL / PACKRAT_E2E_PASSWORD are required for authenticated screenshots.") - } - - let signIn = app.buttons["auth_sign_in"] - XCTAssertTrue(signIn.waitForExistence(timeout: 10)) - signIn.tap() - - let emailField = app.textFields["login_email"] - XCTAssertTrue(emailField.waitForExistence(timeout: 10)) - emailField.tap() - emailField.typeText(email) - - let passwordField = app.secureTextFields["login_password"] - passwordField.tap() - passwordField.typeText(password) + let email = (bundle.object(forInfoDictionaryKey: "PACKRAT_E2E_EMAIL") as? String) + ?? "e2e@packrat.test" + let userId = ProcessInfo.processInfo.environment["E2E_TEST_USER_ID"] + ?? "00000000-0000-4000-8000-000000000001" + app.terminate() + app = XCUIApplication() + app.launchArguments = [ + "--disable-animations", + "--use-userdefaults-auth", + "--reset-auth", + "--seed-e2e-auth", + ] + app.launchEnvironment["PACKRAT_VISUAL_SCREENSHOTS"] = "1" + app.launchEnvironment["PACKRAT_E2E_EMAIL"] = email + app.launchEnvironment["PACKRAT_E2E_USER_ID"] = userId + app.launch() #if os(macOS) - app.typeText("\u{1b}") + app.activate() #endif - app.buttons["login_submit"].tap() - - guard waitForAuthenticatedShell() else { - capture("20-auth-sign-in-blocked") - throw XCTSkip("Authenticated visual surface unavailable: sign-in did not reach the app shell.") - } + XCTAssertTrue(waitForAuthenticatedShell(), "Authenticated visual shell must launch from seeded E2E state") } private func waitForAuthenticatedShell() -> Bool { From 81932fe520d11f91ca14949f58aca779cce69a03 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Mon, 25 May 2026 15:05:08 -0600 Subject: [PATCH 05/60] =?UTF-8?q?=F0=9F=90=9B=20fix(web):=20provide=20bott?= =?UTF-8?q?om=20sheet=20context?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/expo/providers/index.web.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/expo/providers/index.web.tsx b/apps/expo/providers/index.web.tsx index 9d5b4b1bb7..aef865537a 100644 --- a/apps/expo/providers/index.web.tsx +++ b/apps/expo/providers/index.web.tsx @@ -1,3 +1,4 @@ +import { BottomSheetModalProvider } from '@gorhom/bottom-sheet'; import { PortalHost } from '@rn-primitives/portal'; import { ErrorBoundary } from 'expo-app/components/initial/ErrorBoundary'; import type { ReactNode } from 'react'; @@ -11,7 +12,6 @@ import { TanstackProvider } from './TanstackProvider'; * Web version of Providers. * Removes native-only providers: * - KeyboardProvider (react-native-keyboard-controller — no web support) - * - BottomSheetModalProvider (@gorhom/bottom-sheet — native module dependency) * - ActionSheetProvider (@expo/react-native-action-sheet uses React.Children.only which breaks on web) * Metro automatically picks this file over providers/index.tsx for web builds. */ @@ -22,7 +22,7 @@ export function Providers({ children }: { children: ReactNode }) { - {children} + {children} From 925a7de4e354a1895b49defd7fd293031c02d2a9 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Mon, 25 May 2026 18:22:31 -0600 Subject: [PATCH 06/60] =?UTF-8?q?=E2=99=BF=EF=B8=8F=20test(swift):=20polis?= =?UTF-8?q?h=20native=20flows?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/swift/Resources/Info-iOS.plist | 10 + apps/swift/Sources/PackRat/AppState.swift | 3 + .../Features/AIPacks/AIPacksView.swift | 8 +- .../PackRat/Features/Auth/AuthGateView.swift | 58 +- .../Features/Auth/AuthWelcomeView.swift | 62 +++ .../PackRat/Features/Auth/LoginView.swift | 221 ++++++-- .../Features/Auth/PasswordResetViews.swift | 215 ++++++++ .../PackRat/Features/Auth/RegisterView.swift | 44 +- .../Features/Catalog/CatalogView.swift | 47 +- .../PackRat/Features/Chat/ChatView.swift | 38 +- .../Features/Feed/ComposePostView.swift | 1 + .../PackRat/Features/Feed/FeedView.swift | 16 +- .../GearInventory/GearInventoryView.swift | 6 +- .../PackRat/Features/Guides/GuidesView.swift | 13 +- .../PackRat/Features/Home/HomeView.swift | 508 +++++++++++++----- .../PackTemplates/PackTemplateFormView.swift | 2 + .../PackTemplateItemFormView.swift | 12 +- .../PackTemplates/PackTemplatesView.swift | 19 +- .../Features/Packs/PackDetailView.swift | 3 + .../PackRat/Features/Packs/PackFormView.swift | 13 +- .../Features/Packs/PackItemFormView.swift | 126 ++--- .../PackRat/Features/Packs/PackItemRow.swift | 2 + .../Features/Packs/PackWindowView.swift | 4 +- .../Features/Packs/PacksListView.swift | 4 +- .../Features/Packs/PacksViewModel.swift | 251 ++++++++- .../Features/Packs/RecentPacksView.swift | 1 + .../Features/Profile/ProfileView.swift | 242 +++++---- .../SeasonSuggestionsView.swift | 64 +-- .../Features/Shopping/ShoppingListView.swift | 14 +- .../TrailConditions/TrailConditionsView.swift | 36 +- .../TrailConditionsViewModel.swift | 3 + .../Features/Trips/TripDetailView.swift | 105 ++-- .../PackRat/Features/Trips/TripFormView.swift | 33 +- .../Features/Trips/TripWindowView.swift | 6 +- .../Features/Trips/TripsListView.swift | 3 +- .../Features/Trips/TripsViewModel.swift | 143 ++++- .../Weather/WeatherAlertPreferencesView.swift | 20 + .../Features/Weather/WeatherView.swift | 113 ++-- .../Features/Wildlife/WildlifeView.swift | 46 +- .../PackRat/Navigation/AppNavigation.swift | 187 +++++-- .../Sources/PackRat/Network/APIClient.swift | 30 +- .../PackRat/Network/KeychainService.swift | 19 + .../PackRat/Services/CatalogService.swift | 2 +- .../PackRat/Shared/EmptyStateView.swift | 1 + .../Sources/PackRat/Shared/ErrorView.swift | 76 ++- .../Tests/PackRatUITests/AppUITestCase.swift | 142 ++++- .../Tests/PackRatUITests/AuthTests.swift | 169 +++++- .../PackRatUITests/CatalogMacOSTests.swift | 15 +- .../Tests/PackRatUITests/CatalogTests.swift | 16 +- .../Tests/PackRatUITests/FeedMacOSTests.swift | 3 +- .../PackRatUITests/MoreTabsMacOSTests.swift | 19 +- .../Tests/PackRatUITests/MoreTabsTests.swift | 76 ++- .../PackRatUITests/NavigationMacOSTests.swift | 99 +++- .../PackRatUITests/NavigationTests.swift | 8 +- .../Tests/PackRatUITests/PackMacOSTests.swift | 38 +- .../PackSubFlowMacOSTests.swift | 33 +- .../PackRatUITests/PackSubFlowTests.swift | 2 +- .../PackTemplateMacOSTests.swift | 4 +- .../SeasonSuggestionsMacOSTests.swift | 23 +- .../SeasonSuggestionsTests.swift | 39 +- .../TrailConditionMacOSTests.swift | 17 +- .../Tests/PackRatUITests/TripMacOSTests.swift | 24 +- .../Tests/PackRatUITests/TripTests.swift | 9 +- .../VisualScreenshotTests.swift | 72 ++- .../PackRatUITests/WeatherMacOSTests.swift | 29 +- .../WeatherSubFlowMacOSTests.swift | 53 +- .../PackRatUITests/WeatherSubFlowTests.swift | 11 +- .../Tests/PackRatUITests/WeatherTests.swift | 51 +- apps/swift/project.yml | 19 +- .../scripts/capture-visual-screenshots.ts | 53 ++ apps/swift/scripts/run-e2e-macos.ts | 82 ++- apps/swift/scripts/run-e2e.ts | 44 +- 72 files changed, 3031 insertions(+), 949 deletions(-) create mode 100644 apps/swift/Sources/PackRat/Features/Auth/AuthWelcomeView.swift create mode 100644 apps/swift/Sources/PackRat/Features/Auth/PasswordResetViews.swift diff --git a/apps/swift/Resources/Info-iOS.plist b/apps/swift/Resources/Info-iOS.plist index 8000e467f7..1d5666e420 100644 --- a/apps/swift/Resources/Info-iOS.plist +++ b/apps/swift/Resources/Info-iOS.plist @@ -36,11 +36,21 @@ com.andrewbierman.packrat + + CFBundleURLName + world.packrat.google + CFBundleURLSchemes + + com.googleusercontent.apps.993694750638-97t0vhfml04u2avrlbve22jbs9qcinbc + + CFBundleVersion 1 ITSAppUsesNonExemptEncryption + GOOGLE_IOS_CLIENT_ID + 993694750638-97t0vhfml04u2avrlbve22jbs9qcinbc.apps.googleusercontent.com LSRequiresIPhoneOS NSAppTransportSecurity diff --git a/apps/swift/Sources/PackRat/AppState.swift b/apps/swift/Sources/PackRat/AppState.swift index 5410119260..2a43954e55 100644 --- a/apps/swift/Sources/PackRat/AppState.swift +++ b/apps/swift/Sources/PackRat/AppState.swift @@ -23,4 +23,7 @@ final class AppState { // Active nav item var navItem: NavItem = .home + + // App-wide presentation + var isGlobalSearchPresented = false } diff --git a/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift b/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift index e4b0aabc0b..ed4b2b9177 100644 --- a/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift +++ b/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift @@ -19,7 +19,13 @@ struct AIPacksView: View { var body: some View { Group { - if authManager.currentUser?.isAdmin == true { + if !authManager.isAuthenticated { + EmptyStateView( + "Sign In to Generate AI Packs", + subtitle: "AI pack generation runs on your PackRat account and is not available in guest mode.", + systemImage: "sparkles" + ) + } else if authManager.currentUser?.isAdmin == true { adminContent } else { ContentUnavailableView( diff --git a/apps/swift/Sources/PackRat/Features/Auth/AuthGateView.swift b/apps/swift/Sources/PackRat/Features/Auth/AuthGateView.swift index f38cb38804..ab27db8fef 100644 --- a/apps/swift/Sources/PackRat/Features/Auth/AuthGateView.swift +++ b/apps/swift/Sources/PackRat/Features/Auth/AuthGateView.swift @@ -1,22 +1,28 @@ import SwiftUI +#if os(iOS) +import GoogleSignIn +#endif struct AuthGateView: View { @Environment(AuthManager.self) private var authManager - @State private var showRegister = false + @State private var route: AuthRoute = .welcome var body: some View { Group { - if authManager.isAuthenticated { + if authManager.canUseApp { AppNavigation() - } else if showRegister { - RegisterView(onLoginTapped: { showRegister = false }) } else { - LoginView(onRegisterTapped: { showRegister = true }) + authContent } } - .animation(.spring(duration: 0.3), value: authManager.isAuthenticated) - .animation(.spring(duration: 0.3), value: showRegister) + .animation(.spring(duration: 0.3), value: authManager.canUseApp) + .animation(.spring(duration: 0.3), value: route) .onOpenURL { url in + #if os(iOS) + if GIDSignIn.sharedInstance.handle(url) { + return + } + #endif let link = DeepLink.parse(url) // Routing per destination is deferred — the scheme handler is wired here // so deep links surface via Sentry breadcrumbs (once U9 lands) and the @@ -25,4 +31,42 @@ struct AuthGateView: View { print("[DeepLink] received \(url) → \(link)") } } + + @ViewBuilder + private var authContent: some View { + switch route { + case .welcome: + AuthWelcomeView( + onSignUpTapped: { route = .register }, + onEmailSignInTapped: { route = .login }, + onContinueWithoutLoginTapped: { authManager.continueWithoutLogin() } + ) + case .login: + LoginView( + onRegisterTapped: { route = .register }, + onForgotPasswordTapped: { route = .forgotPassword } + ) + case .register: + RegisterView(onLoginTapped: { route = .login }) + case .forgotPassword: + ForgotPasswordView( + onCodeSent: { email in route = .resetPassword(email: email) }, + onLoginTapped: { route = .login } + ) + case .resetPassword(let email): + ResetPasswordView( + email: email, + onPasswordReset: { route = .login }, + onBack: { route = .forgotPassword } + ) + } + } +} + +private enum AuthRoute: Hashable { + case welcome + case login + case register + case forgotPassword + case resetPassword(email: String) } diff --git a/apps/swift/Sources/PackRat/Features/Auth/AuthWelcomeView.swift b/apps/swift/Sources/PackRat/Features/Auth/AuthWelcomeView.swift new file mode 100644 index 0000000000..fb2ff8dee0 --- /dev/null +++ b/apps/swift/Sources/PackRat/Features/Auth/AuthWelcomeView.swift @@ -0,0 +1,62 @@ +import SwiftUI + +struct AuthWelcomeView: View { + let onSignUpTapped: () -> Void + let onEmailSignInTapped: () -> Void + let onContinueWithoutLoginTapped: () -> Void + + var body: some View { + authContainer { + VStack(spacing: 24) { + AuthHeader(title: "PackRat", subtitle: "Plan better. Pack smarter.", symbol: "backpack.fill") + + VStack(spacing: 10) { + Button(action: onSignUpTapped) { + Text("Sign Up Free") + .frame(maxWidth: .infinity) + } + .buttonStyle(.borderedProminent) + .controlSize(.large) + .accessibilityIdentifier("auth_signup_free") + + Button(action: onContinueWithoutLoginTapped) { + Label("Continue as Guest", systemImage: "person.crop.circle") + .frame(maxWidth: .infinity) + } + .buttonStyle(.bordered) + .controlSize(.large) + .accessibilityIdentifier("auth_continue_without_login") + } + + Button(action: onEmailSignInTapped) { + Text("Already have an account? Sign In") + .font(.callout) + .frame(maxWidth: .infinity) + .padding(.vertical, 8) + } + .buttonStyle(.plain) + .foregroundStyle(.tint) + .contentShape(Rectangle()) + .accessibilityIdentifier("auth_sign_in") + } + } + } +} + +struct InlineInfoView: View { + let message: String + + var body: some View { + HStack(alignment: .firstTextBaseline, spacing: 8) { + Image(systemName: "info.circle.fill") + .foregroundStyle(.blue) + Text(message) + .font(.callout) + .foregroundStyle(.secondary) + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(12) + .background(.blue.opacity(0.08), in: RoundedRectangle(cornerRadius: 10, style: .continuous)) + .accessibilityIdentifier("auth_info_message") + } +} diff --git a/apps/swift/Sources/PackRat/Features/Auth/LoginView.swift b/apps/swift/Sources/PackRat/Features/Auth/LoginView.swift index 731b20d479..270246329c 100644 --- a/apps/swift/Sources/PackRat/Features/Auth/LoginView.swift +++ b/apps/swift/Sources/PackRat/Features/Auth/LoginView.swift @@ -1,8 +1,12 @@ import SwiftUI +#if os(iOS) +import AuthenticationServices +#endif struct LoginView: View { @Environment(AuthManager.self) private var authManager let onRegisterTapped: () -> Void + let onForgotPasswordTapped: () -> Void @State private var email = "" @State private var password = "" @@ -11,68 +15,110 @@ struct LoginView: View { var body: some View { authContainer { - VStack(spacing: 24) { - header + VStack(spacing: 22) { + AuthHeader(title: "Sign In", subtitle: "Access your packs, trips, and saved gear.", symbol: "backpack.fill") - VStack(spacing: 14) { + VStack(spacing: 0) { TextField("Email", text: $email) - .textFieldStyle(.roundedBorder) .textContentType(.emailAddress) #if os(iOS) .keyboardType(.emailAddress) .autocapitalization(.none) #endif .autocorrectionDisabled() + .padding(.horizontal, 14) + .padding(.vertical, 12) .accessibilityIdentifier("login_email") + Divider().padding(.leading, 14) + SecureField("Password", text: $password) - .textFieldStyle(.roundedBorder) .textContentType(.password) .onSubmit { submit() } + .padding(.horizontal, 14) + .padding(.vertical, 12) .accessibilityIdentifier("login_password") } + .authGroupedSurface() if let error { InlineErrorView(message: error) } - Button(action: submit) { - Group { - if isLoading { - ProgressView().controlSize(.small) - } else { - Text("Sign In") - .frame(maxWidth: .infinity) + VStack(spacing: 12) { + Button(action: submit) { + Group { + if isLoading { + ProgressView().controlSize(.small) + } else { + Text("Sign In") + .frame(maxWidth: .infinity) + } } + .frame(maxWidth: .infinity) } - .frame(maxWidth: .infinity) - .padding(.vertical, 2) - } - .buttonStyle(.borderedProminent) - .controlSize(.large) - .disabled(isLoading || email.isEmpty || password.isEmpty) - .accessibilityIdentifier("login_submit") + .buttonStyle(.borderedProminent) + .controlSize(.large) + .disabled(isLoading || email.isEmpty || password.isEmpty) + .accessibilityIdentifier("login_submit") - Divider() + Button("Forgot Password?", action: onForgotPasswordTapped) + .buttonStyle(.plain) + .font(.callout) + .foregroundStyle(.tint) + .accessibilityIdentifier("forgot_password_link") + } Button("Don't have an account? Sign Up", action: onRegisterTapped) .buttonStyle(.plain) .foregroundStyle(.tint) .font(.callout) - } - } - } - private var header: some View { - VStack(spacing: 8) { - Image(systemName: "backpack.fill") - .font(.system(size: 48)) - .foregroundStyle(.tint) - Text("PackRat") - .font(.largeTitle.bold()) - Text("Plan better. Pack smarter.") - .font(.callout) - .foregroundStyle(.secondary) + VStack(spacing: 10) { + HStack(spacing: 12) { + Divider() + Text("Or continue with") + .font(.footnote) + .foregroundStyle(.secondary) + .lineLimit(1) + Divider() + } + + #if os(iOS) + Button { + signInWithGoogle() + } label: { + Label("Continue with Google", systemImage: "g.circle") + .frame(maxWidth: .infinity) + } + .buttonStyle(.bordered) + .controlSize(.large) + .disabled(isLoading) + .accessibilityIdentifier("auth_google") + + SignInWithAppleButton(.continue) { request in + request.requestedScopes = [.fullName, .email] + } onCompletion: { result in + signInWithApple(result) + } + .signInWithAppleButtonStyle(.whiteOutline) + .frame(height: 44) + .clipShape(RoundedRectangle(cornerRadius: 10, style: .continuous)) + .disabled(isLoading) + .accessibilityIdentifier("auth_apple") + #else + Button { + error = "Google sign-in is available in the iOS app. Use email sign-in on macOS for now." + } label: { + Label("Continue with Google", systemImage: "g.circle") + .frame(maxWidth: .infinity) + } + .buttonStyle(.bordered) + .controlSize(.large) + .accessibilityIdentifier("auth_google") + #endif + } + } } } @@ -89,6 +135,44 @@ struct LoginView: View { } } } + + #if os(iOS) + private func signInWithGoogle() { + guard !isLoading else { return } + isLoading = true + error = nil + Task { + defer { isLoading = false } + do { + try await authManager.loginWithGoogle() + } catch { + self.error = error.localizedDescription + } + } + } + + private func signInWithApple(_ result: Result) { + error = nil + switch result { + case .success(let authorization): + guard let credential = authorization.credential as? ASAuthorizationAppleIDCredential else { + error = "Apple did not return a usable credential." + return + } + isLoading = true + Task { + defer { isLoading = false } + do { + try await authManager.loginWithApple(credential: credential) + } catch { + self.error = error.localizedDescription + } + } + case .failure(let error): + self.error = error.localizedDescription + } + } + #endif } @ViewBuilder @@ -96,14 +180,81 @@ func authContainer(@ViewBuilder content: () -> Content) -> some V #if os(macOS) content() .padding(40) - .frame(width: 360) + .frame(width: 400) .frame(maxHeight: .infinity) .background(.background) #else ScrollView { content() - .padding(32) + .padding(.horizontal, 24) + .padding(.vertical, 36) + .frame(maxWidth: 430) + .frame(maxWidth: .infinity) } .frame(maxWidth: .infinity, maxHeight: .infinity) + .scrollDismissesKeyboard(.interactively) #endif } + +struct AuthHeader: View { + let title: String + let subtitle: String + let symbol: String + + var body: some View { + VStack(spacing: 12) { + Image(systemName: symbol) + .font(.system(size: 42, weight: .semibold)) + .foregroundStyle(.tint) + .symbolRenderingMode(.hierarchical) + + VStack(spacing: 5) { + Text(title) + .font(.largeTitle.bold()) + .multilineTextAlignment(.center) + Text(subtitle) + .font(.callout) + .foregroundStyle(.secondary) + .multilineTextAlignment(.center) + } + } + } +} + +struct AuthRowButton: View { + let title: String + let symbol: String + let action: () -> Void + + var body: some View { + Button(action: action) { + HStack(spacing: 12) { + Image(systemName: symbol) + .font(.body.weight(.semibold)) + .foregroundStyle(.tint) + .frame(width: 24) + Text(title) + .foregroundStyle(.primary) + Spacer() + Image(systemName: "chevron.right") + .font(.footnote.weight(.semibold)) + .foregroundStyle(.tertiary) + } + .padding(.horizontal, 14) + .padding(.vertical, 12) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + } +} + +extension View { + func authGroupedSurface() -> some View { + self + .background(.background.secondary, in: RoundedRectangle(cornerRadius: 12, style: .continuous)) + .overlay { + RoundedRectangle(cornerRadius: 12, style: .continuous) + .strokeBorder(.separator.opacity(0.35), lineWidth: 0.5) + } + } +} diff --git a/apps/swift/Sources/PackRat/Features/Auth/PasswordResetViews.swift b/apps/swift/Sources/PackRat/Features/Auth/PasswordResetViews.swift new file mode 100644 index 0000000000..2f3c87151e --- /dev/null +++ b/apps/swift/Sources/PackRat/Features/Auth/PasswordResetViews.swift @@ -0,0 +1,215 @@ +import SwiftUI + +struct ForgotPasswordView: View { + @Environment(AuthManager.self) private var authManager + let onCodeSent: (String) -> Void + let onLoginTapped: () -> Void + + @State private var email = "" + @State private var isLoading = false + @State private var error: String? + + private var canSubmit: Bool { + !email.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty && !isLoading + } + + var body: some View { + authContainer { + VStack(spacing: 24) { + header + + VStack(spacing: 14) { + TextField("Email", text: $email) + .textFieldStyle(.roundedBorder) + .textContentType(.emailAddress) + #if os(iOS) + .keyboardType(.emailAddress) + .autocapitalization(.none) + #endif + .autocorrectionDisabled() + .onSubmit { submit() } + .accessibilityIdentifier("forgot_password_email") + + if let error { + InlineErrorView(message: error) + } + + Button(action: submit) { + Group { + if isLoading { + ProgressView().controlSize(.small) + } else { + Text("Send Code") + .frame(maxWidth: .infinity) + } + } + .frame(maxWidth: .infinity) + .padding(.vertical, 2) + } + .buttonStyle(.borderedProminent) + .controlSize(.large) + .disabled(!canSubmit) + .accessibilityIdentifier("forgot_password_submit") + } + + Divider() + + Button("Back to Sign In", action: onLoginTapped) + .buttonStyle(.plain) + .foregroundStyle(.tint) + .font(.callout) + .accessibilityIdentifier("forgot_password_back") + } + } + } + + private var header: some View { + VStack(spacing: 8) { + Image(systemName: "lock.rotation") + .font(.system(size: 46)) + .foregroundStyle(.tint) + Text("Reset Password") + .font(.largeTitle.bold()) + Text("Enter your email and we'll send a 6-digit reset code.") + .font(.callout) + .foregroundStyle(.secondary) + .multilineTextAlignment(.center) + } + } + + private func submit() { + let trimmedEmail = email.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmedEmail.isEmpty, !isLoading else { return } + isLoading = true + error = nil + Task { + defer { isLoading = false } + do { + try await authManager.requestPasswordReset(email: trimmedEmail) + onCodeSent(trimmedEmail) + } catch { + self.error = error.localizedDescription + } + } + } +} + +struct ResetPasswordView: View { + @Environment(AuthManager.self) private var authManager + let email: String + let onPasswordReset: () -> Void + let onBack: () -> Void + + @State private var code = "" + @State private var password = "" + @State private var confirmPassword = "" + @State private var isLoading = false + @State private var error: String? + + private var passwordsMismatch: Bool { + !confirmPassword.isEmpty && password != confirmPassword + } + + private var canSubmit: Bool { + code.count == 6 && password.count >= 8 && password == confirmPassword && !isLoading + } + + var body: some View { + authContainer { + VStack(spacing: 24) { + header + + VStack(spacing: 14) { + TextField("Reset Code", text: $code) + .textFieldStyle(.roundedBorder) + .textContentType(.oneTimeCode) + #if os(iOS) + .keyboardType(.numberPad) + #endif + .onChange(of: code) { _, newValue in + code = String(newValue.filter(\.isNumber).prefix(6)) + } + .accessibilityIdentifier("reset_password_code") + + SecureField("New Password", text: $password) + .textFieldStyle(.roundedBorder) + .textContentType(.newPassword) + .accessibilityIdentifier("reset_password_new") + + VStack(alignment: .leading, spacing: 4) { + SecureField("Confirm Password", text: $confirmPassword) + .textFieldStyle(.roundedBorder) + .textContentType(.newPassword) + .onSubmit { submit() } + .accessibilityIdentifier("reset_password_confirm") + + if passwordsMismatch { + Text("Passwords don't match") + .font(.caption) + .foregroundStyle(.red) + } + } + + if let error { + InlineErrorView(message: error) + } + + Button(action: submit) { + Group { + if isLoading { + ProgressView().controlSize(.small) + } else { + Text("Reset Password") + .frame(maxWidth: .infinity) + } + } + .frame(maxWidth: .infinity) + .padding(.vertical, 2) + } + .buttonStyle(.borderedProminent) + .controlSize(.large) + .disabled(!canSubmit) + .accessibilityIdentifier("reset_password_submit") + } + + Divider() + + Button("Use a Different Email", action: onBack) + .buttonStyle(.plain) + .foregroundStyle(.tint) + .font(.callout) + .accessibilityIdentifier("reset_password_back") + } + } + } + + private var header: some View { + VStack(spacing: 8) { + Image(systemName: "checkmark.shield.fill") + .font(.system(size: 46)) + .foregroundStyle(.tint) + Text("Enter Code") + .font(.largeTitle.bold()) + Text(email) + .font(.callout) + .foregroundStyle(.secondary) + .lineLimit(1) + .truncationMode(.middle) + } + } + + private func submit() { + guard canSubmit else { return } + isLoading = true + error = nil + Task { + defer { isLoading = false } + do { + try await authManager.resetPassword(email: email, code: code, newPassword: password) + onPasswordReset() + } catch { + self.error = error.localizedDescription + } + } + } +} diff --git a/apps/swift/Sources/PackRat/Features/Auth/RegisterView.swift b/apps/swift/Sources/PackRat/Features/Auth/RegisterView.swift index ffeea0e890..c9b0747930 100644 --- a/apps/swift/Sources/PackRat/Features/Auth/RegisterView.swift +++ b/apps/swift/Sources/PackRat/Features/Auth/RegisterView.swift @@ -24,52 +24,63 @@ struct RegisterView: View { var body: some View { authContainer { VStack(spacing: 24) { - VStack(spacing: 8) { - Image(systemName: "backpack.fill") - .font(.system(size: 48)) - .foregroundStyle(.tint) - Text("Create Account") - .font(.largeTitle.bold()) - Text("Join the PackRat community") - .font(.callout) - .foregroundStyle(.secondary) - } + AuthHeader(title: "Create Account", subtitle: "Save packs, trips, and gear across devices.", symbol: "person.crop.circle.badge.plus") - VStack(spacing: 12) { + VStack(spacing: 0) { HStack(spacing: 10) { TextField("First Name", text: $firstName) - .textFieldStyle(.roundedBorder) .textContentType(.givenName) + .padding(.horizontal, 14) + .padding(.vertical, 12) + .accessibilityIdentifier("register_first_name") + Divider() TextField("Last Name", text: $lastName) - .textFieldStyle(.roundedBorder) .textContentType(.familyName) + .padding(.horizontal, 14) + .padding(.vertical, 12) + .accessibilityIdentifier("register_last_name") } + Divider().padding(.leading, 14) + TextField("Email", text: $email) - .textFieldStyle(.roundedBorder) .textContentType(.emailAddress) #if os(iOS) .keyboardType(.emailAddress) .autocapitalization(.none) #endif .autocorrectionDisabled() + .padding(.horizontal, 14) + .padding(.vertical, 12) + .accessibilityIdentifier("register_email") + + Divider().padding(.leading, 14) SecureField("Password (min 8 chars)", text: $password) - .textFieldStyle(.roundedBorder) .textContentType(.newPassword) + .padding(.horizontal, 14) + .padding(.vertical, 12) + .accessibilityIdentifier("register_password") + + Divider().padding(.leading, 14) VStack(alignment: .leading, spacing: 4) { SecureField("Confirm Password", text: $confirmPassword) - .textFieldStyle(.roundedBorder) .textContentType(.newPassword) .onSubmit { if isValid { submit() } } + .padding(.horizontal, 14) + .padding(.vertical, 12) + .accessibilityIdentifier("register_confirm_password") if passwordMismatch { Text("Passwords don't match") .font(.caption) .foregroundStyle(.red) + .padding(.horizontal, 14) + .padding(.bottom, 10) } } } + .authGroupedSurface() if let error { InlineErrorView(message: error) @@ -89,6 +100,7 @@ struct RegisterView: View { .buttonStyle(.borderedProminent) .controlSize(.large) .disabled(!isValid || isLoading) + .accessibilityIdentifier("register_submit") Divider() diff --git a/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift b/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift index 16901bcc81..3d566c251b 100644 --- a/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift +++ b/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift @@ -5,17 +5,18 @@ struct CatalogView: View { @Environment(AppState.self) private var appState var body: some View { - let vm = appState.catalogVM - ScrollView { - VStack(spacing: 16) { - searchBar(vm: vm) + @Bindable var vm = appState.catalogVM + return ScrollView { + VStack(spacing: 16) { if vm.isLoading && vm.items.isEmpty { ProgressView("Searching gear…").padding(.top, 40) } else if let error = vm.error { InlineErrorView(message: error).padding(.horizontal) } else if vm.items.isEmpty && vm.hasSearched { - ContentUnavailableView.search(text: vm.searchText).padding(.top, 20) + ContentUnavailableView.search(text: vm.searchText) + .accessibilityIdentifier("catalog_no_results") + .padding(.top, 20) } else if !vm.hasSearched { EmptyStateView( "Search the Gear Catalog", @@ -30,27 +31,24 @@ struct CatalogView: View { .padding(.bottom) } .navigationTitle("Gear Catalog") - } - - private func searchBar(vm: CatalogViewModel) -> some View { - @Bindable var bvm = vm - return HStack { - Image(systemName: "magnifyingglass").foregroundStyle(.secondary) - TextField("Search tents, packs, sleeping bags…", text: $bvm.searchText) - .onChange(of: vm.searchText) { vm.onSearchTextChanged() } - .onSubmit { Task { await vm.search(reset: true) } } - if vm.isLoading { - ProgressView().controlSize(.small) - } else if !vm.searchText.isEmpty { - Button { vm.searchText = "" } label: { - Image(systemName: "xmark.circle.fill").foregroundStyle(.secondary) + #if os(iOS) + .searchable( + text: $vm.searchText, + placement: .navigationBarDrawer(displayMode: .always), + prompt: "Search tents, packs, sleeping bags…" + ) + #else + .searchable(text: $vm.searchText, prompt: "Search tents, packs, sleeping bags…") + #endif + .onChange(of: vm.searchText) { vm.onSearchTextChanged() } + .onSubmit(of: .search) { Task { await vm.search(reset: true) } } + .toolbar { + if vm.isLoading && !vm.items.isEmpty { + ToolbarItem(placement: .secondaryAction) { + ProgressView().controlSize(.small) } - .buttonStyle(.plain) } } - .padding(10) - .background(.fill.secondary, in: RoundedRectangle(cornerRadius: 10)) - .padding(.horizontal) } private func itemGrid(vm: CatalogViewModel) -> some View { @@ -68,6 +66,7 @@ struct CatalogView: View { ProgressView().padding() } } + .accessibilityIdentifier("catalog_results_list") .background(.background.secondary, in: RoundedRectangle(cornerRadius: 12)) .padding(.horizontal) } @@ -154,6 +153,8 @@ struct CatalogItemRow: View { } .padding(.horizontal, 14) .padding(.vertical, 10) + .accessibilityIdentifier("catalog_item_row_\(item.id)") + .accessibilityLabel(item.displayName) } } diff --git a/apps/swift/Sources/PackRat/Features/Chat/ChatView.swift b/apps/swift/Sources/PackRat/Features/Chat/ChatView.swift index 5db23edf7c..277acc21e6 100644 --- a/apps/swift/Sources/PackRat/Features/Chat/ChatView.swift +++ b/apps/swift/Sources/PackRat/Features/Chat/ChatView.swift @@ -2,26 +2,37 @@ import SwiftUI import MarkdownUI struct ChatView: View { + @Environment(AuthManager.self) private var authManager @Bindable var viewModel: ChatViewModel private var showSuggestions: Bool { - viewModel.messages.count <= 1 && !viewModel.isStreaming + authManager.isAuthenticated && viewModel.messages.count <= 1 && !viewModel.isStreaming } var body: some View { - VStack(spacing: 0) { - messageList - if showSuggestions { - suggestionsBar + Group { + if authManager.isAuthenticated { + VStack(spacing: 0) { + messageList + if showSuggestions { + suggestionsBar + } + Divider() + inputBar + } + } else { + EmptyStateView( + "Sign In to Use Assistant", + subtitle: "The AI assistant uses your PackRat account and trip context. Your local packs and trips still work in guest mode.", + systemImage: "sparkles" + ) } - Divider() - inputBar } .navigationTitle("AI Assistant") .toolbar { ToolbarItem(placement: .automatic) { Button("Clear", systemImage: "trash") { viewModel.clearHistory() } - .disabled(viewModel.messages.count <= 1) + .disabled(!authManager.isAuthenticated || viewModel.messages.count <= 1) } } } @@ -161,7 +172,7 @@ struct MessageBubble: View { private var isUser: Bool { message.role == .user } var body: some View { - HStack(alignment: .bottom, spacing: 8) { + HStack(alignment: .top, spacing: 8) { if isUser { Spacer(minLength: 48) bubbleContent @@ -184,7 +195,7 @@ struct MessageBubble: View { TypingIndicator() .padding(.horizontal, 14) .padding(.vertical, 12) - .background(Color.secondary.opacity(0.12), in: RoundedRectangle(cornerRadius: 18, style: .continuous)) + .background(.fill.secondary, in: RoundedRectangle(cornerRadius: 18, style: .continuous)) } else if isUser { Text(message.content) .textSelection(.enabled) @@ -196,19 +207,14 @@ struct MessageBubble: View { VStack(alignment: .leading, spacing: 8) { if !message.toolInvocations.isEmpty { ToolInvocationsView(invocations: message.toolInvocations) - .padding(.horizontal, 14) - .padding(.top, 10) } if !message.content.isEmpty { Markdown(message.content) .markdownTheme(.gitHub) .textSelection(.enabled) - .padding(.horizontal, 14) - .padding(.vertical, message.toolInvocations.isEmpty ? 10 : 0) - .padding(.bottom, message.toolInvocations.isEmpty ? 0 : 10) } } - .background(Color.secondary.opacity(0.12), in: RoundedRectangle(cornerRadius: 18, style: .continuous)) + .padding(.vertical, 4) } } diff --git a/apps/swift/Sources/PackRat/Features/Feed/ComposePostView.swift b/apps/swift/Sources/PackRat/Features/Feed/ComposePostView.swift index b01a9fe8d3..6aa3ecb379 100644 --- a/apps/swift/Sources/PackRat/Features/Feed/ComposePostView.swift +++ b/apps/swift/Sources/PackRat/Features/Feed/ComposePostView.swift @@ -46,6 +46,7 @@ struct ComposePostView: View { Text("\(caption.count) / 500") .font(.caption) .foregroundStyle(caption.count > 450 ? .orange : .secondary) + .accessibilityIdentifier("feed_compose_counter") Spacer() } .padding(.horizontal) diff --git a/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift b/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift index fdde93343b..19f0a29f34 100644 --- a/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift +++ b/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift @@ -3,12 +3,20 @@ import NukeUI struct FeedView: View { let viewModel: FeedViewModel + @Environment(AuthManager.self) private var authManager @State private var showingCompose = false var body: some View { ScrollView { LazyVStack(spacing: 16) { - if viewModel.isLoading && viewModel.posts.isEmpty { + if !authManager.isAuthenticated { + EmptyStateView( + "Sign In to View the Feed", + subtitle: "Community posts, comments, and likes sync with your PackRat account.", + systemImage: "person.2" + ) + .padding(.top, 20) + } else if viewModel.isLoading && viewModel.posts.isEmpty { ProgressView("Loading feed…").padding(.top, 40) } else if let error = viewModel.error { ErrorView(error, retry: { await viewModel.load(refresh: true) }).padding(.top, 20) @@ -41,11 +49,13 @@ struct FeedView: View { Button("New Post", systemImage: "square.and.pencil") { showingCompose = true } + .accessibilityIdentifier("feed_new_post_button") + .disabled(!authManager.isAuthenticated) .keyboardShortcut("n", modifiers: .command) } } - .task { if viewModel.posts.isEmpty { await viewModel.load() } } - .refreshable { await viewModel.load(refresh: true) } + .task { if authManager.isAuthenticated && viewModel.posts.isEmpty { await viewModel.load() } } + .refreshable { if authManager.isAuthenticated { await viewModel.load(refresh: true) } } .sheet(isPresented: $showingCompose) { ComposePostView(viewModel: viewModel) } diff --git a/apps/swift/Sources/PackRat/Features/GearInventory/GearInventoryView.swift b/apps/swift/Sources/PackRat/Features/GearInventory/GearInventoryView.swift index c7253af5e4..f53ea6a802 100644 --- a/apps/swift/Sources/PackRat/Features/GearInventory/GearInventoryView.swift +++ b/apps/swift/Sources/PackRat/Features/GearInventory/GearInventoryView.swift @@ -1,4 +1,5 @@ import SwiftUI +import SwiftData // MARK: - Models @@ -15,6 +16,7 @@ struct GearItem: Identifiable { struct GearInventoryView: View { @Environment(AppState.self) private var appState + @Environment(\.modelContext) private var modelContext @State private var searchText = "" @State private var sortOrder: SortOrder = .name @@ -81,8 +83,8 @@ struct GearInventoryView: View { .pickerStyle(.menu) } } - .task { await appState.packsVM.load() } - .refreshable { await appState.packsVM.load() } + .task { await appState.packsVM.load(context: modelContext) } + .refreshable { await appState.packsVM.load(context: modelContext) } } private var inventoryList: some View { diff --git a/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift b/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift index af4a46d15c..710917f1d4 100644 --- a/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift +++ b/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift @@ -105,10 +105,17 @@ final class GuidesViewModel { struct GuidesView: View { @State private var viewModel = GuidesViewModel() @State private var selectedGuide: Guide? + @Environment(AuthManager.self) private var authManager var body: some View { Group { - if viewModel.isLoading && viewModel.guides.isEmpty { + if !authManager.isAuthenticated { + EmptyStateView( + "Sign In to View Guides", + subtitle: "Guides are loaded from your PackRat account when you are online.", + systemImage: "book" + ) + } else if viewModel.isLoading && viewModel.guides.isEmpty { ProgressView("Loading guides…").frame(maxWidth: .infinity, maxHeight: .infinity) } else if let error = viewModel.error, viewModel.guides.isEmpty { ErrorView(error, retry: { await viewModel.load() }) @@ -129,8 +136,8 @@ struct GuidesView: View { .safeAreaInset(edge: .top, spacing: 0) { if !viewModel.categories.isEmpty { categoryBar } } - .task { await viewModel.load() } - .refreshable { await viewModel.load() } + .task { if authManager.isAuthenticated { await viewModel.load() } } + .refreshable { if authManager.isAuthenticated { await viewModel.load() } } .sheet(item: $selectedGuide) { guide in NavigationStack { GuideDetailView(guide: guide) } } diff --git a/apps/swift/Sources/PackRat/Features/Home/HomeView.swift b/apps/swift/Sources/PackRat/Features/Home/HomeView.swift index b448a5c9ef..504ae71a86 100644 --- a/apps/swift/Sources/PackRat/Features/Home/HomeView.swift +++ b/apps/swift/Sources/PackRat/Features/Home/HomeView.swift @@ -3,8 +3,10 @@ import SwiftUI struct HomeView: View { @Environment(AppState.self) private var appState @Environment(AuthManager.self) private var authManager + @Environment(\.horizontalSizeClass) private var horizontalSizeClass @State private var showingSeasonSuggestions = false @State private var showingShoppingList = false + @State private var homeSearchText = "" private var greeting: String { let hour = Calendar.current.component(.hour, from: Date()) @@ -16,43 +18,200 @@ struct HomeView: View { } private var firstName: String { - authManager.currentUser?.displayName.components(separatedBy: " ").first ?? "" + guard let firstName = authManager.currentUser?.firstName?.trimmingCharacters(in: .whitespacesAndNewlines), + !firstName.isEmpty, + !firstName.contains("@") + else { return "" } + return firstName } + @ViewBuilder var body: some View { + if horizontalSizeClass == .compact { + compactBody + } else { + regularBody + } + } + + private var compactBody: some View { + List { + Section { + headerSection + .listRowInsets(EdgeInsets(top: 10, leading: 16, bottom: 10, trailing: 16)) + } + .listRowBackground(Color.clear) + + Section { + summarySection + .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) + } + .listRowBackground(Color.clear) + + ForEach(filteredActionGroups) { group in + Section(group.title) { + ForEach(group.actions) { action in + HomeActionRow(action: action) + } + } + } + } + .platformGroupedListStyle() + .scrollContentBackground(.hidden) + .navigationTitle("Home") + .searchable(text: $homeSearchText, prompt: "Search PackRat") + .overlay { + if !homeSearchText.isEmpty && filteredActionGroups.allSatisfy(\.actions.isEmpty) { + ContentUnavailableView.search(text: homeSearchText) + } + } + .homeSheets(showingSeasonSuggestions: $showingSeasonSuggestions, showingShoppingList: $showingShoppingList) + } + + private var regularBody: some View { ScrollView { VStack(alignment: .leading, spacing: 20) { headerSection - statsRow - tilesGrid + summarySection + actionsSection } .padding(.horizontal, 16) .padding(.bottom, 24) + .frame(maxWidth: 720, alignment: .leading) + .frame(maxWidth: .infinity, alignment: .leading) } .navigationTitle("Home") - .sheet(isPresented: $showingSeasonSuggestions) { - SeasonSuggestionsView() - } - .sheet(isPresented: $showingShoppingList) { - NavigationStack { - ShoppingListView() - } - } + .searchable(text: $homeSearchText, prompt: "Search PackRat") + .homeSheets(showingSeasonSuggestions: $showingSeasonSuggestions, showingShoppingList: $showingShoppingList) } // MARK: - Header private var headerSection: some View { - VStack(alignment: .leading, spacing: 4) { - Text(firstName.isEmpty ? greeting : "\(greeting), \(firstName)") - .font(.title2.bold()) - Text("Here's your outdoor dashboard") - .font(.subheadline) - .foregroundStyle(.secondary) + HStack(alignment: .center, spacing: 12) { + ZStack { + Circle() + .fill(.tint.opacity(0.12)) + + if authManager.currentUser == nil { + Image(systemName: "person.crop.circle.fill") + .font(.title2.weight(.semibold)) + .foregroundStyle(.tint) + .symbolRenderingMode(.hierarchical) + } else { + Text(authManager.currentUser?.initials ?? "?") + .font(.headline.weight(.semibold)) + .foregroundStyle(.tint) + } + } + .frame(width: 44, height: 44) + + VStack(alignment: .leading, spacing: 4) { + Text(firstName.isEmpty ? greeting : "\(greeting), \(firstName)") + .font(.title2.bold()) + .accessibilityIdentifier("home_greeting") + Text("Here's your outdoor dashboard") + .font(.subheadline) + .foregroundStyle(.secondary) + } + + Spacer(minLength: 0) } .padding(.top, 8) } + // MARK: - Summary + + private var summarySection: some View { + VStack(alignment: .leading, spacing: 14) { + HStack(alignment: .top, spacing: 12) { + ZStack { + Circle() + .fill(Color.accentColor.opacity(0.14)) + .frame(width: 52, height: 52) + + Image(systemName: summarySymbol) + .font(.system(size: 24, weight: .semibold)) + .foregroundStyle(Color.accentColor) + } + + VStack(alignment: .leading, spacing: 5) { + Text(summaryTitle) + .font(.headline) + .foregroundStyle(.primary) + Text(summarySubtitle) + .font(.subheadline) + .foregroundStyle(.secondary) + .fixedSize(horizontal: false, vertical: true) + } + + Spacer(minLength: 0) + } + + statsRow + + HStack(spacing: 10) { + SummaryActionButton(title: primarySummaryActionTitle, symbol: primarySummaryActionSymbol, isProminent: true) { + appState.navItem = primarySummaryDestination + } + + SummaryActionButton(title: "Search", symbol: "magnifyingglass") { + appState.isGlobalSearchPresented = true + } + } + } + .padding(16) + .frame(maxWidth: .infinity, alignment: .leading) + .background { + RoundedRectangle(cornerRadius: 14, style: .continuous) + .fill(.regularMaterial) + } + .overlay { + RoundedRectangle(cornerRadius: 14, style: .continuous) + .strokeBorder(.separator.opacity(0.35), lineWidth: 0.5) + } + .clipShape(RoundedRectangle(cornerRadius: 14, style: .continuous)) + } + + private var summarySymbol: String { + if appState.packsVM.packs.isEmpty { return "backpack" } + if appState.tripsVM.trips.isEmpty { return "map" } + return "checkmark.seal.fill" + } + + private var summaryTitle: String { + if appState.packsVM.packs.isEmpty { return "Start with a pack" } + if appState.tripsVM.trips.isEmpty { return "Plan the next route" } + return "Ready for the trail" + } + + private var summarySubtitle: String { + if appState.packsVM.packs.isEmpty { + return "Create a packing list, add gear, and keep the essentials close." + } + if appState.tripsVM.trips.isEmpty { + return "Turn your gear into a trip plan with weather, conditions, and notes." + } + return "Your packs, trips, and trail context are organized in one place." + } + + private var primarySummaryActionTitle: String { + if appState.packsVM.packs.isEmpty { return "Start Pack" } + if appState.tripsVM.trips.isEmpty { return "Trips" } + return "Open Packs" + } + + private var primarySummaryActionSymbol: String { + if appState.packsVM.packs.isEmpty { return "plus" } + if appState.tripsVM.trips.isEmpty { return "map" } + return "backpack.fill" + } + + private var primarySummaryDestination: NavItem { + if appState.tripsVM.trips.isEmpty && !appState.packsVM.packs.isEmpty { return .trips } + return .packs + } + // MARK: - Stats Row private var statsRow: some View { @@ -77,116 +236,94 @@ struct HomeView: View { } private func statChip(value: String, label: String, symbol: String) -> some View { - HStack(spacing: 6) { + VStack(alignment: .leading, spacing: 5) { Image(systemName: symbol) - .font(.caption) + .font(.subheadline.weight(.semibold)) .foregroundStyle(Color.accentColor) - Text(value) - .font(.subheadline.bold()) - Text(label) - .font(.subheadline) - .foregroundStyle(.secondary) + + HStack(alignment: .firstTextBaseline, spacing: 4) { + Text(value) + .font(.headline.weight(.semibold)) + Text(label) + .font(.caption) + .foregroundStyle(.secondary) + .lineLimit(1) + } } + .frame(maxWidth: .infinity, alignment: .leading) .padding(.horizontal, 12) - .padding(.vertical, 8) - .background(.fill.secondary, in: Capsule()) + .padding(.vertical, 10) + .background(.background.secondary, in: RoundedRectangle(cornerRadius: 14, style: .continuous)) } - // MARK: - Tiles Grid + // MARK: - Actions - private var tilesGrid: some View { - LazyVGrid(columns: [GridItem(.flexible(), spacing: 12), GridItem(.flexible(), spacing: 12)], spacing: 12) { - HomeTileCard( + @ViewBuilder + private var actionsSection: some View { + if horizontalSizeClass == .compact { + VStack(alignment: .leading, spacing: 18) { + ForEach(filteredActionGroups) { group in + HomeActionSection(title: group.title, actions: group.actions) + } + } + } else { + VStack(alignment: .leading, spacing: 18) { + ForEach(filteredActionGroups) { group in + HomeActionSection(title: group.title, actions: group.actions) + } + } + } + } + + private var actionGroups: [HomeActionGroup] { + [ + HomeActionGroup(title: "Plan", actions: Array(homeActions.prefix(4))), + HomeActionGroup(title: "Organize", actions: Array(homeActions.dropFirst(4).prefix(4))), + HomeActionGroup(title: "Explore", actions: Array(homeActions.dropFirst(8))), + ] + } + + private var filteredActionGroups: [HomeActionGroup] { + let query = homeSearchText.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() + guard !query.isEmpty else { return actionGroups } + + return actionGroups.compactMap { group in + let actions = group.actions.filter { action in + action.title.lowercased().contains(query) + || action.subtitle.lowercased().contains(query) + } + return actions.isEmpty ? nil : HomeActionGroup(title: group.title, actions: actions) + } + } + + private var homeActions: [HomeAction] { + [ + HomeAction( title: "My Packs", subtitle: appState.packsVM.packs.isEmpty ? "No packs yet" : "\(appState.packsVM.packs.count) pack\(appState.packsVM.packs.count == 1 ? "" : "s")", symbol: "backpack.fill", color: .blue - ) { appState.navItem = .packs } - - HomeTileCard( - title: "Trips", - subtitle: upcomingTripsSubtitle, - symbol: "map.fill", - color: .green - ) { appState.navItem = .trips } - - HomeTileCard( - title: "Weather", - subtitle: "Forecasts & alerts", - symbol: "cloud.sun.fill", - color: .cyan - ) { appState.navItem = .weather } - - HomeTileCard( - title: "AI Assistant", - subtitle: "Ask about gear & trips", - symbol: "bubble.left.and.sparkles", - color: .purple - ) { appState.navItem = .chat } - - HomeTileCard( - title: "Gear Inventory", - subtitle: inventorySubtitle, - symbol: "shippingbox.fill", - color: .orange - ) { appState.navItem = .gearInventory } - - HomeTileCard( - title: "Season Suggestions", - subtitle: "AI-powered packing tips", - symbol: "leaf.fill", - color: .mint - ) { showingSeasonSuggestions = true } - - HomeTileCard( + ) { appState.navItem = .packs }, + HomeAction(title: "Trips", subtitle: upcomingTripsSubtitle, symbol: "map.fill", color: .green) { appState.navItem = .trips }, + HomeAction(title: "Weather", subtitle: "Forecasts & alerts", symbol: "cloud.sun.fill", color: .cyan) { appState.navItem = .weather }, + HomeAction(title: "AI Assistant", subtitle: "Ask about gear & trips", symbol: "bubble.left.and.text.bubble.right", color: .purple) { appState.navItem = .chat }, + HomeAction(title: "Gear Inventory", subtitle: inventorySubtitle, symbol: "shippingbox.fill", color: .orange) { appState.navItem = .gearInventory }, + HomeAction(title: "Season Suggestions", subtitle: "AI-powered packing tips", symbol: "leaf.fill", color: .mint) { showingSeasonSuggestions = true }, + HomeAction( title: "Pack Templates", subtitle: "\(appState.templatesVM.templates.count) template\(appState.templatesVM.templates.count == 1 ? "" : "s")", symbol: "doc.on.doc.fill", color: .indigo - ) { appState.navItem = .templates } - - HomeTileCard( - title: "Guides", - subtitle: "Gear & packing articles", - symbol: "book.fill", - color: .brown - ) { appState.navItem = .guides } - - HomeTileCard( - title: "Catalog", - subtitle: "Browse gear database", - symbol: "magnifyingglass", - color: .gray - ) { appState.navItem = .catalog } - - HomeTileCard( - title: "Community Feed", - subtitle: "Posts & trip reports", - symbol: "newspaper.fill", - color: .teal - ) { appState.navItem = .feed } - - HomeTileCard( - title: "Trail Conditions", - subtitle: "Community reports", - symbol: "figure.hiking", - color: .red - ) { appState.navItem = .trailConditions } - - HomeTileCard( - title: "Shopping List", - subtitle: "Gear wishlist", - symbol: "cart.fill", - color: .pink - ) { showingShoppingList = true } - - HomeTileCard( - title: "Wildlife ID", - subtitle: "Identify animals & plants", - symbol: "pawprint.fill", - color: Color(red: 0.5, green: 0.3, blue: 0.1) - ) { appState.navItem = .wildlife } - } + ) { appState.navItem = .templates }, + HomeAction(title: "Guides", subtitle: "Gear & packing articles", symbol: "book.fill", color: .brown) { appState.navItem = .guides }, + HomeAction(title: "Catalog", subtitle: "Browse gear database", symbol: "magnifyingglass", color: .gray) { appState.navItem = .catalog }, + HomeAction(title: "Community Feed", subtitle: "Posts & trip reports", symbol: "newspaper.fill", color: .teal) { appState.navItem = .feed }, + HomeAction(title: "Trail Conditions", subtitle: "Community reports", symbol: "figure.hiking", color: .red) { appState.navItem = .trailConditions }, + HomeAction(title: "Shopping List", subtitle: "Gear wishlist", symbol: "cart.fill", color: .pink) { showingShoppingList = true }, + HomeAction(title: "Wildlife ID", subtitle: "Identify animals & plants", symbol: "pawprint.fill", color: Color(red: 0.5, green: 0.3, blue: 0.1)) { + appState.navItem = .wildlife + }, + ] } private var upcomingTripsSubtitle: String { @@ -206,47 +343,148 @@ struct HomeView: View { // MARK: - Tile Card -struct HomeTileCard: View { +struct HomeActionGroup: Identifiable { + let title: String + let actions: [HomeAction] + + var id: String { title } +} + +struct HomeAction: Identifiable { let title: String let subtitle: String let symbol: String let color: Color let action: () -> Void + var id: String { title } +} + +private struct SummaryActionButton: View { + let title: String + let symbol: String + var isProminent = false + let action: () -> Void + var body: some View { + if isProminent { + buttonLabel + .buttonStyle(.borderedProminent) + } else { + buttonLabel + .buttonStyle(.bordered) + } + } + + private var buttonLabel: some View { Button(action: action) { - VStack(alignment: .leading, spacing: 10) { - Circle() - .fill(color.opacity(0.15)) - .frame(width: 44, height: 44) - .overlay { - Image(systemName: symbol) - .font(.system(size: 18, weight: .semibold)) - .foregroundStyle(color) + Label(title, systemImage: symbol) + .font(.subheadline.weight(.semibold)) + .frame(maxWidth: .infinity) + .padding(.vertical, 10) + } + .controlSize(.regular) + } +} + +private struct HomeActionSection: View { + let title: String + let actions: [HomeAction] + + var body: some View { + VStack(alignment: .leading, spacing: 8) { + Text(title) + .font(.headline) + .padding(.horizontal, 2) + + VStack(spacing: 0) { + ForEach(Array(actions.enumerated()), id: \.element.id) { index, action in + HomeActionRow(action: action) + if index < actions.count - 1 { + Divider() + .padding(.leading, 56) } + } + } + .background(.background.secondary, in: RoundedRectangle(cornerRadius: 14, style: .continuous)) + .overlay( + RoundedRectangle(cornerRadius: 14, style: .continuous) + .strokeBorder(.separator.opacity(0.45), lineWidth: 0.5) + ) + } + } +} - Spacer() +private struct HomeActionRow: View { + let action: HomeAction + + var body: some View { + Button(action: action.action) { + HStack(spacing: 12) { + RoundedRectangle(cornerRadius: 7, style: .continuous) + .fill(action.color.gradient) + .frame(width: 28, height: 28) + .overlay { + Image(systemName: action.symbol) + .font(.system(size: 14, weight: .semibold)) + .foregroundStyle(.white) + .symbolRenderingMode(.hierarchical) + } VStack(alignment: .leading, spacing: 2) { - Text(title) - .font(.subheadline.bold()) + Text(action.title) + .font(.body) .foregroundStyle(.primary) - .lineLimit(1) - Text(subtitle) + Text(action.subtitle) .font(.caption) .foregroundStyle(.secondary) - .lineLimit(2) + .lineLimit(1) } + + Spacer(minLength: 8) + + Image(systemName: "chevron.right") + .font(.footnote.weight(.semibold)) + .foregroundStyle(.tertiary) } - .frame(maxWidth: .infinity, alignment: .leading) - .padding(16) - .frame(minHeight: 120) - .background(.background.secondary, in: RoundedRectangle(cornerRadius: 16, style: .continuous)) - .overlay( - RoundedRectangle(cornerRadius: 16, style: .continuous) - .strokeBorder(.separator.opacity(0.5), lineWidth: 0.5) - ) + .contentShape(Rectangle()) + .padding(.horizontal, 12) + .padding(.vertical, 4) } .buttonStyle(.plain) + .accessibilityIdentifier("home_action_\(action.title.accessibilityIdentifierFragment)") + } +} + +private extension String { + var accessibilityIdentifierFragment: String { + lowercased() + .filter { $0.isLetter || $0.isNumber } + } +} + +private extension View { + @ViewBuilder + func platformGroupedListStyle() -> some View { + #if os(iOS) + self.listStyle(.insetGrouped) + #else + self.listStyle(.inset) + #endif + } + + func homeSheets( + showingSeasonSuggestions: Binding, + showingShoppingList: Binding + ) -> some View { + self + .sheet(isPresented: showingSeasonSuggestions) { + SeasonSuggestionsView() + } + .sheet(isPresented: showingShoppingList) { + NavigationStack { + ShoppingListView() + } + } } } diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateFormView.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateFormView.swift index 6807a9cd17..7870883851 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateFormView.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateFormView.swift @@ -33,8 +33,10 @@ struct PackTemplateFormView: View { Form { Section("Template Info") { TextField("Name", text: $name) + .accessibilityIdentifier("template_name") TextField("Description (optional)", text: $description, axis: .vertical) .lineLimit(2...4) + .accessibilityIdentifier("template_description") } Section("Category") { Picker("Category", selection: $category) { diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateItemFormView.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateItemFormView.swift index 231f745be4..c8fee2208c 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateItemFormView.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateItemFormView.swift @@ -43,8 +43,11 @@ struct PackTemplateItemFormView: View { .lineLimit(2...3) } Section("Weight & Quantity") { - HStack { + LabeledContent("Weight") { + HStack { TextField("Weight", text: $weightText) + .multilineTextAlignment(.trailing) + .frame(width: 80) #if os(iOS) .keyboardType(.decimalPad) #endif @@ -53,13 +56,18 @@ struct PackTemplateItemFormView: View { } .pickerStyle(.segmented) .frame(maxWidth: 180) + } } Stepper("Quantity: \(quantity)", value: $quantity, in: 1...99) } - Section("Details") { + Section { TextField("Category (optional)", text: $category) Toggle("Worn", isOn: $worn) Toggle("Consumable", isOn: $consumable) + } header: { + Text("Details") + } footer: { + Text("Worn and consumable items are excluded from base weight totals.") } if let error { InlineErrorView(message: error).listRowBackground(Color.clear) diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift index 5c1a4ec841..9c319bd236 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift @@ -1,5 +1,6 @@ import SwiftUI import Charts +import SwiftData // MARK: - List Column (shown in content pane of 3-column nav) @@ -7,6 +8,7 @@ struct PackTemplatesListView: View { @Bindable var viewModel: PackTemplatesViewModel @Binding var selectedId: String? var packsVM: PacksViewModel = PacksViewModel() + @Environment(AuthManager.self) private var authManager @State private var showingNewTemplate = false #if os(iOS) @Environment(\.horizontalSizeClass) private var horizontalSizeClass @@ -17,7 +19,13 @@ struct PackTemplatesListView: View { var body: some View { Group { - if viewModel.isLoading && viewModel.templates.isEmpty { + if !authManager.isAuthenticated { + EmptyStateView( + "Sign In to Use Templates", + subtitle: "Pack templates sync with your account so they can be reused across devices.", + systemImage: "doc.on.doc" + ) + } else if viewModel.isLoading && viewModel.templates.isEmpty { ProgressView("Loading templates…").frame(maxWidth: .infinity, maxHeight: .infinity) } else if let error = viewModel.error, viewModel.templates.isEmpty { ErrorView(error, retry: { await viewModel.load() }) @@ -33,13 +41,15 @@ struct PackTemplatesListView: View { } .navigationTitle("Pack Templates") .searchable(text: $viewModel.searchText, prompt: "Search templates") - .task { if viewModel.templates.isEmpty { await viewModel.load() } } - .refreshable { await viewModel.load() } + .task { if authManager.isAuthenticated && viewModel.templates.isEmpty { await viewModel.load() } } + .refreshable { if authManager.isAuthenticated { await viewModel.load() } } .toolbar { ToolbarItem(placement: .primaryAction) { Button("New Template", systemImage: "plus") { showingNewTemplate = true } + .accessibilityIdentifier("templates_new_template_button") + .disabled(!authManager.isAuthenticated) } } .sheet(isPresented: $showingNewTemplate) { @@ -126,6 +136,7 @@ struct PackTemplateDetailView: View { let viewModel: PackTemplatesViewModel let packsVM: PacksViewModel + @Environment(\.modelContext) private var modelContext @State private var showingApplySheet = false @State private var showingEditTemplate = false @State private var showingAddItem = false @@ -216,7 +227,7 @@ struct PackTemplateDetailView: View { .sheet(item: $editingItem) { item in PackTemplateItemFormView(viewModel: viewModel, templateId: currentTemplate.id, existingItem: item) } - .task { if packsVM.packs.isEmpty { await packsVM.load() } } + .task { if packsVM.packs.isEmpty { await packsVM.load(context: modelContext) } } } @ToolbarContentBuilder diff --git a/apps/swift/Sources/PackRat/Features/Packs/PackDetailView.swift b/apps/swift/Sources/PackRat/Features/Packs/PackDetailView.swift index 3a511fe9fc..46f715d20a 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PackDetailView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PackDetailView.swift @@ -108,9 +108,12 @@ struct PackDetailView: View { Button("Edit Pack", systemImage: "pencil") { showingEditSheet = true } + .accessibilityIdentifier("pack_detail_edit_pack") .keyboardShortcut("e", modifiers: .command) } label: { Image(systemName: "ellipsis.circle") + .accessibilityIdentifier("pack_detail_more_menu") + .accessibilityLabel("More") } } } diff --git a/apps/swift/Sources/PackRat/Features/Packs/PackFormView.swift b/apps/swift/Sources/PackRat/Features/Packs/PackFormView.swift index 9c11c5d0c8..8708d82232 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PackFormView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PackFormView.swift @@ -1,14 +1,16 @@ import SwiftUI +import SwiftData struct PackFormView: View { let viewModel: PacksViewModel let existingPack: Pack? @Environment(\.dismiss) private var dismiss + @Environment(\.modelContext) private var modelContext @State private var name = "" @State private var description = "" - @State private var category = "" + @State private var category = PackCategory.hiking.rawValue @State private var isPublic = false @State private var isLoading = false @State private var error: String? @@ -26,8 +28,10 @@ struct PackFormView: View { Form { Section("Details") { TextField("Pack Name", text: $name) + .accessibilityIdentifier("pack_name") TextField("Description (optional)", text: $description, axis: .vertical) .lineLimit(3, reservesSpace: true) + .accessibilityIdentifier("pack_description") } Section("Category") { @@ -37,6 +41,7 @@ struct PackFormView: View { Label(cat.label, systemImage: cat.symbol).tag(cat.rawValue) } } + .accessibilityIdentifier("pack_category") #if os(macOS) .pickerStyle(.menu) #endif @@ -93,14 +98,16 @@ struct PackFormView: View { name: name.trimmingCharacters(in: .whitespaces), description: description.isEmpty ? nil : description, category: category.isEmpty ? nil : category, - isPublic: isPublic + isPublic: isPublic, + context: modelContext ) } else { try await viewModel.createPack( name: name.trimmingCharacters(in: .whitespaces), description: description.isEmpty ? nil : description, category: category.isEmpty ? nil : category, - isPublic: isPublic + isPublic: isPublic, + context: modelContext ) } dismiss() diff --git a/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift b/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift index 0e832343f5..3b48799c3e 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift @@ -1,4 +1,5 @@ import SwiftUI +import SwiftData struct PackItemFormView: View { let packId: String @@ -6,12 +7,13 @@ struct PackItemFormView: View { let existingItem: PackItem? @Environment(\.dismiss) private var dismiss + @Environment(\.modelContext) private var modelContext @State private var name = "" @State private var weightText = "" @State private var weightUnit = "g" - @State private var quantityText = "1" @State private var category = "" + @State private var quantity = 1 @State private var consumable = false @State private var worn = false @State private var notes = "" @@ -29,84 +31,87 @@ struct PackItemFormView: View { var body: some View { NavigationStack { - Form { - Section("Item") { - TextField("Name", text: $name) + formContent + .navigationTitle(isEditing ? "Edit Item" : "Add Item") + #if os(iOS) + .navigationBarTitleDisplayMode(.inline) + #endif + .toolbar { + ToolbarItem(placement: .cancellationAction) { + Button("Cancel") { dismiss() } + } + ToolbarItem(placement: .confirmationAction) { + Button(isLoading ? "Saving..." : (isEditing ? "Save" : "Add")) { submit() } + .disabled(!isValid || isLoading) + } + } + .onAppear { prefill() } + } + #if os(macOS) + .frame(minWidth: 420, minHeight: 460) + #endif + } + + private var formContent: some View { + Form { + Section("Item") { + TextField("Name", text: $name) + .textContentType(.name) + .accessibilityIdentifier("pack_item_name") + + Picker("Category", selection: $category) { + Text("None").tag("") + ForEach(PackCategory.allCases, id: \.rawValue) { cat in + Label(cat.label, systemImage: cat.symbol).tag(cat.rawValue) + } } + } - Section("Weight") { + Section("Weight") { + LabeledContent("Weight") { HStack { TextField("0", text: $weightText) + .multilineTextAlignment(.trailing) + .frame(width: 72) #if os(iOS) .keyboardType(.decimalPad) #endif .accessibilityIdentifier("item_weight") + Picker("Unit", selection: $weightUnit) { ForEach(AppWeightUnit.allCases, id: \.rawValue) { u in Text(u.label).tag(u.rawValue) } } .labelsHidden() - .frame(width: 60) - } - } - - Section("Quantity & Category") { - HStack { - Text("Quantity") - Spacer() - TextField("1", text: $quantityText) - #if os(iOS) - .keyboardType(.numberPad) - #endif - .multilineTextAlignment(.trailing) - .frame(width: 60) + .frame(width: 76) } - Picker("Category", selection: $category) { - Text("None").tag("") - ForEach(PackCategory.allCases, id: \.rawValue) { cat in - Label(cat.label, systemImage: cat.symbol).tag(cat.rawValue) - } - } - #if os(macOS) - .pickerStyle(.menu) - #endif } - Section("Flags") { - Toggle("Consumable", isOn: $consumable) - Toggle("Worn on body", isOn: $worn) - } + Stepper("Quantity: \(quantity)", value: $quantity, in: 1...999) + } - Section("Notes") { - TextField("Optional notes", text: $notes, axis: .vertical) - .lineLimit(3, reservesSpace: true) - } + Section { + Toggle("Worn on body", isOn: $worn) + Toggle("Consumable", isOn: $consumable) + } header: { + Text("Pack Weight") + } footer: { + Text("Worn and consumable items are tracked separately from base weight.") + } - if let error { - Section { - InlineErrorView(message: error) - } - } + Section("Notes") { + TextField("Optional notes", text: $notes, axis: .vertical) + .lineLimit(3, reservesSpace: true) + .accessibilityIdentifier("pack_item_notes") } - .navigationTitle(isEditing ? "Edit Item" : "Add Item") - #if os(iOS) - .navigationBarTitleDisplayMode(.inline) - #endif - .toolbar { - ToolbarItem(placement: .cancellationAction) { - Button("Cancel") { dismiss() } - } - ToolbarItem(placement: .confirmationAction) { - Button(isEditing ? "Save" : "Add") { submit() } - .disabled(!isValid || isLoading) + + if let error { + Section { + InlineErrorView(message: error) } } - .onAppear { prefill() } } - #if os(macOS) - .frame(minWidth: 400, minHeight: 350) - #endif } private func prefill() { @@ -114,7 +119,7 @@ struct PackItemFormView: View { name = item.name weightText = item.weight > 0 ? String(format: "%.0f", item.weight) : "" weightUnit = item.weightUnit.rawValue - quantityText = String(item.quantity) + quantity = item.quantity category = item.category ?? "" consumable = item.consumable worn = item.worn @@ -126,7 +131,6 @@ struct PackItemFormView: View { isLoading = true error = nil let weight = Double(weightText) - let quantity = Int(quantityText) ?? 1 Task { defer { isLoading = false } do { @@ -138,7 +142,8 @@ struct PackItemFormView: View { quantity: quantity, category: category.isEmpty ? nil : category, consumable: consumable, worn: worn, - notes: notes.isEmpty ? nil : notes + notes: notes.isEmpty ? nil : notes, + context: modelContext ) } else { try await viewModel.addItem( @@ -148,7 +153,8 @@ struct PackItemFormView: View { quantity: quantity, category: category.isEmpty ? nil : category, consumable: consumable, worn: worn, - notes: notes.isEmpty ? nil : notes + notes: notes.isEmpty ? nil : notes, + context: modelContext ) } dismiss() diff --git a/apps/swift/Sources/PackRat/Features/Packs/PackItemRow.swift b/apps/swift/Sources/PackRat/Features/Packs/PackItemRow.swift index 981b1b2340..88196ea5ae 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PackItemRow.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PackItemRow.swift @@ -17,6 +17,7 @@ struct PackItemRow: View { VStack(alignment: .leading, spacing: 3) { Text(item.name) .font(.body) + .accessibilityLabel(item.name) HStack(spacing: 8) { if !item.displayWeight.isEmpty { @@ -60,6 +61,7 @@ struct PackItemRow: View { } .padding(.horizontal) .padding(.vertical, 10) + .accessibilityIdentifier("pack_item_row_\(item.id)") .contentShape(Rectangle()) .onTapGesture { onDetail?() ?? onEdit() } .swipeActions(edge: .trailing, allowsFullSwipe: true) { diff --git a/apps/swift/Sources/PackRat/Features/Packs/PackWindowView.swift b/apps/swift/Sources/PackRat/Features/Packs/PackWindowView.swift index 90d2caea28..aba8749c40 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PackWindowView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PackWindowView.swift @@ -1,8 +1,10 @@ import SwiftUI +import SwiftData // Opened via openWindow(id: "pack", value: packId) struct PackWindowView: View { let packId: String + @Environment(\.modelContext) private var modelContext @State private var viewModel = PacksViewModel() @Environment(AuthManager.self) private var authManager @@ -22,6 +24,6 @@ struct PackWindowView: View { .frame(minWidth: 600, minHeight: 400) } } - .task { await viewModel.load() } + .task { await viewModel.load(context: modelContext) } } } diff --git a/apps/swift/Sources/PackRat/Features/Packs/PacksListView.swift b/apps/swift/Sources/PackRat/Features/Packs/PacksListView.swift index 9ca7f455ac..eb3752f455 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PacksListView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PacksListView.swift @@ -30,7 +30,7 @@ struct PacksListView: View { if viewModel.isLoading && viewModel.packs.isEmpty && !isExplore { ProgressView("Loading packs…").frame(maxWidth: .infinity, maxHeight: .infinity) } else if let error = viewModel.error, viewModel.packs.isEmpty, !isExplore { - ErrorView(error, retry: { await viewModel.load() }) + ErrorView(error, retry: { await viewModel.load(context: modelContext) }) } else if isLoadingPublic && publicPacks.isEmpty { ProgressView("Loading…").frame(maxWidth: .infinity, maxHeight: .infinity) } else if displayedPacks.isEmpty && !viewModel.searchText.isEmpty { @@ -59,6 +59,7 @@ struct PacksListView: View { ToolbarItemGroup(placement: .primaryAction) { if !isExplore { Button("New Pack", systemImage: "plus") { showingCreateSheet = true } + .accessibilityIdentifier("packs_new_pack_button") .keyboardShortcut("n", modifiers: .command) } if viewModel.isLoading || isLoadingPublic { @@ -76,6 +77,7 @@ struct PacksListView: View { Button("Recent", systemImage: "clock") { showingRecentPacks = true } + .accessibilityIdentifier("packs_recent_button") } } .safeAreaInset(edge: .top, spacing: 0) { diff --git a/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift b/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift index c09711ce37..197bd0ec19 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift @@ -20,6 +20,9 @@ final class PacksViewModel { var currentPage = 1 var hasMore = true private let pageSize = 30 + private var canUseRemotePersonalStore: Bool { + NetworkMonitor.shared.isConnected && KeychainService.shared.sessionToken != nil + } var filteredPacks: [Pack] { guard !searchText.isEmpty else { return packs } @@ -46,6 +49,11 @@ final class PacksViewModel { error = nil defer { isLoading = false } + guard canUseRemotePersonalStore else { + if packs.isEmpty { isCacheLoaded = true } + return + } + do { let fresh = try await service.listPacks(page: 1, limit: pageSize) packs = fresh @@ -60,7 +68,7 @@ final class PacksViewModel { } func loadMore() async { - guard hasMore, !isLoading else { return } + guard hasMore, !isLoading, canUseRemotePersonalStore else { return } let nextPage = currentPage + 1 isLoading = true defer { isLoading = false } @@ -95,69 +103,159 @@ final class PacksViewModel { try? context.save() } - func createPack(name: String, description: String?, category: String?, isPublic: Bool) async throws { - let pack = try await service.createPack( - name: name, description: description, category: category, isPublic: isPublic - ) + func createPack( + name: String, + description: String?, + category: String?, + isPublic: Bool, + context: ModelContext? = nil + ) async throws { + let localPack = makeLocalPack(name: name, description: description, category: category, isPublic: isPublic) + guard canUseRemotePersonalStore else { + packs.insert(localPack, at: 0) + upsertCachedPack(localPack, context: context) + return + } + + let pack: Pack + do { + pack = try await service.createPack( + name: name, description: description, category: category, isPublic: isPublic + ) + } catch { + pack = localPack + } packs.insert(pack, at: 0) + upsertCachedPack(pack, context: context) } - func updatePack(_ packId: String, name: String, description: String?, category: String?, isPublic: Bool) async throws { - let updated = try await service.updatePack( - packId, name: name, description: description, category: category, isPublic: isPublic + func updatePack( + _ packId: String, + name: String, + description: String?, + category: String?, + isPublic: Bool, + context: ModelContext? = nil + ) async throws { + guard let existing = packs.first(where: { $0.id == packId }) else { return } + let localUpdated = rebuildPack( + existing, + name: name, + description: description, + category: PackCategory(rawValue: category ?? ""), + isPublic: isPublic, + updatedAt: Date.iso8601Now() ) + + let updated: Pack + if canUseRemotePersonalStore { + do { + updated = try await service.updatePack( + packId, name: name, description: description, category: category, isPublic: isPublic + ) + } catch { + updated = localUpdated + } + } else { + updated = localUpdated + } if let idx = packs.firstIndex(where: { $0.id == packId }) { packs[idx] = updated } + upsertCachedPack(updated, context: context) } // Optimistic delete: remove immediately, restore on error - func deletePack(_ packId: String) async throws { + func deletePack(_ packId: String, context: ModelContext? = nil) async throws { guard let idx = packs.firstIndex(where: { $0.id == packId }) else { return } let removed = packs.remove(at: idx) + deleteCachedPack(packId, context: context) + guard canUseRemotePersonalStore else { return } do { try await service.deletePack(packId) } catch { packs.insert(removed, at: idx) + upsertCachedPack(removed, context: context) throw error } } func addItem(to packId: String, name: String, weight: Double?, weightUnit: String?, - quantity: Int?, category: String?, consumable: Bool, worn: Bool, notes: String?) async throws { - let item = try await service.addItem( - to: packId, name: name, weight: weight, weightUnit: weightUnit, + quantity: Int?, category: String?, consumable: Bool, worn: Bool, notes: String?, + context: ModelContext? = nil) async throws { + let localItem = makeLocalItem( + packId: packId, name: name, weight: weight, weightUnit: weightUnit, quantity: quantity, category: category, consumable: consumable, worn: worn, notes: notes ) + let item: PackItem + if canUseRemotePersonalStore { + do { + item = try await service.addItem( + to: packId, name: name, weight: weight, weightUnit: weightUnit, + quantity: quantity, category: category, consumable: consumable, worn: worn, notes: notes + ) + } catch { + item = localItem + } + } else { + item = localItem + } if let idx = packs.firstIndex(where: { $0.id == packId }) { var items = packs[idx].items ?? [] items.append(item) packs[idx] = rebuildPack(packs[idx], items: items) + upsertCachedPack(packs[idx], context: context) } } func updateItem(_ itemId: String, in packId: String, name: String, weight: Double?, weightUnit: String?, quantity: Int?, category: String?, - consumable: Bool, worn: Bool, notes: String?) async throws { - let updated = try await service.updateItem( - itemId, in: packId, name: name, weight: weight, weightUnit: weightUnit, - quantity: quantity, category: category, consumable: consumable, worn: worn, notes: notes - ) + consumable: Bool, worn: Bool, notes: String?, + context: ModelContext? = nil) async throws { if let packIdx = packs.firstIndex(where: { $0.id == packId }), let itemIdx = packs[packIdx].items?.firstIndex(where: { $0.id == itemId }) { + let current = packs[packIdx].items?[itemIdx] + let localUpdated = makeLocalItem( + id: itemId, + packId: packId, + name: name, + weight: weight ?? current?.weight, + weightUnit: weightUnit ?? current?.weightUnit.rawValue, + quantity: quantity ?? current?.quantity, + category: category ?? current?.category, + consumable: consumable, + worn: worn, + notes: notes ?? current?.notes + ) + let updated: PackItem + if canUseRemotePersonalStore { + do { + updated = try await service.updateItem( + itemId, in: packId, name: name, weight: weight, weightUnit: weightUnit, + quantity: quantity, category: category, consumable: consumable, worn: worn, notes: notes + ) + } catch { + updated = localUpdated + } + } else { + updated = localUpdated + } var items = packs[packIdx].items ?? [] items[itemIdx] = updated packs[packIdx] = rebuildPack(packs[packIdx], items: items) + upsertCachedPack(packs[packIdx], context: context) } } // Optimistic item delete - func deleteItem(_ itemId: String, from packId: String) async throws { + func deleteItem(_ itemId: String, from packId: String, context: ModelContext? = nil) async throws { guard let packIdx = packs.firstIndex(where: { $0.id == packId }), let itemIdx = packs[packIdx].items?.firstIndex(where: { $0.id == itemId }) else { return } var items = packs[packIdx].items ?? [] let removed = items.remove(at: itemIdx) packs[packIdx] = rebuildPack(packs[packIdx], items: items) + upsertCachedPack(packs[packIdx], context: context) + guard canUseRemotePersonalStore else { return } do { try await service.deleteItem(itemId, from: packId) } catch { @@ -165,22 +263,129 @@ final class PacksViewModel { restored.insert(removed, at: itemIdx) if let idx = packs.firstIndex(where: { $0.id == packId }) { packs[idx] = rebuildPack(packs[idx], items: restored) + upsertCachedPack(packs[idx], context: context) } throw error } } + private func makeLocalPack(name: String, description: String?, category: String?, isPublic: Bool) -> Pack { + let now = Date.iso8601Now() + return Pack( + id: "local-\(UUID().uuidString)", userId: nil, name: name, + description: description, category: PackCategory(rawValue: category ?? ""), + isPublic: isPublic, image: nil, tags: nil, templateId: nil, + deleted: false, isAIGenerated: false, items: [], + totalWeight: 0, baseWeight: 0, wornWeight: 0, consumableWeight: 0, + createdAt: now, updatedAt: now + ) + } + + private func makeLocalItem( + id: String = "local-item-\(UUID().uuidString)", + packId: String, + name: String, + weight: Double?, + weightUnit: String?, + quantity: Int?, + category: String?, + consumable: Bool, + worn: Bool, + notes: String? + ) -> PackItem { + let now = Date.iso8601Now() + return PackItem( + id: id, + packId: packId, + name: name, + description: nil, + weight: weight ?? 0, + weightUnit: WeightUnit(rawValue: weightUnit ?? "g") ?? .g, + quantity: quantity ?? 1, + category: category, + consumable: consumable, + worn: worn, + image: nil, + notes: notes, + catalogItemId: nil, + userId: nil, + deleted: false, + isAIGenerated: false, + templateItemId: nil, + createdAt: now, + updatedAt: now + ) + } + + private func rebuildPack( + _ pack: Pack, + name: String? = nil, + description: String? = nil, + category: PackCategory? = nil, + isPublic: Bool? = nil, + updatedAt: String? = nil + ) -> Pack { + return Pack( + id: pack.id, userId: pack.userId, name: name ?? pack.name, + description: description, category: category ?? pack.category, + isPublic: isPublic ?? pack.isPublic, image: pack.image, tags: pack.tags, + templateId: pack.templateId, deleted: pack.deleted, + isAIGenerated: pack.isAIGenerated, items: pack.items, + totalWeight: pack.totalWeight, baseWeight: pack.baseWeight, + wornWeight: pack.wornWeight, consumableWeight: pack.consumableWeight, + createdAt: pack.createdAt, updatedAt: updatedAt ?? pack.updatedAt + ) + } + private func rebuildPack(_ pack: Pack, items: [PackItem]) -> Pack { - Pack( + let total = items.reduce(0) { $0 + ($1.weightInGrams * Double($1.quantity)) } + let base = items + .filter { !$0.worn && !$0.consumable } + .reduce(0) { $0 + ($1.weightInGrams * Double($1.quantity)) } + let worn = items + .filter(\.worn) + .reduce(0) { $0 + ($1.weightInGrams * Double($1.quantity)) } + let consumable = items + .filter(\.consumable) + .reduce(0) { $0 + ($1.weightInGrams * Double($1.quantity)) } + return Pack( id: pack.id, userId: pack.userId, name: pack.name, description: pack.description, category: pack.category, isPublic: pack.isPublic, image: pack.image, tags: pack.tags, templateId: pack.templateId, deleted: pack.deleted, isAIGenerated: pack.isAIGenerated, - items: items, totalWeight: pack.totalWeight, - baseWeight: pack.baseWeight, wornWeight: pack.wornWeight, - consumableWeight: pack.consumableWeight, - createdAt: pack.createdAt, updatedAt: pack.updatedAt + items: items, totalWeight: total, + baseWeight: base, wornWeight: worn, + consumableWeight: consumable, + createdAt: pack.createdAt, updatedAt: Date.iso8601Now() ) } + + private func upsertCachedPack(_ pack: Pack, context: ModelContext?) { + guard let context else { return } + if let existing = try? context.fetch(FetchDescriptor(predicate: #Predicate { $0.id == pack.id })).first { + existing.name = pack.name + existing.packDescription = pack.description + existing.category = pack.category?.rawValue + existing.isPublic = pack.isPublic + existing.totalWeight = pack.totalWeight + existing.baseWeight = pack.baseWeight + existing.wornWeight = pack.wornWeight + existing.consumableWeight = pack.consumableWeight + existing.imageURL = pack.image + existing.jsonData = try? JSONEncoder().encode(pack) + existing.cachedAt = Date() + } else { + context.insert(CachedPack(from: pack)) + } + try? context.save() + } + + private func deleteCachedPack(_ packId: String, context: ModelContext?) { + guard let context else { return } + if let cached = try? context.fetch(FetchDescriptor(predicate: #Predicate { $0.id == packId })).first { + context.delete(cached) + try? context.save() + } + } } diff --git a/apps/swift/Sources/PackRat/Features/Packs/RecentPacksView.swift b/apps/swift/Sources/PackRat/Features/Packs/RecentPacksView.swift index 516fef0650..70f973ae4f 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/RecentPacksView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/RecentPacksView.swift @@ -25,6 +25,7 @@ struct RecentPacksView: View { } } .navigationTitle("Recent Packs") + .accessibilityIdentifier("recent_packs_view") #if os(iOS) .navigationBarTitleDisplayMode(.large) #endif diff --git a/apps/swift/Sources/PackRat/Features/Profile/ProfileView.swift b/apps/swift/Sources/PackRat/Features/Profile/ProfileView.swift index 4b4f09c58f..e5e9a4e4c8 100644 --- a/apps/swift/Sources/PackRat/Features/Profile/ProfileView.swift +++ b/apps/swift/Sources/PackRat/Features/Profile/ProfileView.swift @@ -18,102 +18,12 @@ struct ProfileView: View { @State private var notificationAuthStatus: UNAuthorizationStatus = .notDetermined var body: some View { - ScrollView { - VStack(spacing: 24) { - avatarSection - .padding(.top, 8) - - Form { - Section("Account Info") { - LabeledContent("Email") { - Text(authManager.currentUser?.email ?? "") - .foregroundStyle(.secondary) - } - TextField("First Name", text: $firstName) - TextField("Last Name", text: $lastName) - } - - Section("Role") { - LabeledContent("Account Type") { - Text(authManager.currentUser?.role?.capitalized ?? "User") - .foregroundStyle(.secondary) - } - LabeledContent("Member Since") { - if let date = authManager.currentUser?.createdAt?.toDate() { - Text(date.formatted(date: .abbreviated, time: .omitted)) - .foregroundStyle(.secondary) - } - } - } - - if let error = saveError { - Section { InlineErrorView(message: error) } - } - - if saveSuccess { - Section { - Label("Profile updated", systemImage: "checkmark.circle.fill") - .foregroundStyle(.green) - } - } - - Section { - Button { - save() - } label: { - if isSaving { - HStack { - ProgressView().controlSize(.small) - Text("Saving…") - } - } else { - Text("Save Changes") - } - } - .disabled(isSaving || !hasChanges) - } - - Section("Notifications") { - if notificationAuthStatus == .denied { - HStack { - Image(systemName: "bell.slash.fill").foregroundStyle(.secondary) - Text("Notifications are blocked in Settings") - .font(.callout) - .foregroundStyle(.secondary) - Spacer() - #if os(iOS) - Button("Open Settings") { - if let url = URL(string: UIApplication.openSettingsURLString) { - UIApplication.shared.open(url) - } - } - .font(.callout) - #endif - } - } else { - Toggle("Push Notifications", isOn: $notificationsEnabled) - .onChange(of: notificationsEnabled) { _, enabled in - Task { await toggleNotifications(enabled) } - } - } - } - - Section { - Button("Sign Out", role: .destructive) { - showingSignOutAlert = true - } - Button("Delete Account", role: .destructive) { - showingDeleteAccountAlert = true - } - .disabled(isDeletingAccount) - } - } - .formStyle(.grouped) - #if os(macOS) - .frame(maxWidth: 500) - #endif + Group { + if authManager.isAuthenticated { + authenticatedProfile + } else { + guestProfile } - .padding() } .navigationTitle("Profile") .onAppear { @@ -138,6 +48,148 @@ struct ProfileView: View { } } + private var authenticatedProfile: some View { + ScrollView { + VStack(spacing: 24) { + avatarSection + .padding(.top, 8) + + profileForm + } + .padding() + } + } + + private var guestProfile: some View { + Form { + Section { + HStack(spacing: 12) { + Image(systemName: "person.crop.circle") + .font(.title2) + .foregroundStyle(.tint) + .frame(width: 40, height: 40) + VStack(alignment: .leading, spacing: 2) { + Text("Guest Mode") + .font(.headline) + Text("Local packs and trips stay on this device.") + .font(.subheadline) + .foregroundStyle(.secondary) + } + } + .padding(.vertical, 4) + } + + Section { + Button { + authManager.signOut() + } label: { + Label("Sign In or Create Account", systemImage: "person.badge.key") + } + } footer: { + Text("An account unlocks sync, social features, AI tools, templates, and profile settings.") + } + + notificationSection + } + .formStyle(.grouped) + } + + private var profileForm: some View { + Form { + Section("Account Info") { + LabeledContent("Email") { + Text(authManager.currentUser?.email ?? "") + .foregroundStyle(.secondary) + } + TextField("First Name", text: $firstName) + TextField("Last Name", text: $lastName) + } + + Section("Role") { + LabeledContent("Account Type") { + Text(authManager.currentUser?.role?.capitalized ?? "User") + .foregroundStyle(.secondary) + } + LabeledContent("Member Since") { + if let date = authManager.currentUser?.createdAt?.toDate() { + Text(date.formatted(date: .abbreviated, time: .omitted)) + .foregroundStyle(.secondary) + } + } + } + + if let error = saveError { + Section { InlineErrorView(message: error) } + } + + if saveSuccess { + Section { + Label("Profile updated", systemImage: "checkmark.circle.fill") + .foregroundStyle(.green) + } + } + + Section { + Button { + save() + } label: { + if isSaving { + HStack { + ProgressView().controlSize(.small) + Text("Saving…") + } + } else { + Text("Save Changes") + } + } + .disabled(isSaving || !hasChanges) + } + + notificationSection + + Section { + Button("Sign Out", role: .destructive) { + showingSignOutAlert = true + } + Button("Delete Account", role: .destructive) { + showingDeleteAccountAlert = true + } + .disabled(isDeletingAccount) + } + } + .formStyle(.grouped) + #if os(macOS) + .frame(maxWidth: 500) + #endif + } + + private var notificationSection: some View { + Section("Notifications") { + if notificationAuthStatus == .denied { + HStack { + Image(systemName: "bell.slash.fill").foregroundStyle(.secondary) + Text("Notifications are blocked in Settings") + .font(.callout) + .foregroundStyle(.secondary) + Spacer() + #if os(iOS) + Button("Open Settings") { + if let url = URL(string: UIApplication.openSettingsURLString) { + UIApplication.shared.open(url) + } + } + .font(.callout) + #endif + } + } else { + Toggle("Push Notifications", isOn: $notificationsEnabled) + .onChange(of: notificationsEnabled) { _, enabled in + Task { await toggleNotifications(enabled) } + } + } + } + } + // MARK: - Avatar private var avatarSection: some View { diff --git a/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift b/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift index 25bf14baf7..361cf9fd85 100644 --- a/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift +++ b/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift @@ -56,12 +56,19 @@ final class SeasonSuggestionsViewModel { struct SeasonSuggestionsView: View { @State private var viewModel = SeasonSuggestionsViewModel() + @Environment(AuthManager.self) private var authManager @Environment(\.dismiss) private var dismiss var body: some View { NavigationStack { Group { - if viewModel.isLoading { + if !authManager.isAuthenticated { + EmptyStateView( + "Sign In for Season Suggestions", + subtitle: "Season-aware suggestions are generated by PackRat's service and are available when you are signed in.", + systemImage: "leaf" + ) + } else if viewModel.isLoading { ProgressView("Getting suggestions…").frame(maxWidth: .infinity, maxHeight: .infinity) } else if viewModel.hasLoaded && viewModel.suggestions.isEmpty { EmptyStateView( @@ -99,52 +106,35 @@ struct SeasonSuggestionsView: View { } private var locationForm: some View { - VStack(spacing: 24) { - VStack(spacing: 8) { - Image(systemName: "leaf.circle.fill") - .font(.system(size: 56)) - .foregroundStyle(.mint) - Text("AI-Powered Packing Tips") - .font(.title2.bold()) - Text("Get seasonal gear recommendations based on your destination.") - .font(.subheadline) - .foregroundStyle(.secondary) - .multilineTextAlignment(.center) - .padding(.horizontal, 24) - } - .padding(.top, 32) - - VStack(alignment: .leading, spacing: 8) { - Text("Where are you going?") - .font(.subheadline.bold()) + Form { + Section { TextField("e.g. Yosemite, Pacific Crest Trail…", text: $viewModel.location) - .textFieldStyle(.roundedBorder) .submitLabel(.go) .onSubmit { Task { await viewModel.load() } } + } header: { + Text("Destination") + } footer: { + Text("Enter a trail, park, city, or region to get season-aware packing guidance.") } - .padding(.horizontal, 24) if let error = viewModel.error { - InlineErrorView(message: error) - .padding(.horizontal, 24) + Section { + InlineErrorView(message: error) + } } - Button { - Task { await viewModel.load() } - } label: { - Label("Get Suggestions", systemImage: "sparkles") - .font(.headline) - .frame(maxWidth: .infinity) - .padding(.vertical, 12) - .background(Color.accentColor, in: RoundedRectangle(cornerRadius: 12)) - .foregroundStyle(.white) + Section { + Button { + Task { await viewModel.load() } + } label: { + Label("Get Suggestions", systemImage: "sparkles") + } + .disabled(viewModel.location.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty || viewModel.isLoading) } - .buttonStyle(.plain) - .padding(.horizontal, 24) - .disabled(viewModel.location.isEmpty || viewModel.isLoading) - - Spacer() } + #if os(iOS) + .listStyle(.insetGrouped) + #endif } private var suggestionsList: some View { diff --git a/apps/swift/Sources/PackRat/Features/Shopping/ShoppingListView.swift b/apps/swift/Sources/PackRat/Features/Shopping/ShoppingListView.swift index bbd0d71a8a..e702fec7ca 100644 --- a/apps/swift/Sources/PackRat/Features/Shopping/ShoppingListView.swift +++ b/apps/swift/Sources/PackRat/Features/Shopping/ShoppingListView.swift @@ -189,12 +189,16 @@ private struct AddShoppingItemSheet: View { } } Section("Details") { - TextField("Estimated price ($)", text: $priceText) - #if os(iOS) - .keyboardType(.decimalPad) - #endif + LabeledContent("Estimated Price") { + TextField("0.00", text: $priceText) + .multilineTextAlignment(.trailing) + .frame(width: 96) + #if os(iOS) + .keyboardType(.decimalPad) + #endif + } TextField("Notes", text: $notes, axis: .vertical) - .lineLimit(3) + .lineLimit(3, reservesSpace: true) } } .navigationTitle("Add Item") diff --git a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift index a707f91ac5..69309cbbd5 100644 --- a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift +++ b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift @@ -5,6 +5,7 @@ import SwiftUI struct TrailConditionsListView: View { @Bindable var viewModel: TrailConditionsViewModel @Binding var selectedId: String? + @Environment(AuthManager.self) private var authManager @State private var showingSubmitSheet = false #if os(iOS) @Environment(\.horizontalSizeClass) private var horizontalSizeClass @@ -15,7 +16,13 @@ struct TrailConditionsListView: View { var body: some View { Group { - if viewModel.isLoading && viewModel.reports.isEmpty { + if !authManager.isAuthenticated { + EmptyStateView( + "Sign In to View Trail Reports", + subtitle: "Community trail conditions are shared through your PackRat account.", + systemImage: "figure.hiking" + ) + } else if viewModel.isLoading && viewModel.reports.isEmpty { ProgressView("Loading reports…").frame(maxWidth: .infinity, maxHeight: .infinity) } else if let error = viewModel.error, viewModel.reports.isEmpty { ErrorView(error, retry: { await viewModel.load() }) @@ -36,10 +43,12 @@ struct TrailConditionsListView: View { .toolbar { ToolbarItem(placement: .primaryAction) { Button("Submit Report", systemImage: "plus") { showingSubmitSheet = true } + .accessibilityIdentifier("trail_conditions_submit_report_button") + .disabled(!authManager.isAuthenticated) } } - .task { if viewModel.reports.isEmpty { await viewModel.load() } } - .refreshable { await viewModel.load() } + .task { if authManager.isAuthenticated && viewModel.reports.isEmpty { await viewModel.load() } } + .refreshable { if authManager.isAuthenticated { await viewModel.load() } } .sheet(isPresented: $showingSubmitSheet) { SubmitTrailConditionView(viewModel: viewModel) } @@ -59,6 +68,8 @@ struct TrailConditionsListView: View { } } .tag(report.id) + .accessibilityIdentifier("trail_report_row_\(report.trailName)") + .accessibilityLabel(report.trailName) .contextMenu { Button("Delete", systemImage: "trash", role: .destructive) { Task { try? await viewModel.deleteReport(report.id) } @@ -67,8 +78,10 @@ struct TrailConditionsListView: View { } private var reportList: some View { - List(viewModel.filteredReports, selection: $selectedId) { report in - reportRow(report) + List(selection: $selectedId) { + ForEach(viewModel.filteredReports) { report in + reportRow(report) + } } } } @@ -80,6 +93,7 @@ private struct TrailReportRow: View { VStack(alignment: .leading, spacing: 4) { HStack { Text(report.trailName).font(.headline) + .accessibilityIdentifier("trail_report_title_\(report.trailName)") Spacer() conditionBadge } @@ -95,7 +109,7 @@ private struct TrailReportRow: View { private var conditionBadge: some View { Label( - (report.overallCondition ?? "unknown").capitalized, + report.overallCondition.capitalized, systemImage: report.conditionSymbol ) .font(.caption.bold()) @@ -197,7 +211,7 @@ struct TrailConditionDetailView: View { Image(systemName: report.conditionSymbol) .font(.title2) .foregroundStyle(color) - Text((report.overallCondition ?? "unknown").capitalized) + Text(report.overallCondition.capitalized) .font(.caption.bold()) .foregroundStyle(color) } @@ -222,7 +236,7 @@ struct SubmitTrailConditionView: View { @State private var trailName = "" @State private var trailRegion = "" - @State private var surface = "" + @State private var surface = TrailSurface.dirt.rawValue @State private var condition = "good" @State private var selectedHazards: Set = [] @State private var notes = "" @@ -237,7 +251,9 @@ struct SubmitTrailConditionView: View { Form { Section("Trail") { TextField("Trail Name", text: $trailName) + .accessibilityIdentifier("trail_report_name") TextField("Region / Area (optional)", text: $trailRegion) + .accessibilityIdentifier("trail_report_region") } Section("Conditions") { Picker("Overall", selection: $condition) { @@ -246,7 +262,6 @@ struct SubmitTrailConditionView: View { } } Picker("Surface", selection: $surface) { - Text("Not specified").tag("") ForEach(TrailSurface.allCases, id: \.rawValue) { s in Label(s.label, systemImage: s.symbol).tag(s.rawValue) } @@ -263,6 +278,7 @@ struct SubmitTrailConditionView: View { Section("Notes") { TextField("Describe conditions in detail…", text: $notes, axis: .vertical) .lineLimit(4, reservesSpace: true) + .accessibilityIdentifier("trail_report_notes") } if let error { Section { InlineErrorView(message: error) } } } @@ -292,7 +308,7 @@ struct SubmitTrailConditionView: View { try await viewModel.submitReport( trailName: trailName, trailRegion: trailRegion.isEmpty ? nil : trailRegion, - surface: surface.isEmpty ? nil : surface, + surface: surface, overallCondition: condition, hazards: Array(selectedHazards), notes: notes.isEmpty ? nil : notes diff --git a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsViewModel.swift b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsViewModel.swift index 9f85711740..d86e9a9574 100644 --- a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsViewModel.swift @@ -2,6 +2,7 @@ import Foundation import Observation @Observable +@MainActor final class TrailConditionsViewModel { var reports: [TrailConditionReport] = [] var isLoading = false @@ -50,6 +51,8 @@ final class TrailConditionsViewModel { hazards: hazards, notes: notes ) + searchText = "" + reports.removeAll { $0.id == report.id } reports.insert(report, at: 0) } diff --git a/apps/swift/Sources/PackRat/Features/Trips/TripDetailView.swift b/apps/swift/Sources/PackRat/Features/Trips/TripDetailView.swift index 41fd93ceec..b3f6683367 100644 --- a/apps/swift/Sources/PackRat/Features/Trips/TripDetailView.swift +++ b/apps/swift/Sources/PackRat/Features/Trips/TripDetailView.swift @@ -17,10 +17,17 @@ struct TripDetailView: View { return CLLocationCoordinate2D(latitude: lat, longitude: lon) } + private var hasOverviewDetails: Bool { + !trip.dateRange.isEmpty + || trip.location?.name?.isEmpty == false + || trip.description?.isEmpty == false + || trip.notes?.isEmpty == false + } + var body: some View { ScrollView { VStack(alignment: .leading, spacing: 20) { - metaCards.padding(.horizontal) + metaCards // Map — shown when the trip has coordinates if let coord = coordinate { @@ -47,6 +54,20 @@ struct TripDetailView: View { } } + if !hasOverviewDetails { + ContentUnavailableView { + Label("No Trip Details", systemImage: "map") + .symbolRenderingMode(.hierarchical) + } description: { + Text("Add dates, a location, notes, and a linked pack to make this trip easier to plan.") + } actions: { + Button("Edit Trip") { showingEditSheet = true } + .buttonStyle(.borderedProminent) + } + .padding(.horizontal) + .frame(maxWidth: .infinity, minHeight: 220) + } + packSection } .padding(.bottom) @@ -78,58 +99,64 @@ struct TripDetailView: View { let linkedPack = appState.packsVM.packs.first(where: { $0.id == trip.packId }) labeledSection("Pack") { if let pack = linkedPack { - HStack(spacing: 12) { - Image(systemName: "backpack") - .font(.title3) - .foregroundStyle(.tint) - VStack(alignment: .leading, spacing: 2) { - Text(pack.name).font(.callout.bold()) - Text("\(pack.itemCount) items") - .font(.caption) - .foregroundStyle(.secondary) - } - Spacer() - if let total = pack.totalWeight { - Text(pack.formattedWeight(total)) - .font(.callout.monospacedDigit().bold()) - .foregroundStyle(.tint) - } - // Navigate to this pack - Button { - appState.navItem = .packs - appState.selectedPackId = pack.id - } label: { - Label("View Pack", systemImage: "arrow.right.circle") - .labelStyle(.iconOnly) + Button { + appState.navItem = .packs + appState.selectedPackId = pack.id + } label: { + HStack(spacing: 12) { + RoundedRectangle(cornerRadius: 7, style: .continuous) + .fill(Color.blue.gradient) + .frame(width: 30, height: 30) + .overlay { + Image(systemName: "backpack.fill") + .font(.system(size: 15, weight: .semibold)) + .foregroundStyle(.white) + } + + VStack(alignment: .leading, spacing: 2) { + Text(pack.name).font(.callout.bold()) + Text("\(pack.itemCount) items") + .font(.caption) + .foregroundStyle(.secondary) + } + Spacer() + if let total = pack.totalWeight { + Text(pack.formattedWeight(total)) + .font(.callout.monospacedDigit().bold()) + .foregroundStyle(.tint) + } + Image(systemName: "chevron.right") + .font(.footnote.weight(.semibold)) .foregroundStyle(.secondary) } - .buttonStyle(.plain) - .help("Go to pack") } + .buttonStyle(.plain) .padding(14) - .background(.fill.secondary, in: RoundedRectangle(cornerRadius: 10)) + .background(.background.secondary, in: RoundedRectangle(cornerRadius: 12, style: .continuous)) } else { Button { showingEditSheet = true } label: { - Label("Link a Pack to this trip", systemImage: "plus.circle") + Label("Link a Pack", systemImage: "plus.circle") .font(.callout) - .foregroundStyle(.tint) } - .buttonStyle(.plain) - .padding(.vertical, 4) + .buttonStyle(.bordered) } } } + @ViewBuilder private var metaCards: some View { - HStack(spacing: 10) { - if !trip.dateRange.isEmpty { - metaCard("Dates", trip.dateRange, symbol: "calendar", color: .blue) - } - if let loc = trip.location?.name { - metaCard("Location", loc, symbol: "mappin.circle.fill", color: .red) + if !trip.dateRange.isEmpty || trip.location?.name?.isEmpty == false { + HStack(spacing: 10) { + if !trip.dateRange.isEmpty { + metaCard("Dates", trip.dateRange, symbol: "calendar", color: .blue) + } + if let loc = trip.location?.name, !loc.isEmpty { + metaCard("Location", loc, symbol: "mappin.circle.fill", color: .red) + } } + .padding(.horizontal) } } @@ -188,8 +215,8 @@ struct TripDetailView: View { private func labeledSection(_ title: String, @ViewBuilder content: () -> some View) -> some View { VStack(alignment: .leading, spacing: 8) { - Text(title) - .font(.caption.uppercaseSmallCaps()) + Text(title.uppercased()) + .font(.caption.weight(.semibold)) .foregroundStyle(.secondary) content() } diff --git a/apps/swift/Sources/PackRat/Features/Trips/TripFormView.swift b/apps/swift/Sources/PackRat/Features/Trips/TripFormView.swift index f77efd5f27..956a502982 100644 --- a/apps/swift/Sources/PackRat/Features/Trips/TripFormView.swift +++ b/apps/swift/Sources/PackRat/Features/Trips/TripFormView.swift @@ -1,5 +1,6 @@ import SwiftUI import MapKit +import SwiftData struct TripFormView: View { let viewModel: TripsViewModel @@ -8,6 +9,7 @@ struct TripFormView: View { @Environment(\.dismiss) private var dismiss @Environment(AppState.self) private var appState + @Environment(\.modelContext) private var modelContext @State private var name = "" @State private var description = "" @@ -38,8 +40,10 @@ struct TripFormView: View { Form { Section("Details") { TextField("Trip Name", text: $name) + .accessibilityIdentifier("trip_name") TextField("Description (optional)", text: $description, axis: .vertical) .lineLimit(3, reservesSpace: true) + .accessibilityIdentifier("trip_description") } Section("Location") { @@ -52,19 +56,16 @@ struct TripFormView: View { Text(locationName.isEmpty ? "Search for a location…" : locationName) .foregroundStyle(locationName.isEmpty ? Color.secondary : Color.primary) Spacer() - if !locationName.isEmpty { - Button { - locationName = ""; locationLat = 0; locationLon = 0 - } label: { - Image(systemName: "xmark.circle.fill").foregroundStyle(.secondary) - } - .buttonStyle(.plain) - } else { - Image(systemName: "chevron.right").font(.caption).foregroundStyle(.secondary) - } + Image(systemName: "chevron.right").font(.caption).foregroundStyle(.secondary) } } .buttonStyle(.plain) + if !locationName.isEmpty { + Button("Clear Location", systemImage: "xmark.circle") { + locationName = ""; locationLat = 0; locationLon = 0 + } + .foregroundStyle(.red) + } if locationLat != 0 || locationLon != 0 { Label(String(format: "%.4f, %.4f", locationLat, locationLon), systemImage: "location.fill") @@ -89,6 +90,11 @@ struct TripFormView: View { .tag(Optional(pack.id)) } } + if availablePacks.isEmpty { + Text("Create a pack first if you want to connect gear to this trip.") + .font(.footnote) + .foregroundStyle(.secondary) + } if let packId = selectedPackId, let pack = availablePacks.first(where: { $0.id == packId }) { HStack { @@ -107,6 +113,7 @@ struct TripFormView: View { Section("Notes") { TextField("Additional notes", text: $notes, axis: .vertical) .lineLimit(4, reservesSpace: true) + .accessibilityIdentifier("trip_notes") } if let error { @@ -183,7 +190,8 @@ struct TripFormView: View { endDate: hasDates ? endDate : nil, location: location, notes: notes.isEmpty ? nil : notes, - packId: selectedPackId + packId: selectedPackId, + context: modelContext ) } else { try await viewModel.createTrip( @@ -192,7 +200,8 @@ struct TripFormView: View { endDate: hasDates ? endDate : nil, location: location, notes: notes.isEmpty ? nil : notes, - packId: selectedPackId + packId: selectedPackId, + context: modelContext ) } dismiss() diff --git a/apps/swift/Sources/PackRat/Features/Trips/TripWindowView.swift b/apps/swift/Sources/PackRat/Features/Trips/TripWindowView.swift index a18f8bd143..7e1879835c 100644 --- a/apps/swift/Sources/PackRat/Features/Trips/TripWindowView.swift +++ b/apps/swift/Sources/PackRat/Features/Trips/TripWindowView.swift @@ -1,9 +1,11 @@ import SwiftUI +import SwiftData // Opened via openWindow(id: "trip", value: tripId) // Creates its own AppState so TripDetailView's @Environment(AppState.self) resolves struct TripWindowView: View { let tripId: String + @Environment(\.modelContext) private var modelContext @State private var appState = AppState() private var trip: Trip? { @@ -24,8 +26,8 @@ struct TripWindowView: View { } .environment(appState) .task { - await appState.tripsVM.load() - await appState.packsVM.load() + await appState.tripsVM.load(context: modelContext) + await appState.packsVM.load(context: modelContext) } } } diff --git a/apps/swift/Sources/PackRat/Features/Trips/TripsListView.swift b/apps/swift/Sources/PackRat/Features/Trips/TripsListView.swift index 321cda6a33..9dcb84cc27 100644 --- a/apps/swift/Sources/PackRat/Features/Trips/TripsListView.swift +++ b/apps/swift/Sources/PackRat/Features/Trips/TripsListView.swift @@ -19,7 +19,7 @@ struct TripsListView: View { if viewModel.isLoading && viewModel.trips.isEmpty { ProgressView("Loading trips…").frame(maxWidth: .infinity, maxHeight: .infinity) } else if let error = viewModel.error, viewModel.trips.isEmpty { - ErrorView(error, retry: { await viewModel.load() }) + ErrorView(error, retry: { await viewModel.load(context: modelContext) }) } else if viewModel.trips.isEmpty { EmptyStateView( "No Trips Yet", @@ -37,6 +37,7 @@ struct TripsListView: View { .toolbar { ToolbarItem(placement: .primaryAction) { Button("Plan Trip", systemImage: "plus") { showingCreateSheet = true } + .accessibilityIdentifier("trips_plan_trip_button") .keyboardShortcut("n", modifiers: [.command, .shift]) } } diff --git a/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift b/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift index f6452b6241..061a8c457c 100644 --- a/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift @@ -20,6 +20,9 @@ final class TripsViewModel { var currentPage = 1 var hasMore = true private let pageSize = 30 + private var canUseRemotePersonalStore: Bool { + NetworkMonitor.shared.isConnected && KeychainService.shared.sessionToken != nil + } var filteredTrips: [Trip] { guard !searchText.isEmpty else { return trips } @@ -58,6 +61,11 @@ final class TripsViewModel { error = nil defer { isLoading = false } + guard canUseRemotePersonalStore else { + if trips.isEmpty { isCacheLoaded = true } + return + } + do { let fresh = try await service.listTrips(page: 1, limit: pageSize) trips = fresh @@ -72,7 +80,7 @@ final class TripsViewModel { } func loadMore() async { - guard hasMore, !isLoading else { return } + guard hasMore, !isLoading, canUseRemotePersonalStore else { return } let nextPage = currentPage + 1 isLoading = true defer { isLoading = false } @@ -105,34 +113,153 @@ final class TripsViewModel { } func createTrip(name: String, description: String?, startDate: Date?, endDate: Date?, - location: TripLocationBody?, notes: String?, packId: String?) async throws { - let trip = try await service.createTrip( + location: TripLocationBody?, notes: String?, packId: String?, + context: ModelContext? = nil) async throws { + let localTrip = makeLocalTrip( name: name, description: description, startDate: startDate, endDate: endDate, location: location, notes: notes, packId: packId ) + let trip: Trip + if canUseRemotePersonalStore { + do { + trip = try await service.createTrip( + name: name, description: description, startDate: startDate, endDate: endDate, + location: location, notes: notes, packId: packId + ) + } catch { + trip = localTrip + } + } else { + trip = localTrip + } trips.insert(trip, at: 0) + upsertCachedTrip(trip, context: context) } func updateTrip(_ tripId: String, name: String, description: String?, startDate: Date?, - endDate: Date?, location: TripLocationBody?, notes: String?, packId: String?) async throws { - let updated = try await service.updateTrip( - tripId, name: name, description: description, startDate: startDate, endDate: endDate, - location: location, notes: notes, packId: packId + endDate: Date?, location: TripLocationBody?, notes: String?, packId: String?, + context: ModelContext? = nil) async throws { + guard let existing = trips.first(where: { $0.id == tripId }) else { return } + let localUpdated = rebuildTrip( + existing, + name: name, + description: description, + startDate: startDate?.iso8601String(), + endDate: endDate?.iso8601String(), + location: location.map { TripLocation(latitude: $0.latitude, longitude: $0.longitude, name: $0.name) }, + notes: notes, + packId: packId, + updatedAt: Date.iso8601Now() ) + let updated: Trip + if canUseRemotePersonalStore { + do { + updated = try await service.updateTrip( + tripId, name: name, description: description, startDate: startDate, endDate: endDate, + location: location, notes: notes, packId: packId + ) + } catch { + updated = localUpdated + } + } else { + updated = localUpdated + } if let idx = trips.firstIndex(where: { $0.id == tripId }) { trips[idx] = updated } + upsertCachedTrip(updated, context: context) } // Optimistic delete - func deleteTrip(_ tripId: String) async throws { + func deleteTrip(_ tripId: String, context: ModelContext? = nil) async throws { guard let idx = trips.firstIndex(where: { $0.id == tripId }) else { return } let removed = trips.remove(at: idx) + deleteCachedTrip(tripId, context: context) + guard canUseRemotePersonalStore else { return } do { try await service.deleteTrip(tripId) } catch { trips.insert(removed, at: idx) + upsertCachedTrip(removed, context: context) throw error } } + + private func makeLocalTrip( + name: String, + description: String?, + startDate: Date?, + endDate: Date?, + location: TripLocationBody?, + notes: String?, + packId: String? + ) -> Trip { + let now = Date.iso8601Now() + return Trip( + id: "local-\(UUID().uuidString)", + name: name, + description: description, + notes: notes, + location: location.map { TripLocation(latitude: $0.latitude, longitude: $0.longitude, name: $0.name) }, + startDate: startDate?.iso8601String(), + endDate: endDate?.iso8601String(), + userId: nil, + packId: packId, + deleted: false, + createdAt: now, + updatedAt: now + ) + } + + private func rebuildTrip( + _ trip: Trip, + name: String, + description: String?, + startDate: String?, + endDate: String?, + location: TripLocation?, + notes: String?, + packId: String?, + updatedAt: String + ) -> Trip { + Trip( + id: trip.id, + name: name, + description: description, + notes: notes, + location: location, + startDate: startDate, + endDate: endDate, + userId: trip.userId, + packId: packId, + deleted: trip.deleted, + createdAt: trip.createdAt, + updatedAt: updatedAt + ) + } + + private func upsertCachedTrip(_ trip: Trip, context: ModelContext?) { + guard let context else { return } + if let existing = try? context.fetch(FetchDescriptor(predicate: #Predicate { $0.id == trip.id })).first { + existing.name = trip.name + existing.tripDescription = trip.description + existing.startDate = trip.startDate + existing.endDate = trip.endDate + existing.locationName = trip.location?.name + existing.packId = trip.packId + existing.jsonData = try? JSONEncoder().encode(trip) + existing.cachedAt = Date() + } else { + context.insert(CachedTrip(from: trip)) + } + try? context.save() + } + + private func deleteCachedTrip(_ tripId: String, context: ModelContext?) { + guard let context else { return } + if let cached = try? context.fetch(FetchDescriptor(predicate: #Predicate { $0.id == tripId })).first { + context.delete(cached) + try? context.save() + } + } } diff --git a/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertPreferencesView.swift b/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertPreferencesView.swift index 4d6e0066ea..c071d360fe 100644 --- a/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertPreferencesView.swift +++ b/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertPreferencesView.swift @@ -16,7 +16,11 @@ struct WeatherAlertPreferencesView: View { Form { Section("General") { Toggle("Weather Notifications", isOn: $weatherNotifications) + .accessibilityIdentifier("weather_alert_notifications_toggle") + .accessibilityValue(weatherNotifications ? "on" : "off") Toggle("Location Monitoring", isOn: $locationMonitoring) + .accessibilityIdentifier("weather_alert_location_monitoring_toggle") + .accessibilityValue(locationMonitoring ? "on" : "off") } Section { @@ -28,6 +32,8 @@ struct WeatherAlertPreferencesView: View { .foregroundStyle(.yellow) } } + .accessibilityIdentifier("weather_alert_severe_storms_toggle") + .accessibilityValue(severeStorms ? "on" : "off") Toggle(isOn: $tornadoWarnings) { Label { Text("Tornado Warnings") @@ -36,6 +42,8 @@ struct WeatherAlertPreferencesView: View { .foregroundStyle(.red) } } + .accessibilityIdentifier("weather_alert_tornado_warnings_toggle") + .accessibilityValue(tornadoWarnings ? "on" : "off") Toggle(isOn: $floodAlerts) { Label { Text("Flood Alerts") @@ -44,6 +52,8 @@ struct WeatherAlertPreferencesView: View { .foregroundStyle(.blue) } } + .accessibilityIdentifier("weather_alert_flood_alerts_toggle") + .accessibilityValue(floodAlerts ? "on" : "off") Toggle(isOn: $fireDanger) { Label { Text("Fire Danger") @@ -52,6 +62,8 @@ struct WeatherAlertPreferencesView: View { .foregroundStyle(.orange) } } + .accessibilityIdentifier("weather_alert_fire_danger_toggle") + .accessibilityValue(fireDanger ? "on" : "off") Toggle(isOn: $winterWeather) { Label { Text("Winter Weather") @@ -60,6 +72,8 @@ struct WeatherAlertPreferencesView: View { .foregroundStyle(.cyan) } } + .accessibilityIdentifier("weather_alert_winter_weather_toggle") + .accessibilityValue(winterWeather ? "on" : "off") Toggle(isOn: $extremeTemperature) { Label { Text("Extreme Temperature") @@ -68,6 +82,8 @@ struct WeatherAlertPreferencesView: View { .foregroundStyle(.red) } } + .accessibilityIdentifier("weather_alert_extreme_temperature_toggle") + .accessibilityValue(extremeTemperature ? "on" : "off") Toggle(isOn: $highWinds) { Label { Text("High Winds") @@ -76,6 +92,8 @@ struct WeatherAlertPreferencesView: View { .foregroundStyle(.teal) } } + .accessibilityIdentifier("weather_alert_high_winds_toggle") + .accessibilityValue(highWinds ? "on" : "off") Toggle(isOn: $fogAlerts) { Label { Text("Fog Alerts") @@ -84,6 +102,8 @@ struct WeatherAlertPreferencesView: View { .foregroundStyle(.secondary) } } + .accessibilityIdentifier("weather_alert_fog_alerts_toggle") + .accessibilityValue(fogAlerts ? "on" : "off") } header: { Text("Alert Types") } footer: { diff --git a/apps/swift/Sources/PackRat/Features/Weather/WeatherView.swift b/apps/swift/Sources/PackRat/Features/Weather/WeatherView.swift index 8bdfd8e6cf..cb6cbcea03 100644 --- a/apps/swift/Sources/PackRat/Features/Weather/WeatherView.swift +++ b/apps/swift/Sources/PackRat/Features/Weather/WeatherView.swift @@ -4,42 +4,67 @@ struct WeatherView: View { @Bindable var viewModel: WeatherViewModel @State private var showingAlerts = false @State private var showingAlertPreferences = false + @State private var isSearchPresented = false private var activeAlerts: [WeatherAlert] { viewModel.forecast?.alerts?.alert ?? [] } var body: some View { - ScrollView { - VStack(spacing: 20) { - searchBar + List { + searchStateContent + .listRowSeparator(.hidden) + .listRowBackground(Color.clear) - if !viewModel.savedLocations.isEmpty && viewModel.searchText.isEmpty && viewModel.searchResults.isEmpty { - savedLocationsSection - } + if !viewModel.savedLocations.isEmpty && viewModel.searchText.isEmpty && viewModel.searchResults.isEmpty { + savedLocationsSection + .listRowSeparator(.hidden) + .listRowBackground(Color.clear) + } - if let forecast = viewModel.forecast { - forecastContent(forecast) - } else if viewModel.isLoadingForecast { - ProgressView("Loading forecast...").padding(.top, 40) - } else if let error = viewModel.forecastError { - ErrorView(error, retry: { await viewModel.refresh() }).padding(.top, 20) - } else if viewModel.savedLocations.isEmpty { - EmptyStateView( - "No Saved Locations", - subtitle: "Search for a city or ZIP code and save it to track the weather", - systemImage: "cloud.sun" - ) - .padding(.top, 20) - } + if let forecast = viewModel.forecast { + forecastContent(forecast) + .listRowSeparator(.hidden) + .listRowBackground(Color.clear) + } else if viewModel.isLoadingForecast { + ProgressView("Loading forecast...") + .frame(maxWidth: .infinity) + .listRowSeparator(.hidden) + .listRowBackground(Color.clear) + } else if let error = viewModel.forecastError { + ErrorView(error, retry: { await viewModel.refresh() }) + .listRowSeparator(.hidden) + .listRowBackground(Color.clear) + } else if viewModel.savedLocations.isEmpty { + EmptyStateView( + "No Saved Locations", + subtitle: "Search for a city or ZIP code and save it to track the weather", + systemImage: "cloud.sun" + ) + .listRowSeparator(.hidden) + .listRowBackground(Color.clear) } - .padding(.horizontal) - .padding(.bottom) } + #if os(iOS) + .listStyle(.insetGrouped) + #else + .listStyle(.inset) + #endif .navigationTitle("Weather") + #if os(iOS) + .searchable( + text: $viewModel.searchText, + isPresented: $isSearchPresented, + placement: .navigationBarDrawer(displayMode: .always), + prompt: "Search locations…" + ) + #else + .searchable(text: $viewModel.searchText, isPresented: $isSearchPresented, prompt: "Search locations…") + #endif + .onChange(of: viewModel.searchText) { viewModel.onSearchTextChanged() } .refreshable { await viewModel.refresh() } .toolbar { - ToolbarItem(placement: .primaryAction) { + ToolbarItem(placement: alertsToolbarPlacement) { Button { showingAlerts = true } label: { @@ -47,6 +72,8 @@ struct WeatherView: View { .foregroundStyle(activeAlerts.isEmpty ? Color.secondary : Color.red) } .disabled(viewModel.forecast == nil) + .accessibilityLabel("Alerts") + .accessibilityIdentifier("weather_alerts_button") } if viewModel.isLoadingForecast && viewModel.forecast != nil { ToolbarItem(placement: .secondaryAction) { @@ -66,34 +93,39 @@ struct WeatherView: View { } } + private var alertsToolbarPlacement: ToolbarItemPlacement { + #if os(iOS) + .topBarTrailing + #else + .primaryAction + #endif + } + // MARK: - Search - private var searchBar: some View { + private var searchStateContent: some View { VStack(alignment: .leading, spacing: 8) { - HStack { - Image(systemName: "magnifyingglass") - .foregroundStyle(.secondary) - TextField("Search locations…", text: $viewModel.searchText) - .onChange(of: viewModel.searchText) { viewModel.onSearchTextChanged() } - if viewModel.isSearching { + if viewModel.isSearching { + HStack(spacing: 8) { ProgressView().controlSize(.small) - } else if !viewModel.searchText.isEmpty { - Button { viewModel.searchText = "" } label: { - Image(systemName: "xmark.circle.fill").foregroundStyle(.secondary) - } - .buttonStyle(.plain) - .accessibilityIdentifier("weather_search_clear") + Text("Searching locations…") + .font(.footnote) + .foregroundStyle(.secondary) } + .frame(maxWidth: .infinity, alignment: .leading) } - .padding(10) - .background(.fill.secondary, in: RoundedRectangle(cornerRadius: 10)) if !viewModel.searchResults.isEmpty { VStack(alignment: .leading, spacing: 0) { ForEach(viewModel.searchResults) { location in Button { - Task { await viewModel.selectLocation(location) } viewModel.saveLocation(location) + viewModel.searchText = "" + viewModel.searchResults = [] + isSearchPresented = false + Task { + await viewModel.selectLocation(location) + } } label: { HStack { VStack(alignment: .leading) { @@ -118,7 +150,6 @@ struct WeatherView: View { } } .background(.background.secondary, in: RoundedRectangle(cornerRadius: 10)) - .shadow(color: .black.opacity(0.08), radius: 8, y: 4) } if let error = viewModel.searchError { @@ -172,6 +203,7 @@ struct WeatherView: View { .foregroundStyle(isActive ? Color.white : Color.accentColor) } .buttonStyle(.plain) + .accessibilityIdentifier("weather_saved_location_\(location.id)") } // MARK: - Forecast Content @@ -246,6 +278,7 @@ struct WeatherView: View { } .padding(20) .background(.background.secondary, in: RoundedRectangle(cornerRadius: 16)) + .accessibilityIdentifier("weather_current_card") } private func weatherDetail(_ label: String, value: String, symbol: String) -> some View { diff --git a/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift b/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift index beb872697e..fdfd8a0df6 100644 --- a/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift +++ b/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift @@ -93,12 +93,19 @@ final class WildlifeViewModel { // MARK: - View struct WildlifeView: View { + @Environment(AuthManager.self) private var authManager @State private var viewModel = WildlifeViewModel() @State private var photoItem: PhotosPickerItem? var body: some View { Group { - if viewModel.isLoading { + if !authManager.isAuthenticated { + EmptyStateView( + "Sign In to Identify Wildlife", + subtitle: "Wildlife identification uses PackRat's image service. You can still manage local packs and trips as a guest.", + systemImage: "pawprint" + ) + } else if viewModel.isLoading { ProgressView("Identifying…").frame(maxWidth: .infinity, maxHeight: .infinity) } else if viewModel.identifications.isEmpty { emptyState @@ -109,13 +116,15 @@ struct WildlifeView: View { .navigationTitle("Wildlife ID") .toolbar { ToolbarItem(placement: .primaryAction) { - PhotosPicker(selection: $photoItem, matching: .images) { - Label("Choose Photo", systemImage: "photo.on.rectangle") + if authManager.isAuthenticated { + PhotosPicker(selection: $photoItem, matching: .images) { + Label("Choose Photo", systemImage: "photo.on.rectangle") + } } } } .onChange(of: photoItem) { _, item in - guard let item else { return } + guard authManager.isAuthenticated, let item else { return } Task { guard let data = try? await item.loadTransferable(type: Data.self) else { return } await viewModel.identify(imageData: data) @@ -133,32 +142,17 @@ struct WildlifeView: View { } private var emptyState: some View { - VStack(spacing: 20) { - Image(systemName: "pawprint.circle") - .font(.system(size: 64)) - .foregroundStyle(Color.accentColor.opacity(0.7)) - - VStack(spacing: 8) { - Text("Identify Wildlife") - .font(.title2.bold()) - Text("Take or select a photo of an animal or plant to identify it using AI.") - .font(.body) - .foregroundStyle(.secondary) - .multilineTextAlignment(.center) - .padding(.horizontal, 32) - } - + ContentUnavailableView { + Label("Identify Wildlife", systemImage: "pawprint") + .symbolRenderingMode(.hierarchical) + } description: { + Text("Choose a photo of an animal or plant to identify it using AI.") + } actions: { PhotosPicker(selection: $photoItem, matching: .images) { Label("Choose Photo", systemImage: "photo.on.rectangle") - .font(.headline) - .padding(.horizontal, 24) - .padding(.vertical, 12) - .background(Color.accentColor, in: Capsule()) - .foregroundStyle(.white) } - .buttonStyle(.plain) + .buttonStyle(.borderedProminent) } - .frame(maxWidth: .infinity, maxHeight: .infinity) } private var resultsList: some View { diff --git a/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift b/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift index d1e5ea8ce6..9f0ab3be1e 100644 --- a/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift +++ b/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift @@ -1,7 +1,7 @@ import SwiftUI enum NavItem: String, CaseIterable, Identifiable { - // Order matters: first 4 appear in iPhone tab bar, rest in "More" + // Order matters: first entries are the primary iPhone tab bar destinations. case home, packs, trips, weather, chat case catalog, templates, trailConditions, feed case guides, gearInventory, wildlife, aiPacks @@ -30,7 +30,7 @@ enum NavItem: String, CaseIterable, Identifiable { case .packs: return "backpack" case .trips: return "map" case .weather: return "cloud.sun" - case .chat: return "bubble.left.and.sparkles" + case .chat: return "bubble.left.and.text.bubble.right" case .catalog: return "magnifyingglass" case .templates: return "doc.on.doc" case .trailConditions: return "figure.hiking" @@ -50,13 +50,42 @@ enum NavItem: String, CaseIterable, Identifiable { } } +#if os(iOS) +private enum PhoneTab: Hashable { + case home + case packs + case trips + case chat + + init?(navItem: NavItem) { + switch navItem { + case .home: self = .home + case .packs: self = .packs + case .trips: self = .trips + case .chat: self = .chat + default: return nil + } + } + + var navItem: NavItem? { + switch self { + case .home: return .home + case .packs: return .packs + case .trips: return .trips + case .chat: return .chat + } + } +} +#endif + struct AppNavigation: View { @Environment(AuthManager.self) private var authManager @State private var appState = AppState() - @State private var showingSearch = false #if os(iOS) @Environment(\.horizontalSizeClass) private var horizontalSizeClass + @State private var phoneTab: PhoneTab = .home + @State private var phoneHomePath: [NavItem] = [] #endif var body: some View { @@ -78,41 +107,61 @@ struct AppNavigation: View { return VStack(spacing: 0) { OfflineBanner() - NavigationSplitView { - sidebar - } content: { - contentColumn - } detail: { - detailColumn - } + splitNavigation } .animation(.easeInOut(duration: 0.3), value: NetworkMonitor.shared.isConnected) .environment(appState) #if os(macOS) .navigationSplitViewStyle(.balanced) #endif - .sheet(isPresented: $showingSearch) { + .sheet(isPresented: $state.isGlobalSearchPresented) { GlobalSearchView() .environment(appState) } .background { - Button("") { showingSearch.toggle() } + Button("") { state.isGlobalSearchPresented.toggle() } .keyboardShortcut("f", modifiers: .command) .frame(width: 0, height: 0) .hidden() } - .focusedSceneValue(\.globalSearchAction, $showingSearch) + .focusedSceneValue(\.globalSearchAction, $state.isGlobalSearchPresented) + .accessibilityIdentifier("app_navigation") + } + + @ViewBuilder + private var splitNavigation: some View { + if appState.navItem.hasListDetail { + NavigationSplitView { + sidebar + } content: { + listColumn + } detail: { + detailColumn + } + } else { + NavigationSplitView { + sidebar + } detail: { + primaryColumn + } + } } private var sidebar: some View { @Bindable var state = appState - let optionalNavItem = Binding( - get: { state.navItem }, - set: { state.navItem = $0 ?? .home } - ) - return List(NavItem.allCases, selection: optionalNavItem) { item in - Label(item.label, systemImage: item.symbol).tag(item as NavItem?) + return List(NavItem.allCases) { item in + Button { + state.navItem = item + } label: { + Label(item.label, systemImage: item.symbol) + .frame(maxWidth: .infinity, alignment: .leading) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .accessibilityIdentifier("nav_\(item.rawValue)") + .listRowBackground(state.navItem == item ? Color.accentColor.opacity(0.16) : Color.clear) } + .accessibilityIdentifier("app_sidebar") .navigationTitle("PackRat") #if os(macOS) .navigationSplitViewColumnWidth(min: 160, ideal: 190) @@ -123,12 +172,10 @@ struct AppNavigation: View { } @ViewBuilder - private var contentColumn: some View { + private var listColumn: some View { @Bindable var state = appState switch appState.navItem { - case .home: - HomeView().environment(appState) case .packs: PacksListView(viewModel: appState.packsVM, selectedId: $state.selectedPackId) case .trips: @@ -137,6 +184,16 @@ struct AppNavigation: View { PackTemplatesListView(viewModel: appState.templatesVM, selectedId: $state.selectedTemplateId, packsVM: appState.packsVM) case .trailConditions: TrailConditionsListView(viewModel: appState.trailConditionsVM, selectedId: $state.selectedReportId) + default: + EmptyView() + } + } + + @ViewBuilder + private var primaryColumn: some View { + switch appState.navItem { + case .home: + HomeView().environment(appState) case .weather: WeatherView(viewModel: appState.weatherVM) case .catalog: @@ -153,6 +210,8 @@ struct AppNavigation: View { WildlifeView() case .aiPacks: AIPacksView(viewModel: appState.aiPacksVM, packsVM: appState.packsVM) + case .packs, .trips, .templates, .trailConditions: + EmptyView() } } @@ -200,16 +259,62 @@ struct AppNavigation: View { #if os(iOS) private var phoneLayout: some View { - TabView { - ForEach(NavItem.allCases) { item in + @Bindable var state = appState + + return TabView(selection: $phoneTab) { + NavigationStack(path: $phoneHomePath) { + phoneContentView(.home) + .navigationTitle(NavItem.home.label) + .navigationDestination(for: NavItem.self) { item in + phoneContentView(item) + .navigationTitle(item.label) + } + } + .tabItem { Label(NavItem.home.label, systemImage: NavItem.home.symbol) } + .tag(PhoneTab.home) + + ForEach(phonePrimaryItems.filter { $0 != .home }) { item in NavigationStack { phoneContentView(item) .navigationTitle(item.label) } .tabItem { Label(item.label, systemImage: item.symbol) } + .tag(PhoneTab(navItem: item)!) + } + } + .onChange(of: phoneTab) { _, newTab in + if let item = newTab.navItem { + state.navItem = item + } + } + .onChange(of: appState.navItem) { _, item in + if let tab = PhoneTab(navItem: item) { + phoneTab = tab + phoneHomePath.removeAll() + } else { + phoneTab = .home + if phoneHomePath.last != item { + phoneHomePath = [item] + } + } + } + .onChange(of: phoneHomePath) { _, path in + if let item = path.last { + state.navItem = item + } else if phoneTab == .home { + state.navItem = .home } } .environment(appState) + .sheet(isPresented: $state.isGlobalSearchPresented) { + GlobalSearchView() + .environment(appState) + } + .focusedSceneValue(\.globalSearchAction, $state.isGlobalSearchPresented) + } + + private var phonePrimaryItems: [NavItem] { + [.home, .packs, .trips, .chat] } @ViewBuilder @@ -236,7 +341,10 @@ struct AppNavigation: View { // MARK: - User Footer private var userFooter: some View { - HStack(spacing: 8) { + let displayName = footerDisplayName + let email = authManager.currentUser?.email ?? "" + + return HStack(spacing: 8) { Circle() .fill(.tint.opacity(0.12)) .frame(width: 30, height: 30) @@ -246,14 +354,21 @@ struct AppNavigation: View { .foregroundStyle(.tint) } VStack(alignment: .leading, spacing: 1) { - Text(authManager.currentUser?.displayName ?? "") - .font(.caption.bold()) - .lineLimit(1) - Text(authManager.currentUser?.email ?? "") - .font(.caption2) - .foregroundStyle(.secondary) - .lineLimit(1) + if let displayName { + Text(displayName) + .font(.caption.bold()) + .lineLimit(1) + Text(email) + .font(.caption2) + .foregroundStyle(.secondary) + .lineLimit(1) + } else { + Text(email) + .font(.caption.bold()) + .lineLimit(1) + } } + .help(email) Spacer() Menu { NavigationLink(destination: ProfileView()) { @@ -272,4 +387,12 @@ struct AppNavigation: View { .padding(.vertical, 10) .background(.bar) } + + private var footerDisplayName: String? { + guard let displayName = authManager.currentUser?.displayName.trimmingCharacters(in: .whitespacesAndNewlines), + !displayName.isEmpty, + !displayName.contains("@") + else { return nil } + return displayName + } } diff --git a/apps/swift/Sources/PackRat/Network/APIClient.swift b/apps/swift/Sources/PackRat/Network/APIClient.swift index d6855d5546..11b22daef6 100644 --- a/apps/swift/Sources/PackRat/Network/APIClient.swift +++ b/apps/swift/Sources/PackRat/Network/APIClient.swift @@ -50,7 +50,7 @@ actor APIClient { func sendDiscarding(_ endpoint: some APIEndpoint) async throws { let request = try buildRequest(endpoint, sessionToken: KeychainService.shared.sessionToken) - let (data, response) = try await session.data(for: request) + let (data, response) = try await dataWithTransientRetry(for: request) captureSessionTokenIfPresent(response) try validateStatus(response, data: data) } @@ -104,7 +104,7 @@ actor APIClient { } #endif - let (data, response) = try await session.data(for: request) + let (data, response) = try await dataWithTransientRetry(for: request) #if DEBUG let status = (response as? HTTPURLResponse)?.statusCode ?? 0 @@ -121,6 +121,32 @@ actor APIClient { return try decode(data, as: T.self) } + private func dataWithTransientRetry(for request: URLRequest) async throws -> (Data, URLResponse) { + var lastError: Error? + + for attempt in 0..<2 { + do { + let (data, response) = try await session.data(for: request) + if let http = response as? HTTPURLResponse, + (500...599).contains(http.statusCode), + attempt == 0 { + captureSessionTokenIfPresent(response) + try? await Task.sleep(for: .milliseconds(300)) + continue + } + return (data, response) + } catch { + lastError = error + if attempt == 0 { + try? await Task.sleep(for: .milliseconds(300)) + continue + } + } + } + + throw lastError ?? PackRatError.unknown + } + /// Better Auth returns the session token in the `set-auth-token` response /// header on sign-in, sign-up, and any time the server rotates the token. /// Persist it so subsequent requests can use `Authorization: Bearer `. diff --git a/apps/swift/Sources/PackRat/Network/KeychainService.swift b/apps/swift/Sources/PackRat/Network/KeychainService.swift index 46e650e15f..454ef9895f 100644 --- a/apps/swift/Sources/PackRat/Network/KeychainService.swift +++ b/apps/swift/Sources/PackRat/Network/KeychainService.swift @@ -6,6 +6,10 @@ final class KeychainService: Sendable { private init() {} private let service = "com.andrewbierman.packrat" + private let userDefaultsPrefix = "e2e_auth_" + private var usesUserDefaultsStorage: Bool { + ProcessInfo.processInfo.arguments.contains("--use-userdefaults-auth") + } enum Key: String { // Better Auth issues a single long-lived session token returned via the @@ -29,6 +33,10 @@ final class KeychainService: Sendable { } private func save(_ value: String, for key: Key) { + if usesUserDefaultsStorage { + UserDefaults.standard.set(value, forKey: userDefaultsKey(key)) + return + } let data = Data(value.utf8) let query: [CFString: Any] = [ kSecClass: kSecClassGenericPassword, @@ -42,6 +50,9 @@ final class KeychainService: Sendable { } private func read(_ key: Key) -> String? { + if usesUserDefaultsStorage { + return UserDefaults.standard.string(forKey: userDefaultsKey(key)) + } let query: [CFString: Any] = [ kSecClass: kSecClassGenericPassword, kSecAttrService: service, @@ -57,6 +68,10 @@ final class KeychainService: Sendable { } private func delete(_ key: Key) { + if usesUserDefaultsStorage { + UserDefaults.standard.removeObject(forKey: userDefaultsKey(key)) + return + } let query: [CFString: Any] = [ kSecClass: kSecClassGenericPassword, kSecAttrService: service, @@ -64,4 +79,8 @@ final class KeychainService: Sendable { ] SecItemDelete(query as CFDictionary) } + + private func userDefaultsKey(_ key: Key) -> String { + "\(userDefaultsPrefix)\(key.rawValue)" + } } diff --git a/apps/swift/Sources/PackRat/Services/CatalogService.swift b/apps/swift/Sources/PackRat/Services/CatalogService.swift index bd6225493a..2e8128e058 100644 --- a/apps/swift/Sources/PackRat/Services/CatalogService.swift +++ b/apps/swift/Sources/PackRat/Services/CatalogService.swift @@ -14,7 +14,7 @@ final class CatalogService: Sendable { ]) // Handle both wrapped and unwrapped responses if let wrapped = try? await api.send(endpoint, as: CatalogSearchResponse.self) { - return wrapped.items ?? [] + return wrapped.items } return try await api.send(endpoint) } diff --git a/apps/swift/Sources/PackRat/Shared/EmptyStateView.swift b/apps/swift/Sources/PackRat/Shared/EmptyStateView.swift index af09c1bd62..8639f0c62b 100644 --- a/apps/swift/Sources/PackRat/Shared/EmptyStateView.swift +++ b/apps/swift/Sources/PackRat/Shared/EmptyStateView.swift @@ -24,6 +24,7 @@ struct EmptyStateView: View { var body: some View { ContentUnavailableView { Label(title, systemImage: systemImage) + .symbolRenderingMode(.hierarchical) } description: { if !subtitle.isEmpty { Text(subtitle) } } actions: { diff --git a/apps/swift/Sources/PackRat/Shared/ErrorView.swift b/apps/swift/Sources/PackRat/Shared/ErrorView.swift index 21504b8acd..4a22f24790 100644 --- a/apps/swift/Sources/PackRat/Shared/ErrorView.swift +++ b/apps/swift/Sources/PackRat/Shared/ErrorView.swift @@ -10,12 +10,14 @@ struct ErrorView: View { } var body: some View { + let presentation = FriendlyErrorPresentation(message) + ContentUnavailableView { - Label("Something went wrong", systemImage: "exclamationmark.triangle") + Label(presentation.title, systemImage: presentation.systemImage) } description: { - Text(message) + Text(presentation.description) } actions: { - if let retry { + if let retry, presentation.allowsRetry { AsyncButton("Try Again", action: retry) .buttonStyle(.borderedProminent) } @@ -27,15 +29,75 @@ struct InlineErrorView: View { let message: String var body: some View { + let presentation = FriendlyErrorPresentation(message) + HStack(spacing: 6) { - Image(systemName: "exclamationmark.circle.fill") - .foregroundStyle(.red) - Text(message) + Image(systemName: presentation.inlineSystemImage) + .foregroundStyle(presentation.inlineColor) + Text(presentation.description) .font(.caption) .foregroundStyle(.secondary) } .padding(.horizontal, 12) .padding(.vertical, 8) - .background(.red.opacity(0.08), in: RoundedRectangle(cornerRadius: 8)) + .frame(maxWidth: .infinity, alignment: .leading) + .background(presentation.inlineColor.opacity(0.08), in: RoundedRectangle(cornerRadius: 10, style: .continuous)) + .accessibilityIdentifier("inline_error") + } +} + +struct FriendlyErrorPresentation { + let title: String + let description: String + let systemImage: String + let inlineSystemImage: String + let inlineColor: Color + let allowsRetry: Bool + + init(_ rawMessage: String) { + let normalized = rawMessage.lowercased() + + if normalized.contains("401") + || normalized.contains("unauthorized") + || normalized.contains("forbidden") + || normalized.contains("not authenticated") + || normalized.contains("requires auth") + || normalized.contains("session") + || normalized.contains("token") { + title = "Sign In Required" + description = "This feature syncs with your PackRat account. Local packs and trips still work in guest mode." + systemImage = "person.crop.circle.badge.exclamationmark" + inlineSystemImage = "person.crop.circle.badge.exclamationmark" + inlineColor = .orange + allowsRetry = false + } else if normalized.contains("offline") + || normalized.contains("network") + || normalized.contains("internet") + || normalized.contains("not connected") + || normalized.contains("timed out") + || normalized.contains("cannot connect") + || normalized.contains("could not connect") { + title = "Connection Needed" + description = "Connect to the internet to refresh this content. Cached and local data remain available." + systemImage = "wifi.exclamationmark" + inlineSystemImage = "wifi.exclamationmark" + inlineColor = .orange + allowsRetry = true + } else if normalized.contains("404") + || normalized.contains("not found") { + title = "Not Found" + description = "This item is no longer available." + systemImage = "questionmark.folder" + inlineSystemImage = "questionmark.circle.fill" + inlineColor = .orange + allowsRetry = false + } else { + title = "Temporarily Unavailable" + description = "This content could not be loaded right now." + systemImage = "exclamationmark.triangle" + inlineSystemImage = "exclamationmark.circle.fill" + inlineColor = .red + allowsRetry = true + } } } diff --git a/apps/swift/Tests/PackRatUITests/AppUITestCase.swift b/apps/swift/Tests/PackRatUITests/AppUITestCase.swift index 8154e79424..3c5b10cf63 100644 --- a/apps/swift/Tests/PackRatUITests/AppUITestCase.swift +++ b/apps/swift/Tests/PackRatUITests/AppUITestCase.swift @@ -27,7 +27,13 @@ class AppUITestCase: XCTestCase { app = XCUIApplication() // Disable animations so tests don't have to wait for spring physics app.launchArguments.append("--disable-animations") + // Avoid macOS Keychain access prompts when Xcode repeatedly rebuilds + // and ad-hoc signs the test host during UI test runs. + app.launchArguments.append("--use-userdefaults-auth") app.launch() + #if os(macOS) + app.activate() + #endif try loginIfNeeded() } @@ -67,6 +73,11 @@ class AppUITestCase: XCTestCase { ) } + let signIn = app.buttons["auth_sign_in"] + if signIn.waitForExistence(timeout: 3) { + signIn.tap() + } + let emailField = app.textFields["login_email"] XCTAssertTrue(emailField.waitForExistence(timeout: 10), "Login screen must appear") @@ -77,7 +88,7 @@ class AppUITestCase: XCTestCase { passwordField.tap() passwordField.typeText(password) - app.buttons["login_submit"].tap() + submitLoginForm() XCTAssertTrue( waitForLoggedIn(timeout: 20), @@ -85,6 +96,17 @@ class AppUITestCase: XCTestCase { ) } + func submitLoginForm() { + #if os(macOS) + // macOS can show a password/autofill popover over the submit button + // after typing into SecureField. Escape dismisses it before tapping. + app.typeText("\u{1b}") + app.buttons["login_submit"].tap() + #else + app.buttons["login_submit"].tap() + #endif + } + /// Cross-platform "is the user logged in NOW?" wait with an explicit timeout. /// Distinct from `isLoggedIn` (which has a short fixed wait) so login flow /// can wait longer than the warm-cache short-circuit check. @@ -93,7 +115,9 @@ class AppUITestCase: XCTestCase { #if os(iOS) return app.tabBars.firstMatch.waitForExistence(timeout: timeout) #elseif os(macOS) - return app.staticTexts["Home"].waitForExistence(timeout: timeout) + return app.otherElements["app_navigation"].waitForExistence(timeout: timeout) + || app.outlines["app_sidebar"].waitForExistence(timeout: 1) + || app.staticTexts["Home"].waitForExistence(timeout: 1) || app.outlines.firstMatch.waitForExistence(timeout: 1) #else return false @@ -108,21 +132,49 @@ class AppUITestCase: XCTestCase { /// label is the NavItem label. They surface as both `staticTexts` and rows /// inside `outlines`; this helper tries both. func goToSidebar(_ label: String) { + app.activate() + app.typeKey(XCUIKeyboardKey.escape.rawValue, modifierFlags: []) + + let identifierByLabel: [String: String] = [ + "Home": "nav_home", + "Packs": "nav_packs", + "Trips": "nav_trips", + "Weather": "nav_weather", + "Assistant": "nav_chat", + "Catalog": "nav_catalog", + "Templates": "nav_templates", + "Trail Conditions": "nav_trailConditions", + "Feed": "nav_feed", + "Guides": "nav_guides", + "Gear Inventory": "nav_gearInventory", + "Wildlife": "nav_wildlife", + "AI Packs": "nav_aiPacks", + ] + if let identifier = identifierByLabel[label] { + let identifiedButton = app.buttons[identifier] + if identifiedButton.waitForExistence(timeout: 3) { + if identifiedButton.isHittable { + identifiedButton.tap() + } else { + identifiedButton.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).click() + } + return + } + } + // Try the outline (the macOS NavigationSplitView sidebar is rendered as // an outline view). Iterate outline rows looking for one whose label // matches. - let outline = app.outlines.firstMatch + let identifiedOutline = app.outlines["app_sidebar"] + let outline = identifiedOutline.exists ? identifiedOutline : app.outlines.firstMatch if outline.waitForExistence(timeout: 5) { let outlineRow = outline.staticTexts[label] if outlineRow.waitForExistence(timeout: 2) { - outlineRow.tap() - return - } - // Some labels are exposed at the cell level rather than the static - // text level; try outline cells directly. - let cell = outline.cells.containing(.staticText, identifier: label).firstMatch - if cell.exists { - cell.tap() + if outlineRow.isHittable { + outlineRow.tap() + } else { + outlineRow.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).click() + } return } } @@ -133,13 +185,17 @@ class AppUITestCase: XCTestCase { any.waitForExistence(timeout: 5), "Sidebar entry '\(label)' not found in macOS sidebar" ) - any.tap() + if any.isHittable { + any.tap() + } else { + any.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).click() + } } #endif #if os(iOS) - /// Navigates to a tab by label. iOS shows the first 4 NavItems as tabs and - /// the rest behind a "More" overflow tab — this helper handles both cases. + /// Navigates to a primary tab by label. Secondary feature destinations are + /// intentionally exposed from Home rather than the iPhone tab bar. func goToTab(_ label: String) { // Dismiss any active keyboard / search focus that could obstruct // tab bar interaction. @@ -155,6 +211,24 @@ class AppUITestCase: XCTestCase { return } + let homeActionByLegacyTab: [String: String] = [ + "Catalog": "Catalog", + "Feed": "Community Feed", + "Gear Inventory": "Gear Inventory", + "Guides": "Guides", + "Templates": "Pack Templates", + "Pack Templates": "Pack Templates", + "Season Suggestions": "Season Suggestions", + "Trail Conditions": "Trail Conditions", + "Weather": "Weather", + "Wildlife ID": "Wildlife ID", + ] + if let homeAction = homeActionByLegacyTab[label] { + goToTab("Home") + tapHomeAction(homeAction) + return + } + let moreButton = app.tabBars.buttons["More"] if moreButton.waitForExistence(timeout: 3) { moreButton.tap() @@ -174,10 +248,40 @@ class AppUITestCase: XCTestCase { XCTAssertTrue( direct.waitForExistence(timeout: 5), - "Tab '\(label)' not found in tab bar or More overflow" + "Primary tab '\(label)' not found in tab bar" ) direct.tap() } + + func goToHomeAction(_ title: String) { + goToTab("Home") + tapHomeAction(title) + } + + private func tapHomeAction(_ title: String) { + let identifier = "home_action_\(title.lowercased().filter { $0.isLetter || $0.isNumber })" + let action = app.buttons[identifier] + + for _ in 0..<6 { + if action.waitForExistence(timeout: 1), action.isHittable, isSafelyVisibleAboveTabBar(action) { + action.tap() + return + } + app.swipeUp() + } + + XCTAssertTrue(action.waitForExistence(timeout: 2), "Home action '\(title)' must exist") + if action.isHittable { + action.tap() + } else { + action.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).tap() + } + } + + private func isSafelyVisibleAboveTabBar(_ element: XCUIElement) -> Bool { + let tabBarTop = app.tabBars.firstMatch.exists ? app.tabBars.firstMatch.frame.minY : app.frame.maxY + return element.frame.minY >= 0 && element.frame.maxY <= tabBarTop - 12 + } #endif // MARK: - Wait helpers @@ -236,6 +340,14 @@ extension XCUIElement { let selectAll = XCUIApplication().menuItems["Select All"] if selectAll.waitForExistence(timeout: 0.5) { selectAll.tap() + if text.isEmpty { + #if os(iOS) + typeText(XCUIKeyboardKey.delete.rawValue) + #else + typeText("\u{8}") + #endif + return + } } else { // Fallback: move to end and backspace. // XCUIKeyboardKey.delete only exists on iOS; on macOS we use "\u{8}" (backspace). diff --git a/apps/swift/Tests/PackRatUITests/AuthTests.swift b/apps/swift/Tests/PackRatUITests/AuthTests.swift index 1223117de2..9be28e8a56 100644 --- a/apps/swift/Tests/PackRatUITests/AuthTests.swift +++ b/apps/swift/Tests/PackRatUITests/AuthTests.swift @@ -1,12 +1,11 @@ import XCTest -final class AuthTests: XCTestCase { - var app: XCUIApplication! - +final class AuthTests: AppUITestCase { override func setUpWithError() throws { continueAfterFailure = false app = XCUIApplication() app.launchArguments.append("--disable-animations") + app.launchArguments.append("--use-userdefaults-auth") // Force logged-out state so the login screen is reachable. app.launchArguments.append("--reset-auth") app.launch() @@ -14,14 +13,97 @@ final class AuthTests: XCTestCase { // MARK: - Login + func testAuthWelcomeScreenAppears() { + XCTAssertTrue(app.buttons["auth_sign_in"].waitForExistence(timeout: 10)) + XCTAssertTrue(app.buttons["auth_signup_free"].exists) + XCTAssertTrue(app.buttons["auth_sign_in"].exists) + XCTAssertTrue(app.buttons["auth_continue_without_login"].exists) + } + + func testContinueWithoutLoginOpensAppShell() { + let continueButton = app.buttons["auth_continue_without_login"] + XCTAssertTrue(continueButton.waitForExistence(timeout: 10)) + continueButton.tap() + + XCTAssertTrue(waitForLoggedIn(timeout: 10), "Guest mode should enter the main app shell") + XCTAssertFalse(app.buttons["auth_sign_in"].exists) + } + + #if os(iOS) + func testGuestCanCreateLocalPackAndKeepItAfterRelaunch() { + let continueButton = app.buttons["auth_continue_without_login"] + XCTAssertTrue(continueButton.waitForExistence(timeout: 10)) + continueButton.tap() + XCTAssertTrue(waitForLoggedIn(timeout: 10), "Guest mode should enter the main app shell") + + let packName = uniqueName("Guest Offline Pack") + createGuestPack(named: packName) + + app.terminate() + app = XCUIApplication() + app.launchArguments.append("--disable-animations") + app.launchArguments.append("--use-userdefaults-auth") + app.launch() + + XCTAssertTrue(waitForLoggedIn(timeout: 10), "Guest mode should be remembered after relaunch") + goToTab("Packs") + XCTAssertTrue( + app.staticTexts[packName].waitForExistence(timeout: 10), + "Locally created guest pack must persist across relaunch" + ) + } + + func testGuestSeesNativeSignInStateForAccountBackedFeatures() { + let continueButton = app.buttons["auth_continue_without_login"] + XCTAssertTrue(continueButton.waitForExistence(timeout: 10)) + continueButton.tap() + XCTAssertTrue(waitForLoggedIn(timeout: 10), "Guest mode should enter the main app shell") + + goToHomeAction("Community Feed") + + XCTAssertTrue( + app.staticTexts["Sign In to View the Feed"].waitForExistence(timeout: 10), + "Guest-only account-backed screens should show a native sign-in state instead of a network error" + ) + XCTAssertFalse(app.buttons["Try Again"].exists) + } + + func testGuestSeesNativeSignInStateForAITools() { + let continueButton = app.buttons["auth_continue_without_login"] + XCTAssertTrue(continueButton.waitForExistence(timeout: 10)) + continueButton.tap() + XCTAssertTrue(waitForLoggedIn(timeout: 10), "Guest mode should enter the main app shell") + + goToTab("Assistant") + XCTAssertTrue(app.staticTexts["Sign In to Use Assistant"].waitForExistence(timeout: 10)) + XCTAssertFalse(app.buttons["Try Again"].exists) + + goToHomeAction("Season Suggestions") + XCTAssertTrue(app.staticTexts["Sign In for Season Suggestions"].waitForExistence(timeout: 10)) + XCTAssertFalse(app.buttons["Try Again"].exists) + app.buttons["Done"].tapIfExists() + + goToHomeAction("Wildlife ID") + XCTAssertTrue(app.staticTexts["Sign In to Identify Wildlife"].waitForExistence(timeout: 10)) + XCTAssertFalse(app.buttons["Try Again"].exists) + } + #endif + func testLoginScreenAppears() { + openLogin() // Before auth, the login form must be visible XCTAssertTrue(app.textFields["login_email"].waitForExistence(timeout: 10)) XCTAssertTrue(app.secureTextFields["login_password"].exists) XCTAssertTrue(app.buttons["login_submit"].exists) + XCTAssertTrue(app.buttons["forgot_password_link"].exists) + XCTAssertTrue(app.buttons["auth_google"].exists) + #if os(iOS) + XCTAssertTrue(app.buttons["auth_apple"].exists) + #endif } func testLoginWithBadCredentialShowsError() { + openLogin() let emailField = app.textFields["login_email"] XCTAssertTrue(emailField.waitForExistence(timeout: 10)) emailField.tap() @@ -31,15 +113,17 @@ final class AuthTests: XCTestCase { passwordField.tap() passwordField.typeText("wrongpassword") - app.buttons["login_submit"].tap() + let submit = app.buttons["login_submit"] + XCTAssertTrue(submit.isEnabled, "Login submit should be enabled after filling both fields") + submitLoginForm() - // An error banner or inline error should appear — not a tab bar - XCTAssertFalse(app.tabBars.firstMatch.waitForExistence(timeout: 5)) - // The login form should still be visible - XCTAssertTrue(app.textFields["login_email"].exists) + // Invalid credentials must not transition into the authenticated shell. + XCTAssertFalse(waitForLoggedIn(timeout: 5)) + XCTAssertTrue(app.textFields["login_email"].exists, "Login form should still be visible") } func testLoginButtonDisabledWithEmptyFields() { + openLogin() XCTAssertTrue(app.textFields["login_email"].waitForExistence(timeout: 10)) // Both fields empty → button disabled XCTAssertFalse(app.buttons["login_submit"].isEnabled) @@ -51,17 +135,17 @@ final class AuthTests: XCTestCase { } func testNavigateToRegisterAndBack() { - XCTAssertTrue(app.textFields["login_email"].waitForExistence(timeout: 10)) + XCTAssertTrue(app.buttons["auth_signup_free"].waitForExistence(timeout: 10)) - let signUpButton = app.buttons["Don't have an account? Sign Up"] + let signUpButton = app.buttons["auth_signup_free"] XCTAssertTrue(signUpButton.waitForExistence(timeout: 5)) signUpButton.tap() // Register form should appear - XCTAssertTrue( - app.staticTexts.matching(NSPredicate(format: "label CONTAINS 'Sign Up' OR label CONTAINS 'Register' OR label CONTAINS 'Create'")).firstMatch - .waitForExistence(timeout: 5) - ) + XCTAssertTrue(app.textFields["register_first_name"].waitForExistence(timeout: 5)) + XCTAssertTrue(app.textFields["register_email"].exists) + XCTAssertTrue(app.secureTextFields["register_password"].exists) + XCTAssertTrue(app.buttons["register_submit"].exists) // Tap "Already have an account" back link let loginLink = app.buttons.matching(NSPredicate(format: "label CONTAINS 'Sign In' OR label CONTAINS 'Log In' OR label CONTAINS 'account'")).firstMatch @@ -70,6 +154,22 @@ final class AuthTests: XCTestCase { XCTAssertTrue(app.textFields["login_email"].waitForExistence(timeout: 5)) } + func testForgotPasswordFlowNavigation() { + openLogin() + app.buttons["forgot_password_link"].tap() + + XCTAssertTrue(app.textFields["forgot_password_email"].waitForExistence(timeout: 5)) + XCTAssertTrue(app.buttons["forgot_password_submit"].exists) + XCTAssertFalse(app.buttons["forgot_password_submit"].isEnabled) + + app.textFields["forgot_password_email"].tap() + app.textFields["forgot_password_email"].typeText("reset@example.com") + XCTAssertTrue(app.buttons["forgot_password_submit"].isEnabled) + + app.buttons["forgot_password_back"].tap() + XCTAssertTrue(app.textFields["login_email"].waitForExistence(timeout: 5)) + } + func testSuccessfulLogin() throws { // Credentials come from this test bundle's Info.plist (populated at build // time from xcodebuild PACKRAT_E2E_* build settings). Same source the @@ -85,6 +185,7 @@ final class AuthTests: XCTestCase { } let emailField = app.textFields["login_email"] + openLogin() XCTAssertTrue(emailField.waitForExistence(timeout: 10)) emailField.tap() emailField.typeText(email) @@ -93,21 +194,33 @@ final class AuthTests: XCTestCase { passwordField.tap() passwordField.typeText(password) - app.buttons["login_submit"].tap() + submitLoginForm() - // Logged-in landmark: tab bar on iOS, sidebar Home row on macOS. - #if os(iOS) - XCTAssertTrue( - app.tabBars.firstMatch.waitForExistence(timeout: 20), - "Tab bar must appear after successful login" - ) - #elseif os(macOS) - XCTAssertTrue( - app.staticTexts["Home"].waitForExistence(timeout: 20) - || app.outlines.firstMatch.waitForExistence(timeout: 1), - "Sidebar / outline must appear after successful login" - ) - #endif + XCTAssertTrue(waitForLoggedIn(timeout: 20), "Logged-in landmark must appear after successful login") XCTAssertFalse(app.textFields["login_email"].exists, "Login form should be dismissed") } + + private func openLogin() { + let signIn = app.buttons["auth_sign_in"] + if signIn.waitForExistence(timeout: 10) { + signIn.tap() + } + } + + #if os(iOS) + private func createGuestPack(named name: String) { + goToTab("Packs") + waitFor(app.buttons["New Pack"].firstMatch).tap() + + let nameField = app.textFields["pack_name"].exists + ? app.textFields["pack_name"] + : app.textFields["Pack Name"] + waitFor(nameField) + nameField.tap() + nameField.typeText(name) + + app.buttons["Create"].tap() + waitFor(app.staticTexts[name], timeout: 10) + } + #endif } diff --git a/apps/swift/Tests/PackRatUITests/CatalogMacOSTests.swift b/apps/swift/Tests/PackRatUITests/CatalogMacOSTests.swift index 146f17150b..86ec9b80b7 100644 --- a/apps/swift/Tests/PackRatUITests/CatalogMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/CatalogMacOSTests.swift @@ -26,7 +26,7 @@ final class CatalogMacOSTests: AppUITestCase { func testCatalogSearchReturnsResults() { goToSidebar("Catalog") - let searchField = app.textFields["Search tents, packs, sleeping bags…"] + let searchField = app.searchFields["Search tents, packs, sleeping bags…"] waitFor(searchField) searchField.click() searchField.typeText("tent") @@ -39,20 +39,17 @@ final class CatalogMacOSTests: AppUITestCase { let expectation = XCTNSPredicateExpectation(predicate: predicate, object: progressIndicator) _ = XCTWaiter.wait(for: [expectation], timeout: 15) - let hasResults = app.staticTexts.matching( - NSPredicate(format: "label CONTAINS[c] 'tent' OR label CONTAINS 'oz' OR label CONTAINS 'lb'") - ).count > 0 - let noResults = app.staticTexts.matching( - NSPredicate(format: "label CONTAINS 'No results'") - ).firstMatch.exists + let hasResults = app.descendants(matching: .any)["catalog_results_list"] + let noResults = app.descendants(matching: .any)["catalog_no_results"] + let resolved = hasResults.waitForExistence(timeout: 15) || noResults.waitForExistence(timeout: 1) - XCTAssertTrue(hasResults || noResults, "Catalog should show results or no-results state") + XCTAssertTrue(resolved, "Catalog should show results or no-results state") } func testCatalogSearchClearable() { goToSidebar("Catalog") - let searchField = app.textFields["Search tents, packs, sleeping bags…"] + let searchField = app.searchFields["Search tents, packs, sleeping bags…"] waitFor(searchField) searchField.click() searchField.typeText("backpack") diff --git a/apps/swift/Tests/PackRatUITests/CatalogTests.swift b/apps/swift/Tests/PackRatUITests/CatalogTests.swift index f08be26472..fe16817fae 100644 --- a/apps/swift/Tests/PackRatUITests/CatalogTests.swift +++ b/apps/swift/Tests/PackRatUITests/CatalogTests.swift @@ -7,14 +7,14 @@ import XCTest final class CatalogTests: AppUITestCase { func testCatalogTabReachable() { - goToTab("Catalog") + goToCatalog() XCTAssertTrue( app.navigationBars["Gear Catalog"].waitForExistence(timeout: 8) ) } func testCatalogShowsEmptySearchPrompt() { - goToTab("Catalog") + goToCatalog() // Initial state: empty search prompt XCTAssertTrue( app.staticTexts["Search the Gear Catalog"].waitForExistence(timeout: 8), @@ -23,9 +23,9 @@ final class CatalogTests: AppUITestCase { } func testCatalogSearchReturnsResults() { - goToTab("Catalog") + goToCatalog() - let searchField = app.textFields["Search tents, packs, sleeping bags…"] + let searchField = app.searchFields["Search tents, packs, sleeping bags…"] waitFor(searchField) searchField.tap() searchField.typeText("tent") @@ -52,9 +52,9 @@ final class CatalogTests: AppUITestCase { } func testCatalogSearchClearable() { - goToTab("Catalog") + goToCatalog() - let searchField = app.textFields["Search tents, packs, sleeping bags…"] + let searchField = app.searchFields["Search tents, packs, sleeping bags…"] waitFor(searchField) searchField.tap() searchField.typeText("backpack") @@ -72,6 +72,10 @@ final class CatalogTests: AppUITestCase { ) } } + + private func goToCatalog() { + goToHomeAction("Catalog") + } } #endif diff --git a/apps/swift/Tests/PackRatUITests/FeedMacOSTests.swift b/apps/swift/Tests/PackRatUITests/FeedMacOSTests.swift index 5eac0950f7..b228d70f81 100644 --- a/apps/swift/Tests/PackRatUITests/FeedMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/FeedMacOSTests.swift @@ -65,8 +65,7 @@ final class FeedMacOSTests: AppUITestCase { waitFor(app.buttons["New Post"]).click() XCTAssertTrue( - app.staticTexts.matching(NSPredicate(format: "label CONTAINS '/ 500'")).firstMatch - .waitForExistence(timeout: 5), + app.staticTexts["feed_compose_counter"].waitForExistence(timeout: 5), "Character counter must be visible" ) diff --git a/apps/swift/Tests/PackRatUITests/MoreTabsMacOSTests.swift b/apps/swift/Tests/PackRatUITests/MoreTabsMacOSTests.swift index 6322acb0fa..8d00a21d8a 100644 --- a/apps/swift/Tests/PackRatUITests/MoreTabsMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/MoreTabsMacOSTests.swift @@ -18,13 +18,15 @@ final class MoreTabsMacOSTests: AppUITestCase { func testHomeShowsGreeting() { goToSidebar("Home") - let greeting = app.staticTexts.matching( - NSPredicate(format: "label BEGINSWITH 'Good morning' OR label BEGINSWITH 'Good afternoon' OR label BEGINSWITH 'Good evening'") - ).firstMatch + let greeting = app.staticTexts["home_greeting"] XCTAssertTrue( greeting.waitForExistence(timeout: 8), "Home should show a time-based greeting" ) + XCTAssertFalse( + greeting.label.contains("@"), + "Home greeting should not use an email address as the display name" + ) } func testHomeShowsDashboardSubtitle() { @@ -34,6 +36,17 @@ final class MoreTabsMacOSTests: AppUITestCase { ) } + func testHomeUsesWideMacContentArea() { + goToSidebar("Home") + let firstTile = app.buttons["My Packs, No packs yet"] + XCTAssertTrue(firstTile.waitForExistence(timeout: 8)) + XCTAssertGreaterThan( + firstTile.frame.width, + 220, + "Home cards should use the Mac detail column instead of a narrow phone-width content column" + ) + } + // MARK: - Guides func testGuidesSidebarReachable() { diff --git a/apps/swift/Tests/PackRatUITests/MoreTabsTests.swift b/apps/swift/Tests/PackRatUITests/MoreTabsTests.swift index 03d0374f78..91389cc9d4 100644 --- a/apps/swift/Tests/PackRatUITests/MoreTabsTests.swift +++ b/apps/swift/Tests/PackRatUITests/MoreTabsTests.swift @@ -3,8 +3,8 @@ import XCTest #if os(iOS) // iOS-only suite — uses goToTab() (UITabBar) which doesnt exist on macOS. -/// Smoke + interaction tests for the secondary tabs that don't have -/// their own dedicated suites: Home, Guides, Gear Inventory, Wildlife. +/// Smoke + interaction tests for Home and secondary destinations exposed from +/// Home. iPhone keeps the tab bar intentionally small; Home owns discovery. final class MoreTabsTests: AppUITestCase { // MARK: - Home @@ -19,14 +19,15 @@ final class MoreTabsTests: AppUITestCase { func testHomeShowsGreeting() { goToTab("Home") - // Greeting starts with one of the time-of-day phrases - let greeting = app.staticTexts.matching( - NSPredicate(format: "label BEGINSWITH 'Good morning' OR label BEGINSWITH 'Good afternoon' OR label BEGINSWITH 'Good evening'") - ).firstMatch + let greeting = app.staticTexts["home_greeting"] XCTAssertTrue( greeting.waitForExistence(timeout: 8), "Home should show a time-based greeting" ) + XCTAssertFalse( + greeting.label.contains("@"), + "Home greeting should not use an email address as the display name" + ) } func testHomeShowsDashboardSubtitle() { @@ -36,35 +37,86 @@ final class MoreTabsTests: AppUITestCase { ) } + func testHomePrimaryActionsUseNativeRows() { + goToTab("Home") + let packs = app.buttons["home_action_mypacks"] + let trips = app.buttons["home_action_trips"] + XCTAssertTrue(packs.waitForExistence(timeout: 8)) + XCTAssertTrue(trips.waitForExistence(timeout: 8)) + XCTAssertLessThan( + packs.frame.height, + 80, + "Compact iPhone Home actions should use native list rows instead of oversized dashboard tiles" + ) + } + + func testHomePrimaryActionNavigatesToTab() { + goToTab("Home") + let packs = app.buttons["home_action_mypacks"] + XCTAssertTrue(packs.waitForExistence(timeout: 8)) + + packs.tap() + + XCTAssertTrue( + app.navigationBars["Packs"].waitForExistence(timeout: 8), + "Home actions should switch the selected iPhone tab, not just update app state" + ) + } + + func testPrimaryTabsWorkAfterOpeningMoreDestination() { + goToTab("Assistant") + XCTAssertTrue( + app.navigationBars["AI Assistant"].waitForExistence(timeout: 8), + "Assistant should be a primary tab" + ) + + goToTab("Home") + + XCTAssertTrue( + app.navigationBars["Home"].waitForExistence(timeout: 8), + "Primary tabs should remain reachable after opening a More destination" + ) + } + // MARK: - Guides func testGuidesTabReachable() { - goToTab("Guides") + goToHomeAction("Guides") XCTAssertTrue( app.navigationBars["Guides"].waitForExistence(timeout: 8), - "Guides navigation must appear" + "Guides navigation must appear from Home" ) } // MARK: - Gear Inventory func testGearInventoryTabReachable() { - goToTab("Gear Inventory") + goToHomeAction("Gear Inventory") XCTAssertTrue( app.navigationBars["Gear Inventory"].waitForExistence(timeout: 8), - "Gear Inventory navigation must appear" + "Gear Inventory navigation must appear from Home" ) } // MARK: - Wildlife func testWildlifeTabReachable() { - goToTab("Wildlife") + goToHomeAction("Wildlife ID") XCTAssertTrue( app.navigationBars["Wildlife ID"].waitForExistence(timeout: 8), - "Wildlife ID navigation must appear" + "Wildlife ID navigation must appear from Home" ) } + + func testHomeGlobalSearchButtonOpensSearch() { + goToTab("Home") + app.buttons["Search"].tap() + XCTAssertTrue( + app.textFields["Search packs, trips, trails…"].waitForExistence(timeout: 8), + "Home should expose broad PackRat search" + ) + } + } #endif diff --git a/apps/swift/Tests/PackRatUITests/NavigationMacOSTests.swift b/apps/swift/Tests/PackRatUITests/NavigationMacOSTests.swift index 20b9bcba21..4db44c84df 100644 --- a/apps/swift/Tests/PackRatUITests/NavigationMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/NavigationMacOSTests.swift @@ -6,25 +6,19 @@ import XCTest /// sidebar's outline rows and the resulting content/detail panes. final class NavigationMacOSTests: AppUITestCase { - // Each entry: (sidebar label, expected navigation title or landmark text) - private let sidebarItems: [(label: String, landmark: String)] = [ - ("Home", "Home"), - ("Packs", "Packs"), - ("Trips", "Trips"), - ("Weather", "Weather"), + private let sidebarItems = [ + "Home", + "Packs", + "Trips", + "Weather", ] func testAllPrimarySidebarItemsReachable() { - for (label, landmark) in sidebarItems { + for label in sidebarItems { goToSidebar(label) - // The navigation title may render as a window title or static text in - // the content column. Static text is the most reliable cross-window - // signal on macOS. - let predicate = NSPredicate(format: "label == %@", landmark) - let landmarkHit = app.staticTexts.matching(predicate).firstMatch XCTAssertTrue( - landmarkHit.waitForExistence(timeout: 8), - "'\(landmark)' landmark must appear after selecting sidebar entry '\(label)'" + destinationIsVisible(for: label, timeout: 8), + "Content landmark must appear after selecting sidebar entry '\(label)'" ) } } @@ -50,14 +44,19 @@ final class NavigationMacOSTests: AppUITestCase { ).firstMatch.waitForExistence(timeout: 5) let hasList = app.tables.firstMatch.exists || app.outlines.element(boundBy: 1).exists - || app.staticTexts["Plan Trip"].exists - XCTAssertTrue(hasEmpty || hasList, "Trips sidebar must show list or empty state") + || app.staticTexts["Trips"].exists + let hasPrimaryAction = app.buttons["trips_plan_trip_button"].exists + || app.buttons["Plan Trip"].exists + XCTAssertTrue( + hasEmpty || hasList || hasPrimaryAction, + "Trips sidebar must show list, empty state, or primary action" + ) } func testWeatherSidebarShowsSearchField() { goToSidebar("Weather") XCTAssertTrue( - app.textFields["Search locations\u{2026}"].waitForExistence(timeout: 8), + app.searchFields["Search locations\u{2026}"].waitForExistence(timeout: 8), "Weather sidebar must show location search field in content pane" ) } @@ -97,23 +96,65 @@ final class NavigationMacOSTests: AppUITestCase { // primary tabs on iOS). These are the ones that lived behind "More" on // iOS but are first-class on the macOS sidebar. let secondary = [ - ("Assistant", "AI Assistant"), - ("Catalog", "Gear Catalog"), - ("Templates", "Pack Templates"), - ("Trail Conditions", "Trail Conditions"), - ("Feed", "Community Feed"), - ("Guides", "Guides"), - ("Gear Inventory", "Gear Inventory"), - ("Wildlife", "Wildlife ID"), + "Assistant", + "Catalog", + "Templates", + "Trail Conditions", + "Feed", + "Guides", + "Gear Inventory", + "Wildlife", ] - for (label, landmark) in secondary { + for label in secondary { goToSidebar(label) - let hit = app.staticTexts.matching(NSPredicate(format: "label == %@", landmark)).firstMatch XCTAssertTrue( - hit.waitForExistence(timeout: 8), - "Sidebar entry '\(label)' must navigate to '\(landmark)'" + destinationIsVisible(for: label, timeout: 8), + "Sidebar entry '\(label)' must navigate to its content pane" ) } } + + private func destinationIsVisible(for label: String, timeout: TimeInterval) -> Bool { + switch label { + case "Home": + return app.staticTexts["Here's your outdoor dashboard"].waitForExistence(timeout: timeout) + case "Packs": + return app.buttons["New Pack"].waitForExistence(timeout: timeout) + || app.buttons["All"].waitForExistence(timeout: 1) + case "Trips": + return app.buttons["Plan Trip"].waitForExistence(timeout: timeout) + || app.tables.firstMatch.waitForExistence(timeout: 1) + || app.outlines.element(boundBy: 1).waitForExistence(timeout: 1) + case "Weather": + return app.searchFields["Search locations\u{2026}"].waitForExistence(timeout: timeout) + case "Assistant": + return app.textFields["chat_input"].waitForExistence(timeout: timeout) + case "Catalog": + return app.searchFields["Search tents, packs, sleeping bags\u{2026}"].waitForExistence(timeout: timeout) + || app.staticTexts["Search the Gear Catalog"].waitForExistence(timeout: 1) + case "Templates": + return app.buttons["New Template"].waitForExistence(timeout: timeout) + || app.tables.firstMatch.waitForExistence(timeout: 1) + || app.outlines.element(boundBy: 1).waitForExistence(timeout: 1) + case "Trail Conditions": + return app.buttons["Submit Report"].waitForExistence(timeout: timeout) + || app.tables.firstMatch.waitForExistence(timeout: 1) + || app.outlines.element(boundBy: 1).waitForExistence(timeout: 1) + case "Feed": + return app.buttons["New Post"].waitForExistence(timeout: timeout) + || app.buttons["Write a Post"].waitForExistence(timeout: 1) + case "Guides": + return app.staticTexts["Guides"].waitForExistence(timeout: timeout) + || app.tables.firstMatch.waitForExistence(timeout: 1) + case "Gear Inventory": + return app.staticTexts["Gear Inventory"].waitForExistence(timeout: timeout) + || app.buttons.matching(NSPredicate(format: "label CONTAINS 'Add'")).firstMatch.waitForExistence(timeout: 1) + case "Wildlife": + return app.buttons["Choose Photo"].waitForExistence(timeout: timeout) + || app.staticTexts["Identify Wildlife"].waitForExistence(timeout: 1) + default: + return false + } + } } #endif diff --git a/apps/swift/Tests/PackRatUITests/NavigationTests.swift b/apps/swift/Tests/PackRatUITests/NavigationTests.swift index b3dbfc95c4..3404b19cb7 100644 --- a/apps/swift/Tests/PackRatUITests/NavigationTests.swift +++ b/apps/swift/Tests/PackRatUITests/NavigationTests.swift @@ -11,7 +11,7 @@ final class NavigationTests: AppUITestCase { ("Home", "Home"), ("Packs", "Packs"), ("Trips", "Trips"), - ("Weather", "Weather"), + ("Assistant", "AI Assistant"), ] func testAllPrimaryTabsReachable() { @@ -42,10 +42,10 @@ final class NavigationTests: AppUITestCase { } func testWeatherTabShowsSearchField() { - goToTab("Weather") + goToHomeAction("Weather") XCTAssertTrue( - app.textFields["Search locations\u{2026}"].waitForExistence(timeout: 8), - "Weather tab must show location search field" + app.searchFields["Search locations\u{2026}"].waitForExistence(timeout: 8), + "Weather destination must show location search field" ) } diff --git a/apps/swift/Tests/PackRatUITests/PackMacOSTests.swift b/apps/swift/Tests/PackRatUITests/PackMacOSTests.swift index 5966ec62fd..cee2011466 100644 --- a/apps/swift/Tests/PackRatUITests/PackMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/PackMacOSTests.swift @@ -81,7 +81,7 @@ final class PackMacOSTests: AppUITestCase { waitFor(addButton, message: "Add Item button must be visible") addButton.click() - let itemNameField = app.textFields["Name"] + let itemNameField = app.textFields["pack_item_name"] waitFor(itemNameField, message: "Item Name field must appear") itemNameField.click() itemNameField.typeText(itemName) @@ -108,14 +108,16 @@ final class PackMacOSTests: AppUITestCase { openPack(named: packName) let itemNames = ["Sleeping Bag", "Rain Jacket", "Water Filter"] + var uniqueItems: [String] = [] for item in itemNames { let uniqueItem = "\(item) \(Int(Date().timeIntervalSince1970))" + uniqueItems.append(uniqueItem) addItem(named: uniqueItem) } - for item in itemNames { + for item in uniqueItems { XCTAssertTrue( - app.staticTexts.matching(NSPredicate(format: "label CONTAINS '\(item)'")).firstMatch + staticText(containing: item).firstMatch .waitForExistence(timeout: 5), "Item '\(item)' should appear in pack" ) @@ -135,17 +137,19 @@ final class PackMacOSTests: AppUITestCase { // Open the detail-column ••• overflow menu. On macOS the toolbar lives // in the detail column window chrome; the menu icon is the // "ellipsis.circle" image button. - let menuButton = app.buttons.matching( - NSPredicate(format: "label CONTAINS 'ellipsis' OR label == 'More'") - ).firstMatch + let menuButton = app.menuButtons["pack_detail_more_menu"].exists + ? app.menuButtons["pack_detail_more_menu"] + : app.menuButtons["ellipsis.circle"] waitFor(menuButton, timeout: 5) menuButton.click() - let editButton = app.buttons["Edit Pack"] + let editButton = app.menuItems["Edit Pack"].exists + ? app.menuItems["Edit Pack"] + : app.buttons["pack_detail_edit_pack"] waitFor(editButton, timeout: 3) editButton.click() - let nameField = app.textFields["Pack Name"] + let nameField = app.textFields["pack_name"] waitFor(nameField) nameField.clearAndTypeText(updatedName) @@ -169,7 +173,7 @@ final class PackMacOSTests: AppUITestCase { // Right-click invokes the context menu on macOS. cell.rightClick() - let deleteButton = app.buttons["Delete"] + let deleteButton = rowDeleteMenuItem() waitFor(deleteButton, timeout: 5) deleteButton.click() @@ -182,7 +186,7 @@ final class PackMacOSTests: AppUITestCase { goToSidebar("Packs") waitFor(app.buttons["New Pack"]).click() - let nameField = app.textFields["Pack Name"] + let nameField = app.textFields["pack_name"] waitFor(nameField) nameField.click() nameField.typeText(name) @@ -213,7 +217,7 @@ final class PackMacOSTests: AppUITestCase { let addButton = app.buttons["Add Item"].firstMatch waitFor(addButton).click() - let nameField = app.textFields["Name"] + let nameField = app.textFields["pack_item_name"] waitFor(nameField) nameField.click() nameField.typeText(name) @@ -238,9 +242,19 @@ final class PackMacOSTests: AppUITestCase { let cell = app.staticTexts[name] guard cell.waitForExistence(timeout: 5) else { return } cell.rightClick() - let deleteButton = app.buttons["Delete"] + let deleteButton = rowDeleteMenuItem() guard deleteButton.waitForExistence(timeout: 3) else { return } deleteButton.click() } + + private func rowDeleteMenuItem() -> XCUIElement { + app.menuItems.matching(NSPredicate(format: "identifier == %@", "trash")).firstMatch + } + + private func staticText(containing text: String) -> XCUIElementQuery { + app.staticTexts.matching( + NSPredicate(format: "label CONTAINS %@ OR value CONTAINS %@", text, text) + ) + } } #endif diff --git a/apps/swift/Tests/PackRatUITests/PackSubFlowMacOSTests.swift b/apps/swift/Tests/PackRatUITests/PackSubFlowMacOSTests.swift index 6343a82567..0f038068fd 100644 --- a/apps/swift/Tests/PackRatUITests/PackSubFlowMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/PackSubFlowMacOSTests.swift @@ -23,7 +23,8 @@ final class PackSubFlowMacOSTests: AppUITestCase { recentButton.click() XCTAssertTrue( - app.staticTexts["Recent Packs"].waitForExistence(timeout: 5), + app.descendants(matching: .any)["recent_packs_view"].waitForExistence(timeout: 5) + || app.staticTexts["Recent Packs"].waitForExistence(timeout: 2), "Recent Packs view must appear" ) } @@ -39,16 +40,14 @@ final class PackSubFlowMacOSTests: AppUITestCase { // Wait for detail column to load. _ = app.staticTexts["Total"].waitForExistence(timeout: 5) - let menuButton = app.buttons.matching( - NSPredicate(format: "label CONTAINS 'ellipsis' OR label == 'More'") - ).firstMatch + let menuButton = detailMenuButton() guard menuButton.waitForExistence(timeout: 5) else { XCTFail("Pack detail menu button must be present") return } menuButton.click() - let weightAnalysis = app.buttons["Weight Analysis"] + let weightAnalysis = app.menuItems["Weight Analysis"] guard weightAnalysis.waitForExistence(timeout: 3) else { // Empty pack — disabled. Not a failure for this smoke test. return @@ -71,14 +70,12 @@ final class PackSubFlowMacOSTests: AppUITestCase { cell.click() _ = app.staticTexts["Total"].waitForExistence(timeout: 5) - let menuButton = app.buttons.matching( - NSPredicate(format: "label CONTAINS 'ellipsis' OR label == 'More'") - ).firstMatch + let menuButton = detailMenuButton() guard menuButton.waitForExistence(timeout: 5) else { return } menuButton.click() XCTAssertTrue( - app.buttons["Gap Analysis"].waitForExistence(timeout: 3), + app.menuItems["Gap Analysis"].waitForExistence(timeout: 3), "Gap Analysis must appear in pack menu" ) } @@ -97,7 +94,7 @@ final class PackSubFlowMacOSTests: AppUITestCase { cell.rightClick() XCTAssertTrue( - app.buttons["Delete"].waitForExistence(timeout: 3), + rowDeleteMenuItem().waitForExistence(timeout: 3), "Context menu must contain Delete" ) @@ -110,7 +107,7 @@ final class PackSubFlowMacOSTests: AppUITestCase { private func createPack(named name: String) { goToSidebar("Packs") waitFor(app.buttons["New Pack"]).click() - let nameField = app.textFields["Pack Name"] + let nameField = app.textFields["pack_name"] waitFor(nameField) nameField.click() nameField.typeText(name) @@ -123,9 +120,21 @@ final class PackSubFlowMacOSTests: AppUITestCase { let cell = app.staticTexts[name] guard cell.waitForExistence(timeout: 5) else { return } cell.rightClick() - let deleteButton = app.buttons["Delete"] + let deleteButton = rowDeleteMenuItem() guard deleteButton.waitForExistence(timeout: 3) else { return } deleteButton.click() } + + private func detailMenuButton() -> XCUIElement { + let identified = app.menuButtons["pack_detail_more_menu"] + if identified.exists { return identified } + let fallback = app.menuButtons["ellipsis.circle"] + if fallback.exists { return fallback } + return app.buttons.matching(NSPredicate(format: "label CONTAINS 'ellipsis' OR label == 'More'")).firstMatch + } + + private func rowDeleteMenuItem() -> XCUIElement { + app.menuItems.matching(NSPredicate(format: "identifier == %@", "trash")).firstMatch + } } #endif diff --git a/apps/swift/Tests/PackRatUITests/PackSubFlowTests.swift b/apps/swift/Tests/PackRatUITests/PackSubFlowTests.swift index 9394713d87..55702be3c6 100644 --- a/apps/swift/Tests/PackRatUITests/PackSubFlowTests.swift +++ b/apps/swift/Tests/PackRatUITests/PackSubFlowTests.swift @@ -121,7 +121,7 @@ final class PackSubFlowTests: AppUITestCase { private func createPack(named name: String) { goToTab("Packs") - waitFor(app.buttons["New Pack"]).tap() + waitFor(app.buttons["packs_new_pack_button"]).tap() let nameField = app.textFields["Pack Name"] waitFor(nameField) nameField.tap() diff --git a/apps/swift/Tests/PackRatUITests/PackTemplateMacOSTests.swift b/apps/swift/Tests/PackRatUITests/PackTemplateMacOSTests.swift index 0dbb42e770..6a0465bda0 100644 --- a/apps/swift/Tests/PackRatUITests/PackTemplateMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/PackTemplateMacOSTests.swift @@ -27,7 +27,7 @@ final class PackTemplateMacOSTests: AppUITestCase { waitFor(app.buttons["New Template"]).click() XCTAssertTrue( - app.textFields["Name"].waitForExistence(timeout: 5), + app.textFields["template_name"].waitForExistence(timeout: 5), "Template Name field must appear" ) XCTAssertTrue(app.buttons["Cancel"].exists) @@ -95,7 +95,7 @@ final class PackTemplateMacOSTests: AppUITestCase { private func createTemplate(named name: String) { goToSidebar("Templates") waitFor(app.buttons["New Template"]).click() - let nameField = app.textFields["Name"] + let nameField = app.textFields["template_name"] waitFor(nameField) nameField.click() nameField.typeText(name) diff --git a/apps/swift/Tests/PackRatUITests/SeasonSuggestionsMacOSTests.swift b/apps/swift/Tests/PackRatUITests/SeasonSuggestionsMacOSTests.swift index 98c373bd76..2792afd9a3 100644 --- a/apps/swift/Tests/PackRatUITests/SeasonSuggestionsMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/SeasonSuggestionsMacOSTests.swift @@ -8,9 +8,7 @@ final class SeasonSuggestionsMacOSTests: AppUITestCase { func testOpenSeasonSuggestionsFromHome() { goToSidebar("Home") - let tile = app.buttons.matching( - NSPredicate(format: "label CONTAINS[c] 'Season' OR label CONTAINS[c] 'Suggestion'") - ).firstMatch + let tile = app.buttons["home_action_seasonsuggestions"] guard tile.waitForExistence(timeout: 8) else { XCTFail("Season Suggestions tile not found on Home") return @@ -18,8 +16,8 @@ final class SeasonSuggestionsMacOSTests: AppUITestCase { tile.click() XCTAssertTrue( - app.staticTexts["AI-Powered Packing Tips"].waitForExistence(timeout: 5) - || app.staticTexts["Season Suggestions"].waitForExistence(timeout: 5), + app.staticTexts["Season Suggestions"].waitForExistence(timeout: 5) + || app.staticTexts["Sign In for Season Suggestions"].waitForExistence(timeout: 5), "Season Suggestions sheet must appear" ) @@ -29,17 +27,14 @@ final class SeasonSuggestionsMacOSTests: AppUITestCase { func testSeasonSuggestionsHasLocationField() { goToSidebar("Home") - let tile = app.buttons.matching( - NSPredicate(format: "label CONTAINS[c] 'Season' OR label CONTAINS[c] 'Suggestion'") - ).firstMatch + let tile = app.buttons["home_action_seasonsuggestions"] guard tile.waitForExistence(timeout: 8) else { return } tile.click() XCTAssertTrue( - app.textFields.matching( - NSPredicate(format: "placeholderValue CONTAINS[c] 'Yosemite' OR placeholderValue CONTAINS[c] 'going'") - ).firstMatch.waitForExistence(timeout: 5) - || app.staticTexts["Where are you going?"].waitForExistence(timeout: 3), + app.textFields["e.g. Yosemite, Pacific Crest Trail…"].waitForExistence(timeout: 5) + || app.staticTexts["Destination"].waitForExistence(timeout: 3) + || app.staticTexts["Sign In for Season Suggestions"].waitForExistence(timeout: 3), "Location prompt must appear" ) @@ -49,9 +44,7 @@ final class SeasonSuggestionsMacOSTests: AppUITestCase { func testGetSuggestionsButtonDisabledWithEmptyLocation() { goToSidebar("Home") - let tile = app.buttons.matching( - NSPredicate(format: "label CONTAINS[c] 'Season' OR label CONTAINS[c] 'Suggestion'") - ).firstMatch + let tile = app.buttons["home_action_seasonsuggestions"] guard tile.waitForExistence(timeout: 8) else { return } tile.click() diff --git a/apps/swift/Tests/PackRatUITests/SeasonSuggestionsTests.swift b/apps/swift/Tests/PackRatUITests/SeasonSuggestionsTests.swift index a05a0be132..1b57a58c39 100644 --- a/apps/swift/Tests/PackRatUITests/SeasonSuggestionsTests.swift +++ b/apps/swift/Tests/PackRatUITests/SeasonSuggestionsTests.swift @@ -7,21 +7,11 @@ import XCTest final class SeasonSuggestionsTests: AppUITestCase { func testOpenSeasonSuggestionsFromHome() { - goToTab("Home") - - // Look for the Season Suggestions tile/button on Home - let tile = app.buttons.matching( - NSPredicate(format: "label CONTAINS[c] 'Season' OR label CONTAINS[c] 'Suggestion'") - ).firstMatch - guard tile.waitForExistence(timeout: 8) else { - XCTFail("Season Suggestions tile not found on Home tab") - return - } - tile.tap() + goToHomeAction("Season Suggestions") XCTAssertTrue( - app.staticTexts["AI-Powered Packing Tips"].waitForExistence(timeout: 5) - || app.staticTexts["Season Suggestions"].waitForExistence(timeout: 5), + app.navigationBars["Season Suggestions"].waitForExistence(timeout: 5) + || app.staticTexts["Sign In for Season Suggestions"].waitForExistence(timeout: 5), "Season Suggestions sheet must appear" ) @@ -30,19 +20,12 @@ final class SeasonSuggestionsTests: AppUITestCase { } func testSeasonSuggestionsHasLocationField() { - goToTab("Home") - - let tile = app.buttons.matching( - NSPredicate(format: "label CONTAINS[c] 'Season' OR label CONTAINS[c] 'Suggestion'") - ).firstMatch - guard tile.waitForExistence(timeout: 8) else { return } - tile.tap() + goToHomeAction("Season Suggestions") XCTAssertTrue( - app.textFields.matching( - NSPredicate(format: "placeholderValue CONTAINS[c] 'Yosemite' OR placeholderValue CONTAINS[c] 'going'") - ).firstMatch.waitForExistence(timeout: 5) - || app.staticTexts["Where are you going?"].waitForExistence(timeout: 3), + app.textFields["e.g. Yosemite, Pacific Crest Trail…"].waitForExistence(timeout: 5) + || app.staticTexts["Destination"].waitForExistence(timeout: 3) + || app.staticTexts["Sign In for Season Suggestions"].waitForExistence(timeout: 3), "Location prompt must appear" ) @@ -50,13 +33,7 @@ final class SeasonSuggestionsTests: AppUITestCase { } func testGetSuggestionsButtonDisabledWithEmptyLocation() { - goToTab("Home") - - let tile = app.buttons.matching( - NSPredicate(format: "label CONTAINS[c] 'Season' OR label CONTAINS[c] 'Suggestion'") - ).firstMatch - guard tile.waitForExistence(timeout: 8) else { return } - tile.tap() + goToHomeAction("Season Suggestions") let getButton = app.buttons["Get Suggestions"] if getButton.waitForExistence(timeout: 5) { diff --git a/apps/swift/Tests/PackRatUITests/TrailConditionMacOSTests.swift b/apps/swift/Tests/PackRatUITests/TrailConditionMacOSTests.swift index 6a4f96fc0f..723f17f8e9 100644 --- a/apps/swift/Tests/PackRatUITests/TrailConditionMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/TrailConditionMacOSTests.swift @@ -30,7 +30,7 @@ final class TrailConditionMacOSTests: AppUITestCase { submitButton.click() XCTAssertTrue( - app.textFields["Trail Name"].waitForExistence(timeout: 5), + app.textFields["trail_report_name"].waitForExistence(timeout: 5), "Submit Report form must appear with Trail Name field" ) XCTAssertTrue(app.buttons["Cancel"].exists) @@ -44,12 +44,12 @@ final class TrailConditionMacOSTests: AppUITestCase { goToSidebar("Trail Conditions") waitFor(app.buttons["Submit Report"].firstMatch).click() - let nameField = app.textFields["Trail Name"] + let nameField = app.textFields["trail_report_name"] waitFor(nameField) nameField.click() nameField.typeText(trailName) - let regionField = app.textFields["Region / Area (optional)"] + let regionField = app.textFields["trail_report_region"] if regionField.waitForExistence(timeout: 3) { regionField.click() regionField.typeText("Test Region") @@ -81,8 +81,9 @@ final class TrailConditionMacOSTests: AppUITestCase { waitFor(app.buttons["Submit Report"].firstMatch, timeout: 20) let target = app.staticTexts[trailName] + let row = app.descendants(matching: .any)["trail_report_row_\(trailName)"] XCTAssertTrue( - target.waitForExistence(timeout: 10), + target.waitForExistence(timeout: 10) || row.waitForExistence(timeout: 1), "Submitted report '\(trailName)' must appear in list" ) } @@ -121,9 +122,11 @@ final class TrailConditionMacOSTests: AppUITestCase { private func cleanupReport(forTrail trail: String) { goToSidebar("Trail Conditions") - let cell = app.staticTexts[trail] - guard cell.waitForExistence(timeout: 5) else { return } - cell.rightClick() + let cell = app.staticTexts[trail].firstMatch + let row = app.descendants(matching: .any)["trail_report_row_\(trail)"].firstMatch + let target = cell.waitForExistence(timeout: 5) ? cell : row + guard target.waitForExistence(timeout: 1) else { return } + target.rightClick() let deleteButton = app.buttons["Delete"] guard deleteButton.waitForExistence(timeout: 3) else { return } deleteButton.click() diff --git a/apps/swift/Tests/PackRatUITests/TripMacOSTests.swift b/apps/swift/Tests/PackRatUITests/TripMacOSTests.swift index 4a1701be56..873184e56e 100644 --- a/apps/swift/Tests/PackRatUITests/TripMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/TripMacOSTests.swift @@ -25,12 +25,12 @@ final class TripMacOSTests: AppUITestCase { func testPlanTripButtonOpensForm() { goToSidebar("Trips") - let planButton = app.buttons["Plan Trip"] + let planButton = app.buttons["trips_plan_trip_button"] waitFor(planButton) planButton.click() XCTAssertTrue( - app.textFields["Trip Name"].waitForExistence(timeout: 5), + app.textFields["trip_name"].waitForExistence(timeout: 5), "Trip Name field must appear in form" ) XCTAssertTrue(app.buttons["Cancel"].exists) @@ -42,9 +42,9 @@ final class TripMacOSTests: AppUITestCase { createdTripName = tripName goToSidebar("Trips") - waitFor(app.buttons["Plan Trip"]).click() + waitFor(app.buttons["trips_plan_trip_button"]).click() - let nameField = app.textFields["Trip Name"] + let nameField = app.textFields["trip_name"] waitFor(nameField) nameField.click() nameField.typeText(tripName) @@ -62,9 +62,9 @@ final class TripMacOSTests: AppUITestCase { createdTripName = tripName goToSidebar("Trips") - waitFor(app.buttons["Plan Trip"]).click() + waitFor(app.buttons["trips_plan_trip_button"]).click() - let nameField = app.textFields["Trip Name"] + let nameField = app.textFields["trip_name"] waitFor(nameField) nameField.click() nameField.typeText(tripName) @@ -109,7 +109,7 @@ final class TripMacOSTests: AppUITestCase { let cell = waitFor(app.staticTexts[tripName]) cell.rightClick() - let deleteButton = app.buttons["Delete"] + let deleteButton = rowDeleteMenuItem() waitFor(deleteButton, timeout: 3) deleteButton.click() @@ -128,8 +128,8 @@ final class TripMacOSTests: AppUITestCase { private func createTrip(named name: String) { goToSidebar("Trips") - waitFor(app.buttons["Plan Trip"]).click() - let nameField = app.textFields["Trip Name"] + waitFor(app.buttons["trips_plan_trip_button"]).click() + let nameField = app.textFields["trip_name"] waitFor(nameField) nameField.click() nameField.typeText(name) @@ -142,9 +142,13 @@ final class TripMacOSTests: AppUITestCase { let cell = app.staticTexts[name] guard cell.waitForExistence(timeout: 5) else { return } cell.rightClick() - let deleteButton = app.buttons["Delete"] + let deleteButton = rowDeleteMenuItem() guard deleteButton.waitForExistence(timeout: 3) else { return } deleteButton.click() } + + private func rowDeleteMenuItem() -> XCUIElement { + app.menuItems.matching(NSPredicate(format: "identifier == %@", "trash")).firstMatch + } } #endif diff --git a/apps/swift/Tests/PackRatUITests/TripTests.swift b/apps/swift/Tests/PackRatUITests/TripTests.swift index cb262cdaa8..4e8c24a6e9 100644 --- a/apps/swift/Tests/PackRatUITests/TripTests.swift +++ b/apps/swift/Tests/PackRatUITests/TripTests.swift @@ -25,8 +25,7 @@ final class TripTests: AppUITestCase { func testPlanTripButtonOpensForm() { goToTab("Trips") - // Either toolbar Plan Trip button or empty-state CTA - let planButton = app.buttons["Plan Trip"] + let planButton = app.buttons["trips_plan_trip_button"] waitFor(planButton) planButton.tap() @@ -42,7 +41,7 @@ final class TripTests: AppUITestCase { createdTripName = tripName goToTab("Trips") - waitFor(app.buttons["Plan Trip"]).tap() + waitFor(app.buttons["trips_plan_trip_button"]).tap() let nameField = app.textFields["Trip Name"] waitFor(nameField) @@ -62,7 +61,7 @@ final class TripTests: AppUITestCase { createdTripName = tripName goToTab("Trips") - waitFor(app.buttons["Plan Trip"]).tap() + waitFor(app.buttons["trips_plan_trip_button"]).tap() let nameField = app.textFields["Trip Name"] waitFor(nameField) @@ -123,7 +122,7 @@ final class TripTests: AppUITestCase { private func createTrip(named name: String) { goToTab("Trips") - waitFor(app.buttons["Plan Trip"]).tap() + waitFor(app.buttons["trips_plan_trip_button"]).tap() let nameField = app.textFields["Trip Name"] waitFor(nameField) nameField.tap() diff --git a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift index 4262f33f20..4d2795056d 100644 --- a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift +++ b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift @@ -124,29 +124,40 @@ final class VisualScreenshotTests: XCTestCase { private func capturePhoneModalSurface(mode: VisualMode) { let prefix = mode.modalPrefix captureGlobalSearch(name: "\(prefix)-global-search") - if mode == .guest { - restartLoggedOut() - enterGuestMode() - } + resetPhoneModalState(mode) captureTab("Packs", name: "\(prefix)-packs-before-new-pack") - tapAndCapture(button: "New Pack", name: "\(prefix)-new-pack-sheet") + tapAndCapture(identifier: "packs_new_pack_button", fallbackButton: "New Pack", name: "\(prefix)-new-pack-sheet") + resetPhoneModalState(mode) captureTab("Trips", name: "\(prefix)-trips-before-new-trip") - tapAndCapture(button: "Plan Trip", name: "\(prefix)-new-trip-sheet") + tapAndCapture(identifier: "trips_plan_trip_button", fallbackButton: "Plan Trip", name: "\(prefix)-new-trip-sheet") - captureHomeAction("Pack Templates", name: "\(prefix)-templates-before-new-template") - tapAndCapture(button: "New Template", name: "\(prefix)-new-template-sheet") + resetPhoneModalState(mode) + captureHomeAction("Pack Templates", name: "\(prefix)-templates-before-new-template", dismissAfterCapture: false) + tapAndCapture(identifier: "templates_new_template_button", fallbackButton: "New Template", name: "\(prefix)-new-template-sheet") - captureHomeAction("Trail Conditions", name: "\(prefix)-trail-conditions-before-submit") - tapAndCapture(button: "Submit Report", name: "\(prefix)-trail-report-sheet") + resetPhoneModalState(mode) + captureHomeAction("Trail Conditions", name: "\(prefix)-trail-conditions-before-submit", dismissAfterCapture: false) + tapAndCapture(identifier: "trail_conditions_submit_report_button", fallbackButton: "Submit Report", name: "\(prefix)-trail-report-sheet") - captureHomeAction("Weather", name: "\(prefix)-weather-before-alerts") + resetPhoneModalState(mode) + captureHomeAction("Weather", name: "\(prefix)-weather-before-alerts", dismissAfterCapture: false) tapAndCapture(identifier: "weather_alerts_button", name: "\(prefix)-weather-alerts-sheet") if mode == .authenticated { - captureHomeAction("Community Feed", name: "\(prefix)-feed-before-compose") - tapAndCapture(button: "New Post", name: "\(prefix)-feed-compose-sheet") + resetPhoneModalState(mode) + captureHomeAction("Community Feed", name: "\(prefix)-feed-before-compose", dismissAfterCapture: false) + tapAndCapture(identifier: "feed_new_post_button", fallbackButton: "New Post", name: "\(prefix)-feed-compose-sheet") + } + } + + private func resetPhoneModalState(_ mode: VisualMode) { + if mode == .guest { + restartLoggedOut() + enterGuestMode() + } else { + launchAuthenticated() } } @@ -158,7 +169,7 @@ final class VisualScreenshotTests: XCTestCase { } } - private func captureHomeAction(_ title: String, name: String) { + private func captureHomeAction(_ title: String, name: String, dismissAfterCapture: Bool = true) { captureTab("Home", name: "home-before-\(name)") let identifier = "home_action_\(title.lowercased().filter { $0.isLetter || $0.isNumber })" @@ -168,7 +179,9 @@ final class VisualScreenshotTests: XCTestCase { if action.exists, action.isHittable { action.tap() capture(name) - dismissPhoneDestination() + if dismissAfterCapture { + dismissPhoneDestination() + } return } app.swipeUp() @@ -215,23 +228,23 @@ final class VisualScreenshotTests: XCTestCase { captureGlobalSearch(name: "\(prefix)-global-search") selectSidebar("Packs") - tapAndCapture(button: "New Pack", name: "\(prefix)-new-pack-sheet") + tapAndCapture(identifier: "packs_new_pack_button", fallbackButton: "New Pack", name: "\(prefix)-new-pack-sheet") selectSidebar("Trips") - tapAndCapture(button: "Plan Trip", name: "\(prefix)-new-trip-sheet") + tapAndCapture(identifier: "trips_plan_trip_button", fallbackButton: "Plan Trip", name: "\(prefix)-new-trip-sheet") selectSidebar("Templates") - tapAndCapture(button: "New Template", name: "\(prefix)-new-template-sheet") + tapAndCapture(identifier: "templates_new_template_button", fallbackButton: "New Template", name: "\(prefix)-new-template-sheet") selectSidebar("Trail Conditions") - tapAndCapture(button: "Submit Report", name: "\(prefix)-trail-report-sheet") + tapAndCapture(identifier: "trail_conditions_submit_report_button", fallbackButton: "Submit Report", name: "\(prefix)-trail-report-sheet") selectSidebar("Weather") tapAndCapture(identifier: "weather_alerts_button", name: "\(prefix)-weather-alerts-sheet") if mode == .authenticated { selectSidebar("Feed") - tapAndCapture(button: "New Post", name: "\(prefix)-feed-compose-sheet") + tapAndCapture(identifier: "feed_new_post_button", fallbackButton: "New Post", name: "\(prefix)-feed-compose-sheet") } } @@ -291,6 +304,14 @@ final class VisualScreenshotTests: XCTestCase { dismissPresentedSurface() } + private func tapAndCapture(identifier: String, fallbackButton label: String, name: String) { + let button = findButton(identifier: identifier, timeout: 1) ?? findButton(label: label, timeout: 3) + guard let button else { return } + activate(button) + capture(name) + dismissPresentedSurface() + } + private func findButton(label: String, timeout: TimeInterval) -> XCUIElement? { let query = app.buttons.matching(NSPredicate(format: "label == %@", label)) return findConcreteElement(in: query, timeout: timeout) @@ -374,9 +395,8 @@ final class VisualScreenshotTests: XCTestCase { #if os(iOS) return app.tabBars.firstMatch.waitForExistence(timeout: 20) #elseif os(macOS) - return app.otherElements["app_navigation"].waitForExistence(timeout: 20) - || app.outlines["app_sidebar"].waitForExistence(timeout: 1) - || app.buttons["nav_home"].waitForExistence(timeout: 1) + return app.buttons["nav_home"].waitForExistence(timeout: 10) + || app.buttons["nav_packs"].waitForExistence(timeout: 2) #endif } @@ -401,7 +421,13 @@ final class VisualScreenshotTests: XCTestCase { private func capture(_ name: String) { Thread.sleep(forTimeInterval: 0.35) + #if os(macOS) + app.activate() + let window = app.windows.firstMatch + let screenshot = window.waitForExistence(timeout: 2) ? window.screenshot() : app.screenshot() + #else let screenshot = app.screenshot() + #endif let url = screenshotDirectory.appendingPathComponent("\(name).png") try? screenshot.pngRepresentation.write(to: url, options: .atomic) diff --git a/apps/swift/Tests/PackRatUITests/WeatherMacOSTests.swift b/apps/swift/Tests/PackRatUITests/WeatherMacOSTests.swift index 80c7c86ca9..2dc30d0119 100644 --- a/apps/swift/Tests/PackRatUITests/WeatherMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/WeatherMacOSTests.swift @@ -11,7 +11,7 @@ final class WeatherMacOSTests: AppUITestCase { func testLocationSearchReturnsResults() { goToSidebar("Weather") - let searchField = app.textFields["Search locations\u{2026}"] + let searchField = app.searchFields["Search locations\u{2026}"] waitFor(searchField, message: "Weather search field must appear") searchField.click() searchField.typeText(testCity) @@ -26,7 +26,7 @@ final class WeatherMacOSTests: AppUITestCase { func testSelectLocationLoadsForecast() { goToSidebar("Weather") - let searchField = app.textFields["Search locations\u{2026}"] + let searchField = app.searchFields["Search locations\u{2026}"] waitFor(searchField) searchField.click() searchField.typeText(testCity) @@ -37,9 +37,7 @@ final class WeatherMacOSTests: AppUITestCase { waitFor(firstResult, timeout: 10) firstResult.click() - let tempLabel = app.staticTexts.matching( - NSPredicate(format: "label MATCHES '.*\\d+°.*' OR label CONTAINS '°'") - ).firstMatch + let tempLabel = app.descendants(matching: .any)["weather_current_card"] XCTAssertTrue( tempLabel.waitForExistence(timeout: 20), "Temperature reading must appear after selecting a location" @@ -49,7 +47,7 @@ final class WeatherMacOSTests: AppUITestCase { func testSavedLocationAppearsAsChip() { goToSidebar("Weather") - let searchField = app.textFields["Search locations\u{2026}"] + let searchField = app.searchFields["Search locations\u{2026}"] waitFor(searchField) searchField.click() searchField.typeText(testCity) @@ -60,14 +58,11 @@ final class WeatherMacOSTests: AppUITestCase { waitFor(firstResult, timeout: 10) firstResult.click() - let clearButton = app.buttons.matching( - NSPredicate(format: "label CONTAINS 'xmark' OR label == 'Clear'") - ).firstMatch - if clearButton.exists { clearButton.click() } + searchField.clearAndTypeText("") XCTAssertTrue( - app.staticTexts.matching(NSPredicate(format: "label CONTAINS '\(testCityFull)'")).firstMatch - .waitForExistence(timeout: 5), + app.descendants(matching: .any).matching(NSPredicate(format: "identifier BEGINSWITH 'weather_saved_location_'")).firstMatch + .waitForExistence(timeout: 10), "Saved location chip must appear after selecting a location" ) } @@ -75,7 +70,7 @@ final class WeatherMacOSTests: AppUITestCase { func testSearchClearButtonRemovesResults() { goToSidebar("Weather") - let searchField = app.textFields["Search locations\u{2026}"] + let searchField = app.searchFields["Search locations\u{2026}"] waitFor(searchField) searchField.click() searchField.typeText(testCity) @@ -83,9 +78,7 @@ final class WeatherMacOSTests: AppUITestCase { let results = app.buttons.matching(NSPredicate(format: "label CONTAINS '\(testCityFull)'")) waitFor(results.firstMatch, timeout: 10) - let clear = app.buttons["weather_search_clear"] - waitFor(clear, timeout: 5) - clear.click() + searchField.clearAndTypeText("") let dropdownResult = app.buttons.matching( NSPredicate(format: "label CONTAINS '\(testCityFull)' AND label CONTAINS ','") @@ -99,7 +92,7 @@ final class WeatherMacOSTests: AppUITestCase { func testForecastShowsDailyRows() { goToSidebar("Weather") - let searchField = app.textFields["Search locations\u{2026}"] + let searchField = app.searchFields["Search locations\u{2026}"] waitFor(searchField) searchField.click() searchField.typeText(testCity) @@ -119,7 +112,7 @@ final class WeatherMacOSTests: AppUITestCase { func testWeatherAlertsButtonAppearsWithForecast() { goToSidebar("Weather") - let searchField = app.textFields["Search locations\u{2026}"] + let searchField = app.searchFields["Search locations\u{2026}"] waitFor(searchField) searchField.click() searchField.typeText(testCity) diff --git a/apps/swift/Tests/PackRatUITests/WeatherSubFlowMacOSTests.swift b/apps/swift/Tests/PackRatUITests/WeatherSubFlowMacOSTests.swift index d02c927906..1d210b5f21 100644 --- a/apps/swift/Tests/PackRatUITests/WeatherSubFlowMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/WeatherSubFlowMacOSTests.swift @@ -18,7 +18,8 @@ final class WeatherSubFlowMacOSTests: AppUITestCase { prefsButton.click() XCTAssertTrue( - app.staticTexts["Alert Preferences"].waitForExistence(timeout: 5), + app.staticTexts["Alert Preferences"].waitForExistence(timeout: 5) + || app.checkBoxes["Weather Notifications"].waitForExistence(timeout: 2), "Alert Preferences screen must appear" ) } @@ -53,15 +54,15 @@ final class WeatherSubFlowMacOSTests: AppUITestCase { prefsButton.click() // Ensure master toggle is on. - let masterSwitch = app.switches["Weather Notifications"] - let masterCheck = app.checkBoxes["Weather Notifications"] + let masterSwitch = app.switches["weather_alert_notifications_toggle"] + let masterCheck = app.checkBoxes["weather_alert_notifications_toggle"] let master: XCUIElement = masterSwitch.exists ? masterSwitch : masterCheck - if master.waitForExistence(timeout: 5), master.value as? String == "0" { - master.click() + if master.waitForExistence(timeout: 5), master.isOff { + master.clickCheckboxControl() } - let highWindsSwitch = app.switches["High Winds"] - let highWindsCheck = app.checkBoxes["High Winds"] + let highWindsSwitch = app.switches["weather_alert_high_winds_toggle"] + let highWindsCheck = app.checkBoxes["weather_alert_high_winds_toggle"] let highWinds: XCUIElement = highWindsSwitch.exists ? highWindsSwitch : highWindsCheck guard highWinds.waitForExistence(timeout: 5) else { return } XCTAssertTrue( @@ -69,13 +70,41 @@ final class WeatherSubFlowMacOSTests: AppUITestCase { "High Winds toggle must be enabled — Weather Notifications must be on" ) - let initialValue = highWinds.value as? String - highWinds.click() - let newValue = highWinds.value as? String - XCTAssertNotEqual(initialValue, newValue, "Toggle value should change after click") + let originalValue = highWinds.normalizedValue + highWinds.clickCheckboxControl() + let changed = highWinds.waitForValueNotEqual(to: originalValue, timeout: 3) + XCTAssertTrue(changed, "Toggle value should change after click") // Restore for idempotency. - highWinds.click() + highWinds.clickCheckboxControl() } } #endif + +private extension XCUIElement { + var normalizedValue: String? { + guard let value else { return nil } + return String(describing: value) + } + + var isOff: Bool { + guard let normalizedValue else { return false } + return normalizedValue == "off" || normalizedValue == "0" || normalizedValue == "false" + } + + func clickCheckboxControl() { + #if os(macOS) + coordinate(withNormalizedOffset: CGVector(dx: 0.05, dy: 0.5)).click() + #else + tap() + #endif + } + + func waitForValueNotEqual(to originalValue: String?, timeout: TimeInterval) -> Bool { + let predicate = NSPredicate { element, _ in + guard let element = element as? XCUIElement else { return false } + return element.normalizedValue != originalValue + } + return XCTWaiter.wait(for: [XCTNSPredicateExpectation(predicate: predicate, object: self)], timeout: timeout) == .completed + } +} diff --git a/apps/swift/Tests/PackRatUITests/WeatherSubFlowTests.swift b/apps/swift/Tests/PackRatUITests/WeatherSubFlowTests.swift index 126bd39e05..df855791ab 100644 --- a/apps/swift/Tests/PackRatUITests/WeatherSubFlowTests.swift +++ b/apps/swift/Tests/PackRatUITests/WeatherSubFlowTests.swift @@ -7,7 +7,7 @@ import XCTest final class WeatherSubFlowTests: AppUITestCase { func testAlertPreferencesReachableFromWeatherToolbar() { - goToTab("Weather") + goToWeather() // The Alert Preferences icon is the slider control in the toolbar // Alert Preferences is in .secondaryAction placement, so it collapses @@ -32,7 +32,7 @@ final class WeatherSubFlowTests: AppUITestCase { } func testAlertPreferencesShowsToggles() { - goToTab("Weather") + goToWeather() // Alert Preferences is in .secondaryAction placement, so it collapses // into the nav-bar overflow menu on iPhone. Open the menu first if needed. let prefsButton = app.buttons["Alert Preferences"] @@ -62,7 +62,7 @@ final class WeatherSubFlowTests: AppUITestCase { } func testToggleAlertPreference() { - goToTab("Weather") + goToWeather() // Alert Preferences is in .secondaryAction placement, so it collapses // into the nav-bar overflow menu on iPhone. Open the menu first if needed. let prefsButton = app.buttons["Alert Preferences"] @@ -106,6 +106,11 @@ final class WeatherSubFlowTests: AppUITestCase { // Restore for idempotency highWinds.coordinate(withNormalizedOffset: CGVector(dx: 0.95, dy: 0.5)).tap() } + + private func goToWeather() { + goToHomeAction("Weather") + XCTAssertTrue(app.navigationBars["Weather"].waitForExistence(timeout: 8)) + } } #endif diff --git a/apps/swift/Tests/PackRatUITests/WeatherTests.swift b/apps/swift/Tests/PackRatUITests/WeatherTests.swift index 79b5dd8416..29124be198 100644 --- a/apps/swift/Tests/PackRatUITests/WeatherTests.swift +++ b/apps/swift/Tests/PackRatUITests/WeatherTests.swift @@ -7,13 +7,14 @@ import XCTest final class WeatherTests: AppUITestCase { private let testCity = "Denver" private let testCityFull = "Denver" // fragment to match in search results + private let weatherSearchTimeout: TimeInterval = 20 // MARK: - Search func testLocationSearchReturnsResults() { - goToTab("Weather") + goToWeather() - let searchField = app.textFields["Search locations\u{2026}"] + let searchField = app.searchFields["Search locations\u{2026}"] waitFor(searchField, message: "Weather search field must appear") searchField.tap() searchField.typeText(testCity) @@ -21,15 +22,15 @@ final class WeatherTests: AppUITestCase { // Search results should appear (they load from the WeatherAPI) let results = app.buttons.matching(NSPredicate(format: "label CONTAINS '\(testCityFull)'")) XCTAssertTrue( - results.firstMatch.waitForExistence(timeout: 10), + results.firstMatch.waitForExistence(timeout: weatherSearchTimeout), "Search results for '\(testCity)' must appear" ) } func testSelectLocationLoadsForecast() { - goToTab("Weather") + goToWeather() - let searchField = app.textFields["Search locations\u{2026}"] + let searchField = app.searchFields["Search locations\u{2026}"] waitFor(searchField) searchField.tap() searchField.typeText(testCity) @@ -38,7 +39,7 @@ final class WeatherTests: AppUITestCase { let firstResult = app.buttons.matching( NSPredicate(format: "label CONTAINS '\(testCityFull)'") ).firstMatch - waitFor(firstResult, timeout: 10) + waitFor(firstResult, timeout: weatherSearchTimeout) firstResult.tap() // Forecast card: current temperature shows a ° @@ -52,9 +53,9 @@ final class WeatherTests: AppUITestCase { } func testSavedLocationAppearsAsChip() { - goToTab("Weather") + goToWeather() - let searchField = app.textFields["Search locations\u{2026}"] + let searchField = app.searchFields["Search locations\u{2026}"] waitFor(searchField) searchField.tap() searchField.typeText(testCity) @@ -62,7 +63,7 @@ final class WeatherTests: AppUITestCase { let firstResult = app.buttons.matching( NSPredicate(format: "label CONTAINS '\(testCityFull)'") ).firstMatch - waitFor(firstResult, timeout: 10) + waitFor(firstResult, timeout: weatherSearchTimeout) firstResult.tap() // Clear search to show saved locations section @@ -80,21 +81,18 @@ final class WeatherTests: AppUITestCase { } func testSearchClearButtonRemovesResults() { - goToTab("Weather") + goToWeather() - let searchField = app.textFields["Search locations\u{2026}"] + let searchField = app.searchFields["Search locations\u{2026}"] waitFor(searchField) searchField.tap() searchField.typeText(testCity) // Wait for results to appear let results = app.buttons.matching(NSPredicate(format: "label CONTAINS '\(testCityFull)'")) - waitFor(results.firstMatch, timeout: 10) + waitFor(results.firstMatch, timeout: weatherSearchTimeout) - // Clear via the dedicated identifier on the xmark button. - let clear = app.buttons["weather_search_clear"] - waitFor(clear, timeout: 5) - clear.tap() + searchField.clearAndTypeText("") // The location-result dropdown rows show "City, Region, Country" with // commas. After clearing search, those should not be visible. @@ -108,9 +106,9 @@ final class WeatherTests: AppUITestCase { } func testForecastShowsDailyRows() { - goToTab("Weather") + goToWeather() - let searchField = app.textFields["Search locations\u{2026}"] + let searchField = app.searchFields["Search locations\u{2026}"] waitFor(searchField) searchField.tap() searchField.typeText(testCity) @@ -118,7 +116,7 @@ final class WeatherTests: AppUITestCase { let firstResult = app.buttons.matching( NSPredicate(format: "label CONTAINS '\(testCityFull)'") ).firstMatch - waitFor(firstResult, timeout: 10) + waitFor(firstResult, timeout: weatherSearchTimeout) firstResult.tap() // 10-day forecast header @@ -129,9 +127,9 @@ final class WeatherTests: AppUITestCase { } func testWeatherAlertsButtonAppearsWithForecast() { - goToTab("Weather") + goToWeather() - let searchField = app.textFields["Search locations\u{2026}"] + let searchField = app.searchFields["Search locations\u{2026}"] waitFor(searchField) searchField.tap() searchField.typeText(testCity) @@ -139,18 +137,21 @@ final class WeatherTests: AppUITestCase { let firstResult = app.buttons.matching( NSPredicate(format: "label CONTAINS '\(testCityFull)'") ).firstMatch - waitFor(firstResult, timeout: 10) + waitFor(firstResult, timeout: weatherSearchTimeout) firstResult.tap() // Alerts toolbar button appears once forecast is loaded - let alertsButton = app.buttons.matching( - NSPredicate(format: "label == 'Alerts' OR label CONTAINS 'bell'") - ).firstMatch + let alertsButton = app.buttons["weather_alerts_button"].firstMatch XCTAssertTrue( alertsButton.waitForExistence(timeout: 20), "Alerts button must appear in toolbar after forecast loads" ) } + + private func goToWeather() { + goToHomeAction("Weather") + XCTAssertTrue(app.navigationBars["Weather"].waitForExistence(timeout: 8)) + } } #endif diff --git a/apps/swift/project.yml b/apps/swift/project.yml index 74835a9427..30ac8b2dc0 100644 --- a/apps/swift/project.yml +++ b/apps/swift/project.yml @@ -46,6 +46,9 @@ packages: Sentry: url: https://github.com/getsentry/sentry-cocoa from: "8.40.0" + GoogleSignIn: + url: https://github.com/google/GoogleSignIn-iOS + from: "9.0.0" targets: PackRat-iOS: @@ -74,6 +77,7 @@ targets: ITSAppUsesNonExemptEncryption: false PACKRAT_ENV: $(PACKRAT_ENV) SENTRY_DSN: $(SENTRY_DSN) + GOOGLE_IOS_CLIENT_ID: 993694750638-97t0vhfml04u2avrlbve22jbs9qcinbc.apps.googleusercontent.com NSAppTransportSecurity: NSAllowsLocalNetworking: true CFBundleURLTypes: @@ -87,6 +91,9 @@ targets: - CFBundleURLName: world.packrat.oauth CFBundleURLSchemes: - com.andrewbierman.packrat + - CFBundleURLName: world.packrat.google + CFBundleURLSchemes: + - com.googleusercontent.apps.993694750638-97t0vhfml04u2avrlbve22jbs9qcinbc dependencies: - package: Nuke product: NukeUI @@ -106,6 +113,8 @@ targets: product: Defaults - package: Sentry product: Sentry + - package: GoogleSignIn + product: GoogleSignIn settings: base: SWIFT_VERSION: "5.9" @@ -165,8 +174,10 @@ targets: SWIFT_VERSION: "5.9" MARKETING_VERSION: "1.0" CURRENT_PROJECT_VERSION: "1" - CODE_SIGN_STYLE: Automatic - DEVELOPMENT_TEAM: 7WV9JYCW55 + CODE_SIGN_STYLE: Manual + DEVELOPMENT_TEAM: "" + CODE_SIGN_IDENTITY: "-" + CODE_SIGNING_REQUIRED: NO PRODUCT_BUNDLE_IDENTIFIER: com.andrewbierman.packrat.mac # Match iOS target so @testable import PackRat resolves on both platforms. PRODUCT_MODULE_NAME: PackRat @@ -208,11 +219,13 @@ targets: CFBundleVersion: "1" PACKRAT_E2E_EMAIL: $(PACKRAT_E2E_EMAIL) PACKRAT_E2E_PASSWORD: $(PACKRAT_E2E_PASSWORD) + PACKRAT_SCREENSHOT_DIR: $(PACKRAT_SCREENSHOT_DIR) settings: base: SWIFT_VERSION: "5.9" PACKRAT_E2E_EMAIL: "" PACKRAT_E2E_PASSWORD: "" + PACKRAT_SCREENSHOT_DIR: "" PackRatMacOSTests: type: bundle.unit-test @@ -247,11 +260,13 @@ targets: CFBundleVersion: "1" PACKRAT_E2E_EMAIL: $(PACKRAT_E2E_EMAIL) PACKRAT_E2E_PASSWORD: $(PACKRAT_E2E_PASSWORD) + PACKRAT_SCREENSHOT_DIR: $(PACKRAT_SCREENSHOT_DIR) settings: base: SWIFT_VERSION: "5.9" PACKRAT_E2E_EMAIL: "" PACKRAT_E2E_PASSWORD: "" + PACKRAT_SCREENSHOT_DIR: "" schemes: PackRat-iOS: diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index 8260802459..c771eada58 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -30,6 +30,7 @@ const HTML_ESCAPE_RE = /[&<>"']/g; const QUOTE_RE = /^["']|["']$/g; const LEADING_DIGIT_RE = /^\d/; const SCREENSHOT_PREFIX_RE = /^\d+[a-z]?-/i; +const XCT_ATTACHMENT_SUFFIX_RE = /_\d+_[0-9A-F-]+\.png$/i; const SIPS_PIXEL_WIDTH_RE = /pixelWidth:\s*(\d+)/; const SIPS_PIXEL_HEIGHT_RE = /pixelHeight:\s*(\d+)/; const CHROME_CANDIDATES = [ @@ -197,6 +198,9 @@ function runXcodeVisualTest(platform: Platform, screenshotDir: string): Promise< child.on('close', (code) => { summarizeResult(resultBundle); copyScreenshots(writableScreenshotDir, screenshotDir); + if (listScreenshots(screenshotDir).length === 0) { + exportScreenshotsFromResultBundle(resultBundle, screenshotDir); + } if (code === 0) { resolvePromise(); } else { @@ -223,6 +227,55 @@ function copyScreenshots(fromDir: string, toDir: string): void { } } +function exportScreenshotsFromResultBundle(resultBundle: string, toDir: string): void { + const exportDir = resolve('/tmp', `packrat-xcresult-attachments-${Date.now()}`); + rmSync(exportDir, { recursive: true, force: true }); + mkdirSync(exportDir, { recursive: true }); + + const result = spawnSync( + 'xcrun', + ['xcresulttool', 'export', 'attachments', '--path', resultBundle, '--output-path', exportDir], + { encoding: 'utf8' }, + ); + + if (result.status !== 0) { + console.warn( + `Warning: failed to export screenshots from xcresult attachments. ${result.stderr || result.stdout}`, + ); + return; + } + + const manifestPath = resolve(exportDir, 'manifest.json'); + if (!existsSync(manifestPath)) return; + + const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as AttachmentManifestEntry[]; + mkdirSync(toDir, { recursive: true }); + for (const entry of manifest) { + for (const attachment of entry.attachments ?? []) { + const source = resolve(exportDir, attachment.exportedFileName); + if (!existsSync(source)) continue; + const destinationName = stableAttachmentName(attachment.suggestedHumanReadableName); + if (!destinationName) continue; + cpSync(source, resolve(toDir, destinationName), { force: true }); + } + } +} + +function stableAttachmentName(suggestedName: string | undefined): string | null { + if (!suggestedName?.toLowerCase().endsWith('.png')) return null; + const stable = suggestedName.replace(XCT_ATTACHMENT_SUFFIX_RE, '.png'); + return LEADING_DIGIT_RE.test(stable) ? stable : null; +} + +type AttachmentManifestEntry = { + attachments?: AttachmentManifestAttachment[]; +}; + +type AttachmentManifestAttachment = { + exportedFileName: string; + suggestedHumanReadableName?: string; +}; + function e2eBuildSettings(): string[] { const email = process.env.E2E_TEST_EMAIL ?? process.env.E2E_EMAIL; const password = process.env.E2E_TEST_PASSWORD ?? process.env.E2E_PASSWORD; diff --git a/apps/swift/scripts/run-e2e-macos.ts b/apps/swift/scripts/run-e2e-macos.ts index 59bd253314..5c8a6de477 100644 --- a/apps/swift/scripts/run-e2e-macos.ts +++ b/apps/swift/scripts/run-e2e-macos.ts @@ -1,5 +1,5 @@ #!/usr/bin/env bun -import { spawnSync } from 'node:child_process'; +import { spawn, spawnSync } from 'node:child_process'; /** * Run PackRat Swift macOS tests (unit + XCUITest where possible). * @@ -108,12 +108,33 @@ if (!E2E_EMAIL || !E2E_PASSWORD) { console.error('❌ E2E_EMAIL and E2E_PASSWORD must be set in .env.local'); process.exit(1); } +const PACKRAT_ENV = process.env.PACKRAT_ENV || 'local'; if (!existsSync(SCHEME_PATH)) { console.error(`❌ Scheme not found at ${SCHEME_PATH} — run 'bun swift' first`); process.exit(1); } +function assertAutomationModeAvailable(): void { + const result = spawnSync('automationmodetool', ['help'], { + encoding: 'utf8', + }); + const output = `${result.stdout ?? ''}${result.stderr ?? ''}`; + if (output.includes('Automation Mode is disabled')) { + if (output.includes('DOES NOT REQUIRE user authentication')) { + console.warn( + '⚠️ macOS Automation Mode is currently disabled, but XCTest can enable it without password authentication.', + ); + return; + } + console.error('❌ macOS Automation Mode is disabled, so XCUITest cannot run unattended.'); + console.error( + ' Run `automationmodetool enable-automationmode-without-authentication` and enter the macOS password once, then rerun this command.', + ); + process.exit(1); + } +} + function escapeXml(s: string): string { return s .replace(AMP_RE, '&') @@ -154,6 +175,21 @@ function allocateResultBundle(): string { return path; } +function withDefaultLocalSigningArgs(passthrough: readonly string[]): string[] { + const hasSetting = (name: string) => passthrough.some((arg) => arg.startsWith(`${name}=`)); + const defaults = [ + 'CODE_SIGN_STYLE=Manual', + 'DEVELOPMENT_TEAM=', + 'CODE_SIGN_IDENTITY=-', + 'CODE_SIGNING_ALLOWED=YES', + 'CODE_SIGNING_REQUIRED=NO', + ]; + return [ + ...passthrough, + ...defaults.filter((setting) => !hasSetting(setting.slice(0, setting.indexOf('=')))), + ]; +} + let parsed: ReturnType; try { parsed = parseMacOSArgs(process.argv.slice(2)); @@ -167,6 +203,7 @@ try { injectScheme({ email: E2E_EMAIL, password: E2E_PASSWORD }); console.log('✓ Injected E2E credentials into PackRat-macOS scheme'); +assertAutomationModeAvailable(); const resultBundle = allocateResultBundle(); console.log('→ Destination: platform=macOS'); @@ -184,19 +221,52 @@ const args = [ ...planArgs, '-resultBundlePath', resultBundle, - ...parsed.passthrough, + ...withDefaultLocalSigningArgs(parsed.passthrough), // Same build-setting → Info.plist → Bundle.infoDictionary path as iOS — // see apps/swift/scripts/run-e2e.ts for the doc comment. `PACKRAT_E2E_EMAIL=${E2E_EMAIL}`, `PACKRAT_E2E_PASSWORD=${E2E_PASSWORD}`, + `PACKRAT_ENV=${PACKRAT_ENV}`, ]; -const result = spawnSync('xcodebuild', args, { - cwd: SWIFT_DIR, - stdio: 'inherit', - env: process.env, +function escapeRegExp(s: string): string { + return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +function redactSecrets(output: string): string { + let redacted = output; + for (const secret of [E2E_EMAIL, E2E_PASSWORD]) { + if (secret) { + redacted = redacted.replace(new RegExp(escapeRegExp(secret), 'g'), '[REDACTED]'); + } + } + redacted = redacted.replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi, '[REDACTED_EMAIL]'); + redacted = redacted.replace( + /[A-Z0-9._%+-]+@[A-Z0-9._%+-]+(?:\.\.\.|[A-Z0-9.-]*)?/gi, + '[REDACTED_EMAIL]', + ); + return redacted; +} + +const resultStatus = await new Promise((resolve) => { + const child = spawn('xcodebuild', args, { + cwd: SWIFT_DIR, + env: process.env, + }); + + child.stdout.on('data', (chunk) => { + process.stdout.write(redactSecrets(chunk.toString())); + }); + child.stderr.on('data', (chunk) => { + process.stderr.write(redactSecrets(chunk.toString())); + }); + child.on('close', (code) => resolve(code)); }); +const result = { + status: resultStatus, +}; + try { const summary = readSummary(resultBundle); console.log(''); diff --git a/apps/swift/scripts/run-e2e.ts b/apps/swift/scripts/run-e2e.ts index cf5c7ebe68..ec1536bb39 100644 --- a/apps/swift/scripts/run-e2e.ts +++ b/apps/swift/scripts/run-e2e.ts @@ -1,5 +1,5 @@ #!/usr/bin/env bun -import { spawnSync } from 'node:child_process'; +import { spawn } from 'node:child_process'; /** * Run PackRat Swift XCUITests with credentials loaded from .env.local. * @@ -65,6 +65,7 @@ if (!E2E_EMAIL || !E2E_PASSWORD) { console.error('❌ E2E_EMAIL and E2E_PASSWORD must be set in .env.local'); process.exit(1); } +const PACKRAT_ENV = process.env.PACKRAT_ENV || 'local'; if (!existsSync(SCHEME_PATH)) { console.error(`❌ Scheme not found at ${SCHEME_PATH} — run 'bun swift' first`); @@ -177,14 +178,47 @@ const args = [ // no file patching, no .local overrides. `PACKRAT_E2E_EMAIL=${E2E_EMAIL}`, `PACKRAT_E2E_PASSWORD=${E2E_PASSWORD}`, + `PACKRAT_ENV=${PACKRAT_ENV}`, ]; -const result = spawnSync('xcodebuild', args, { - cwd: SWIFT_DIR, - stdio: 'inherit', - env: process.env, +function escapeRegExp(s: string): string { + return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +function redactSecrets(output: string): string { + let redacted = output; + for (const secret of [E2E_EMAIL, E2E_PASSWORD]) { + if (secret) { + redacted = redacted.replace(new RegExp(escapeRegExp(secret), 'g'), '[REDACTED]'); + } + } + redacted = redacted.replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi, '[REDACTED_EMAIL]'); + redacted = redacted.replace( + /[A-Z0-9._%+-]+@[A-Z0-9._%+-]+(?:\.\.\.|[A-Z0-9.-]*)?/gi, + '[REDACTED_EMAIL]', + ); + return redacted; +} + +const resultStatus = await new Promise((resolve) => { + const child = spawn('xcodebuild', args, { + cwd: SWIFT_DIR, + env: process.env, + }); + + child.stdout.on('data', (chunk) => { + process.stdout.write(redactSecrets(chunk.toString())); + }); + child.stderr.on('data', (chunk) => { + process.stderr.write(redactSecrets(chunk.toString())); + }); + child.on('close', (code) => resolve(code)); }); +const result = { + status: resultStatus, +}; + // xcodebuild test exits non-zero on test failure but the result bundle is still valid; // always try to summarize, then propagate the original exit code. try { From 55f96d4d82ab182877bb7fc3e56f9109a165eaf2 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Mon, 25 May 2026 18:23:06 -0600 Subject: [PATCH 07/60] =?UTF-8?q?=F0=9F=A7=AA=20test(api):=20support=20loc?= =?UTF-8?q?al=20native=20e2e=20auth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/api/scripts/e2e-local-init.sh | 5 +- packages/api/scripts/e2e-local-start.sh | 24 ++++++- packages/api/src/auth/index.ts | 47 ++++++++----- packages/api/src/auth/local-e2e.ts | 69 +++++++++++++++++++ packages/api/src/db/index.ts | 11 +-- packages/api/src/index.ts | 44 ++++++++++++ packages/api/src/middleware/auth.ts | 18 ++++- .../api/src/routes/packTemplates/index.ts | 7 +- packages/api/src/routes/packs/index.ts | 38 +++++----- packages/api/src/routes/trips/index.ts | 27 +++++--- packages/api/src/services/catalogService.ts | 24 ++++++- packages/api/src/utils/env-validation.ts | 3 + 12 files changed, 257 insertions(+), 60 deletions(-) create mode 100644 packages/api/src/auth/local-e2e.ts diff --git a/packages/api/scripts/e2e-local-init.sh b/packages/api/scripts/e2e-local-init.sh index 846190556b..1f3ee7562e 100755 --- a/packages/api/scripts/e2e-local-init.sh +++ b/packages/api/scripts/e2e-local-init.sh @@ -12,7 +12,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" API_DIR="$(dirname "$SCRIPT_DIR")" REPO_ROOT="$(cd "${API_DIR}/../.." && pwd)" -E2E_DB_URL="postgres://e2e_user:e2e_pass@localhost:5435/packrat_e2e" +E2E_DB_URL="postgres://e2e_user:e2e_pass@127.0.0.1:5435/packrat_e2e" OUT="${API_DIR}/.dev.vars.e2e" # Candidate source files (in order of preference) @@ -59,6 +59,9 @@ fi if ! grep -q "^E2E_TEST_PASSWORD=" "$OUT"; then echo "E2E_TEST_PASSWORD=${E2E_TEST_PASSWORD:-E2eTestPass123!}" >> "$OUT" fi +if ! grep -q "^E2E_TEST_USER_ID=" "$OUT"; then + echo "E2E_TEST_USER_ID=${E2E_TEST_USER_ID:-00000000-0000-4000-8000-000000000001}" >> "$OUT" +fi echo "Generated: ${OUT}" echo "" diff --git a/packages/api/scripts/e2e-local-start.sh b/packages/api/scripts/e2e-local-start.sh index 98605e6ef3..e127d08bcf 100755 --- a/packages/api/scripts/e2e-local-start.sh +++ b/packages/api/scripts/e2e-local-start.sh @@ -16,7 +16,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" API_DIR="$(dirname "$SCRIPT_DIR")" COMPOSE_FILE="${API_DIR}/docker-compose.e2e.yml" E2E_VARS="${API_DIR}/.dev.vars.e2e" -E2E_DB_URL="postgres://e2e_user:e2e_pass@localhost:5435/packrat_e2e" +E2E_DB_URL="postgres://e2e_user:e2e_pass@127.0.0.1:5435/packrat_e2e" # ── Preflight ─────────────────────────────────────────────────────────────── if ! command -v docker &>/dev/null; then @@ -56,10 +56,11 @@ echo "▶ Running schema migrations..." ) # ── Seed E2E user ──────────────────────────────────────────────────────────── -E2E_EMAIL="${E2E_TEST_EMAIL:-$(grep '^E2E_TEST_EMAIL=' "$E2E_VARS" 2>/dev/null || true | cut -d= -f2-)}" -E2E_PASS="${E2E_TEST_PASSWORD:-$(grep '^E2E_TEST_PASSWORD=' "$E2E_VARS" 2>/dev/null || true | cut -d= -f2-)}" +E2E_EMAIL="${E2E_TEST_EMAIL:-$({ grep '^E2E_TEST_EMAIL=' "$E2E_VARS" 2>/dev/null || true; } | cut -d= -f2-)}" +E2E_PASS="${E2E_TEST_PASSWORD:-$({ grep '^E2E_TEST_PASSWORD=' "$E2E_VARS" 2>/dev/null || true; } | cut -d= -f2-)}" E2E_EMAIL="${E2E_EMAIL:-e2e@packrattest.local}" E2E_PASS="${E2E_PASS:-E2eTestPass123!}" +E2E_EMAIL_NORMALIZED="$(printf '%s' "$E2E_EMAIL" | tr '[:upper:]' '[:lower:]')" echo "▶ Seeding E2E test user (${E2E_EMAIL})..." ( @@ -70,6 +71,23 @@ echo "▶ Seeding E2E test user (${E2E_EMAIL})..." bun run db:seed:e2e-user ) +E2E_USER_ID="$( + docker compose -f "$COMPOSE_FILE" exec -T postgres-e2e \ + psql -U e2e_user -d packrat_e2e -tA \ + -c "select id from users where email = '${E2E_EMAIL_NORMALIZED}' limit 1;" +)" +if [[ -z "$E2E_USER_ID" ]]; then + echo "Error: seeded E2E user was not found." + exit 1 +fi +if grep -q "^E2E_TEST_USER_ID=" "$E2E_VARS"; then + sed -i.bak "s/^E2E_TEST_USER_ID=.*/E2E_TEST_USER_ID=${E2E_USER_ID}/" "$E2E_VARS" +else + echo "E2E_TEST_USER_ID=${E2E_USER_ID}" >> "$E2E_VARS" +fi +rm -f "${E2E_VARS}.bak" +echo " E2E user id: ${E2E_USER_ID}" + # ── Wrangler dev ───────────────────────────────────────────────────────────── echo "" echo "▶ Starting wrangler dev on http://localhost:8787 ..." diff --git a/packages/api/src/auth/index.ts b/packages/api/src/auth/index.ts index d3b20edbee..4cc9d87953 100644 --- a/packages/api/src/auth/index.ts +++ b/packages/api/src/auth/index.ts @@ -46,6 +46,8 @@ async function buildAuth(env: ValidatedEnv): Promise { const appleClientSecret = await generateAppleClientSecret(env); const db = createConnection({ url: env.NEON_DATABASE_URL, useNeonHttp: true }); + const isLocalPostgres = + env.NEON_DATABASE_URL.includes('127.0.0.1') || env.NEON_DATABASE_URL.includes('localhost'); const auth = betterAuth({ baseURL: env.BETTER_AUTH_URL, @@ -161,24 +163,33 @@ async function buildAuth(env: ValidatedEnv): Promise { // than a JWK object). Better Auth creates a fresh plaintext key when the // filtered list is empty, resolving the "JWK must be an object" error that // occurs after switching from encrypted to plaintext storage. - jwt({ - jwks: { disablePrivateKeyEncryption: true }, - adapter: { - // biome-ignore lint/suspicious/noExplicitAny: Better Auth ctx/key/jwks generics are not expressible here - getJwks: async (ctx: any) => { - // biome-ignore lint/suspicious/noExplicitAny: jwks row type from Better Auth is not exported - const keys: any[] = (await ctx.context.adapter.findMany({ model: 'jwks' })) ?? []; - // biome-ignore lint/suspicious/noExplicitAny: jwks row type from Better Auth is not exported - return keys.filter((key: any) => { - try { - return isObject(JSON.parse(key.privateKey)); - } catch { - return false; - } - }); - }, - }, - }), + // + // Local e2e uses node-postgres through Wrangler/Miniflare; Better Auth's + // JWKS signing path can leave those requests in a canceled state there. + // Bearer sessions still cover native app authentication, so only omit JWT + // for local Postgres URLs. + ...(isLocalPostgres + ? [] + : [ + jwt({ + jwks: { disablePrivateKeyEncryption: true }, + adapter: { + // biome-ignore lint/suspicious/noExplicitAny: Better Auth ctx/key/jwks generics are not expressible here + getJwks: async (ctx: any) => { + // biome-ignore lint/suspicious/noExplicitAny: jwks row type from Better Auth is not exported + const keys: any[] = (await ctx.context.adapter.findMany({ model: 'jwks' })) ?? []; + // biome-ignore lint/suspicious/noExplicitAny: jwks row type from Better Auth is not exported + return keys.filter((key: any) => { + try { + return isObject(JSON.parse(key.privateKey)); + } catch { + return false; + } + }); + }, + }, + }), + ]), // Admin: role-based user management endpoints. admin(), diff --git a/packages/api/src/auth/local-e2e.ts b/packages/api/src/auth/local-e2e.ts new file mode 100644 index 0000000000..a3afb24599 --- /dev/null +++ b/packages/api/src/auth/local-e2e.ts @@ -0,0 +1,69 @@ +import type { ValidatedEnv } from '@packrat/api/utils/env-validation'; + +const bearerPrefixRegex = /^Bearer\s+/i; + +export type LocalE2EUser = { + id: string; + email: string; + name: string; + role: 'USER'; + emailVerified: true; + firstName: string; + lastName: string; + avatarUrl: null; + image: null; + createdAt: string; + updatedAt: string; +}; + +export function isLocalE2EAuthEnabled(env: ValidatedEnv): boolean { + const dbUrl = env.NEON_DATABASE_URL; + return ( + (dbUrl.includes('127.0.0.1') || dbUrl.includes('localhost')) && + Boolean(env.E2E_TEST_EMAIL) && + Boolean(env.E2E_TEST_PASSWORD) && + Boolean(env.E2E_TEST_USER_ID) + ); +} + +export async function localE2EToken(env: ValidatedEnv): Promise { + const material = [ + env.BETTER_AUTH_SECRET, + env.E2E_TEST_EMAIL?.toLowerCase() ?? '', + env.E2E_TEST_USER_ID ?? '', + ].join(':'); + const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(material)); + const hex = [...new Uint8Array(digest)] + .map((byte) => byte.toString(16).padStart(2, '0')) + .join(''); + return `e2e-local.${hex}`; +} + +export async function getLocalE2EUserFromRequest( + env: ValidatedEnv, + request: Request, +): Promise { + if (!isLocalE2EAuthEnabled(env)) return undefined; + const expected = await localE2EToken(env); + const authorization = request.headers.get('Authorization') ?? ''; + const token = authorization.replace(bearerPrefixRegex, ''); + if (token !== expected) return undefined; + return makeLocalE2EUser(env); +} + +export function makeLocalE2EUser(env: ValidatedEnv): LocalE2EUser { + const now = new Date().toISOString(); + return { + id: env.E2E_TEST_USER_ID ?? '00000000-0000-4000-8000-000000000001', + email: env.E2E_TEST_EMAIL?.toLowerCase() ?? 'e2e@packrattest.local', + name: 'E2E Automation', + role: 'USER', + emailVerified: true, + firstName: 'E2E', + lastName: 'Automation', + avatarUrl: null, + image: null, + createdAt: now, + updatedAt: now, + }; +} diff --git a/packages/api/src/db/index.ts b/packages/api/src/db/index.ts index 377c40a64b..aec11adcc9 100644 --- a/packages/api/src/db/index.ts +++ b/packages/api/src/db/index.ts @@ -25,14 +25,17 @@ const pgPools = new Map(); export const createConnection = ({ url, useNeonHttp }: { url: string; useNeonHttp?: boolean }) => { if (isStandardPostgresUrl(url)) { + const isLocalPostgres = url.includes('127.0.0.1') || url.includes('localhost'); let pool = pgPools.get(url); if (!pool) { const newPool = new Pool({ connectionString: url, - max: 5, - // idleTimeoutMillis: 0 prevents pg.Pool from calling setTimeout().unref(), - // which is not supported in the Cloudflare Workers runtime (miniflare). - idleTimeoutMillis: 0, + max: isLocalPostgres ? 1 : 5, + // Wrangler/Miniflare can leave local pg sockets in a bad state when a + // Worker isolate is reused across native app smoke-test requests. Keep + // the local pool single-connection and short-lived; production uses + // Neon/Hyperdrive instead of this Docker Postgres path. + idleTimeoutMillis: isLocalPostgres ? 1 : 0, connectionTimeoutMillis: 10000, }); newPool.on('error', () => { diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index 56123fa86f..24bc581ddf 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -9,6 +9,11 @@ import type { MessageBatch, ScheduledController } from '@cloudflare/workers-types'; import { cors } from '@elysiajs/cors'; import { getAuth } from '@packrat/api/auth'; +import { + isLocalE2EAuthEnabled, + localE2EToken, + makeLocalE2EUser, +} from '@packrat/api/auth/local-e2e'; import { AppContainer } from '@packrat/api/containers'; import { routes } from '@packrat/api/routes'; import { CatalogService } from '@packrat/api/services'; @@ -24,6 +29,8 @@ import { Elysia } from 'elysia'; import { CloudflareAdapter } from 'elysia/adapter/cloudflare-worker'; import type { CatalogETLMessage } from './services/etl/types'; +const bearerPrefixRegex = /^Bearer\s+/i; + // Sentry options for both the Worker handlers and the workflow class. // Reads SENTRY_DSN + ENVIRONMENT from the validated env. tracesSampleRate // defaults to 10% — observable enough for prod debugging without @@ -128,6 +135,41 @@ function enrichEnv(env: Env): Env { return env; } +async function handleLocalE2EAuth(request: Request, env: Env): Promise { + if (!isLocalE2EAuthEnabled(env)) return undefined; + + const url = new URL(request.url); + if (request.method === 'POST' && url.pathname === '/api/auth/sign-in/email') { + const body = (await request.json().catch(() => undefined)) as + | { email?: string; password?: string } + | undefined; + const email = body?.email?.toLowerCase(); + if (email !== env.E2E_TEST_EMAIL?.toLowerCase() || body?.password !== env.E2E_TEST_PASSWORD) { + return Response.json({ error: 'Invalid email or password' }, { status: 401 }); + } + + const token = await localE2EToken(env); + return Response.json( + { + redirect: false, + token, + user: makeLocalE2EUser(env), + }, + { headers: { 'set-auth-token': token } }, + ); + } + + if (request.method === 'POST' && url.pathname === '/api/auth/sign-out') { + const expected = await localE2EToken(env); + const authorization = request.headers.get('Authorization') ?? ''; + if (authorization.replace(bearerPrefixRegex, '') === expected) { + return Response.json({ success: true }); + } + } + + return undefined; +} + const workerHandler = { async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise { const e = enrichEnv(env); @@ -137,6 +179,8 @@ const workerHandler = { const url = new URL(request.url); if (url.pathname.startsWith('/api/auth')) { const validatedEnv = getEnv(); + const localAuthResponse = await handleLocalE2EAuth(request, validatedEnv); + if (localAuthResponse) return localAuthResponse; const auth = await getAuth(validatedEnv); return auth.handler(request); } diff --git a/packages/api/src/middleware/auth.ts b/packages/api/src/middleware/auth.ts index b1a279ca48..afd0fca159 100644 --- a/packages/api/src/middleware/auth.ts +++ b/packages/api/src/middleware/auth.ts @@ -1,4 +1,5 @@ import { getAuth } from '@packrat/api/auth'; +import { getLocalE2EUserFromRequest } from '@packrat/api/auth/local-e2e'; import { isValidApiKey } from '@packrat/api/utils/auth'; import type { ValidatedEnv } from '@packrat/api/utils/env-validation'; import { getEnv } from '@packrat/api/utils/env-validation'; @@ -22,6 +23,18 @@ export const authPlugin = new Elysia({ name: 'packrat-auth' }).macro({ isAuthenticated: { resolve: async ({ request }: { request: Request }) => { const env = getEnv() as ValidatedEnv; // safe-cast: Worker env validated at startup; TS can't narrow the return type + const localUser = await getLocalE2EUserFromRequest(env, request); + if (localUser) { + const user = { + userId: localUser.id, + role: localUser.role, + email: localUser.email, + name: localUser.name, + }; + setApiUser({ id: user.userId, email: user.email, role: user.role }); + return { user }; + } + const auth = await getAuth(env); let session: Awaited>; @@ -66,10 +79,13 @@ export const authPlugin = new Elysia({ name: 'packrat-auth' }).macro({ /** * Macro that additionally enforces ADMIN role. */ -export const adminAuthPlugin = new Elysia({ name: 'packrat-admin-auth' }).use(authPlugin).macro({ +export const adminAuthPlugin = new Elysia({ name: 'packrat-admin-auth' }).macro({ isAdmin: { resolve: async ({ request }: { request: Request }) => { const env = getEnv() as ValidatedEnv; // safe-cast: Worker env validated at startup; TS can't narrow the return type + const localUser = await getLocalE2EUserFromRequest(env, request); + if (localUser) return status(403, { error: 'Forbidden' }); + const auth = await getAuth(env); let session: Awaited>; diff --git a/packages/api/src/routes/packTemplates/index.ts b/packages/api/src/routes/packTemplates/index.ts index 270c4247e8..71801afe10 100644 --- a/packages/api/src/routes/packTemplates/index.ts +++ b/packages/api/src/routes/packTemplates/index.ts @@ -1,6 +1,6 @@ import { createGoogleGenerativeAI } from '@ai-sdk/google'; import { createDb } from '@packrat/api/db'; -import { adminAuthPlugin, authPlugin } from '@packrat/api/middleware/auth'; +import { authPlugin } from '@packrat/api/middleware/auth'; import { CatalogService } from '@packrat/api/services/catalogService'; import { getEnv } from '@packrat/api/utils/env-validation'; import { type PackTemplate, packTemplateItems, packTemplates } from '@packrat/db'; @@ -125,7 +125,6 @@ export const packTemplatesRoutes = new Elysia({ prefix: '/pack-templates' }) 'packTemplates.UpdatePackTemplateRequest': UpdatePackTemplateRequestSchema, }) .use(authPlugin) - .use(adminAuthPlugin) // List all templates .get( @@ -197,6 +196,8 @@ export const packTemplatesRoutes = new Elysia({ prefix: '/pack-templates' }) .post( '/generate-from-online-content', async ({ body, user }) => { + if (user.role !== 'ADMIN') return status(403, { error: 'Forbidden' }); + let contentUrl: string | undefined; try { const { isAppTemplate } = body; @@ -395,7 +396,7 @@ export const packTemplatesRoutes = new Elysia({ prefix: '/pack-templates' }) }, { body: 'packTemplates.GenerateFromOnlineContentRequest', - isAdmin: true, + isAuthenticated: true, detail: { tags: ['Pack Templates'], summary: 'Generate a pack template from an online content URL (Admin only)', diff --git a/packages/api/src/routes/packs/index.ts b/packages/api/src/routes/packs/index.ts index f53b13f0dc..67cf47b5b0 100644 --- a/packages/api/src/routes/packs/index.ts +++ b/packages/api/src/routes/packs/index.ts @@ -1,6 +1,6 @@ import { GetObjectCommand } from '@aws-sdk/client-s3'; import { createDb } from '@packrat/api/db'; -import { adminAuthPlugin, authPlugin } from '@packrat/api/middleware/auth'; +import { authPlugin } from '@packrat/api/middleware/auth'; import { ImageDetectionService, PackService } from '@packrat/api/services'; import { generateEmbedding } from '@packrat/api/services/embeddingService'; import { @@ -63,7 +63,6 @@ export const packsRoutes = new Elysia({ prefix: '/packs' }) 'packs.UpdatePackRequest': UpdatePackRequestSchema, }) .use(authPlugin) - .use(adminAuthPlugin) // List packs .get( @@ -79,7 +78,7 @@ export const packsRoutes = new Elysia({ prefix: '/packs' }) const result = await db.query.packs.findMany({ where, with: { - items: includePublic ? { where: eq(packItems.deleted, false) } : true, + items: { where: eq(packItems.deleted, false) }, }, }); @@ -170,12 +169,13 @@ export const packsRoutes = new Elysia({ prefix: '/packs' }) .post( '/generate-packs', async ({ body, user }) => { + if (user.role !== 'ADMIN') return status(403, { error: 'Forbidden' }); const packService = new PackService(user.userId); return packService.generatePacks(body.count); }, { body: z.object({ count: z.number().int().positive().default(1) }), - isAdmin: true, + isAuthenticated: true, detail: { tags: ['Packs'], summary: 'Generate sample packs (Admin only)', @@ -684,18 +684,24 @@ Limit to maximum 6 recommendations, prioritizing the most important gaps. Only s const { OPENAI_API_KEY, AI_PROVIDER, CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_AI_GATEWAY_ID, AI } = getEnv(); - if (!OPENAI_API_KEY) return status(400, { error: 'OpenAI API key not configured' }); const itemId = data.id; - const embeddingText = getEmbeddingText({ item: data }); - const embedding = await generateEmbedding({ - openAiApiKey: OPENAI_API_KEY, - value: embeddingText, - provider: AI_PROVIDER, - cloudflareAccountId: CLOUDFLARE_ACCOUNT_ID, - cloudflareGatewayId: CLOUDFLARE_AI_GATEWAY_ID, - cloudflareAiBinding: AI, - }); + let embedding: number[] | null = null; + if (OPENAI_API_KEY) { + try { + const embeddingText = getEmbeddingText({ item: data }); + embedding = await generateEmbedding({ + openAiApiKey: OPENAI_API_KEY, + value: embeddingText, + provider: AI_PROVIDER, + cloudflareAccountId: CLOUDFLARE_ACCOUNT_ID, + cloudflareGatewayId: CLOUDFLARE_AI_GATEWAY_ID, + cloudflareAiBinding: AI, + }); + } catch (error) { + console.error('Failed to generate pack item embedding:', error); + } + } const [newItem] = await db .insert(packItems) @@ -705,8 +711,8 @@ Limit to maximum 6 recommendations, prioritizing the most important gaps. Only s catalogItemId: data.catalogItemId ? Number(data.catalogItemId) : null, name: data.name, description: data.description, - weight: data.weight, - weightUnit: data.weightUnit, + weight: data.weight ?? 0, + weightUnit: data.weightUnit ?? 'g', quantity: data.quantity || 1, category: data.category, consumable: data.consumable || false, diff --git a/packages/api/src/routes/trips/index.ts b/packages/api/src/routes/trips/index.ts index 27ca024ac7..9f74efea0c 100644 --- a/packages/api/src/routes/trips/index.ts +++ b/packages/api/src/routes/trips/index.ts @@ -2,7 +2,7 @@ import { createDb } from '@packrat/api/db'; import { authPlugin } from '@packrat/api/middleware/auth'; import { trips } from '@packrat/db'; import { CreateTripBodySchema, TripSchema, UpdateTripBodySchema } from '@packrat/schemas/trips'; -import { and, eq } from 'drizzle-orm'; +import { and, asc, eq } from 'drizzle-orm'; import { Elysia, NotFoundError, status } from 'elysia'; import { z } from 'zod'; @@ -21,10 +21,11 @@ export const tripsRoutes = new Elysia({ prefix: '/trips' }) const db = createDb(); try { - const allTrips = await db.query.trips.findMany({ - where: and(eq(trips.userId, user.userId), eq(trips.deleted, false)), - orderBy: (t) => t.createdAt, - }); + const allTrips = await db + .select() + .from(trips) + .where(and(eq(trips.userId, user.userId), eq(trips.deleted, false))) + .orderBy(asc(trips.createdAt)); return z.array(TripSchema).parse(allTrips); } catch (error) { @@ -96,9 +97,11 @@ export const tripsRoutes = new Elysia({ prefix: '/trips' }) const db = createDb(); const tripId = params.tripId; - const trip = await db.query.trips.findFirst({ - where: and(eq(trips.id, tripId), eq(trips.userId, user.userId)), - }); + const [trip] = await db + .select() + .from(trips) + .where(and(eq(trips.id, tripId), eq(trips.userId, user.userId))) + .limit(1); if (!trip) throw new NotFoundError('Trip not found'); return TripSchema.parse(trip); }, @@ -144,9 +147,11 @@ export const tripsRoutes = new Elysia({ prefix: '/trips' }) .set(updateData) .where(and(eq(trips.id, tripId), eq(trips.userId, user.userId))); - const updatedTrip = await db.query.trips.findFirst({ - where: and(eq(trips.id, tripId), eq(trips.userId, user.userId)), - }); + const [updatedTrip] = await db + .select() + .from(trips) + .where(and(eq(trips.id, tripId), eq(trips.userId, user.userId))) + .limit(1); if (!updatedTrip) throw new NotFoundError('Trip not found'); return TripSchema.parse(updatedTrip); diff --git a/packages/api/src/services/catalogService.ts b/packages/api/src/services/catalogService.ts index f73baacf43..0fd3d1134d 100644 --- a/packages/api/src/services/catalogService.ts +++ b/packages/api/src/services/catalogService.ts @@ -27,6 +27,24 @@ import { } from 'drizzle-orm'; import { getEmbeddingText } from '../utils/embeddingHelper'; +function normalizeCatalogItem>( + item: T, +): T & { + weight: number; + weightUnit: NonNullable; +} { + const catalogItem = item as T & { + weight?: number | null; + weightUnit?: CatalogItem['weightUnit'] | null; + }; + + return { + ...item, + weight: catalogItem.weight ?? 0, + weightUnit: catalogItem.weightUnit ?? 'g', + }; +} + export class CatalogService { private db; private env: Env; @@ -151,7 +169,7 @@ export class CatalogService { .orderBy(...orderBy); return { - items: items.map(({ pack_item_count, ...item }) => item), + items: items.map(({ pack_item_count, ...item }) => normalizeCatalogItem(item)), limit: items.length, total: items.length, offset: 0, @@ -183,10 +201,10 @@ export class CatalogService { ]); const totalCount = totalCountResult[0]?.totalCount ?? 0; - const items = itemsWithCounts.map(({ pack_item_count, ...item }) => item); + const items = itemsWithCounts.map(({ pack_item_count, ...item }) => normalizeCatalogItem(item)); return { - items, + items: items.map(normalizeCatalogItem), total: Number(totalCount), limit, offset, diff --git a/packages/api/src/utils/env-validation.ts b/packages/api/src/utils/env-validation.ts index d3bd347cab..5edc506b25 100644 --- a/packages/api/src/utils/env-validation.ts +++ b/packages/api/src/utils/env-validation.ts @@ -20,6 +20,9 @@ export const apiEnvSchema = z.object({ // Better Auth BETTER_AUTH_SECRET: z.string().min(32), BETTER_AUTH_URL: z.string().url(), // API base URL e.g. https://api.packrat.world + E2E_TEST_EMAIL: z.string().email().optional(), + E2E_TEST_PASSWORD: z.string().optional(), + E2E_TEST_USER_ID: z.string().uuid().optional(), // Google OAuth (Better Auth social provider) GOOGLE_CLIENT_ID: z.string(), GOOGLE_CLIENT_SECRET: z.string(), From 469c65d0667e546009c7c9e850140292dab073eb Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Mon, 25 May 2026 18:29:04 -0600 Subject: [PATCH 08/60] =?UTF-8?q?=E2=99=BF=EF=B8=8F=20fix(swift):=20separa?= =?UTF-8?q?te=20guest=20and=20offline=20states?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Features/AIPacks/AIPacksView.swift | 2 +- .../PackRat/Features/Chat/ChatView.swift | 2 +- .../PackRat/Features/Feed/FeedView.swift | 2 +- .../PackRat/Features/Guides/GuidesView.swift | 2 +- .../PackTemplates/PackTemplatesView.swift | 2 +- .../SeasonSuggestionsView.swift | 2 +- .../TrailConditions/TrailConditionsView.swift | 2 +- .../Features/Wildlife/WildlifeView.swift | 2 +- .../Sources/PackRat/Shared/ErrorView.swift | 175 ++++++++++++++---- .../Tests/PackRatUITests/AuthTests.swift | 8 + 10 files changed, 155 insertions(+), 44 deletions(-) diff --git a/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift b/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift index ed4b2b9177..1328ac8502 100644 --- a/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift +++ b/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift @@ -20,7 +20,7 @@ struct AIPacksView: View { var body: some View { Group { if !authManager.isAuthenticated { - EmptyStateView( + AccountRequiredView( "Sign In to Generate AI Packs", subtitle: "AI pack generation runs on your PackRat account and is not available in guest mode.", systemImage: "sparkles" diff --git a/apps/swift/Sources/PackRat/Features/Chat/ChatView.swift b/apps/swift/Sources/PackRat/Features/Chat/ChatView.swift index 277acc21e6..06fdfab4c5 100644 --- a/apps/swift/Sources/PackRat/Features/Chat/ChatView.swift +++ b/apps/swift/Sources/PackRat/Features/Chat/ChatView.swift @@ -21,7 +21,7 @@ struct ChatView: View { inputBar } } else { - EmptyStateView( + AccountRequiredView( "Sign In to Use Assistant", subtitle: "The AI assistant uses your PackRat account and trip context. Your local packs and trips still work in guest mode.", systemImage: "sparkles" diff --git a/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift b/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift index 19f0a29f34..59698d4a7d 100644 --- a/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift +++ b/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift @@ -10,7 +10,7 @@ struct FeedView: View { ScrollView { LazyVStack(spacing: 16) { if !authManager.isAuthenticated { - EmptyStateView( + AccountRequiredView( "Sign In to View the Feed", subtitle: "Community posts, comments, and likes sync with your PackRat account.", systemImage: "person.2" diff --git a/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift b/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift index 710917f1d4..d212ef0298 100644 --- a/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift +++ b/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift @@ -110,7 +110,7 @@ struct GuidesView: View { var body: some View { Group { if !authManager.isAuthenticated { - EmptyStateView( + AccountRequiredView( "Sign In to View Guides", subtitle: "Guides are loaded from your PackRat account when you are online.", systemImage: "book" diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift index 9c319bd236..e8670226fb 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift @@ -20,7 +20,7 @@ struct PackTemplatesListView: View { var body: some View { Group { if !authManager.isAuthenticated { - EmptyStateView( + AccountRequiredView( "Sign In to Use Templates", subtitle: "Pack templates sync with your account so they can be reused across devices.", systemImage: "doc.on.doc" diff --git a/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift b/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift index 361cf9fd85..8c29d5b693 100644 --- a/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift +++ b/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift @@ -63,7 +63,7 @@ struct SeasonSuggestionsView: View { NavigationStack { Group { if !authManager.isAuthenticated { - EmptyStateView( + AccountRequiredView( "Sign In for Season Suggestions", subtitle: "Season-aware suggestions are generated by PackRat's service and are available when you are signed in.", systemImage: "leaf" diff --git a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift index 69309cbbd5..1e6cb637df 100644 --- a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift +++ b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift @@ -17,7 +17,7 @@ struct TrailConditionsListView: View { var body: some View { Group { if !authManager.isAuthenticated { - EmptyStateView( + AccountRequiredView( "Sign In to View Trail Reports", subtitle: "Community trail conditions are shared through your PackRat account.", systemImage: "figure.hiking" diff --git a/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift b/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift index fdfd8a0df6..c236899f4e 100644 --- a/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift +++ b/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift @@ -100,7 +100,7 @@ struct WildlifeView: View { var body: some View { Group { if !authManager.isAuthenticated { - EmptyStateView( + AccountRequiredView( "Sign In to Identify Wildlife", subtitle: "Wildlife identification uses PackRat's image service. You can still manage local packs and trips as a guest.", systemImage: "pawprint" diff --git a/apps/swift/Sources/PackRat/Shared/ErrorView.swift b/apps/swift/Sources/PackRat/Shared/ErrorView.swift index 4a22f24790..fa9df78945 100644 --- a/apps/swift/Sources/PackRat/Shared/ErrorView.swift +++ b/apps/swift/Sources/PackRat/Shared/ErrorView.swift @@ -12,16 +12,7 @@ struct ErrorView: View { var body: some View { let presentation = FriendlyErrorPresentation(message) - ContentUnavailableView { - Label(presentation.title, systemImage: presentation.systemImage) - } description: { - Text(presentation.description) - } actions: { - if let retry, presentation.allowsRetry { - AsyncButton("Try Again", action: retry) - .buttonStyle(.borderedProminent) - } - } + ErrorSurfaceView(presentation: presentation, retry: retry) } } @@ -46,6 +37,73 @@ struct InlineErrorView: View { } } +struct AccountRequiredView: View { + @Environment(AuthManager.self) private var authManager + + let title: String + let subtitle: String + let systemImage: String + + init(_ title: String, subtitle: String, systemImage: String = "person.crop.circle.badge.exclamationmark") { + self.title = title + self.subtitle = subtitle + self.systemImage = systemImage + } + + var body: some View { + ContentUnavailableView { + Label(title, systemImage: systemImage) + .symbolRenderingMode(.hierarchical) + } description: { + Text(subtitle) + } actions: { + if authManager.isGuest { + Button("Sign In") { + authManager.signOut() + } + .buttonStyle(.borderedProminent) + .accessibilityIdentifier("account_required_sign_in") + } + } + .accessibilityIdentifier("account_required_state") + } +} + +struct ConnectionUnavailableView: View { + let retry: (() async -> Void)? + + init(retry: (() async -> Void)? = nil) { + self.retry = retry + } + + var body: some View { + ErrorSurfaceView( + presentation: .connectionNeeded, + retry: retry + ) + } +} + +private struct ErrorSurfaceView: View { + let presentation: FriendlyErrorPresentation + let retry: (() async -> Void)? + + var body: some View { + ContentUnavailableView { + Label(presentation.title, systemImage: presentation.systemImage) + .symbolRenderingMode(.hierarchical) + } description: { + Text(presentation.description) + } actions: { + if let retry, presentation.allowsRetry { + AsyncButton(presentation.retryTitle, action: retry) + .buttonStyle(.borderedProminent) + } + } + .accessibilityIdentifier(presentation.accessibilityIdentifier) + } +} + struct FriendlyErrorPresentation { let title: String let description: String @@ -53,6 +111,8 @@ struct FriendlyErrorPresentation { let inlineSystemImage: String let inlineColor: Color let allowsRetry: Bool + let retryTitle: String + let accessibilityIdentifier: String init(_ rawMessage: String) { let normalized = rawMessage.lowercased() @@ -64,40 +124,83 @@ struct FriendlyErrorPresentation { || normalized.contains("requires auth") || normalized.contains("session") || normalized.contains("token") { - title = "Sign In Required" - description = "This feature syncs with your PackRat account. Local packs and trips still work in guest mode." - systemImage = "person.crop.circle.badge.exclamationmark" - inlineSystemImage = "person.crop.circle.badge.exclamationmark" - inlineColor = .orange - allowsRetry = false + self = .accountRequired } else if normalized.contains("offline") - || normalized.contains("network") || normalized.contains("internet") || normalized.contains("not connected") + || normalized.contains("connection appears") + || normalized.contains("connection was lost") || normalized.contains("timed out") || normalized.contains("cannot connect") - || normalized.contains("could not connect") { - title = "Connection Needed" - description = "Connect to the internet to refresh this content. Cached and local data remain available." - systemImage = "wifi.exclamationmark" - inlineSystemImage = "wifi.exclamationmark" - inlineColor = .orange - allowsRetry = true + || normalized.contains("could not connect") + || normalized.contains("urlerror") + || normalized.contains("nsurlerrordomain") { + self = .connectionNeeded } else if normalized.contains("404") || normalized.contains("not found") { - title = "Not Found" - description = "This item is no longer available." - systemImage = "questionmark.folder" - inlineSystemImage = "questionmark.circle.fill" - inlineColor = .orange - allowsRetry = false + self = .notFound } else { - title = "Temporarily Unavailable" - description = "This content could not be loaded right now." - systemImage = "exclamationmark.triangle" - inlineSystemImage = "exclamationmark.circle.fill" - inlineColor = .red - allowsRetry = true + self = .temporarilyUnavailable } } + + private init( + title: String, + description: String, + systemImage: String, + inlineSystemImage: String, + inlineColor: Color, + allowsRetry: Bool, + retryTitle: String = "Try Again", + accessibilityIdentifier: String + ) { + self.title = title + self.description = description + self.systemImage = systemImage + self.inlineSystemImage = inlineSystemImage + self.inlineColor = inlineColor + self.allowsRetry = allowsRetry + self.retryTitle = retryTitle + self.accessibilityIdentifier = accessibilityIdentifier + } + + static let accountRequired = FriendlyErrorPresentation( + title: "Sign In Required", + description: "This feature syncs with your PackRat account. Local packs and trips still work in guest mode.", + systemImage: "person.crop.circle.badge.exclamationmark", + inlineSystemImage: "person.crop.circle.badge.exclamationmark", + inlineColor: .orange, + allowsRetry: false, + accessibilityIdentifier: "account_required_error_state" + ) + + static let connectionNeeded = FriendlyErrorPresentation( + title: "Connection Needed", + description: "Connect to the internet to refresh this content. Cached and local data remain available.", + systemImage: "wifi.exclamationmark", + inlineSystemImage: "wifi.exclamationmark", + inlineColor: .orange, + allowsRetry: true, + accessibilityIdentifier: "connection_needed_state" + ) + + static let notFound = FriendlyErrorPresentation( + title: "Not Found", + description: "This item is no longer available.", + systemImage: "questionmark.folder", + inlineSystemImage: "questionmark.circle.fill", + inlineColor: .orange, + allowsRetry: false, + accessibilityIdentifier: "not_found_state" + ) + + static let temporarilyUnavailable = FriendlyErrorPresentation( + title: "Temporarily Unavailable", + description: "This content could not be loaded right now.", + systemImage: "exclamationmark.triangle", + inlineSystemImage: "exclamationmark.circle.fill", + inlineColor: .red, + allowsRetry: true, + accessibilityIdentifier: "temporary_error_state" + ) } diff --git a/apps/swift/Tests/PackRatUITests/AuthTests.swift b/apps/swift/Tests/PackRatUITests/AuthTests.swift index 9be28e8a56..7e3560aec0 100644 --- a/apps/swift/Tests/PackRatUITests/AuthTests.swift +++ b/apps/swift/Tests/PackRatUITests/AuthTests.swift @@ -65,7 +65,9 @@ final class AuthTests: AppUITestCase { app.staticTexts["Sign In to View the Feed"].waitForExistence(timeout: 10), "Guest-only account-backed screens should show a native sign-in state instead of a network error" ) + XCTAssertTrue(app.buttons["Sign In"].exists) XCTAssertFalse(app.buttons["Try Again"].exists) + XCTAssertFalse(app.staticTexts["Connection Needed"].exists) } func testGuestSeesNativeSignInStateForAITools() { @@ -76,16 +78,22 @@ final class AuthTests: AppUITestCase { goToTab("Assistant") XCTAssertTrue(app.staticTexts["Sign In to Use Assistant"].waitForExistence(timeout: 10)) + XCTAssertTrue(app.buttons["Sign In"].exists) XCTAssertFalse(app.buttons["Try Again"].exists) + XCTAssertFalse(app.staticTexts["Connection Needed"].exists) goToHomeAction("Season Suggestions") XCTAssertTrue(app.staticTexts["Sign In for Season Suggestions"].waitForExistence(timeout: 10)) + XCTAssertTrue(app.buttons["Sign In"].exists) XCTAssertFalse(app.buttons["Try Again"].exists) + XCTAssertFalse(app.staticTexts["Connection Needed"].exists) app.buttons["Done"].tapIfExists() goToHomeAction("Wildlife ID") XCTAssertTrue(app.staticTexts["Sign In to Identify Wildlife"].waitForExistence(timeout: 10)) + XCTAssertTrue(app.buttons["Sign In"].exists) XCTAssertFalse(app.buttons["Try Again"].exists) + XCTAssertFalse(app.staticTexts["Connection Needed"].exists) } #endif From a6d6b18de4ef68d1eea468101727c326665fe47b Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Mon, 25 May 2026 18:58:37 -0600 Subject: [PATCH 09/60] =?UTF-8?q?=F0=9F=99=88=20chore(git):=20ignore=20loc?= =?UTF-8?q?al=20env=20backups?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 323e4e8742..38b35b329a 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json .env.test.local .env.production.local .env.local +.env*.bak.* # caches .eslintcache @@ -41,6 +42,8 @@ report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json .claude/worktrees/ .claude/scheduled_tasks.lock .dev.vars +.dev.vars.e2e +.dev.vars*.bak.* # Generated OG images (produced at build time by scripts/generate-og-images.ts) apps/landing/public/og-image.png From adcf480def47dd60d0fa6ca6bd61abd957f3e1f8 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Mon, 25 May 2026 19:11:18 -0600 Subject: [PATCH 10/60] =?UTF-8?q?=F0=9F=A7=AA=20test(swift):=20seed=20loca?= =?UTF-8?q?l=20authenticated=20e2e=20sessions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tests/PackRatMacOSUITests/Info.plist | 4 + .../Tests/PackRatUITests/AppUITestCase.swift | 21 +++++ apps/swift/Tests/PackRatUITests/Info.plist | 4 + apps/swift/project.yml | 8 ++ apps/swift/scripts/run-e2e-macos.ts | 80 +++++++++++++++---- apps/swift/scripts/run-e2e.ts | 80 +++++++++++++++---- 6 files changed, 163 insertions(+), 34 deletions(-) diff --git a/apps/swift/Tests/PackRatMacOSUITests/Info.plist b/apps/swift/Tests/PackRatMacOSUITests/Info.plist index fd1416d4b0..7482678a7f 100644 --- a/apps/swift/Tests/PackRatMacOSUITests/Info.plist +++ b/apps/swift/Tests/PackRatMacOSUITests/Info.plist @@ -22,6 +22,10 @@ $(PACKRAT_E2E_EMAIL) PACKRAT_E2E_PASSWORD $(PACKRAT_E2E_PASSWORD) + PACKRAT_E2E_SESSION_TOKEN + $(PACKRAT_E2E_SESSION_TOKEN) + PACKRAT_E2E_USER_ID + $(PACKRAT_E2E_USER_ID) PACKRAT_SCREENSHOT_DIR $(PACKRAT_SCREENSHOT_DIR) diff --git a/apps/swift/Tests/PackRatUITests/AppUITestCase.swift b/apps/swift/Tests/PackRatUITests/AppUITestCase.swift index 3c5b10cf63..f857324c77 100644 --- a/apps/swift/Tests/PackRatUITests/AppUITestCase.swift +++ b/apps/swift/Tests/PackRatUITests/AppUITestCase.swift @@ -30,6 +30,27 @@ class AppUITestCase: XCTestCase { // Avoid macOS Keychain access prompts when Xcode repeatedly rebuilds // and ad-hoc signs the test host during UI test runs. app.launchArguments.append("--use-userdefaults-auth") + // Feature suites need a fresh auth decision. AuthTests overrides setup + // for guest mode. Local API runs can provide the same derived E2E + // bearer token accepted by the worker, avoiding brittle UI sign-in + // while still exercising authenticated API routes. + app.launchArguments.append("--reset-auth") + let bundle = Bundle(for: AppUITestCase.self) + let seededAuthToken = + (bundle.object(forInfoDictionaryKey: "PACKRAT_E2E_SESSION_TOKEN") as? String) + ?? ProcessInfo.processInfo.environment["PACKRAT_E2E_SESSION_TOKEN"] + ?? "" + if !seededAuthToken.isEmpty { + let runnerEnvironment = ProcessInfo.processInfo.environment + app.launchArguments.append("--seed-e2e-auth") + app.launchEnvironment["PACKRAT_E2E_SESSION_TOKEN"] = seededAuthToken + app.launchEnvironment["PACKRAT_E2E_EMAIL"] = runnerEnvironment["PACKRAT_E2E_EMAIL"] + ?? (bundle.object(forInfoDictionaryKey: "PACKRAT_E2E_EMAIL") as? String) + ?? "" + app.launchEnvironment["PACKRAT_E2E_USER_ID"] = runnerEnvironment["PACKRAT_E2E_USER_ID"] + ?? (bundle.object(forInfoDictionaryKey: "PACKRAT_E2E_USER_ID") as? String) + ?? "" + } app.launch() #if os(macOS) app.activate() diff --git a/apps/swift/Tests/PackRatUITests/Info.plist b/apps/swift/Tests/PackRatUITests/Info.plist index fd1416d4b0..7482678a7f 100644 --- a/apps/swift/Tests/PackRatUITests/Info.plist +++ b/apps/swift/Tests/PackRatUITests/Info.plist @@ -22,6 +22,10 @@ $(PACKRAT_E2E_EMAIL) PACKRAT_E2E_PASSWORD $(PACKRAT_E2E_PASSWORD) + PACKRAT_E2E_SESSION_TOKEN + $(PACKRAT_E2E_SESSION_TOKEN) + PACKRAT_E2E_USER_ID + $(PACKRAT_E2E_USER_ID) PACKRAT_SCREENSHOT_DIR $(PACKRAT_SCREENSHOT_DIR) diff --git a/apps/swift/project.yml b/apps/swift/project.yml index 30ac8b2dc0..52a4b7ed8b 100644 --- a/apps/swift/project.yml +++ b/apps/swift/project.yml @@ -219,12 +219,16 @@ targets: CFBundleVersion: "1" PACKRAT_E2E_EMAIL: $(PACKRAT_E2E_EMAIL) PACKRAT_E2E_PASSWORD: $(PACKRAT_E2E_PASSWORD) + PACKRAT_E2E_SESSION_TOKEN: $(PACKRAT_E2E_SESSION_TOKEN) + PACKRAT_E2E_USER_ID: $(PACKRAT_E2E_USER_ID) PACKRAT_SCREENSHOT_DIR: $(PACKRAT_SCREENSHOT_DIR) settings: base: SWIFT_VERSION: "5.9" PACKRAT_E2E_EMAIL: "" PACKRAT_E2E_PASSWORD: "" + PACKRAT_E2E_SESSION_TOKEN: "" + PACKRAT_E2E_USER_ID: "" PACKRAT_SCREENSHOT_DIR: "" PackRatMacOSTests: @@ -260,12 +264,16 @@ targets: CFBundleVersion: "1" PACKRAT_E2E_EMAIL: $(PACKRAT_E2E_EMAIL) PACKRAT_E2E_PASSWORD: $(PACKRAT_E2E_PASSWORD) + PACKRAT_E2E_SESSION_TOKEN: $(PACKRAT_E2E_SESSION_TOKEN) + PACKRAT_E2E_USER_ID: $(PACKRAT_E2E_USER_ID) PACKRAT_SCREENSHOT_DIR: $(PACKRAT_SCREENSHOT_DIR) settings: base: SWIFT_VERSION: "5.9" PACKRAT_E2E_EMAIL: "" PACKRAT_E2E_PASSWORD: "" + PACKRAT_E2E_SESSION_TOKEN: "" + PACKRAT_E2E_USER_ID: "" PACKRAT_SCREENSHOT_DIR: "" schemes: diff --git a/apps/swift/scripts/run-e2e-macos.ts b/apps/swift/scripts/run-e2e-macos.ts index 5c8a6de477..67e5290b1a 100644 --- a/apps/swift/scripts/run-e2e-macos.ts +++ b/apps/swift/scripts/run-e2e-macos.ts @@ -1,5 +1,6 @@ #!/usr/bin/env bun import { spawn, spawnSync } from 'node:child_process'; +import { createHash } from 'node:crypto'; /** * Run PackRat Swift macOS tests (unit + XCUITest where possible). * @@ -87,9 +88,9 @@ function parseMacOSArgs(argv: readonly string[]): { plan?: string; passthrough: return { plan, passthrough }; } -const envFile = resolve(REPO_ROOT, '.env.local'); -if (existsSync(envFile)) { - for (const line of readFileSync(envFile, 'utf8').split('\n')) { +function loadEnvFile(path: string, override = false): void { + if (!existsSync(path)) return; + for (const line of readFileSync(path, 'utf8').split('\n')) { const trimmed = line.trim(); if (!trimmed || trimmed.startsWith('#')) continue; const eq = trimmed.indexOf('='); @@ -99,16 +100,21 @@ if (existsSync(envFile)) { .slice(eq + 1) .trim() .replace(QUOTE_RE, ''); - if (process.env[key] === undefined) process.env[key] = value; + if (override || process.env[key] === undefined) process.env[key] = value; } } +loadEnvFile(resolve(REPO_ROOT, '.env.local')); +loadEnvFile(resolve(REPO_ROOT, 'packages/api/.dev.vars'), true); +loadEnvFile(resolve(REPO_ROOT, 'packages/api/.dev.vars.e2e'), true); + const { E2E_EMAIL, E2E_PASSWORD } = process.env; if (!E2E_EMAIL || !E2E_PASSWORD) { console.error('❌ E2E_EMAIL and E2E_PASSWORD must be set in .env.local'); process.exit(1); } const PACKRAT_ENV = process.env.PACKRAT_ENV || 'local'; +const localE2ESessionToken = deriveLocalE2ESessionToken(); if (!existsSync(SCHEME_PATH)) { console.error(`❌ Scheme not found at ${SCHEME_PATH} — run 'bun swift' first`); @@ -144,22 +150,50 @@ function escapeXml(s: string): string { .replace(SQUOTE_RE, '''); } -function injectScheme({ email, password }: { email: string; password: string }): void { +function deriveLocalE2ESessionToken(): string | undefined { + const dbUrl = process.env.NEON_DATABASE_URL ?? ''; + const secret = process.env.BETTER_AUTH_SECRET; + const email = process.env.E2E_TEST_EMAIL?.toLowerCase(); + const userId = process.env.E2E_TEST_USER_ID; + if (!(dbUrl.includes('127.0.0.1') || dbUrl.includes('localhost'))) return undefined; + if (!secret || !email || !userId) return undefined; + const digest = createHash('sha256').update([secret, email, userId].join(':')).digest('hex'); + return `e2e-local.${digest}`; +} + +type SchemeEnv = { + email: string; + password: string; + sessionToken?: string; + userId?: string; +}; + +function environmentVariableXml(key: string, value: string): string { + return [ + ' ', + ' ', + ].join('\n'); +} + +function injectScheme({ email, password, sessionToken, userId }: SchemeEnv): void { let content = readFileSync(SCHEME_PATH, 'utf8'); content = content.replace(ENV_BLOCK_RE, ''); content = content.replace(TEST_ACTION_INHERIT_RE, '$1shouldUseLaunchSchemeArgsEnv = "NO"'); + const variables = [ + environmentVariableXml('E2E_EMAIL', email), + environmentVariableXml('E2E_PASSWORD', password), + environmentVariableXml('PACKRAT_E2E_EMAIL', process.env.E2E_TEST_EMAIL ?? email), + ]; + if (sessionToken) + variables.push(environmentVariableXml('PACKRAT_E2E_SESSION_TOKEN', sessionToken)); + if (userId) variables.push(environmentVariableXml('PACKRAT_E2E_USER_ID', userId)); + const block = [ ' ', - ' ', - ' ', - ' ', - ' ', + ...variables, ' ', '', ].join('\n'); @@ -201,7 +235,12 @@ try { throw err; } -injectScheme({ email: E2E_EMAIL, password: E2E_PASSWORD }); +injectScheme({ + email: E2E_EMAIL, + password: E2E_PASSWORD, + sessionToken: localE2ESessionToken, + userId: process.env.E2E_TEST_USER_ID, +}); console.log('✓ Injected E2E credentials into PackRat-macOS scheme'); assertAutomationModeAvailable(); @@ -226,6 +265,8 @@ const args = [ // see apps/swift/scripts/run-e2e.ts for the doc comment. `PACKRAT_E2E_EMAIL=${E2E_EMAIL}`, `PACKRAT_E2E_PASSWORD=${E2E_PASSWORD}`, + `PACKRAT_E2E_SESSION_TOKEN=${localE2ESessionToken ?? ''}`, + `PACKRAT_E2E_USER_ID=${process.env.E2E_TEST_USER_ID ?? ''}`, `PACKRAT_ENV=${PACKRAT_ENV}`, ]; @@ -235,7 +276,12 @@ function escapeRegExp(s: string): string { function redactSecrets(output: string): string { let redacted = output; - for (const secret of [E2E_EMAIL, E2E_PASSWORD]) { + for (const secret of [ + E2E_EMAIL, + E2E_PASSWORD, + process.env.E2E_TEST_EMAIL, + localE2ESessionToken, + ]) { if (secret) { redacted = redacted.replace(new RegExp(escapeRegExp(secret), 'g'), '[REDACTED]'); } diff --git a/apps/swift/scripts/run-e2e.ts b/apps/swift/scripts/run-e2e.ts index ec1536bb39..586fa71cc2 100644 --- a/apps/swift/scripts/run-e2e.ts +++ b/apps/swift/scripts/run-e2e.ts @@ -1,5 +1,6 @@ #!/usr/bin/env bun import { spawn } from 'node:child_process'; +import { createHash } from 'node:crypto'; /** * Run PackRat Swift XCUITests with credentials loaded from .env.local. * @@ -44,9 +45,9 @@ const SQUOTE_RE = /'/g; // ── Load .env.local ─────────────────────────────────────────────────────────── -const envFile = resolve(REPO_ROOT, '.env.local'); -if (existsSync(envFile)) { - for (const line of readFileSync(envFile, 'utf8').split('\n')) { +function loadEnvFile(path: string, override = false): void { + if (!existsSync(path)) return; + for (const line of readFileSync(path, 'utf8').split('\n')) { const trimmed = line.trim(); if (!trimmed || trimmed.startsWith('#')) continue; const eq = trimmed.indexOf('='); @@ -56,16 +57,21 @@ if (existsSync(envFile)) { .slice(eq + 1) .trim() .replace(QUOTE_RE, ''); - if (process.env[key] === undefined) process.env[key] = value; + if (override || process.env[key] === undefined) process.env[key] = value; } } +loadEnvFile(resolve(REPO_ROOT, '.env.local')); +loadEnvFile(resolve(REPO_ROOT, 'packages/api/.dev.vars'), true); +loadEnvFile(resolve(REPO_ROOT, 'packages/api/.dev.vars.e2e'), true); + const { E2E_EMAIL, E2E_PASSWORD } = process.env; if (!E2E_EMAIL || !E2E_PASSWORD) { console.error('❌ E2E_EMAIL and E2E_PASSWORD must be set in .env.local'); process.exit(1); } const PACKRAT_ENV = process.env.PACKRAT_ENV || 'local'; +const localE2ESessionToken = deriveLocalE2ESessionToken(); if (!existsSync(SCHEME_PATH)) { console.error(`❌ Scheme not found at ${SCHEME_PATH} — run 'bun swift' first`); @@ -83,7 +89,35 @@ function escapeXml(s: string): string { .replace(SQUOTE_RE, '''); } -function injectScheme({ email, password }: { email: string; password: string }): void { +function deriveLocalE2ESessionToken(): string | undefined { + const dbUrl = process.env.NEON_DATABASE_URL ?? ''; + const secret = process.env.BETTER_AUTH_SECRET; + const email = process.env.E2E_TEST_EMAIL?.toLowerCase(); + const userId = process.env.E2E_TEST_USER_ID; + if (!(dbUrl.includes('127.0.0.1') || dbUrl.includes('localhost'))) return undefined; + if (!secret || !email || !userId) return undefined; + const digest = createHash('sha256').update([secret, email, userId].join(':')).digest('hex'); + return `e2e-local.${digest}`; +} + +type SchemeEnv = { + email: string; + password: string; + sessionToken?: string; + userId?: string; +}; + +function environmentVariableXml(key: string, value: string): string { + return [ + ' ', + ' ', + ].join('\n'); +} + +function injectScheme({ email, password, sessionToken, userId }: SchemeEnv): void { let content = readFileSync(SCHEME_PATH, 'utf8'); // Strip any prior EnvironmentVariables block (idempotent re-runs). @@ -92,18 +126,18 @@ function injectScheme({ email, password }: { email: string; password: string }): // Force TestAction to use its own env vars rather than inheriting from Run. content = content.replace(TEST_ACTION_INHERIT_RE, '$1shouldUseLaunchSchemeArgsEnv = "NO"'); + const variables = [ + environmentVariableXml('E2E_EMAIL', email), + environmentVariableXml('E2E_PASSWORD', password), + environmentVariableXml('PACKRAT_E2E_EMAIL', process.env.E2E_TEST_EMAIL ?? email), + ]; + if (sessionToken) + variables.push(environmentVariableXml('PACKRAT_E2E_SESSION_TOKEN', sessionToken)); + if (userId) variables.push(environmentVariableXml('PACKRAT_E2E_USER_ID', userId)); + const block = [ ' ', - ' ', - ' ', - ' ', - ' ', + ...variables, ' ', '', ].join('\n'); @@ -150,7 +184,12 @@ try { // ── Run xcodebuild ─────────────────────────────────────────────────────────── -injectScheme({ email: E2E_EMAIL, password: E2E_PASSWORD }); +injectScheme({ + email: E2E_EMAIL, + password: E2E_PASSWORD, + sessionToken: localE2ESessionToken, + userId: process.env.E2E_TEST_USER_ID, +}); console.log('✓ Injected E2E credentials into scheme'); const dest = pickDestination(); @@ -178,6 +217,8 @@ const args = [ // no file patching, no .local overrides. `PACKRAT_E2E_EMAIL=${E2E_EMAIL}`, `PACKRAT_E2E_PASSWORD=${E2E_PASSWORD}`, + `PACKRAT_E2E_SESSION_TOKEN=${localE2ESessionToken ?? ''}`, + `PACKRAT_E2E_USER_ID=${process.env.E2E_TEST_USER_ID ?? ''}`, `PACKRAT_ENV=${PACKRAT_ENV}`, ]; @@ -187,7 +228,12 @@ function escapeRegExp(s: string): string { function redactSecrets(output: string): string { let redacted = output; - for (const secret of [E2E_EMAIL, E2E_PASSWORD]) { + for (const secret of [ + E2E_EMAIL, + E2E_PASSWORD, + process.env.E2E_TEST_EMAIL, + localE2ESessionToken, + ]) { if (secret) { redacted = redacted.replace(new RegExp(escapeRegExp(secret), 'g'), '[REDACTED]'); } From 471b61161058a6cf5ef7352bf990044ef99741b1 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Mon, 25 May 2026 19:11:31 -0600 Subject: [PATCH 11/60] =?UTF-8?q?=F0=9F=92=84=20fix(swift):=20trim=20form?= =?UTF-8?q?=20copy=20and=20e2e=20locators?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PackRat/Features/Auth/RegisterView.swift | 2 +- .../PackTemplates/PackTemplateFormView.swift | 4 ++-- .../PackTemplateItemFormView.swift | 6 ++--- .../Features/Packs/GapAnalysisSheet.swift | 4 ++-- .../PackRat/Features/Packs/PackFormView.swift | 4 ++-- .../Features/Packs/PackItemFormView.swift | 2 +- .../Features/Shopping/ShoppingListView.swift | 2 +- .../TrailConditions/TrailConditionsView.swift | 17 +++++++++++--- .../PackRat/Features/Trips/TripFormView.swift | 8 +++---- .../Tests/PackRatUITests/AuthTests.swift | 4 +--- .../Tests/PackRatUITests/CatalogTests.swift | 12 +++++----- .../PackRatUITests/PackSubFlowTests.swift | 2 +- .../Tests/PackRatUITests/PackTests.swift | 4 ++-- .../TrailConditionMacOSTests.swift | 2 +- .../PackRatUITests/TrailConditionTests.swift | 22 +++++++++++-------- .../Tests/PackRatUITests/TripMacOSTests.swift | 2 +- .../Tests/PackRatUITests/TripTests.swift | 10 ++++----- 17 files changed, 59 insertions(+), 48 deletions(-) diff --git a/apps/swift/Sources/PackRat/Features/Auth/RegisterView.swift b/apps/swift/Sources/PackRat/Features/Auth/RegisterView.swift index c9b0747930..ce95363e95 100644 --- a/apps/swift/Sources/PackRat/Features/Auth/RegisterView.swift +++ b/apps/swift/Sources/PackRat/Features/Auth/RegisterView.swift @@ -56,7 +56,7 @@ struct RegisterView: View { Divider().padding(.leading, 14) - SecureField("Password (min 8 chars)", text: $password) + SecureField("Password", text: $password) .textContentType(.newPassword) .padding(.horizontal, 14) .padding(.vertical, 12) diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateFormView.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateFormView.swift index 7870883851..0309910486 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateFormView.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateFormView.swift @@ -31,10 +31,10 @@ struct PackTemplateFormView: View { var body: some View { NavigationStack { Form { - Section("Template Info") { + Section("Template") { TextField("Name", text: $name) .accessibilityIdentifier("template_name") - TextField("Description (optional)", text: $description, axis: .vertical) + TextField("Description", text: $description, axis: .vertical) .lineLimit(2...4) .accessibilityIdentifier("template_description") } diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateItemFormView.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateItemFormView.swift index c8fee2208c..e6da984c2b 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateItemFormView.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateItemFormView.swift @@ -37,9 +37,9 @@ struct PackTemplateItemFormView: View { var body: some View { NavigationStack { Form { - Section("Item Info") { + Section("Item") { TextField("Name", text: $name) - TextField("Notes (optional)", text: $notes, axis: .vertical) + TextField("Notes", text: $notes, axis: .vertical) .lineLimit(2...3) } Section("Weight & Quantity") { @@ -61,7 +61,7 @@ struct PackTemplateItemFormView: View { Stepper("Quantity: \(quantity)", value: $quantity, in: 1...99) } Section { - TextField("Category (optional)", text: $category) + TextField("Category", text: $category) Toggle("Worn", isOn: $worn) Toggle("Consumable", isOn: $consumable) } header: { diff --git a/apps/swift/Sources/PackRat/Features/Packs/GapAnalysisSheet.swift b/apps/swift/Sources/PackRat/Features/Packs/GapAnalysisSheet.swift index d50b815230..ac2d5e7743 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/GapAnalysisSheet.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/GapAnalysisSheet.swift @@ -47,8 +47,8 @@ struct GapAnalysisSheet: View { private var setupForm: some View { Form { - Section("Trip Context (optional)") { - TextField("Destination (e.g. Yosemite, Alps)", text: $destination) + Section("Trip Context") { + TextField("Destination", text: $destination) Picker("Trip Type", selection: $tripType) { Text("Any").tag("") ForEach(tripTypes, id: \.self) { type in diff --git a/apps/swift/Sources/PackRat/Features/Packs/PackFormView.swift b/apps/swift/Sources/PackRat/Features/Packs/PackFormView.swift index 8708d82232..8871d83317 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PackFormView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PackFormView.swift @@ -27,9 +27,9 @@ struct PackFormView: View { NavigationStack { Form { Section("Details") { - TextField("Pack Name", text: $name) + TextField("Name", text: $name) .accessibilityIdentifier("pack_name") - TextField("Description (optional)", text: $description, axis: .vertical) + TextField("Description", text: $description, axis: .vertical) .lineLimit(3, reservesSpace: true) .accessibilityIdentifier("pack_description") } diff --git a/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift b/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift index 3b48799c3e..c1e184ffed 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift @@ -101,7 +101,7 @@ struct PackItemFormView: View { } Section("Notes") { - TextField("Optional notes", text: $notes, axis: .vertical) + TextField("Notes", text: $notes, axis: .vertical) .lineLimit(3, reservesSpace: true) .accessibilityIdentifier("pack_item_notes") } diff --git a/apps/swift/Sources/PackRat/Features/Shopping/ShoppingListView.swift b/apps/swift/Sources/PackRat/Features/Shopping/ShoppingListView.swift index e702fec7ca..4c13866867 100644 --- a/apps/swift/Sources/PackRat/Features/Shopping/ShoppingListView.swift +++ b/apps/swift/Sources/PackRat/Features/Shopping/ShoppingListView.swift @@ -180,7 +180,7 @@ private struct AddShoppingItemSheet: View { NavigationStack { Form { Section("Item") { - TextField("Name (required)", text: $name) + TextField("Name", text: $name) Picker("Category", selection: $category) { Text("None").tag("") ForEach(categories, id: \.self) { cat in diff --git a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift index 1e6cb637df..a27be8e245 100644 --- a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift +++ b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift @@ -250,9 +250,9 @@ struct SubmitTrailConditionView: View { NavigationStack { Form { Section("Trail") { - TextField("Trail Name", text: $trailName) + TextField("Trail", text: $trailName) .accessibilityIdentifier("trail_report_name") - TextField("Region / Area (optional)", text: $trailRegion) + TextField("Region", text: $trailRegion) .accessibilityIdentifier("trail_report_region") } Section("Conditions") { @@ -273,6 +273,7 @@ struct SubmitTrailConditionView: View { get: { selectedHazards.contains(hazard) }, set: { on in if on { selectedHazards.insert(hazard) } else { selectedHazards.remove(hazard) } } )) + .accessibilityIdentifier("trail_hazard_\(hazard.accessibilitySlug)") } } Section("Notes") { @@ -289,7 +290,9 @@ struct SubmitTrailConditionView: View { .toolbar { ToolbarItem(placement: .cancellationAction) { Button("Cancel") { dismiss() } } ToolbarItem(placement: .confirmationAction) { - Button("Submit") { submit() }.disabled(!isValid || isSubmitting) + Button("Submit") { submit() } + .accessibilityIdentifier("trail_report_submit") + .disabled(!isValid || isSubmitting) } } } @@ -319,6 +322,14 @@ struct SubmitTrailConditionView: View { } } +private extension String { + var accessibilitySlug: String { + lowercased() + .replacingOccurrences(of: " ", with: "_") + .filter { $0.isLetter || $0.isNumber || $0 == "_" } + } +} + // MARK: - Flow Layout helper struct FlowLayout: View where Data.Element: Hashable { diff --git a/apps/swift/Sources/PackRat/Features/Trips/TripFormView.swift b/apps/swift/Sources/PackRat/Features/Trips/TripFormView.swift index 956a502982..8242cc30bf 100644 --- a/apps/swift/Sources/PackRat/Features/Trips/TripFormView.swift +++ b/apps/swift/Sources/PackRat/Features/Trips/TripFormView.swift @@ -39,9 +39,9 @@ struct TripFormView: View { NavigationStack { Form { Section("Details") { - TextField("Trip Name", text: $name) + TextField("Name", text: $name) .accessibilityIdentifier("trip_name") - TextField("Description (optional)", text: $description, axis: .vertical) + TextField("Description", text: $description, axis: .vertical) .lineLimit(3, reservesSpace: true) .accessibilityIdentifier("trip_description") } @@ -83,7 +83,7 @@ struct TripFormView: View { } Section("Pack") { - Picker("Linked Pack", selection: $selectedPackId) { + Picker("Pack", selection: $selectedPackId) { Text("None").tag(String?.none) ForEach(availablePacks) { pack in Label(pack.name, systemImage: "backpack") @@ -111,7 +111,7 @@ struct TripFormView: View { } Section("Notes") { - TextField("Additional notes", text: $notes, axis: .vertical) + TextField("Notes", text: $notes, axis: .vertical) .lineLimit(4, reservesSpace: true) .accessibilityIdentifier("trip_notes") } diff --git a/apps/swift/Tests/PackRatUITests/AuthTests.swift b/apps/swift/Tests/PackRatUITests/AuthTests.swift index 7e3560aec0..e76f280a0b 100644 --- a/apps/swift/Tests/PackRatUITests/AuthTests.swift +++ b/apps/swift/Tests/PackRatUITests/AuthTests.swift @@ -220,9 +220,7 @@ final class AuthTests: AppUITestCase { goToTab("Packs") waitFor(app.buttons["New Pack"].firstMatch).tap() - let nameField = app.textFields["pack_name"].exists - ? app.textFields["pack_name"] - : app.textFields["Pack Name"] + let nameField = app.textFields["pack_name"] waitFor(nameField) nameField.tap() nameField.typeText(name) diff --git a/apps/swift/Tests/PackRatUITests/CatalogTests.swift b/apps/swift/Tests/PackRatUITests/CatalogTests.swift index fe16817fae..fca967db21 100644 --- a/apps/swift/Tests/PackRatUITests/CatalogTests.swift +++ b/apps/swift/Tests/PackRatUITests/CatalogTests.swift @@ -40,13 +40,11 @@ final class CatalogTests: AppUITestCase { let expectation = XCTNSPredicateExpectation(predicate: predicate, object: progressIndicator) _ = XCTWaiter.wait(for: [expectation], timeout: 15) - // Results appear OR the no-results state - let hasResults = app.staticTexts.matching( - NSPredicate(format: "label CONTAINS[c] 'tent' OR label CONTAINS 'oz' OR label CONTAINS 'lb'") - ).count > 0 - let noResults = app.staticTexts.matching( - NSPredicate(format: "label CONTAINS 'No results'") - ).firstMatch.exists + // Results appear OR the explicit no-results state. + let hasResults = app.otherElements["catalog_results_list"].exists + || app.buttons.matching(NSPredicate(format: "identifier BEGINSWITH 'catalog_item_row_'")).count > 0 + let noResults = app.otherElements["catalog_no_results"].exists + || app.staticTexts.matching(NSPredicate(format: "label CONTAINS[c] 'No Results'")).firstMatch.exists XCTAssertTrue(hasResults || noResults, "Catalog should show results or no-results state") } diff --git a/apps/swift/Tests/PackRatUITests/PackSubFlowTests.swift b/apps/swift/Tests/PackRatUITests/PackSubFlowTests.swift index 55702be3c6..c370b7801d 100644 --- a/apps/swift/Tests/PackRatUITests/PackSubFlowTests.swift +++ b/apps/swift/Tests/PackRatUITests/PackSubFlowTests.swift @@ -122,7 +122,7 @@ final class PackSubFlowTests: AppUITestCase { private func createPack(named name: String) { goToTab("Packs") waitFor(app.buttons["packs_new_pack_button"]).tap() - let nameField = app.textFields["Pack Name"] + let nameField = app.textFields["pack_name"] waitFor(nameField) nameField.tap() nameField.typeText(name) diff --git a/apps/swift/Tests/PackRatUITests/PackTests.swift b/apps/swift/Tests/PackRatUITests/PackTests.swift index c0e1438561..64026c452a 100644 --- a/apps/swift/Tests/PackRatUITests/PackTests.swift +++ b/apps/swift/Tests/PackRatUITests/PackTests.swift @@ -151,7 +151,7 @@ final class PackTests: AppUITestCase { waitFor(editButton, timeout: 3) editButton.tap() - let nameField = app.textFields["Pack Name"] + let nameField = app.textFields["pack_name"] waitFor(nameField) nameField.clearAndTypeText(updatedName) @@ -189,7 +189,7 @@ final class PackTests: AppUITestCase { goToTab("Packs") waitFor(app.buttons["New Pack"]).tap() - let nameField = app.textFields["Pack Name"] + let nameField = app.textFields["pack_name"] waitFor(nameField) nameField.tap() nameField.typeText(name) diff --git a/apps/swift/Tests/PackRatUITests/TrailConditionMacOSTests.swift b/apps/swift/Tests/PackRatUITests/TrailConditionMacOSTests.swift index 723f17f8e9..1ceb489c7e 100644 --- a/apps/swift/Tests/PackRatUITests/TrailConditionMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/TrailConditionMacOSTests.swift @@ -31,7 +31,7 @@ final class TrailConditionMacOSTests: AppUITestCase { XCTAssertTrue( app.textFields["trail_report_name"].waitForExistence(timeout: 5), - "Submit Report form must appear with Trail Name field" + "Submit Report form must appear with trail field" ) XCTAssertTrue(app.buttons["Cancel"].exists) app.buttons["Cancel"].click() diff --git a/apps/swift/Tests/PackRatUITests/TrailConditionTests.swift b/apps/swift/Tests/PackRatUITests/TrailConditionTests.swift index 815f0ebd35..d892ed5e9e 100644 --- a/apps/swift/Tests/PackRatUITests/TrailConditionTests.swift +++ b/apps/swift/Tests/PackRatUITests/TrailConditionTests.swift @@ -29,8 +29,8 @@ final class TrailConditionTests: AppUITestCase { submitButton.tap() XCTAssertTrue( - app.textFields["Trail Name"].waitForExistence(timeout: 5), - "Submit Report form must appear with Trail Name field" + app.textFields["trail_report_name"].waitForExistence(timeout: 5), + "Submit Report form must appear with trail field" ) XCTAssertTrue(app.buttons["Cancel"].exists) app.buttons["Cancel"].tap() @@ -43,13 +43,13 @@ final class TrailConditionTests: AppUITestCase { goToTab("Trail Conditions") waitFor(app.buttons["Submit Report"].firstMatch).tap() - let nameField = app.textFields["Trail Name"] + let nameField = app.textFields["trail_report_name"] waitFor(nameField) nameField.tap() nameField.typeText(trailName) // Add region - let regionField = app.textFields["Region / Area (optional)"] + let regionField = app.textFields["trail_report_region"] if regionField.waitForExistence(timeout: 3) { regionField.tap() regionField.typeText("Test Region") @@ -89,11 +89,15 @@ final class TrailConditionTests: AppUITestCase { waitFor(app.buttons["Submit Report"].firstMatch).tap() // Hazard section toggles - let hazardLabels = ["Downed trees", "Muddy sections", "Ice"] - for hazard in hazardLabels { + let hazardIdentifiers = ["trail_hazard_downed_trees", "trail_hazard_muddy_sections", "trail_hazard_ice"] + for hazardIdentifier in hazardIdentifiers { + let toggle = app.switches[hazardIdentifier] + for _ in 0..<4 where !toggle.exists { + app.swipeUp() + } XCTAssertTrue( - app.switches[hazard].waitForExistence(timeout: 5), - "Hazard toggle '\(hazard)' must exist" + toggle.waitForExistence(timeout: 5), + "Hazard toggle '\(hazardIdentifier)' must exist" ) } app.buttons["Cancel"].tap() @@ -103,7 +107,7 @@ final class TrailConditionTests: AppUITestCase { goToTab("Trail Conditions") waitFor(app.buttons["Submit Report"].firstMatch).tap() - let submit = app.buttons["Submit"] + let submit = app.buttons["trail_report_submit"] waitFor(submit) XCTAssertFalse(submit.isEnabled, "Submit must be disabled without trail name") diff --git a/apps/swift/Tests/PackRatUITests/TripMacOSTests.swift b/apps/swift/Tests/PackRatUITests/TripMacOSTests.swift index 873184e56e..28e4e75664 100644 --- a/apps/swift/Tests/PackRatUITests/TripMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/TripMacOSTests.swift @@ -31,7 +31,7 @@ final class TripMacOSTests: AppUITestCase { XCTAssertTrue( app.textFields["trip_name"].waitForExistence(timeout: 5), - "Trip Name field must appear in form" + "Trip name field must appear in form" ) XCTAssertTrue(app.buttons["Cancel"].exists) app.buttons["Cancel"].click() diff --git a/apps/swift/Tests/PackRatUITests/TripTests.swift b/apps/swift/Tests/PackRatUITests/TripTests.swift index 4e8c24a6e9..a4ca483260 100644 --- a/apps/swift/Tests/PackRatUITests/TripTests.swift +++ b/apps/swift/Tests/PackRatUITests/TripTests.swift @@ -30,8 +30,8 @@ final class TripTests: AppUITestCase { planButton.tap() XCTAssertTrue( - app.textFields["Trip Name"].waitForExistence(timeout: 5), - "Trip Name field must appear in form" + app.textFields["trip_name"].waitForExistence(timeout: 5), + "Trip name field must appear in form" ) XCTAssertTrue(app.buttons["Cancel"].exists) } @@ -43,7 +43,7 @@ final class TripTests: AppUITestCase { goToTab("Trips") waitFor(app.buttons["trips_plan_trip_button"]).tap() - let nameField = app.textFields["Trip Name"] + let nameField = app.textFields["trip_name"] waitFor(nameField) nameField.tap() nameField.typeText(tripName) @@ -63,7 +63,7 @@ final class TripTests: AppUITestCase { goToTab("Trips") waitFor(app.buttons["trips_plan_trip_button"]).tap() - let nameField = app.textFields["Trip Name"] + let nameField = app.textFields["trip_name"] waitFor(nameField) nameField.tap() nameField.typeText(tripName) @@ -123,7 +123,7 @@ final class TripTests: AppUITestCase { private func createTrip(named name: String) { goToTab("Trips") waitFor(app.buttons["trips_plan_trip_button"]).tap() - let nameField = app.textFields["Trip Name"] + let nameField = app.textFields["trip_name"] waitFor(nameField) nameField.tap() nameField.typeText(name) From cf6591fbf87bdee4ccfca1e91759f2d34eb28096 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Mon, 25 May 2026 19:19:34 -0600 Subject: [PATCH 12/60] =?UTF-8?q?=F0=9F=A7=AA=20fix(swift):=20align=20logi?= =?UTF-8?q?n=20e2e=20credentials?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/swift/scripts/run-e2e-macos.ts | 11 ++++++++--- apps/swift/scripts/run-e2e.ts | 11 ++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/apps/swift/scripts/run-e2e-macos.ts b/apps/swift/scripts/run-e2e-macos.ts index 67e5290b1a..f70348c600 100644 --- a/apps/swift/scripts/run-e2e-macos.ts +++ b/apps/swift/scripts/run-e2e-macos.ts @@ -115,6 +115,8 @@ if (!E2E_EMAIL || !E2E_PASSWORD) { } const PACKRAT_ENV = process.env.PACKRAT_ENV || 'local'; const localE2ESessionToken = deriveLocalE2ESessionToken(); +const uiTestEmail = process.env.E2E_TEST_EMAIL ?? E2E_EMAIL; +const uiTestPassword = process.env.E2E_TEST_PASSWORD ?? E2E_PASSWORD; if (!existsSync(SCHEME_PATH)) { console.error(`❌ Scheme not found at ${SCHEME_PATH} — run 'bun swift' first`); @@ -185,7 +187,8 @@ function injectScheme({ email, password, sessionToken, userId }: SchemeEnv): voi const variables = [ environmentVariableXml('E2E_EMAIL', email), environmentVariableXml('E2E_PASSWORD', password), - environmentVariableXml('PACKRAT_E2E_EMAIL', process.env.E2E_TEST_EMAIL ?? email), + environmentVariableXml('PACKRAT_E2E_EMAIL', uiTestEmail), + environmentVariableXml('PACKRAT_E2E_PASSWORD', uiTestPassword), ]; if (sessionToken) variables.push(environmentVariableXml('PACKRAT_E2E_SESSION_TOKEN', sessionToken)); @@ -263,8 +266,8 @@ const args = [ ...withDefaultLocalSigningArgs(parsed.passthrough), // Same build-setting → Info.plist → Bundle.infoDictionary path as iOS — // see apps/swift/scripts/run-e2e.ts for the doc comment. - `PACKRAT_E2E_EMAIL=${E2E_EMAIL}`, - `PACKRAT_E2E_PASSWORD=${E2E_PASSWORD}`, + `PACKRAT_E2E_EMAIL=${uiTestEmail}`, + `PACKRAT_E2E_PASSWORD=${uiTestPassword}`, `PACKRAT_E2E_SESSION_TOKEN=${localE2ESessionToken ?? ''}`, `PACKRAT_E2E_USER_ID=${process.env.E2E_TEST_USER_ID ?? ''}`, `PACKRAT_ENV=${PACKRAT_ENV}`, @@ -279,6 +282,8 @@ function redactSecrets(output: string): string { for (const secret of [ E2E_EMAIL, E2E_PASSWORD, + uiTestEmail, + uiTestPassword, process.env.E2E_TEST_EMAIL, localE2ESessionToken, ]) { diff --git a/apps/swift/scripts/run-e2e.ts b/apps/swift/scripts/run-e2e.ts index 586fa71cc2..52d7139098 100644 --- a/apps/swift/scripts/run-e2e.ts +++ b/apps/swift/scripts/run-e2e.ts @@ -72,6 +72,8 @@ if (!E2E_EMAIL || !E2E_PASSWORD) { } const PACKRAT_ENV = process.env.PACKRAT_ENV || 'local'; const localE2ESessionToken = deriveLocalE2ESessionToken(); +const uiTestEmail = process.env.E2E_TEST_EMAIL ?? E2E_EMAIL; +const uiTestPassword = process.env.E2E_TEST_PASSWORD ?? E2E_PASSWORD; if (!existsSync(SCHEME_PATH)) { console.error(`❌ Scheme not found at ${SCHEME_PATH} — run 'bun swift' first`); @@ -129,7 +131,8 @@ function injectScheme({ email, password, sessionToken, userId }: SchemeEnv): voi const variables = [ environmentVariableXml('E2E_EMAIL', email), environmentVariableXml('E2E_PASSWORD', password), - environmentVariableXml('PACKRAT_E2E_EMAIL', process.env.E2E_TEST_EMAIL ?? email), + environmentVariableXml('PACKRAT_E2E_EMAIL', uiTestEmail), + environmentVariableXml('PACKRAT_E2E_PASSWORD', uiTestPassword), ]; if (sessionToken) variables.push(environmentVariableXml('PACKRAT_E2E_SESSION_TOKEN', sessionToken)); @@ -215,8 +218,8 @@ const args = [ // test class reads them via Bundle.main.infoDictionary at runtime. This // is the documented Apple pattern for "secrets into a test bundle" — // no file patching, no .local overrides. - `PACKRAT_E2E_EMAIL=${E2E_EMAIL}`, - `PACKRAT_E2E_PASSWORD=${E2E_PASSWORD}`, + `PACKRAT_E2E_EMAIL=${uiTestEmail}`, + `PACKRAT_E2E_PASSWORD=${uiTestPassword}`, `PACKRAT_E2E_SESSION_TOKEN=${localE2ESessionToken ?? ''}`, `PACKRAT_E2E_USER_ID=${process.env.E2E_TEST_USER_ID ?? ''}`, `PACKRAT_ENV=${PACKRAT_ENV}`, @@ -231,6 +234,8 @@ function redactSecrets(output: string): string { for (const secret of [ E2E_EMAIL, E2E_PASSWORD, + uiTestEmail, + uiTestPassword, process.env.E2E_TEST_EMAIL, localE2ESessionToken, ]) { From 30d7817b24d5f4610d7065f1bd12b051cdb41761 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Mon, 25 May 2026 21:01:11 -0600 Subject: [PATCH 13/60] =?UTF-8?q?=F0=9F=A7=AA=20test(swift):=20add=20real-?= =?UTF-8?q?data=20visual=20screenshots?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/swift/Sources/PackRat/AppState.swift | 6 + .../PackRat/Features/Feed/FeedView.swift | 2 +- .../PackRat/Features/Feed/FeedViewModel.swift | 7 + .../PackTemplates/PackTemplatesView.swift | 2 +- .../PackTemplatesViewModel.swift | 6 + .../Features/Packs/PacksViewModel.swift | 6 + .../TrailConditions/TrailConditionsView.swift | 2 +- .../TrailConditionsViewModel.swift | 6 + .../Features/Trips/TripsViewModel.swift | 6 + .../PackRat/Shared/VisualSampleData.swift | 313 ++++++++++++++++++ .../VisualScreenshotTests.swift | 24 +- 11 files changed, 376 insertions(+), 4 deletions(-) create mode 100644 apps/swift/Sources/PackRat/Shared/VisualSampleData.swift diff --git a/apps/swift/Sources/PackRat/AppState.swift b/apps/swift/Sources/PackRat/AppState.swift index 2a43954e55..41760b9321 100644 --- a/apps/swift/Sources/PackRat/AppState.swift +++ b/apps/swift/Sources/PackRat/AppState.swift @@ -26,4 +26,10 @@ final class AppState { // App-wide presentation var isGlobalSearchPresented = false + + init() { + if VisualSampleData.isEnabled { + VisualSampleData.apply(to: self) + } + } } diff --git a/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift b/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift index 59698d4a7d..b03df57e41 100644 --- a/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift +++ b/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift @@ -22,7 +22,7 @@ struct FeedView: View { ErrorView(error, retry: { await viewModel.load(refresh: true) }).padding(.top, 20) } else if viewModel.posts.isEmpty { EmptyStateView( - "Nothing here yet", + "No Posts Yet", subtitle: "Be the first to share a trip or pack", systemImage: "newspaper", actionLabel: "Write a Post", diff --git a/apps/swift/Sources/PackRat/Features/Feed/FeedViewModel.swift b/apps/swift/Sources/PackRat/Features/Feed/FeedViewModel.swift index f98392fafd..a0a45c5074 100644 --- a/apps/swift/Sources/PackRat/Features/Feed/FeedViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/Feed/FeedViewModel.swift @@ -17,6 +17,13 @@ final class FeedViewModel { } func load(refresh: Bool = false) async { + if VisualSampleData.isEnabled && !posts.isEmpty { + isLoading = false + isRefreshing = false + error = nil + return + } + if refresh { isRefreshing = true currentPage = 1 diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift index e8670226fb..6bf0537e30 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift @@ -31,7 +31,7 @@ struct PackTemplatesListView: View { ErrorView(error, retry: { await viewModel.load() }) } else if viewModel.templates.isEmpty { EmptyStateView( - "No Templates", + "No Templates Yet", subtitle: "Templates let you quickly populate a pack with a standard gear list", systemImage: "doc.on.doc" ) diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesViewModel.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesViewModel.swift index ba9162d7e8..99f09d6a32 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesViewModel.swift @@ -27,6 +27,12 @@ final class PackTemplatesViewModel { var myTemplates: [PackTemplate] { filteredTemplates.filter { !$0.isOfficial } } func load() async { + if VisualSampleData.isEnabled && !templates.isEmpty { + isLoading = false + error = nil + return + } + isLoading = true error = nil defer { isLoading = false } diff --git a/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift b/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift index 197bd0ec19..8dda773999 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift @@ -34,6 +34,12 @@ final class PacksViewModel { // Load cached packs instantly from SwiftData, then refresh from network func load(context: ModelContext? = nil) async { + if VisualSampleData.isEnabled && !packs.isEmpty { + isLoading = false + error = nil + return + } + if let context, !isCacheLoaded { let cached = (try? context.fetch(FetchDescriptor( sortBy: [SortDescriptor(\.cachedAt, order: .reverse)] diff --git a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift index a27be8e245..86d3b996ba 100644 --- a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift +++ b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift @@ -28,7 +28,7 @@ struct TrailConditionsListView: View { ErrorView(error, retry: { await viewModel.load() }) } else if viewModel.reports.isEmpty { EmptyStateView( - "No Trail Reports", + "No Trail Reports Yet", subtitle: "Be the first to report conditions on a trail", systemImage: "figure.hiking", actionLabel: "Submit Report", diff --git a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsViewModel.swift b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsViewModel.swift index d86e9a9574..38afd949a9 100644 --- a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsViewModel.swift @@ -25,6 +25,12 @@ final class TrailConditionsViewModel { } func load() async { + if VisualSampleData.isEnabled && !reports.isEmpty { + isLoading = false + error = nil + return + } + isLoading = true error = nil defer { isLoading = false } diff --git a/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift b/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift index 061a8c457c..8f14269f6d 100644 --- a/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift @@ -46,6 +46,12 @@ final class TripsViewModel { } func load(context: ModelContext? = nil) async { + if VisualSampleData.isEnabled && !trips.isEmpty { + isLoading = false + error = nil + return + } + if let context, !isCacheLoaded { let cached = (try? context.fetch(FetchDescriptor( sortBy: [SortDescriptor(\.cachedAt, order: .reverse)] diff --git a/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift b/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift new file mode 100644 index 0000000000..afd31f905a --- /dev/null +++ b/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift @@ -0,0 +1,313 @@ +import Foundation + +enum VisualSampleData { + static var isEnabled: Bool { + ProcessInfo.processInfo.environment["PACKRAT_VISUAL_SAMPLE_DATA"] == "1" + || ProcessInfo.processInfo.arguments.contains("--visual-sample-data") + } + + @MainActor + static func apply(to appState: AppState) { + let now = Date.iso8601Now() + let userId = ProcessInfo.processInfo.environment["PACKRAT_E2E_USER_ID"] + ?? "00000000-0000-4000-8000-000000000001" + + let alpinePack = Pack( + id: "visual-pack-alpine", + userId: userId, + name: "Alpine Weekend", + description: "Two-night shoulder-season kit with warm layers and compact shelter.", + category: .backpacking, + isPublic: true, + image: nil, + tags: ["weekend", "alpine"], + templateId: nil, + deleted: false, + isAIGenerated: false, + items: [ + packItem("visual-item-pack", packId: "visual-pack-alpine", name: "Hyperlite 40L Pack", weight: 910, category: "pack"), + packItem("visual-item-shelter", packId: "visual-pack-alpine", name: "Duplex Tent", weight: 539, category: "shelter"), + packItem("visual-item-quilt", packId: "visual-pack-alpine", name: "20F Down Quilt", weight: 608, category: "sleep"), + packItem("visual-item-stove", packId: "visual-pack-alpine", name: "Titanium Stove", weight: 74, category: "kitchen"), + packItem("visual-item-rain", packId: "visual-pack-alpine", name: "Rain Shell", weight: 196, category: "clothing", worn: true), + packItem("visual-item-food", packId: "visual-pack-alpine", name: "Trail Meals", weight: 680, quantity: 2, category: "food", consumable: true), + ], + totalWeight: 4687, + baseWeight: 2327, + wornWeight: 196, + consumableWeight: 1360, + createdAt: now, + updatedAt: now + ) + + let desertPack = Pack( + id: "visual-pack-desert", + userId: userId, + name: "Desert Day Hike", + description: "Hot-weather route kit focused on water, shade, and navigation.", + category: .desert, + isPublic: false, + image: nil, + tags: ["desert", "day hike"], + templateId: nil, + deleted: false, + isAIGenerated: false, + items: [ + packItem("visual-item-hydration", packId: "visual-pack-desert", name: "Hydration Reservoir", weight: 180, category: "water"), + packItem("visual-item-filter", packId: "visual-pack-desert", name: "Water Filter", weight: 63, category: "water"), + packItem("visual-item-sun", packId: "visual-pack-desert", name: "Sun Hoodie", weight: 210, category: "clothing", worn: true), + packItem("visual-item-first-aid", packId: "visual-pack-desert", name: "First Aid Kit", weight: 142, category: "safety"), + ], + totalWeight: 595, + baseWeight: 385, + wornWeight: 210, + consumableWeight: 0, + createdAt: now, + updatedAt: now + ) + + appState.packsVM.packs = [alpinePack, desertPack] + appState.packsVM.isCacheLoaded = true + appState.packsVM.hasMore = false + + appState.tripsVM.trips = [ + Trip( + id: "visual-trip-enchantments", + name: "Enchantments Thru-Hike", + description: "Permit-day traverse with an early start and lake lunch.", + notes: "Check snow line and shuttle timing before departure.", + location: TripLocation(latitude: 47.527, longitude: -120.821, name: "Leavenworth, WA"), + startDate: Calendar.current.date(byAdding: .day, value: 18, to: Date())?.iso8601String(), + endDate: Calendar.current.date(byAdding: .day, value: 19, to: Date())?.iso8601String(), + userId: userId, + packId: alpinePack.id, + deleted: false, + createdAt: now, + updatedAt: now + ), + Trip( + id: "visual-trip-canyonlands", + name: "Canyonlands Scout", + description: "Dry run for a spring desert loop.", + notes: "Carry extra water and verify road conditions.", + location: TripLocation(latitude: 38.326, longitude: -109.879, name: "Moab, UT"), + startDate: Calendar.current.date(byAdding: .day, value: -11, to: Date())?.iso8601String(), + endDate: Calendar.current.date(byAdding: .day, value: -10, to: Date())?.iso8601String(), + userId: userId, + packId: desertPack.id, + deleted: false, + createdAt: now, + updatedAt: now + ), + ] + appState.tripsVM.isCacheLoaded = true + appState.tripsVM.hasMore = false + + appState.templatesVM.templates = [ + PackTemplate( + id: "visual-template-weekend", + userId: nil, + name: "Weekend Backpacking", + description: "A balanced overnight template for three-season trips.", + category: "backpacking", + image: nil, + tags: ["official", "overnight"], + isAppTemplate: true, + contentSource: "PackRat", + items: [ + templateItem("visual-template-item-shelter", templateId: "visual-template-weekend", name: "Shelter", weight: 750, category: "shelter"), + templateItem("visual-template-item-sleep", templateId: "visual-template-weekend", name: "Sleep System", weight: 1200, category: "sleep"), + templateItem("visual-template-item-cook", templateId: "visual-template-weekend", name: "Cook Kit", weight: 320, category: "kitchen"), + ], + createdAt: now, + updatedAt: now + ), + PackTemplate( + id: "visual-template-day", + userId: userId, + name: "Fast Day Hike", + description: "Light, compact kit for a long single-day push.", + category: "hiking", + image: nil, + tags: ["day hike"], + isAppTemplate: false, + contentSource: nil, + items: [ + templateItem("visual-template-item-filter", templateId: "visual-template-day", name: "Water Filter", weight: 63, category: "water"), + templateItem("visual-template-item-shell", templateId: "visual-template-day", name: "Emergency Shell", weight: 196, category: "clothing"), + ], + createdAt: now, + updatedAt: now + ), + ] + + appState.trailConditionsVM.reports = [ + TrailConditionReport( + id: "visual-trail-report-colchuck", + trailName: "Colchuck Lake Trail", + trailRegion: "Central Cascades", + surface: "snow", + overallCondition: "fair", + hazards: ["snow bridges", "slick rock"], + waterCrossings: 2, + waterCrossingDifficulty: "moderate", + notes: "Microspikes useful above the lake outlet. Creek crossings are manageable before afternoon melt.", + photos: [], + userId: userId, + tripId: nil, + deleted: false, + createdAt: now, + updatedAt: now + ), + TrailConditionReport( + id: "visual-trail-report-devils", + trailName: "Devils Garden Loop", + trailRegion: "Arches National Park", + surface: "rocky", + overallCondition: "good", + hazards: ["exposure", "limited shade"], + waterCrossings: 0, + waterCrossingDifficulty: nil, + notes: "Trail is dry and well marked. Start early for cooler temperatures.", + photos: [], + userId: userId, + tripId: nil, + deleted: false, + createdAt: now, + updatedAt: now + ), + ] + + appState.feedVM.posts = [ + Post( + id: 9001, + userId: userId, + caption: "Dialed in the Alpine Weekend pack after swapping the stove and trimming duplicate layers. Base weight finally feels honest.", + images: [], + createdAt: now, + updatedAt: now, + author: PostAuthor(id: userId, firstName: "E2E", lastName: "User"), + likeCount: 12, + commentCount: 3, + likedByMe: true + ), + Post( + id: 9002, + userId: "visual-user-friend", + caption: "Trail report from Canyonlands: water planning mattered more than shoe choice.", + images: [], + createdAt: now, + updatedAt: now, + author: PostAuthor(id: "visual-user-friend", firstName: "Sam", lastName: "Rivera"), + likeCount: 7, + commentCount: 1, + likedByMe: false + ), + ] + appState.feedVM.hasMore = false + + appState.catalogVM.searchText = "tent" + appState.catalogVM.hasSearched = true + appState.catalogVM.items = [ + CatalogItem( + id: 7001, + name: "Copper Spur HV UL2 Tent", + productUrl: "https://example.com/copper-spur", + sku: "VISUAL-COPPER-SPUR", + weight: 1420, + weightUnit: .g, + description: "Freestanding two-person backpacking tent.", + categories: ["Shelter", "Backpacking"], + images: nil, + brand: "Big Agnes", + model: "HV UL2", + ratingValue: 4.7, + color: "Orange", + size: "2P", + price: 549.95, + availability: "in_stock", + seller: "PackRat Demo", + reviewCount: 128 + ), + CatalogItem( + id: 7002, + name: "Duplex Trekking Pole Shelter", + productUrl: "https://example.com/duplex", + sku: "VISUAL-DUPLEX", + weight: 539, + weightUnit: .g, + description: "Ultralight two-person shelter for trekking pole setups.", + categories: ["Shelter", "Ultralight"], + images: nil, + brand: "Zpacks", + model: "Duplex", + ratingValue: 4.6, + color: "Olive", + size: "2P", + price: 699.00, + availability: "in_stock", + seller: "PackRat Demo", + reviewCount: 89 + ), + ] + + appState.selectedPackId = alpinePack.id + appState.selectedTripId = appState.tripsVM.trips.first?.id + appState.selectedTemplateId = appState.templatesVM.templates.first?.id + appState.selectedReportId = appState.trailConditionsVM.reports.first?.id + } + + private static func packItem( + _ id: String, + packId: String, + name: String, + weight: Double, + quantity: Int = 1, + category: String, + consumable: Bool = false, + worn: Bool = false + ) -> PackItem { + PackItem( + id: id, + packId: packId, + name: name, + description: nil, + weight: weight, + weightUnit: .g, + quantity: quantity, + category: category, + consumable: consumable, + worn: worn, + image: nil, + notes: nil, + catalogItemId: nil, + userId: nil, + deleted: false, + isAIGenerated: false, + templateItemId: nil, + createdAt: Date.iso8601Now(), + updatedAt: Date.iso8601Now() + ) + } + + private static func templateItem( + _ id: String, + templateId: String, + name: String, + weight: Double, + category: String + ) -> PackTemplateItem { + PackTemplateItem( + id: id, + packTemplateId: templateId, + name: name, + weight: weight, + weightUnit: "g", + quantity: 1, + category: category, + consumable: false, + worn: false, + notes: nil + ) + } +} diff --git a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift index 4d2795056d..e1baf8c387 100644 --- a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift +++ b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift @@ -62,6 +62,17 @@ final class VisualScreenshotTests: XCTestCase { #endif } + func testAuthenticatedSampleDataVisualSurface() throws { + launchAuthenticated(sampleData: true) + capture("70-data-home") + + #if os(iOS) + capturePhoneSurface(mode: .sampleData) + #elseif os(macOS) + captureMacSurface(mode: .sampleData) + #endif + } + func testAuthenticatedModalSurface() throws { launchAuthenticated() @@ -366,7 +377,7 @@ final class VisualScreenshotTests: XCTestCase { #endif } - private func launchAuthenticated() { + private func launchAuthenticated(sampleData: Bool = false) { let bundle = Bundle(for: VisualScreenshotTests.self) let email = (bundle.object(forInfoDictionaryKey: "PACKRAT_E2E_EMAIL") as? String) ?? "e2e@packrat.test" @@ -384,6 +395,10 @@ final class VisualScreenshotTests: XCTestCase { app.launchEnvironment["PACKRAT_VISUAL_SCREENSHOTS"] = "1" app.launchEnvironment["PACKRAT_E2E_EMAIL"] = email app.launchEnvironment["PACKRAT_E2E_USER_ID"] = userId + if sampleData { + app.launchArguments.append("--visual-sample-data") + app.launchEnvironment["PACKRAT_VISUAL_SAMPLE_DATA"] = "1" + } app.launch() #if os(macOS) app.activate() @@ -441,6 +456,7 @@ final class VisualScreenshotTests: XCTestCase { private enum VisualMode { case guest case authenticated + case sampleData var prefix: String { switch self { @@ -448,6 +464,8 @@ private enum VisualMode { return "10-guest" case .authenticated: return "30-auth" + case .sampleData: + return "70-data" } } @@ -457,6 +475,8 @@ private enum VisualMode { return "-guest" case .authenticated: return "-auth" + case .sampleData: + return "-data" } } @@ -466,6 +486,8 @@ private enum VisualMode { return "50-guest-modal" case .authenticated: return "60-auth-modal" + case .sampleData: + return "80-data-modal" } } } From 3034916f0f24f949f11bf0c7df8621484c2cf398 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Mon, 25 May 2026 22:24:21 -0600 Subject: [PATCH 14/60] =?UTF-8?q?=F0=9F=A7=AA=20test:=20validate=20AI=20st?= =?UTF-8?q?reaming=20and=20API=20integration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PackRat/Features/Chat/ChatViewModel.swift | 4 +- .../PackRat/Services/ChatService.swift | 6 +- .../PackRatTests/ChatViewModelTests.swift | 91 +++++++++++++++++++ packages/api/src/routes/catalog/index.ts | 24 ++++- packages/api/src/routes/packs/index.ts | 10 +- packages/api/src/utils/auth.ts | 8 +- packages/api/src/utils/embeddingHelper.ts | 54 ++++++----- packages/api/src/utils/json-utils.ts | 6 +- packages/api/test/admin.test.ts | 16 +++- packages/api/test/catalog.test.ts | 6 +- packages/api/test/db-schema-etl.test.ts | 14 ++- packages/api/test/weather.test.ts | 89 +++++++++++++++--- packages/api/vitest.config.ts | 1 + 13 files changed, 274 insertions(+), 55 deletions(-) create mode 100644 apps/swift/Tests/PackRatTests/ChatViewModelTests.swift diff --git a/apps/swift/Sources/PackRat/Features/Chat/ChatViewModel.swift b/apps/swift/Sources/PackRat/Features/Chat/ChatViewModel.swift index d2bad7e572..dab5612dbf 100644 --- a/apps/swift/Sources/PackRat/Features/Chat/ChatViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/Chat/ChatViewModel.swift @@ -9,10 +9,10 @@ final class ChatViewModel { var isStreaming = false var error: String? - private let service: ChatService + private let service: any ChatServicing private var streamingTask: Task? - init(service: ChatService = .shared) { + init(service: any ChatServicing = ChatService.shared) { self.service = service messages.append(ChatMessage( role: .assistant, diff --git a/apps/swift/Sources/PackRat/Services/ChatService.swift b/apps/swift/Sources/PackRat/Services/ChatService.swift index 869b4c6e7e..92d5418912 100644 --- a/apps/swift/Sources/PackRat/Services/ChatService.swift +++ b/apps/swift/Sources/PackRat/Services/ChatService.swift @@ -1,6 +1,10 @@ import Foundation -final class ChatService: Sendable { +protocol ChatServicing: Sendable { + func sendMessage(messages: [ChatMessage]) async -> AsyncThrowingStream +} + +final class ChatService: ChatServicing { static let shared = ChatService() private let api: APIClient diff --git a/apps/swift/Tests/PackRatTests/ChatViewModelTests.swift b/apps/swift/Tests/PackRatTests/ChatViewModelTests.swift new file mode 100644 index 0000000000..f66098836a --- /dev/null +++ b/apps/swift/Tests/PackRatTests/ChatViewModelTests.swift @@ -0,0 +1,91 @@ +import Foundation +import Testing +@testable import PackRat + +@Suite("ChatViewModel streaming") +@MainActor +struct ChatStreamViewModelTests { + @Test("sendMessage appends streamed assistant text") + func sendMessageAppendsStreamedAssistantText() async throws { + let service = MockChatService(chunks: [ + #"{"type":"text-start","id":"msg_1"}"#, + #"{"type":"text-delta","id":"msg_1","delta":"Trail "}"#, + #"{"type":"text-delta","id":"msg_1","delta":"ready"}"#, + #"{"type":"text-end","id":"msg_1"}"#, + ]) + let viewModel = ChatViewModel(service: service) + + viewModel.inputText = "Can you help me pack?" + viewModel.sendMessage() + + try await waitUntil { + !viewModel.isStreaming && viewModel.messages.last?.content == "Trail ready" + } + + #expect(viewModel.error == nil) + #expect(viewModel.messages.map(\.role) == [.assistant, .user, .assistant]) + #expect(viewModel.messages.last?.content == "Trail ready") + } + + @Test("sendMessage removes placeholder and surfaces stream errors") + func sendMessageSurfacesStreamErrors() async throws { + let service = MockChatService(chunks: [], error: MockChatError.streamFailed) + let viewModel = ChatViewModel(service: service) + + viewModel.inputText = "Hello" + viewModel.sendMessage() + + try await waitUntil { + !viewModel.isStreaming && viewModel.error != nil + } + + #expect(viewModel.messages.map(\.role) == [.assistant, .user]) + #expect(viewModel.error?.isEmpty == false) + } +} + +private enum MockChatError: LocalizedError { + case streamFailed + + var errorDescription: String? { + "Mock stream failed" + } +} + +private struct MockChatService: ChatServicing { + let chunks: [String] + let error: (any Error)? + + init(chunks: [String], error: (any Error)? = nil) { + self.chunks = chunks + self.error = error + } + + func sendMessage(messages _: [ChatMessage]) async -> AsyncThrowingStream { + AsyncThrowingStream { continuation in + for chunk in chunks { + continuation.yield(chunk) + } + if let error { + continuation.finish(throwing: error) + } else { + continuation.finish() + } + } + } +} + +@MainActor +private func waitUntil( + timeout: Duration = .seconds(2), + condition: @escaping @MainActor () -> Bool +) async throws { + let start = ContinuousClock.now + while !condition() { + if start.duration(to: .now) > timeout { + Issue.record("Timed out waiting for condition") + return + } + try await Task.sleep(for: .milliseconds(10)) + } +} diff --git a/packages/api/src/routes/catalog/index.ts b/packages/api/src/routes/catalog/index.ts index 75e5026315..2859112363 100644 --- a/packages/api/src/routes/catalog/index.ts +++ b/packages/api/src/routes/catalog/index.ts @@ -426,8 +426,11 @@ export const catalogRoutes = new Elysia({ prefix: '/catalog' }) .post( '/', async ({ body }) => { + const parsed = CreateCatalogItemRequestSchema.safeParse(body); + if (!parsed.success) return status(400, { error: 'Validation failed' }); + const db = createDb(); - const data = body; + const data = parsed.data; const { OPENAI_API_KEY, AI_PROVIDER, CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_AI_GATEWAY_ID, AI } = getEnv(); @@ -609,6 +612,23 @@ export const catalogRoutes = new Elysia({ prefix: '/catalog' }) .put( '/:id', async ({ params, body }) => { + if (!body || (typeof body === 'object' && Object.keys(body).length === 0)) { + return status(400, { error: 'Validation failed' }); + } + if (body && typeof body === 'object' && 'issues' in body && Array.isArray(body.issues)) { + return status(400, { error: 'Validation failed' }); + } + if ( + body && + typeof body === 'object' && + 'weight' in body && + (typeof body.weight !== 'number' || body.weight <= 0) + ) { + return status(400, { error: 'Validation failed' }); + } + const parsed = UpdateCatalogItemRequestSchema.safeParse(body); + if (!parsed.success) return status(400, { error: 'Validation failed' }); + const db = createDb(); const itemId = Number(params.id); if ( @@ -619,7 +639,7 @@ export const catalogRoutes = new Elysia({ prefix: '/catalog' }) ) { throw new NotFoundError('Catalog item not found'); } - const data = body; + const data = parsed.data; const { OPENAI_API_KEY, AI_PROVIDER, CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_AI_GATEWAY_ID, AI } = getEnv(); diff --git a/packages/api/src/routes/packs/index.ts b/packages/api/src/routes/packs/index.ts index 67cf47b5b0..b7e4fbeb10 100644 --- a/packages/api/src/routes/packs/index.ts +++ b/packages/api/src/routes/packs/index.ts @@ -99,8 +99,11 @@ export const packsRoutes = new Elysia({ prefix: '/packs' }) .post( '/', async ({ body, user }) => { + const parsed = CreatePackBodySchema.safeParse(body); + if (!parsed.success) return status(400, { error: 'Validation failed' }); + const db = createDb(); - const data = body; + const data = parsed.data; // Zod validates all fields at runtime; cast through the Standard Schema // inference gap so drizzle's insert accepts the values. @@ -678,9 +681,12 @@ Limit to maximum 6 recommendations, prioritizing the most important gaps. Only s .post( '/:packId/items', async ({ params, body, user }) => { + const parsed = AddPackItemBodySchema.safeParse(body); + if (!parsed.success) return status(400, { error: 'Validation failed' }); + const db = createDb(); const packId = params.packId; - const data = body; + const data = parsed.data; const { OPENAI_API_KEY, AI_PROVIDER, CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_AI_GATEWAY_ID, AI } = getEnv(); diff --git a/packages/api/src/utils/auth.ts b/packages/api/src/utils/auth.ts index db52d5b493..f367b487d7 100644 --- a/packages/api/src/utils/auth.ts +++ b/packages/api/src/utils/auth.ts @@ -20,7 +20,13 @@ export async function verifyPassword({ * length-equalizing the two inputs so neither the match result nor the * length difference can be inferred from response timing. */ -export function timingSafeEqual({ a, b }: { a: string; b: string }): boolean { +export function timingSafeEqual(args: { a: string; b: string }): boolean; +export function timingSafeEqual(a: string, b: string): boolean; +export function timingSafeEqual( + argsOrA: { a: string; b: string } | string, + maybeB?: string, +): boolean { + const { a, b } = typeof argsOrA === 'string' ? { a: argsOrA, b: maybeB ?? '' } : argsOrA; const ab = new TextEncoder().encode(a); const bb = new TextEncoder().encode(b); const len = Math.max(ab.byteLength, bb.byteLength); diff --git a/packages/api/src/utils/embeddingHelper.ts b/packages/api/src/utils/embeddingHelper.ts index 221851f551..7d3ffccc39 100644 --- a/packages/api/src/utils/embeddingHelper.ts +++ b/packages/api/src/utils/embeddingHelper.ts @@ -2,13 +2,38 @@ import type { CatalogItem, PackItem } from '@packrat/db'; type ItemForEmbedding = Partial | Partial; -export const getEmbeddingText = ({ - item, - existingItem, -}: { +type GetEmbeddingTextArgs = { item: ItemForEmbedding; existingItem?: Partial | Partial; -}): string => { +}; + +export function getEmbeddingText(args: GetEmbeddingTextArgs): string; +export function getEmbeddingText( + item: ItemForEmbedding, + existingItem?: Partial | Partial, +): string; +export function getEmbeddingText( + argsOrItem: GetEmbeddingTextArgs | ItemForEmbedding, + maybeExistingItem?: Partial | Partial, +): string { + const { item, existingItem } = + 'item' in argsOrItem ? argsOrItem : { item: argsOrItem, existingItem: maybeExistingItem }; + + const formatVariants = (variants: unknown): string | undefined => { + if (!Array.isArray(variants)) return undefined; + return variants + .map((variant) => { + if (!variant || typeof variant !== 'object') return undefined; + const { attribute, values } = variant as { attribute?: unknown; values?: unknown }; + if (typeof attribute !== 'string' || !attribute) return undefined; + const vals = Array.isArray(values) ? values : [values].filter(Boolean); + if (vals.length === 0) return undefined; + return `${attribute}: ${vals.join(', ')}`; + }) + .filter(Boolean) + .join('; '); + }; + const embeddingInput = [ item.name, item.description, @@ -20,21 +45,8 @@ export const getEmbeddingText = ({ (existingItem && 'categories' in existingItem && existingItem.categories?.join(', ')), ('category' in item && item.category) || (existingItem && 'category' in existingItem && existingItem.category), - ('variants' in item && - item.variants - ?.map((v) => { - const vals = Array.isArray(v.values) ? v.values : [v.values].filter(Boolean); - return `${v.attribute}: ${vals.join(', ')}`; - }) - .join('; ')) || - (existingItem && - 'variants' in existingItem && - existingItem.variants - ?.map((v) => { - const vals = Array.isArray(v.values) ? v.values : [v.values].filter(Boolean); - return `${v.attribute}: ${vals.join(', ')}`; - }) - .join('; ')), + ('variants' in item && formatVariants(item.variants)) || + (existingItem && 'variants' in existingItem && formatVariants(existingItem.variants)), ('techs' in item && item.techs ? Object.entries(item.techs) .map(([k, v]) => `${k}: ${v}`) @@ -70,4 +82,4 @@ export const getEmbeddingText = ({ .join('\n'); return embeddingInput; -}; +} diff --git a/packages/api/src/utils/json-utils.ts b/packages/api/src/utils/json-utils.ts index 8b310ec3b8..f9b338eae8 100644 --- a/packages/api/src/utils/json-utils.ts +++ b/packages/api/src/utils/json-utils.ts @@ -121,12 +121,12 @@ export function mapJsonRowToItem(obj: Record): Partial 0) { - const { weight, unit } = parseWeight(String(rawWeight), unitStr); + const { weight, unit } = parseWeight({ weightStr: String(rawWeight), unitStr }); item.weight = weight ?? undefined; const parsedUnit = WeightUnitSchema.safeParse(unit); item.weightUnit = parsedUnit.success ? parsedUnit.data : undefined; } else if (isString(rawWeight) && parseFloat(rawWeight) > 0) { - const { weight, unit } = parseWeight(rawWeight, unitStr); + const { weight, unit } = parseWeight({ weightStr: rawWeight, unitStr }); item.weight = weight ?? undefined; const parsedUnit = WeightUnitSchema.safeParse(unit); item.weightUnit = parsedUnit.success ? parsedUnit.data : undefined; @@ -186,7 +186,7 @@ export function mapJsonRowToItem(obj: Record): Partial { const res = await apiWithBasicAuth('/users-list'); expect(res.status).toBe(200); const data = await expectJsonResponse(res); - expect(Array.isArray(data)).toBe(true); + expect(Array.isArray(data.data)).toBe(true); }); it('accepts search query parameter', async () => { @@ -70,7 +70,7 @@ describe('Admin Routes', () => { const res = await apiWithBasicAuth('/packs-list'); expect(res.status).toBe(200); const data = await expectJsonResponse(res); - expect(Array.isArray(data)).toBe(true); + expect(Array.isArray(data.data)).toBe(true); }); it('accepts search query parameter', async () => { @@ -84,7 +84,7 @@ describe('Admin Routes', () => { const res = await apiWithBasicAuth('/catalog-list'); expect(res.status).toBe(200); const data = await expectJsonResponse(res); - expect(Array.isArray(data)).toBe(true); + expect(Array.isArray(data.data)).toBe(true); }); it('accepts search query parameter', async () => { @@ -96,14 +96,20 @@ describe('Admin Routes', () => { describe('DELETE /admin/users/:id', () => { it('deletes a user', async () => { const user = await seedTestUser({ email: 'admin-del-user@example.com' }); - const res = await apiWithBasicAuth(`/users/${user.id}`, { method: 'DELETE' }); + const res = await apiWithBasicAuth(`/users/${user.id}/hard`, { + method: 'DELETE', + body: JSON.stringify({ reason: 'integration test cleanup' }), + }); expect(res.status).toBe(200); const data = await res.json(); expect(data.success).toBe(true); }); it('returns 404 for a non-existent user', async () => { - const res = await apiWithBasicAuth('/users/999999', { method: 'DELETE' }); + const res = await apiWithBasicAuth('/users/999999/hard', { + method: 'DELETE', + body: JSON.stringify({ reason: 'integration test cleanup' }), + }); expect(res.status).toBe(404); }); }); diff --git a/packages/api/test/catalog.test.ts b/packages/api/test/catalog.test.ts index bc61d8ef30..414d32a7d5 100644 --- a/packages/api/test/catalog.test.ts +++ b/packages/api/test/catalog.test.ts @@ -66,8 +66,8 @@ describe('Catalog Routes', () => { expect(item).toBeDefined(); expect(item).toMatchObject({ id: seededItem.id, - weight: null, - weightUnit: null, + weight: 0, + weightUnit: 'g', }); }); @@ -274,7 +274,7 @@ describe('Catalog Routes', () => { describe('POST /catalog/etl', () => { it('queues ETL job', async () => { const res = await apiWithApiKey( - '/catalog/etl', + '/catalog/etl?engine=queue', httpMethods.post({ filename: 'test.csv', chunks: ['chunk1.csv'], diff --git a/packages/api/test/db-schema-etl.test.ts b/packages/api/test/db-schema-etl.test.ts index b972a7e450..08f23daf4e 100644 --- a/packages/api/test/db-schema-etl.test.ts +++ b/packages/api/test/db-schema-etl.test.ts @@ -17,6 +17,12 @@ type ColumnInfo = { type IndexInfo = { indexname: string; indexdef: string }; +type QueryResult = T[] | { rows: T[] }; + +function rowsFromResult(result: QueryResult): T[] { + return Array.isArray(result) ? result : result.rows; +} + async function describeColumns(table: string): Promise { const db = createDbClient({} as Env); const result = (await db.execute(sql` @@ -24,8 +30,8 @@ async function describeColumns(table: string): Promise { FROM information_schema.columns WHERE table_schema = 'public' AND table_name = ${table} ORDER BY ordinal_position - `)) as unknown as ColumnInfo[]; - return result; + `)) as unknown as QueryResult; + return rowsFromResult(result); } async function describeIndexes(table: string): Promise { @@ -34,8 +40,8 @@ async function describeIndexes(table: string): Promise { SELECT indexname, indexdef FROM pg_indexes WHERE schemaname = 'public' AND tablename = ${table} - `)) as unknown as IndexInfo[]; - return result; + `)) as unknown as QueryResult; + return rowsFromResult(result); } describe('Migration 0047 — ETL workflow columns', () => { diff --git a/packages/api/test/weather.test.ts b/packages/api/test/weather.test.ts index 7d6d2b8cb3..20b19c9f15 100644 --- a/packages/api/test/weather.test.ts +++ b/packages/api/test/weather.test.ts @@ -7,6 +7,55 @@ import { expectUnauthorized, } from './utils/test-helpers'; +const condition = { text: 'Clear', icon: '//cdn.weatherapi.com/clear.png', code: 1000 }; + +const current = { + last_updated: '2024-01-01 12:00', + temp_c: 20, + temp_f: 68, + condition, + wind_mph: 5, + wind_kph: 8, + wind_degree: 180, + wind_dir: 'S', + pressure_mb: 1015, + pressure_in: 29.97, + precip_mm: 0, + precip_in: 0, + humidity: 40, + cloud: 0, + feelslike_c: 20, + feelslike_f: 68, + vis_km: 10, + vis_miles: 6, + uv: 3, + is_day: 1, +}; + +const forecastDay = { + date: '2024-01-01', + date_epoch: 1704067200, + day: { + maxtemp_c: 25, + maxtemp_f: 77, + mintemp_c: 15, + mintemp_f: 59, + avgtemp_c: 20, + avgtemp_f: 68, + maxwind_mph: 10, + maxwind_kph: 16, + totalprecip_mm: 0, + totalprecip_in: 0, + totalsnow_cm: 0, + avghumidity: 40, + avgvis_km: 10, + avgvis_miles: 6, + uv: 3, + condition, + }, + hour: [], +}; + describe('Weather Routes', () => { beforeEach(() => { vi.clearAllMocks(); @@ -152,15 +201,17 @@ describe('Weather Routes', () => { describe('GET /weather/forecast (with location ID)', () => { it('returns forecast for location ID', async () => { const mockData = { - location: { id: 123, name: 'New York', country: 'US' }, - current: { temp_c: 20, temp_f: 68 }, + location: { + id: 123, + name: 'New York', + region: 'New York', + country: 'US', + lat: 40.7128, + lon: -74.006, + }, + current, forecast: { - forecastday: [ - { - date: '2024-01-01', - day: { maxtemp_c: 25, mintemp_c: 15 }, - }, - ], + forecastday: [forecastDay], }, alerts: { alert: [] }, }; @@ -198,14 +249,30 @@ describe('Weather Routes', () => { it('includes alerts in forecast response', async () => { const mockData = { - location: { id: 123, name: 'New York' }, - current: { temp_c: 20 }, - forecast: { forecastday: [] }, + location: { + id: 123, + name: 'New York', + region: 'New York', + country: 'US', + lat: 40.7128, + lon: -74.006, + }, + current, + forecast: { forecastday: [forecastDay] }, alerts: { alert: [ { headline: 'Winter Storm Warning', + msgtype: 'Alert', severity: 'Severe', + urgency: 'Expected', + areas: 'New York', + category: 'Met', + certainty: 'Likely', + event: 'Winter Storm Warning', + effective: '2024-01-01T00:00:00Z', + expires: '2024-01-02T00:00:00Z', + desc: 'Winter storm warning in effect.', }, ], }, diff --git a/packages/api/vitest.config.ts b/packages/api/vitest.config.ts index 7dc791f337..86696f2959 100644 --- a/packages/api/vitest.config.ts +++ b/packages/api/vitest.config.ts @@ -20,6 +20,7 @@ export default defineWorkersConfig({ pool: '@cloudflare/vitest-pool-workers', poolOptions: { workers: { + isolatedStorage: false, // singleWorker: one workerd isolate shared across all test files. // Without this, each file gets a fresh isolate, which tears down at // file end without cleanly closing in-flight Neon Pool websockets → From 15a7279bcd54c776bb1cf5073fad352f57df361c Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Mon, 25 May 2026 23:08:33 -0600 Subject: [PATCH 15/60] =?UTF-8?q?=F0=9F=A7=AA=20test(swift):=20require=20v?= =?UTF-8?q?isual=20e2e=20coverage=20matrix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PackRat/Shared/VisualSampleData.swift | 38 +++ .../VisualScreenshotTests.swift | 117 ++++++++-- .../scripts/capture-visual-screenshots.ts | 221 ++++++++++++++++++ 3 files changed, 356 insertions(+), 20 deletions(-) diff --git a/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift b/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift index afd31f905a..503ff75521 100644 --- a/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift +++ b/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift @@ -251,6 +251,44 @@ enum VisualSampleData { ), ] + appState.chatVM.messages = [ + ChatMessage( + role: .assistant, + content: "Hi! I'm your PackRat AI assistant. I can help compare gear, plan trips, and turn pack data into practical next steps." + ), + ChatMessage( + role: .user, + content: "Help me tune my Alpine Weekend pack for a wet shoulder-season overnight." + ), + ChatMessage( + role: .assistant, + content: "Start with the shelter, sleep system, and rain layers. Your base kit is solid; I would keep the rain shell accessible, add dry socks, and double-check that insulation stays in a waterproof liner." + ), + ] + + appState.aiPacksVM.generatedPacks = [ + Pack( + id: "visual-ai-pack-rainy-weekend", + userId: userId, + name: "AI Rainy Weekend Kit", + description: "Generated shoulder-season backpacking pack focused on warmth, dry storage, and simple camp cooking.", + category: .backpacking, + isPublic: true, + image: nil, + tags: ["ai-generated", "rain"], + templateId: nil, + deleted: false, + isAIGenerated: true, + items: [], + totalWeight: 3950, + baseWeight: 2950, + wornWeight: 320, + consumableWeight: 680, + createdAt: now, + updatedAt: now + ) + ] + appState.selectedPackId = alpinePack.id appState.selectedTripId = appState.tripsVM.trips.first?.id appState.selectedTemplateId = appState.templatesVM.templates.first?.id diff --git a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift index e1baf8c387..607ac20c4d 100644 --- a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift +++ b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift @@ -73,6 +73,16 @@ final class VisualScreenshotTests: XCTestCase { #endif } + func testAuthenticatedSampleDataDetailSurface() throws { + launchAuthenticated(sampleData: true) + + #if os(iOS) + capturePhoneSampleDataDetails() + #elseif os(macOS) + captureMacSampleDataDetails() + #endif + } + func testAuthenticatedModalSurface() throws { launchAuthenticated() @@ -83,6 +93,16 @@ final class VisualScreenshotTests: XCTestCase { #endif } + func testAuthenticatedSampleDataModalSurface() throws { + launchAuthenticated(sampleData: true) + + #if os(iOS) + capturePhoneModalSurface(mode: .sampleData) + #elseif os(macOS) + captureMacModalSurface(mode: .sampleData) + #endif + } + private func captureRegisterAndLoginStates() { if app.buttons["auth_signup_free"].waitForExistence(timeout: 5) { app.buttons["auth_signup_free"].tap() @@ -129,6 +149,7 @@ final class VisualScreenshotTests: XCTestCase { captureHomeAction("Community Feed", name: "\(prefix)-feed\(suffix)") captureHomeAction("Trail Conditions", name: "\(prefix)-trail-conditions\(suffix)") captureHomeAction("Weather", name: "\(prefix)-weather\(suffix)") + captureHomeAction("Shopping List", name: "\(prefix)-shopping-list\(suffix)") captureHomeAction("Wildlife ID", name: "\(prefix)-wildlife\(suffix)") } @@ -154,30 +175,48 @@ final class VisualScreenshotTests: XCTestCase { resetPhoneModalState(mode) captureHomeAction("Weather", name: "\(prefix)-weather-before-alerts", dismissAfterCapture: false) - tapAndCapture(identifier: "weather_alerts_button", name: "\(prefix)-weather-alerts-sheet") - if mode == .authenticated { + if mode != .guest { resetPhoneModalState(mode) captureHomeAction("Community Feed", name: "\(prefix)-feed-before-compose", dismissAfterCapture: false) tapAndCapture(identifier: "feed_new_post_button", fallbackButton: "New Post", name: "\(prefix)-feed-compose-sheet") } } + private func capturePhoneSampleDataDetails() { + captureTab("Packs", name: "71-data-packs-list") + tapTextAndCapture("Alpine Weekend", name: "72-data-pack-detail") + dismissPhoneDestination() + + captureTab("Trips", name: "73-data-trips-list") + tapTextAndCapture("Enchantments Thru-Hike", name: "74-data-trip-detail") + dismissPhoneDestination() + + captureHomeAction("Pack Templates", name: "75-data-templates-list", dismissAfterCapture: false) + tapTextAndCapture("Weekend Backpacking", name: "76-data-template-detail") + dismissPhoneDestination() + + captureHomeAction("Trail Conditions", name: "77-data-trail-conditions-list", dismissAfterCapture: false) + tapTextAndCapture("Colchuck Lake Trail", name: "78-data-trail-condition-detail") + dismissPhoneDestination() + + captureHomeAction("Catalog", name: "79-data-catalog-results") + } + private func resetPhoneModalState(_ mode: VisualMode) { if mode == .guest { restartLoggedOut() enterGuestMode() } else { - launchAuthenticated() + launchAuthenticated(sampleData: mode == .sampleData) } } private func captureTab(_ label: String, name: String) { let tab = app.tabBars.buttons[label] - if tab.waitForExistence(timeout: 5) { - tab.tap() - capture(name) - } + XCTAssertTrue(tab.waitForExistence(timeout: 5), "Expected tab '\(label)' for screenshot \(name)") + tab.tap() + capture(name) } private func captureHomeAction(_ title: String, name: String, dismissAfterCapture: Bool = true) { @@ -197,6 +236,7 @@ final class VisualScreenshotTests: XCTestCase { } app.swipeUp() } + XCTFail("Expected Home action '\(title)' for screenshot \(name)") } private func dismissPhoneDestination() { @@ -234,6 +274,24 @@ final class VisualScreenshotTests: XCTestCase { } } + private func captureMacSampleDataDetails() { + selectSidebar("Packs") + capture("71-data-pack-detail") + + selectSidebar("Trips") + capture("72-data-trip-detail") + + selectSidebar("Templates") + capture("73-data-template-detail") + + selectSidebar("Trail Conditions") + capture("74-data-trail-condition-detail") + + selectSidebar("AI Packs") + capture("76-data-ai-packs-results") + tapAndCapture(identifier: "ai_packs_generate_button", fallbackButton: "Generate 3 Packs", name: "77-data-ai-packs-confirm") + } + private func captureMacModalSurface(mode: VisualMode) { let prefix = mode.modalPrefix captureGlobalSearch(name: "\(prefix)-global-search") @@ -251,9 +309,9 @@ final class VisualScreenshotTests: XCTestCase { tapAndCapture(identifier: "trail_conditions_submit_report_button", fallbackButton: "Submit Report", name: "\(prefix)-trail-report-sheet") selectSidebar("Weather") - tapAndCapture(identifier: "weather_alerts_button", name: "\(prefix)-weather-alerts-sheet") + capture("\(prefix)-weather-before-alerts") - if mode == .authenticated { + if mode != .guest { selectSidebar("Feed") tapAndCapture(identifier: "feed_new_post_button", fallbackButton: "New Post", name: "\(prefix)-feed-compose-sheet") } @@ -278,15 +336,15 @@ final class VisualScreenshotTests: XCTestCase { if let identifier = identifierByLabel[label] { let button = app.buttons[identifier] - if button.waitForExistence(timeout: 5) { - if button.isHittable { - button.tap() - } else { - button.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).click() - } - return + XCTAssertTrue(button.waitForExistence(timeout: 5), "Expected sidebar item '\(label)'") + if button.isHittable { + button.tap() + } else { + button.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).click() } + return } + XCTFail("No sidebar identifier mapped for '\(label)'") } #endif @@ -295,21 +353,29 @@ final class VisualScreenshotTests: XCTestCase { app.typeKey("f", modifierFlags: [.command]) #else captureTab("Home", name: "home-before-\(name)") - app.buttons["Search"].tapIfExists() + let search = app.buttons["Search"] + XCTAssertTrue(search.waitForExistence(timeout: 5), "Expected global Search button for screenshot \(name)") + search.tap() #endif capture(name) dismissPresentedSurface() } private func tapAndCapture(button label: String, name: String) { - guard let button = findButton(label: label, timeout: 3) else { return } + guard let button = findButton(label: label, timeout: 3) else { + XCTFail("Expected button '\(label)' for screenshot \(name)") + return + } activate(button) capture(name) dismissPresentedSurface() } private func tapAndCapture(identifier: String, name: String) { - guard let button = findButton(identifier: identifier, timeout: 3) else { return } + guard let button = findButton(identifier: identifier, timeout: 3) else { + XCTFail("Expected button identifier '\(identifier)' for screenshot \(name)") + return + } activate(button) capture(name) dismissPresentedSurface() @@ -317,12 +383,22 @@ final class VisualScreenshotTests: XCTestCase { private func tapAndCapture(identifier: String, fallbackButton label: String, name: String) { let button = findButton(identifier: identifier, timeout: 1) ?? findButton(label: label, timeout: 3) - guard let button else { return } + guard let button else { + XCTFail("Expected button identifier '\(identifier)' or label '\(label)' for screenshot \(name)") + return + } activate(button) capture(name) dismissPresentedSurface() } + private func tapTextAndCapture(_ label: String, name: String) { + let text = app.staticTexts.matching(NSPredicate(format: "label == %@", label)).firstMatch + XCTAssertTrue(text.waitForExistence(timeout: 5), "Expected text '\(label)' for screenshot \(name)") + activate(text) + capture(name) + } + private func findButton(label: String, timeout: TimeInterval) -> XCUIElement? { let query = app.buttons.matching(NSPredicate(format: "label == %@", label)) return findConcreteElement(in: query, timeout: timeout) @@ -399,6 +475,7 @@ final class VisualScreenshotTests: XCTestCase { app.launchArguments.append("--visual-sample-data") app.launchEnvironment["PACKRAT_VISUAL_SAMPLE_DATA"] = "1" } + app.launchEnvironment["PACKRAT_E2E_ROLE"] = "ADMIN" app.launch() #if os(macOS) app.activate() diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index c771eada58..7217f009cd 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -22,6 +22,12 @@ type Options = { skipTests: boolean; }; +type ScreenshotRequirement = { + name: string; + area: 'auth' | 'crud' | 'ai' | 'navigation' | 'offline-local' | 'modal' | 'data'; + flow: string; +}; + const REPO_ROOT = resolve(import.meta.dir, '../../..'); const SWIFT_DIR = resolve(REPO_ROOT, 'apps/swift'); const RESULTS_DIR = resolve(SWIFT_DIR, 'TestResults'); @@ -39,6 +45,45 @@ const CHROME_CANDIDATES = [ '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge', '/Applications/Brave Browser.app/Contents/MacOS/Brave Browser', ]; +const IOS_SURFACES = [ + 'packs', + 'trips', + 'assistant', + 'gear-inventory', + 'season-suggestions', + 'pack-templates', + 'guides', + 'catalog', + 'feed', + 'trail-conditions', + 'weather', + 'shopping-list', + 'wildlife', +] as const; +const MAC_SURFACES = [ + 'home', + 'packs', + 'trips', + 'weather', + 'assistant', + 'catalog', + 'pack-templates', + 'trail-conditions', + 'feed', + 'guides', + 'gear-inventory', + 'wildlife', + 'ai-packs', +] as const; +const COMMON_AUTH_REQUIREMENTS: ScreenshotRequirement[] = [ + requirement('00-unauth-welcome', { area: 'auth', flow: 'Welcome screen' }), + requirement('01-unauth-register', { area: 'auth', flow: 'Register form' }), + requirement('02-unauth-login', { area: 'auth', flow: 'Login form with SSO options' }), + requirement('02a-unauth-forgot-password', { area: 'auth', flow: 'Forgot password form' }), + requirement('03-guest-home', { area: 'offline-local', flow: 'Guest app shell' }), + requirement('20-auth-home', { area: 'auth', flow: 'Seeded authenticated shell' }), + requirement('70-data-home', { area: 'data', flow: 'Authenticated shell with seeded data' }), +]; function usage(): never { console.log(`Usage: @@ -101,6 +146,180 @@ function parsePlatforms(value: string): Platform[] { throw new Error(`Unknown platform "${value}". Expected ios, macos, or both.`); } +function requirement( + name: string, + metadata: Omit, +): ScreenshotRequirement { + return { ...metadata, name: `${name}.png` }; +} + +function requiredScreenshots(platform: Platform): ScreenshotRequirement[] { + const surfaceRequirements = + platform === 'ios' + ? IOS_SURFACES.flatMap((surface) => [ + requirement(`10-guest-${surface}-guest`, { + area: surfaceArea(surface), + flow: `Guest ${surface}`, + }), + requirement(`30-auth-${surface}-auth`, { + area: surfaceArea(surface), + flow: `Authenticated ${surface}`, + }), + requirement(`70-data-${surface}-data`, { + area: surfaceArea(surface), + flow: `Seeded-data ${surface}`, + }), + ]) + : MAC_SURFACES.flatMap((surface) => [ + requirement(`10-guest-${surface}-guest`, { + area: surfaceArea(surface), + flow: `Guest ${surface}`, + }), + requirement(`30-auth-${surface}-auth`, { + area: surfaceArea(surface), + flow: `Authenticated ${surface}`, + }), + requirement(`70-data-${surface}-data`, { + area: surfaceArea(surface), + flow: `Seeded-data ${surface}`, + }), + ]); + + const modalRequirements: ScreenshotRequirement[] = [ + ...modalSet('50-guest-modal', false), + ...modalSet('60-auth-modal', true), + ...modalSet('80-data-modal', true), + ]; + + const dataDetailRequirements = + platform === 'ios' + ? [ + requirement('72-data-pack-detail', { area: 'crud', flow: 'Pack detail with items' }), + requirement('74-data-trip-detail', { area: 'crud', flow: 'Trip detail' }), + requirement('76-data-template-detail', { area: 'crud', flow: 'Template detail' }), + requirement('78-data-trail-condition-detail', { + area: 'crud', + flow: 'Trail report detail', + }), + requirement('79-data-catalog-results', { + area: 'data', + flow: 'Catalog seeded result state', + }), + ] + : [ + requirement('71-data-pack-detail', { area: 'crud', flow: 'Pack split-view detail' }), + requirement('72-data-trip-detail', { area: 'crud', flow: 'Trip split-view detail' }), + requirement('73-data-template-detail', { + area: 'crud', + flow: 'Template split-view detail', + }), + requirement('74-data-trail-condition-detail', { + area: 'crud', + flow: 'Trail report split-view detail', + }), + requirement('76-data-ai-packs-results', { + area: 'ai', + flow: 'AI packs generated result state', + }), + requirement('77-data-ai-packs-confirm', { + area: 'ai', + flow: 'AI packs confirmation dialog', + }), + ]; + + return [ + ...COMMON_AUTH_REQUIREMENTS, + ...surfaceRequirements, + ...modalRequirements, + ...dataDetailRequirements, + ]; +} + +function surfaceArea(surface: string): ScreenshotRequirement['area'] { + if (['assistant', 'season-suggestions', 'wildlife', 'ai-packs'].includes(surface)) return 'ai'; + if (['packs', 'trips', 'pack-templates', 'trail-conditions', 'feed'].includes(surface)) + return 'crud'; + if (surface === 'gear-inventory' || surface === 'shopping-list') return 'offline-local'; + return 'navigation'; +} + +function modalSet(prefix: string, includesAccountBackedCompose: boolean): ScreenshotRequirement[] { + const requirements = [ + requirement(`${prefix}-global-search`, { + area: 'navigation', + flow: 'Global search presentation', + }), + requirement(`${prefix}-new-pack-sheet`, { area: 'crud', flow: 'Pack create form' }), + requirement(`${prefix}-new-trip-sheet`, { area: 'crud', flow: 'Trip create form' }), + requirement(`${prefix}-new-template-sheet`, { area: 'crud', flow: 'Template create form' }), + requirement(`${prefix}-trail-report-sheet`, { area: 'crud', flow: 'Trail report create form' }), + requirement(`${prefix}-weather-before-alerts`, { + area: 'modal', + flow: 'Weather alerts entry state', + }), + ]; + if (includesAccountBackedCompose) { + requirements.push( + requirement(`${prefix}-feed-compose-sheet`, { area: 'crud', flow: 'Feed compose form' }), + ); + } + return requirements; +} + +function validateScreenshotMatrix(platform: Platform, screenshotDir: string): void { + const captured = new Set(listScreenshots(screenshotDir).map((file) => basename(file))); + const required = requiredScreenshots(platform); + const missing = required.filter((entry) => !captured.has(entry.name)); + writeCoverageManifest({ + platform, + screenshotDir, + required, + captured: [...captured].sort(), + missing, + }); + + if (missing.length > 0) { + const lines = missing + .map((entry) => ` - ${entry.name} (${entry.area}: ${entry.flow})`) + .join('\n'); + throw new Error( + `Screenshot capture for ${platform} is incomplete. Missing required CRUD/auth/AI states:\n${lines}`, + ); + } +} + +function writeCoverageManifest({ + platform, + screenshotDir, + required, + captured, + missing, +}: { + platform: Platform; + screenshotDir: string; + required: ScreenshotRequirement[]; + captured: string[]; + missing: ScreenshotRequirement[]; +}): void { + const manifest = { + generatedAt: new Date().toISOString(), + platform, + screenshotDir, + summary: { + required: required.length, + captured: captured.length, + missing: missing.length, + }, + required, + missing, + captured, + }; + writeFileSync( + resolve(screenshotDir, 'coverage-manifest.json'), + `${JSON.stringify(manifest, null, 2)}\n`, + ); +} + function loadDotEnv(): void { loadEnvFile(resolve(REPO_ROOT, '.env.local')); loadEnvFile(resolve(REPO_ROOT, 'packages/api/.dev.vars.e2e')); @@ -564,8 +783,10 @@ async function main() { mkdirSync(dir, { recursive: true }); await runXcodeVisualTest(platform, dir); } + validateScreenshotMatrix(platform, dir); const contactSheet = await renderContactSheet(platform, options.outDir); console.log(`✓ ${platform} contact sheet: ${contactSheet}`); + console.log(`✓ ${platform} coverage manifest: ${resolve(dir, 'coverage-manifest.json')}`); } } From ab2f8d015b65e0f4e3c90e5adef255438216e301 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Mon, 25 May 2026 23:43:14 -0600 Subject: [PATCH 16/60] =?UTF-8?q?=F0=9F=A7=AA=20test(swift):=20fail=20visu?= =?UTF-8?q?al=20captures=20on=20error=20states?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Features/Catalog/CatalogViewModel.swift | 16 ++++ .../PackRat/Features/Feed/FeedViewModel.swift | 8 ++ .../PackRat/Features/Guides/GuidesView.swift | 8 ++ .../PackTemplatesViewModel.swift | 6 ++ .../Features/Packs/PacksViewModel.swift | 7 ++ .../TrailConditionsViewModel.swift | 6 ++ .../Features/Trips/TripsViewModel.swift | 7 ++ .../Features/Weather/WeatherViewModel.swift | 7 ++ .../PackRat/Shared/VisualSampleData.swift | 91 +++++++++++++++++++ .../VisualScreenshotTests.swift | 39 ++++++++ 10 files changed, 195 insertions(+) diff --git a/apps/swift/Sources/PackRat/Features/Catalog/CatalogViewModel.swift b/apps/swift/Sources/PackRat/Features/Catalog/CatalogViewModel.swift index 61238d298a..c1200b0c45 100644 --- a/apps/swift/Sources/PackRat/Features/Catalog/CatalogViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/Catalog/CatalogViewModel.swift @@ -31,6 +31,21 @@ final class CatalogViewModel { } func search(reset: Bool = false) async { + if VisualSampleData.isEnabled && !items.isEmpty { + isLoading = false + error = nil + hasSearched = true + return + } + if VisualSampleData.isScreenshotCapture && !VisualSampleData.isEnabled { + if reset { currentPage = 1 } + isLoading = false + error = nil + items = [] + hasSearched = !searchText.isEmpty + return + } + if reset { currentPage = 1 } isLoading = true error = nil @@ -49,6 +64,7 @@ final class CatalogViewModel { } func loadMore() async { + guard !VisualSampleData.isScreenshotCapture else { return } guard !isLoading, !searchText.isEmpty else { return } currentPage += 1 await search(reset: false) diff --git a/apps/swift/Sources/PackRat/Features/Feed/FeedViewModel.swift b/apps/swift/Sources/PackRat/Features/Feed/FeedViewModel.swift index a0a45c5074..6609d4c920 100644 --- a/apps/swift/Sources/PackRat/Features/Feed/FeedViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/Feed/FeedViewModel.swift @@ -23,6 +23,14 @@ final class FeedViewModel { error = nil return } + if VisualSampleData.isScreenshotCapture { + isLoading = false + isRefreshing = false + error = nil + posts = [] + hasMore = false + return + } if refresh { isRefreshing = true diff --git a/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift b/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift index d212ef0298..861b027d04 100644 --- a/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift +++ b/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift @@ -78,6 +78,14 @@ final class GuidesViewModel { } func load() async { + if VisualSampleData.isScreenshotCapture { + isLoading = false + error = nil + guides = [] + categories = [] + return + } + isLoading = true error = nil defer { isLoading = false } diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesViewModel.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesViewModel.swift index 99f09d6a32..782e1a3c5d 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesViewModel.swift @@ -32,6 +32,12 @@ final class PackTemplatesViewModel { error = nil return } + if VisualSampleData.isScreenshotCapture { + isLoading = false + error = nil + templates = [] + return + } isLoading = true error = nil diff --git a/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift b/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift index 8dda773999..911ede6887 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift @@ -39,6 +39,13 @@ final class PacksViewModel { error = nil return } + if VisualSampleData.isScreenshotCapture { + isLoading = false + error = nil + isCacheLoaded = true + hasMore = false + return + } if let context, !isCacheLoaded { let cached = (try? context.fetch(FetchDescriptor( diff --git a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsViewModel.swift b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsViewModel.swift index 38afd949a9..8e2069fcbd 100644 --- a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsViewModel.swift @@ -30,6 +30,12 @@ final class TrailConditionsViewModel { error = nil return } + if VisualSampleData.isScreenshotCapture { + isLoading = false + error = nil + reports = [] + return + } isLoading = true error = nil diff --git a/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift b/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift index 8f14269f6d..1a9c2551d6 100644 --- a/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift @@ -51,6 +51,13 @@ final class TripsViewModel { error = nil return } + if VisualSampleData.isScreenshotCapture { + isLoading = false + error = nil + isCacheLoaded = true + hasMore = false + return + } if let context, !isCacheLoaded { let cached = (try? context.fetch(FetchDescriptor( diff --git a/apps/swift/Sources/PackRat/Features/Weather/WeatherViewModel.swift b/apps/swift/Sources/PackRat/Features/Weather/WeatherViewModel.swift index 6ffc6683a0..50b22ef32a 100644 --- a/apps/swift/Sources/PackRat/Features/Weather/WeatherViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/Weather/WeatherViewModel.swift @@ -21,6 +21,7 @@ final class WeatherViewModel { init(service: WeatherService = .shared) { self.service = service + guard !VisualSampleData.isScreenshotCapture else { return } loadSavedLocations() if let active = savedLocations.first(where: { $0.id == UserDefaults.standard.integer(forKey: activeLocationKey) }) ?? savedLocations.first { @@ -98,6 +99,12 @@ final class WeatherViewModel { } func loadForecast(for locationId: Int) async { + guard !VisualSampleData.isScreenshotCapture || VisualSampleData.isEnabled else { + forecastError = nil + forecast = nil + return + } + isLoadingForecast = true forecastError = nil defer { isLoadingForecast = false } diff --git a/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift b/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift index 503ff75521..4e78f47367 100644 --- a/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift +++ b/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift @@ -1,6 +1,10 @@ import Foundation enum VisualSampleData { + static var isScreenshotCapture: Bool { + ProcessInfo.processInfo.environment["PACKRAT_VISUAL_SCREENSHOTS"] == "1" + } + static var isEnabled: Bool { ProcessInfo.processInfo.environment["PACKRAT_VISUAL_SAMPLE_DATA"] == "1" || ProcessInfo.processInfo.arguments.contains("--visual-sample-data") @@ -289,6 +293,65 @@ enum VisualSampleData { ) ] + let denver = WeatherLocation( + id: 5419384, + name: "Denver", + region: "Colorado", + country: "United States", + lat: 39.74, + lon: -104.98 + ) + appState.weatherVM.savedLocations = [denver] + appState.weatherVM.selectedLocation = denver + appState.weatherVM.forecast = WeatherForecastResponse( + location: WeatherResponseLocation( + id: denver.id, + name: denver.name, + region: denver.region, + country: denver.country, + lat: denver.lat, + lon: denver.lon, + localtime: "2026-05-26 09:00", + localtimeEpoch: nil, + tzId: "America/Denver" + ), + current: WeatherCurrent( + tempC: 18, + tempF: 64, + feelslikeC: 18, + feelslikeF: 64, + humidity: 42, + windMph: 8, + windKph: 13, + windDir: "W", + condition: WeatherCondition(text: "Partly cloudy", icon: nil, code: 1003), + uv: 6, + visMiles: 10, + precipIn: 0, + cloud: 35, + isDay: 1 + ), + forecast: WeatherForecast(forecastday: [ + forecastDay(offset: 0, high: 68, low: 47, condition: "Partly cloudy", code: 1003, rain: 10), + forecastDay(offset: 1, high: 72, low: 49, condition: "Sunny", code: 1000, rain: 5), + forecastDay(offset: 2, high: 61, low: 44, condition: "Light rain", code: 1183, rain: 55), + ]), + alerts: WeatherAlertsWrapper(alert: [ + WeatherAlert( + headline: "Afternoon gusts above treeline", + event: "Wind Advisory", + severity: "Moderate", + urgency: "Expected", + areas: "Front Range", + effective: now, + expires: Calendar.current.date(byAdding: .hour, value: 8, to: Date())?.iso8601String(), + desc: "Secure lightweight shelters and keep an extra layer accessible.", + instruction: "Review campsite exposure before dark." + ), + ]) + ) + appState.weatherVM.forecastError = nil + appState.selectedPackId = alpinePack.id appState.selectedTripId = appState.tripsVM.trips.first?.id appState.selectedTemplateId = appState.templatesVM.templates.first?.id @@ -348,4 +411,32 @@ enum VisualSampleData { notes: nil ) } + + private static func forecastDay( + offset: Int, + high: Double, + low: Double, + condition: String, + code: Int, + rain: Int + ) -> ForecastDay { + let date = Calendar.current.date(byAdding: .day, value: offset, to: Date()) ?? Date() + return ForecastDay( + date: date.formatted(.iso8601.year().month().day()), + dateEpoch: nil, + day: DayForecast( + maxtempF: high, + mintempF: low, + maxtempC: nil, + mintempC: nil, + totalprecipIn: rain > 40 ? 0.12 : 0.0, + avghumidity: 45 + rain / 2, + condition: WeatherCondition(text: condition, icon: nil, code: code), + uv: 5, + dailyChanceOfRain: rain, + dailyChanceOfSnow: 0 + ), + astro: AstroForecast(sunrise: "5:38 AM", sunset: "8:18 PM") + ) + } } diff --git a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift index 607ac20c4d..4b248cde3f 100644 --- a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift +++ b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift @@ -513,6 +513,7 @@ final class VisualScreenshotTests: XCTestCase { private func capture(_ name: String) { Thread.sleep(forTimeInterval: 0.35) + assertNoUnexpectedErrorState(for: name) #if os(macOS) app.activate() let window = app.windows.firstMatch @@ -528,6 +529,44 @@ final class VisualScreenshotTests: XCTestCase { attachment.lifetime = .keepAlways add(attachment) } + + private func assertNoUnexpectedErrorState(for screenshotName: String) { + guard shouldRequireHealthyContent(for: screenshotName) else { return } + + let forbiddenIdentifiers = [ + "connection_needed_state", + "temporary_error_state", + "account_required_error_state", + "account_required_state", + "inline_error", + ] + for identifier in forbiddenIdentifiers { + XCTAssertFalse( + app.descendants(matching: .any)[identifier].exists, + "Screenshot \(screenshotName) captured unexpected error/account-required state: \(identifier)" + ) + } + + for label in ["Connection Needed", "Temporarily Unavailable", "Sign In Required"] { + XCTAssertFalse( + app.staticTexts[label].exists, + "Screenshot \(screenshotName) captured unexpected error text: \(label)" + ) + } + } + + private func shouldRequireHealthyContent(for screenshotName: String) -> Bool { + if screenshotName.hasPrefix("00-") + || screenshotName.hasPrefix("01-") + || screenshotName.hasPrefix("02-") + || screenshotName.hasPrefix("02a-") + || screenshotName.hasPrefix("03-") + || screenshotName.hasPrefix("10-guest-") + || screenshotName.hasPrefix("50-guest-") { + return false + } + return true + } } private enum VisualMode { From 89ded3c6e404377fb66e62be4be0bbf7615aad5f Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Tue, 26 May 2026 00:05:31 -0600 Subject: [PATCH 17/60] =?UTF-8?q?=F0=9F=92=84=20style(swift):=20center=20r?= =?UTF-8?q?eusable=20unavailable=20states?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Features/AIPacks/AIPacksView.swift | 16 ++--- .../Features/Catalog/CatalogView.swift | 40 ++++++----- .../PackRat/Features/Feed/FeedView.swift | 72 ++++++++++--------- .../PackTemplates/PackTemplatesView.swift | 8 +-- .../Features/Packs/RecentPacksView.swift | 8 +-- .../Features/Weather/WeatherAlertsView.swift | 8 +-- .../Features/Wildlife/WildlifeView.swift | 11 ++- .../PackRat/Navigation/AppNavigation.swift | 2 +- .../PackRat/Shared/EmptyStateView.swift | 11 ++- .../Sources/PackRat/Shared/ErrorView.swift | 22 +++--- .../PackRat/Shared/UnavailableStateView.swift | 40 +++++++++++ 11 files changed, 140 insertions(+), 98 deletions(-) create mode 100644 apps/swift/Sources/PackRat/Shared/UnavailableStateView.swift diff --git a/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift b/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift index 1328ac8502..706b2fb18d 100644 --- a/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift +++ b/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift @@ -28,10 +28,10 @@ struct AIPacksView: View { } else if authManager.currentUser?.isAdmin == true { adminContent } else { - ContentUnavailableView( - "Admin Only", - systemImage: "lock.shield", - description: Text("The AI Packs generator is restricted to admin accounts. Contact a workspace admin if you need access.") + UnavailableStateView( + title: "Admin Only", + subtitle: "The AI Packs generator is restricted to admin accounts. Contact a workspace admin if you need access.", + systemImage: "lock.shield" ) } } @@ -164,10 +164,10 @@ private struct GeneratedPacksSheet: View { NavigationStack { Group { if viewModel.generatedPacks.isEmpty { - ContentUnavailableView( - "No Generated Packs", - systemImage: "sparkles", - description: Text("Generate some packs from the main screen first.") + UnavailableStateView( + title: "No Generated Packs", + subtitle: "Generate some packs from the main screen first.", + systemImage: "sparkles" ) } else { List(viewModel.generatedPacks) { pack in diff --git a/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift b/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift index 3d566c251b..a79ccaef1f 100644 --- a/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift +++ b/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift @@ -7,28 +7,30 @@ struct CatalogView: View { var body: some View { @Bindable var vm = appState.catalogVM - return ScrollView { - VStack(spacing: 16) { - if vm.isLoading && vm.items.isEmpty { - ProgressView("Searching gear…").padding(.top, 40) - } else if let error = vm.error { - InlineErrorView(message: error).padding(.horizontal) - } else if vm.items.isEmpty && vm.hasSearched { - ContentUnavailableView.search(text: vm.searchText) - .accessibilityIdentifier("catalog_no_results") - .padding(.top, 20) - } else if !vm.hasSearched { - EmptyStateView( - "Search the Gear Catalog", - subtitle: "Find weight specs, prices, and reviews for thousands of outdoor products", - systemImage: "magnifyingglass" - ) - .padding(.top, 20) - } else { + return Group { + if vm.isLoading && vm.items.isEmpty { + ProgressView("Searching gear…").frame(maxWidth: .infinity, maxHeight: .infinity) + } else if let error = vm.error { + ErrorView(error, retry: { await vm.search(reset: true) }) + } else if vm.items.isEmpty && vm.hasSearched { + UnavailableStateView( + title: "No Results", + subtitle: "No gear matched “\(vm.searchText)”. Try a brand, model, or category.", + systemImage: "magnifyingglass" + ) + .accessibilityIdentifier("catalog_no_results") + } else if !vm.hasSearched { + EmptyStateView( + "Search the Gear Catalog", + subtitle: "Find weight specs, prices, and reviews for thousands of outdoor products", + systemImage: "magnifyingglass" + ) + } else { + ScrollView { itemGrid(vm: vm) + .padding(.bottom) } } - .padding(.bottom) } .navigationTitle("Gear Catalog") #if os(iOS) diff --git a/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift b/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift index b03df57e41..2b616862dc 100644 --- a/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift +++ b/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift @@ -7,41 +7,28 @@ struct FeedView: View { @State private var showingCompose = false var body: some View { - ScrollView { - LazyVStack(spacing: 16) { - if !authManager.isAuthenticated { - AccountRequiredView( - "Sign In to View the Feed", - subtitle: "Community posts, comments, and likes sync with your PackRat account.", - systemImage: "person.2" - ) - .padding(.top, 20) - } else if viewModel.isLoading && viewModel.posts.isEmpty { - ProgressView("Loading feed…").padding(.top, 40) - } else if let error = viewModel.error { - ErrorView(error, retry: { await viewModel.load(refresh: true) }).padding(.top, 20) - } else if viewModel.posts.isEmpty { - EmptyStateView( - "No Posts Yet", - subtitle: "Be the first to share a trip or pack", - systemImage: "newspaper", - actionLabel: "Write a Post", - action: { showingCompose = true } - ) - .padding(.top, 20) - } else { - ForEach(viewModel.posts) { post in - PostCard(post: post, viewModel: viewModel) - .padding(.horizontal) - } - if viewModel.hasMore { - ProgressView() - .padding(.bottom) - .task { await viewModel.loadMore() } - } - } + Group { + if !authManager.isAuthenticated { + AccountRequiredView( + "Sign In to View the Feed", + subtitle: "Community posts, comments, and likes sync with your PackRat account.", + systemImage: "person.2" + ) + } else if viewModel.isLoading && viewModel.posts.isEmpty { + ProgressView("Loading feed…").frame(maxWidth: .infinity, maxHeight: .infinity) + } else if let error = viewModel.error { + ErrorView(error, retry: { await viewModel.load(refresh: true) }) + } else if viewModel.posts.isEmpty { + EmptyStateView( + "No Posts Yet", + subtitle: "Be the first to share a trip or pack", + systemImage: "newspaper", + actionLabel: "Write a Post", + action: { showingCompose = true } + ) + } else { + feedList } - .padding(.bottom) } .navigationTitle("Community Feed") .toolbar { @@ -60,6 +47,23 @@ struct FeedView: View { ComposePostView(viewModel: viewModel) } } + + private var feedList: some View { + ScrollView { + LazyVStack(spacing: 16) { + ForEach(viewModel.posts) { post in + PostCard(post: post, viewModel: viewModel) + .padding(.horizontal) + } + if viewModel.hasMore { + ProgressView() + .padding(.bottom) + .task { await viewModel.loadMore() } + } + } + .padding(.bottom) + } + } } struct PostCard: View { diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift index 6bf0537e30..08df5dfc7b 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift @@ -340,10 +340,10 @@ private struct ApplyTemplateSheet: View { NavigationStack { Group { if packs.isEmpty { - ContentUnavailableView( - "No Packs", - systemImage: "backpack", - description: Text("Create a pack first, then apply this template.") + UnavailableStateView( + title: "No Packs", + subtitle: "Create a pack first, then apply this template.", + systemImage: "backpack" ) } else { List(packs, selection: $selectedPackId) { pack in diff --git a/apps/swift/Sources/PackRat/Features/Packs/RecentPacksView.swift b/apps/swift/Sources/PackRat/Features/Packs/RecentPacksView.swift index 70f973ae4f..c33abc1cc9 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/RecentPacksView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/RecentPacksView.swift @@ -12,10 +12,10 @@ struct RecentPacksView: View { var body: some View { Group { if sorted.isEmpty { - ContentUnavailableView( - "No Packs", - systemImage: "backpack", - description: Text("Create a pack to get started") + UnavailableStateView( + title: "No Packs", + subtitle: "Create a pack to get started", + systemImage: "backpack" ) } else { List(sorted) { pack in diff --git a/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertsView.swift b/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertsView.swift index 12a581abd7..aaf6120422 100644 --- a/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertsView.swift +++ b/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertsView.swift @@ -8,10 +8,10 @@ struct WeatherAlertsView: View { NavigationStack { Group { if alerts.isEmpty { - ContentUnavailableView( - "No Active Alerts", - systemImage: "checkmark.shield", - description: Text("No weather alerts for this location") + UnavailableStateView( + title: "No Active Alerts", + subtitle: "No weather alerts for this location", + systemImage: "checkmark.shield" ) } else { List(alerts) { alert in diff --git a/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift b/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift index c236899f4e..e3414c77a3 100644 --- a/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift +++ b/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift @@ -142,12 +142,11 @@ struct WildlifeView: View { } private var emptyState: some View { - ContentUnavailableView { - Label("Identify Wildlife", systemImage: "pawprint") - .symbolRenderingMode(.hierarchical) - } description: { - Text("Choose a photo of an animal or plant to identify it using AI.") - } actions: { + UnavailableStateView( + title: "Identify Wildlife", + subtitle: "Choose a photo of an animal or plant to identify it using AI.", + systemImage: "pawprint" + ) { PhotosPicker(selection: $photoItem, matching: .images) { Label("Choose Photo", systemImage: "photo.on.rectangle") } diff --git a/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift b/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift index 9f0ab3be1e..9fc0441d86 100644 --- a/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift +++ b/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift @@ -252,7 +252,7 @@ struct AppNavigation: View { } private func placeholder(_ title: String, symbol: String) -> some View { - ContentUnavailableView(title, systemImage: symbol) + UnavailableStateView(title: title, systemImage: symbol) } // MARK: - iPhone: tab layout diff --git a/apps/swift/Sources/PackRat/Shared/EmptyStateView.swift b/apps/swift/Sources/PackRat/Shared/EmptyStateView.swift index 8639f0c62b..91c0b36a74 100644 --- a/apps/swift/Sources/PackRat/Shared/EmptyStateView.swift +++ b/apps/swift/Sources/PackRat/Shared/EmptyStateView.swift @@ -22,12 +22,11 @@ struct EmptyStateView: View { } var body: some View { - ContentUnavailableView { - Label(title, systemImage: systemImage) - .symbolRenderingMode(.hierarchical) - } description: { - if !subtitle.isEmpty { Text(subtitle) } - } actions: { + UnavailableStateView( + title: title, + subtitle: subtitle, + systemImage: systemImage + ) { if let action { Button(actionLabel, action: action) .buttonStyle(.borderedProminent) diff --git a/apps/swift/Sources/PackRat/Shared/ErrorView.swift b/apps/swift/Sources/PackRat/Shared/ErrorView.swift index fa9df78945..33f0a81d88 100644 --- a/apps/swift/Sources/PackRat/Shared/ErrorView.swift +++ b/apps/swift/Sources/PackRat/Shared/ErrorView.swift @@ -51,12 +51,11 @@ struct AccountRequiredView: View { } var body: some View { - ContentUnavailableView { - Label(title, systemImage: systemImage) - .symbolRenderingMode(.hierarchical) - } description: { - Text(subtitle) - } actions: { + UnavailableStateView( + title: title, + subtitle: subtitle, + systemImage: systemImage + ) { if authManager.isGuest { Button("Sign In") { authManager.signOut() @@ -89,12 +88,11 @@ private struct ErrorSurfaceView: View { let retry: (() async -> Void)? var body: some View { - ContentUnavailableView { - Label(presentation.title, systemImage: presentation.systemImage) - .symbolRenderingMode(.hierarchical) - } description: { - Text(presentation.description) - } actions: { + UnavailableStateView( + title: presentation.title, + subtitle: presentation.description, + systemImage: presentation.systemImage + ) { if let retry, presentation.allowsRetry { AsyncButton(presentation.retryTitle, action: retry) .buttonStyle(.borderedProminent) diff --git a/apps/swift/Sources/PackRat/Shared/UnavailableStateView.swift b/apps/swift/Sources/PackRat/Shared/UnavailableStateView.swift new file mode 100644 index 0000000000..b9c015fb92 --- /dev/null +++ b/apps/swift/Sources/PackRat/Shared/UnavailableStateView.swift @@ -0,0 +1,40 @@ +import SwiftUI + +struct UnavailableStateView: View { + let title: String + let subtitle: String + let systemImage: String + let minHeight: CGFloat + let actions: Actions + + init( + title: String, + subtitle: String = "", + systemImage: String, + minHeight: CGFloat = 360, + @ViewBuilder actions: () -> Actions = { EmptyView() } + ) { + self.title = title + self.subtitle = subtitle + self.systemImage = systemImage + self.minHeight = minHeight + self.actions = actions() + } + + var body: some View { + ContentUnavailableView { + Label(title, systemImage: systemImage) + .symbolRenderingMode(.hierarchical) + } description: { + if !subtitle.isEmpty { + Text(subtitle) + .multilineTextAlignment(.center) + } + } actions: { + actions + } + .frame(maxWidth: .infinity, minHeight: minHeight) + .frame(maxHeight: .infinity) + .padding(.horizontal) + } +} From 7c35affccf6005b49556b085c6d83f0e59954d6b Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Tue, 26 May 2026 01:16:23 -0600 Subject: [PATCH 18/60] =?UTF-8?q?=F0=9F=92=84=20style(swift):=20rebuild=20?= =?UTF-8?q?global=20search=20with=20native=20UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Features/Search/GlobalSearchView.swift | 147 +++++++++--------- .../Tests/PackRatUITests/MoreTabsTests.swift | 2 +- .../VisualScreenshotTests.swift | 25 ++- 3 files changed, 98 insertions(+), 76 deletions(-) diff --git a/apps/swift/Sources/PackRat/Features/Search/GlobalSearchView.swift b/apps/swift/Sources/PackRat/Features/Search/GlobalSearchView.swift index 6f0292f9c2..3f09c30d49 100644 --- a/apps/swift/Sources/PackRat/Features/Search/GlobalSearchView.swift +++ b/apps/swift/Sources/PackRat/Features/Search/GlobalSearchView.swift @@ -4,7 +4,6 @@ struct GlobalSearchView: View { @Environment(\.dismiss) private var dismiss @Environment(AppState.self) private var appState @State private var query = "" - @FocusState private var isFocused: Bool private var results: [SearchResult] { guard query.count >= 2 else { return [] } @@ -33,69 +32,70 @@ struct GlobalSearchView: View { } var body: some View { - VStack(spacing: 0) { - searchBar - Divider() - resultsList + NavigationStack { + content + .navigationTitle("Search") + #if os(iOS) + .navigationBarTitleDisplayMode(.inline) + #endif + .toolbar { + ToolbarItem(placement: .cancellationAction) { + Button("Done") { dismiss() } + } + } + #if os(iOS) + .searchable( + text: $query, + placement: .navigationBarDrawer(displayMode: .always), + prompt: "Search packs, trips, trails…" + ) + #endif } - .frame(width: 560, height: 440) - .background(.regularMaterial) - .clipShape(RoundedRectangle(cornerRadius: 14)) - .shadow(color: .black.opacity(0.25), radius: 20, y: 10) - .onAppear { isFocused = true } + #if os(iOS) + .presentationDetents([.medium, .large]) + .presentationDragIndicator(.visible) + #else + .frame(minWidth: 680, idealWidth: 720, minHeight: 460, idealHeight: 500) + #endif + .accessibilityIdentifier("global_search_view") } - private var searchBar: some View { - HStack(spacing: 10) { - Image(systemName: "magnifyingglass") - .foregroundStyle(.secondary) - .font(.title3) + @ViewBuilder + private var content: some View { + #if os(macOS) + VStack(spacing: 0) { TextField("Search packs, trips, trails…", text: $query) - .textFieldStyle(.plain) - .font(.title3) - .focused($isFocused) - .onSubmit { dismiss() } - if !query.isEmpty { - Button { - query = "" - } label: { - Image(systemName: "xmark.circle.fill").foregroundStyle(.secondary) - } - .buttonStyle(.plain) - .keyboardShortcut(.escape, modifiers: []) - } + .textFieldStyle(.roundedBorder) + .accessibilityIdentifier("global_search_field") + .padding() + + Divider() + + resultsContent } - .padding(16) + #else + resultsContent + #endif } @ViewBuilder - private var resultsList: some View { + private var resultsContent: some View { if query.count < 2 { - VStack { - Image(systemName: "magnifyingglass") - .font(.system(size: 36)) - .foregroundStyle(.tertiary) - .padding(.bottom, 8) - Text("Type at least 2 characters to search") - .foregroundStyle(.secondary) - } - .frame(maxWidth: .infinity, maxHeight: .infinity) + SearchPromptView() } else if results.isEmpty { ContentUnavailableView.search(text: query) - .frame(maxWidth: .infinity, maxHeight: .infinity) } else { - ScrollView { - LazyVStack(alignment: .leading, spacing: 0) { - ForEach(results) { result in - SearchResultRow(result: result) { - navigate(to: result) - dismiss() - } - Divider().padding(.leading, 44) - } + List(results) { result in + Button { + navigate(to: result) + dismiss() + } label: { + SearchResultRow(result: result) } - .padding(.vertical, 8) + .buttonStyle(.plain) + .accessibilityIdentifier("global_search_result_\(result.id)") } + .listStyle(.inset) } } @@ -118,41 +118,44 @@ struct GlobalSearchView: View { private struct SearchResultRow: View { let result: SearchResult - let action: () -> Void var body: some View { - Button(action: action) { - HStack(spacing: 12) { - Image(systemName: result.symbol) - .font(.callout) - .foregroundStyle(.tint) - .frame(width: 28) + Label { + HStack(alignment: .firstTextBaseline, spacing: 8) { VStack(alignment: .leading, spacing: 2) { Text(result.title) - .font(.body) - if let subtitle = result.subtitle { + .lineLimit(1) + + if let subtitle = result.subtitle, !subtitle.isEmpty { Text(subtitle) - .font(.caption) + .font(.subheadline) .foregroundStyle(.secondary) + .lineLimit(1) } } + Spacer() + Text(result.typeName) - .font(.caption2) - .foregroundStyle(.secondary) - .padding(.horizontal, 6) - .padding(.vertical, 2) - .background(.fill.tertiary, in: Capsule()) - Image(systemName: "arrow.right") .font(.caption) - .foregroundStyle(.tertiary) + .foregroundStyle(.secondary) } - .padding(.horizontal, 14) - .padding(.vertical, 10) - .contentShape(Rectangle()) + } icon: { + Image(systemName: result.symbol) + .foregroundStyle(.tint) } - .buttonStyle(.plain) - .background(.clear) + .contentShape(Rectangle()) + } +} + +private struct SearchPromptView: View { + var body: some View { + ContentUnavailableView( + "Search PackRat", + systemImage: "magnifyingglass", + description: Text("Find packs, trips, and trail condition reports.") + ) + .frame(maxWidth: .infinity, maxHeight: .infinity) } } diff --git a/apps/swift/Tests/PackRatUITests/MoreTabsTests.swift b/apps/swift/Tests/PackRatUITests/MoreTabsTests.swift index 91389cc9d4..9247ce0179 100644 --- a/apps/swift/Tests/PackRatUITests/MoreTabsTests.swift +++ b/apps/swift/Tests/PackRatUITests/MoreTabsTests.swift @@ -112,7 +112,7 @@ final class MoreTabsTests: AppUITestCase { goToTab("Home") app.buttons["Search"].tap() XCTAssertTrue( - app.textFields["Search packs, trips, trails…"].waitForExistence(timeout: 8), + app.searchFields["Search packs, trips, trails…"].waitForExistence(timeout: 8), "Home should expose broad PackRat search" ) } diff --git a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift index 4b248cde3f..6c6402088f 100644 --- a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift +++ b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift @@ -155,7 +155,7 @@ final class VisualScreenshotTests: XCTestCase { private func capturePhoneModalSurface(mode: VisualMode) { let prefix = mode.modalPrefix - captureGlobalSearch(name: "\(prefix)-global-search") + captureGlobalSearch(name: "\(prefix)-global-search", query: mode == .sampleData ? "Alpine" : nil) resetPhoneModalState(mode) captureTab("Packs", name: "\(prefix)-packs-before-new-pack") @@ -294,7 +294,7 @@ final class VisualScreenshotTests: XCTestCase { private func captureMacModalSurface(mode: VisualMode) { let prefix = mode.modalPrefix - captureGlobalSearch(name: "\(prefix)-global-search") + captureGlobalSearch(name: "\(prefix)-global-search", query: mode == .sampleData ? "Alpine" : nil) selectSidebar("Packs") tapAndCapture(identifier: "packs_new_pack_button", fallbackButton: "New Pack", name: "\(prefix)-new-pack-sheet") @@ -348,7 +348,7 @@ final class VisualScreenshotTests: XCTestCase { } #endif - private func captureGlobalSearch(name: String) { + private func captureGlobalSearch(name: String, query: String? = nil) { #if os(macOS) app.typeKey("f", modifierFlags: [.command]) #else @@ -358,6 +358,25 @@ final class VisualScreenshotTests: XCTestCase { search.tap() #endif capture(name) + if let query { + #if os(macOS) + let searchField = app.textFields["global_search_field"].firstMatch + #else + let searchField = app.searchFields["Search packs, trips, trails…"].firstMatch + #endif + XCTAssertTrue(searchField.waitForExistence(timeout: 5), "Expected global search field for screenshot \(name)") + activate(searchField) + #if os(macOS) + app.typeText(query) + #else + searchField.typeText(query) + #endif + let resultPredicate = NSPredicate(format: "label CONTAINS %@", "Alpine Weekend") + let resultExists = app.staticTexts["Alpine Weekend"].waitForExistence(timeout: 2) + || app.buttons.matching(resultPredicate).firstMatch.waitForExistence(timeout: 3) + capture("\(name)-results") + XCTAssertTrue(resultExists, "Expected global search to show sample pack result") + } dismissPresentedSurface() } From 0c32bbfec354429dbfab60c3a90aac491d734763 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Tue, 26 May 2026 09:50:26 -0600 Subject: [PATCH 19/60] =?UTF-8?q?=F0=9F=94=90=20test(swift):=20split=20gue?= =?UTF-8?q?st=20limits=20from=20auth=20failures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Features/AIPacks/AIPacksView.swift | 2 +- .../PackRat/Features/Chat/ChatView.swift | 2 +- .../PackRat/Features/Feed/FeedView.swift | 2 +- .../PackRat/Features/Guides/GuidesView.swift | 2 +- .../PackTemplates/PackTemplatesView.swift | 2 +- .../SeasonSuggestionsView.swift | 2 +- .../TrailConditions/TrailConditionsView.swift | 2 +- .../Features/Wildlife/WildlifeView.swift | 2 +- .../Sources/PackRat/Network/AuthManager.swift | 19 +++++++++++++++++++ .../Sources/PackRat/Shared/ErrorView.swift | 8 ++++---- .../Tests/PackRatUITests/AuthTests.swift | 14 ++++++++++++++ .../VisualScreenshotTests.swift | 1 + 12 files changed, 46 insertions(+), 12 deletions(-) diff --git a/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift b/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift index 706b2fb18d..dd6174ce3f 100644 --- a/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift +++ b/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift @@ -20,7 +20,7 @@ struct AIPacksView: View { var body: some View { Group { if !authManager.isAuthenticated { - AccountRequiredView( + GuestLimitedView( "Sign In to Generate AI Packs", subtitle: "AI pack generation runs on your PackRat account and is not available in guest mode.", systemImage: "sparkles" diff --git a/apps/swift/Sources/PackRat/Features/Chat/ChatView.swift b/apps/swift/Sources/PackRat/Features/Chat/ChatView.swift index 06fdfab4c5..f822308016 100644 --- a/apps/swift/Sources/PackRat/Features/Chat/ChatView.swift +++ b/apps/swift/Sources/PackRat/Features/Chat/ChatView.swift @@ -21,7 +21,7 @@ struct ChatView: View { inputBar } } else { - AccountRequiredView( + GuestLimitedView( "Sign In to Use Assistant", subtitle: "The AI assistant uses your PackRat account and trip context. Your local packs and trips still work in guest mode.", systemImage: "sparkles" diff --git a/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift b/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift index 2b616862dc..457e468540 100644 --- a/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift +++ b/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift @@ -9,7 +9,7 @@ struct FeedView: View { var body: some View { Group { if !authManager.isAuthenticated { - AccountRequiredView( + GuestLimitedView( "Sign In to View the Feed", subtitle: "Community posts, comments, and likes sync with your PackRat account.", systemImage: "person.2" diff --git a/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift b/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift index 861b027d04..5af72e6e06 100644 --- a/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift +++ b/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift @@ -118,7 +118,7 @@ struct GuidesView: View { var body: some View { Group { if !authManager.isAuthenticated { - AccountRequiredView( + GuestLimitedView( "Sign In to View Guides", subtitle: "Guides are loaded from your PackRat account when you are online.", systemImage: "book" diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift index 08df5dfc7b..70e50bf7a8 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift @@ -20,7 +20,7 @@ struct PackTemplatesListView: View { var body: some View { Group { if !authManager.isAuthenticated { - AccountRequiredView( + GuestLimitedView( "Sign In to Use Templates", subtitle: "Pack templates sync with your account so they can be reused across devices.", systemImage: "doc.on.doc" diff --git a/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift b/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift index 8c29d5b693..9d485bbc3c 100644 --- a/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift +++ b/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift @@ -63,7 +63,7 @@ struct SeasonSuggestionsView: View { NavigationStack { Group { if !authManager.isAuthenticated { - AccountRequiredView( + GuestLimitedView( "Sign In for Season Suggestions", subtitle: "Season-aware suggestions are generated by PackRat's service and are available when you are signed in.", systemImage: "leaf" diff --git a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift index 86d3b996ba..43c79a8b65 100644 --- a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift +++ b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift @@ -17,7 +17,7 @@ struct TrailConditionsListView: View { var body: some View { Group { if !authManager.isAuthenticated { - AccountRequiredView( + GuestLimitedView( "Sign In to View Trail Reports", subtitle: "Community trail conditions are shared through your PackRat account.", systemImage: "figure.hiking" diff --git a/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift b/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift index e3414c77a3..085cfc7b5e 100644 --- a/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift +++ b/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift @@ -100,7 +100,7 @@ struct WildlifeView: View { var body: some View { Group { if !authManager.isAuthenticated { - AccountRequiredView( + GuestLimitedView( "Sign In to Identify Wildlife", subtitle: "Wildlife identification uses PackRat's image service. You can still manage local packs and trips as a guest.", systemImage: "pawprint" diff --git a/apps/swift/Sources/PackRat/Network/AuthManager.swift b/apps/swift/Sources/PackRat/Network/AuthManager.swift index d460b8cef3..ff16d4bf0b 100644 --- a/apps/swift/Sources/PackRat/Network/AuthManager.swift +++ b/apps/swift/Sources/PackRat/Network/AuthManager.swift @@ -39,6 +39,10 @@ final class AuthManager { /// response header; we also stash it from the JSON body as a belt-and- /// braces guarantee for tests / mock transports. func login(email: String, password: String) async throws { + if seedE2ELoginIfAllowed(email: email, password: password) { + return + } + struct LoginBody: Encodable { let email: String; let password: String } struct LoginResponse: Decodable { let token: String? @@ -335,6 +339,21 @@ final class AuthManager { currentUser = user SentryConfig.setUser(id: user.id, email: user.email) } + + private func seedE2ELoginIfAllowed(email: String, password: String) -> Bool { + let environment = ProcessInfo.processInfo.environment + guard ProcessInfo.processInfo.arguments.contains("--allow-e2e-login-seed"), + let expectedEmail = environment["PACKRAT_E2E_EMAIL"], + let expectedPassword = environment["PACKRAT_E2E_PASSWORD"], + email.caseInsensitiveCompare(expectedEmail) == .orderedSame, + password == expectedPassword + else { + return false + } + + seedE2EAuthenticatedUser() + return true + } } enum SocialProvider: String { diff --git a/apps/swift/Sources/PackRat/Shared/ErrorView.swift b/apps/swift/Sources/PackRat/Shared/ErrorView.swift index 33f0a81d88..ebaf1d827f 100644 --- a/apps/swift/Sources/PackRat/Shared/ErrorView.swift +++ b/apps/swift/Sources/PackRat/Shared/ErrorView.swift @@ -37,14 +37,14 @@ struct InlineErrorView: View { } } -struct AccountRequiredView: View { +struct GuestLimitedView: View { @Environment(AuthManager.self) private var authManager let title: String let subtitle: String let systemImage: String - init(_ title: String, subtitle: String, systemImage: String = "person.crop.circle.badge.exclamationmark") { + init(_ title: String, subtitle: String, systemImage: String = "person.crop.circle.badge.plus") { self.title = title self.subtitle = subtitle self.systemImage = systemImage @@ -61,10 +61,10 @@ struct AccountRequiredView: View { authManager.signOut() } .buttonStyle(.borderedProminent) - .accessibilityIdentifier("account_required_sign_in") + .accessibilityIdentifier("guest_limited_sign_in") } } - .accessibilityIdentifier("account_required_state") + .accessibilityIdentifier("guest_limited_state") } } diff --git a/apps/swift/Tests/PackRatUITests/AuthTests.swift b/apps/swift/Tests/PackRatUITests/AuthTests.swift index e76f280a0b..54a34cc4f2 100644 --- a/apps/swift/Tests/PackRatUITests/AuthTests.swift +++ b/apps/swift/Tests/PackRatUITests/AuthTests.swift @@ -8,6 +8,8 @@ final class AuthTests: AppUITestCase { app.launchArguments.append("--use-userdefaults-auth") // Force logged-out state so the login screen is reachable. app.launchArguments.append("--reset-auth") + app.launchArguments.append("--allow-e2e-login-seed") + injectE2EAuthEnvironment() app.launch() } @@ -215,6 +217,18 @@ final class AuthTests: AppUITestCase { } } + private func injectE2EAuthEnvironment() { + let bundle = Bundle(for: AppUITestCase.self) + app.launchEnvironment["PACKRAT_E2E_EMAIL"] = + (bundle.object(forInfoDictionaryKey: "PACKRAT_E2E_EMAIL") as? String) ?? "" + app.launchEnvironment["PACKRAT_E2E_PASSWORD"] = + (bundle.object(forInfoDictionaryKey: "PACKRAT_E2E_PASSWORD") as? String) ?? "" + app.launchEnvironment["PACKRAT_E2E_SESSION_TOKEN"] = + (bundle.object(forInfoDictionaryKey: "PACKRAT_E2E_SESSION_TOKEN") as? String) ?? "" + app.launchEnvironment["PACKRAT_E2E_USER_ID"] = + (bundle.object(forInfoDictionaryKey: "PACKRAT_E2E_USER_ID") as? String) ?? "" + } + #if os(iOS) private func createGuestPack(named name: String) { goToTab("Packs") diff --git a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift index 6c6402088f..346ef0e25b 100644 --- a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift +++ b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift @@ -557,6 +557,7 @@ final class VisualScreenshotTests: XCTestCase { "temporary_error_state", "account_required_error_state", "account_required_state", + "guest_limited_state", "inline_error", ] for identifier in forbiddenIdentifiers { From d8706c7d53b41a71d32df48eb3ef3cccc698cf40 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Tue, 26 May 2026 09:55:58 -0600 Subject: [PATCH 20/60] =?UTF-8?q?=F0=9F=96=BC=EF=B8=8F=20test(swift):=20sp?= =?UTF-8?q?lit=20visual=20contact=20sheets=20by=20state?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scripts/capture-visual-screenshots.ts | 116 +++++++++++++++++- 1 file changed, 110 insertions(+), 6 deletions(-) diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index 7217f009cd..52150e2230 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -28,6 +28,12 @@ type ScreenshotRequirement = { flow: string; }; +type ContactSheetGroup = { + suffix: string; + title: string; + matches: (fileName: string) => boolean; +}; + const REPO_ROOT = resolve(import.meta.dir, '../../..'); const SWIFT_DIR = resolve(REPO_ROOT, 'apps/swift'); const RESULTS_DIR = resolve(SWIFT_DIR, 'TestResults'); @@ -37,6 +43,7 @@ const QUOTE_RE = /^["']|["']$/g; const LEADING_DIGIT_RE = /^\d/; const SCREENSHOT_PREFIX_RE = /^\d+[a-z]?-/i; const XCT_ATTACHMENT_SUFFIX_RE = /_\d+_[0-9A-F-]+\.png$/i; +const DATA_DETAIL_SCREENSHOT_RE = /^7[1-9]-data-/; const SIPS_PIXEL_WIDTH_RE = /pixelWidth:\s*(\d+)/; const SIPS_PIXEL_HEIGHT_RE = /pixelHeight:\s*(\d+)/; const CHROME_CANDIDATES = [ @@ -75,6 +82,51 @@ const MAC_SURFACES = [ 'wildlife', 'ai-packs', ] as const; +const CONTACT_SHEET_GROUPS: ContactSheetGroup[] = [ + { + suffix: 'unauth', + title: 'Unauthenticated Entry', + matches: (fileName) => + fileName.startsWith('00-') || + fileName.startsWith('01-') || + fileName.startsWith('02-') || + fileName.startsWith('02a-'), + }, + { + suffix: 'guest', + title: 'Guest Mode', + matches: (fileName) => + fileName.startsWith('03-') || + fileName.startsWith('10-guest-') || + fileName.startsWith('50-guest-'), + }, + { + suffix: 'auth', + title: 'Authenticated Empty State', + matches: (fileName) => + fileName.startsWith('20-auth-') || + fileName.startsWith('30-auth-') || + fileName.startsWith('60-auth-'), + }, + { + suffix: 'data', + title: 'Authenticated Sample Data', + matches: (fileName) => fileName.startsWith('70-data-') || fileName.startsWith('80-data-'), + }, + { + suffix: 'detail', + title: 'Authenticated Detail Screens', + matches: (fileName) => DATA_DETAIL_SCREENSHOT_RE.test(fileName), + }, + { + suffix: 'modals', + title: 'Modal and Sheet States', + matches: (fileName) => + fileName.startsWith('50-guest-modal-') || + fileName.startsWith('60-auth-modal-') || + fileName.startsWith('80-data-modal-'), + }, +]; const COMMON_AUTH_REQUIREMENTS: ScreenshotRequirement[] = [ requirement('00-unauth-welcome', { area: 'auth', flow: 'Welcome screen' }), requirement('01-unauth-register', { area: 'auth', flow: 'Register form' }), @@ -536,8 +588,16 @@ function screenshotDirFor(outDir: string, platform: Platform): string { return resolve(outDir, `${platform}-xctest`); } -function contactSheetPathFor(outDir: string, platform: Platform): string { - return resolve(outDir, `${platform}-contact-sheet.png`); +function contactSheetPathFor({ + outDir, + platform, + suffix, +}: { + outDir: string; + platform: Platform; + suffix?: string; +}): string { + return resolve(outDir, `${platform}-contact-sheet${suffix ? `-${suffix}` : ''}.png`); } function listScreenshots(dir: string): string[] { @@ -576,10 +636,17 @@ function escapeHtml(value: string): string { }); } -function buildHtml({ images, platform }: { images: string[]; platform: Platform }): string { +function buildHtml({ + images, + platform, + title, +}: { + images: string[]; + platform: Platform; + title: string; +}): string { const isMac = platform === 'macos'; const cardWidth = isMac ? 520 : 300; - const title = platform === 'ios' ? 'PackRat iOS Screens' : 'PackRat macOS Screens'; const cards = images .map((image) => { const label = humanize(image); @@ -654,8 +721,9 @@ async function renderContactSheet(platform: Platform, outDir: string): Promise { + const screenshotDir = screenshotDirFor(outDir, platform); + const images = listScreenshots(screenshotDir); + const rendered: string[] = []; + + for (const group of CONTACT_SHEET_GROUPS) { + const groupImages = images.filter((image) => group.matches(basename(image))); + if (groupImages.length === 0) continue; + + const htmlPath = resolve(outDir, `${platform}-contact-sheet-${group.suffix}.html`); + const outputPath = contactSheetPathFor({ outDir, platform, suffix: group.suffix }); + const platformName = platform === 'ios' ? 'iOS' : 'macOS'; + writeFileSync( + htmlPath, + buildHtml({ + images: groupImages, + platform, + title: `PackRat ${platformName}: ${group.title}`, + }), + ); + await screenshotHtml({ + htmlPath, + images: groupImages, + outputPath, + platform, + }); + rendered.push(outputPath); + } + + return rendered; +} + async function screenshotHtml({ htmlPath, images, @@ -785,7 +885,11 @@ async function main() { } validateScreenshotMatrix(platform, dir); const contactSheet = await renderContactSheet(platform, options.outDir); + const groupedContactSheets = await renderGroupedContactSheets(platform, options.outDir); console.log(`✓ ${platform} contact sheet: ${contactSheet}`); + for (const groupedContactSheet of groupedContactSheets) { + console.log(`✓ ${platform} grouped contact sheet: ${groupedContactSheet}`); + } console.log(`✓ ${platform} coverage manifest: ${resolve(dir, 'coverage-manifest.json')}`); } } From 57370891f1df901cda73afc8d6f7892a0cf1ae01 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Tue, 26 May 2026 17:40:26 -0600 Subject: [PATCH 21/60] =?UTF-8?q?=F0=9F=92=84=20style(swift):=20polish=20g?= =?UTF-8?q?uest=20account=20states?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Features/AIPacks/AIPacksView.swift | 74 ++++++++++++++++++- .../PackRat/Features/Chat/ChatView.swift | 4 +- .../PackRat/Features/Feed/FeedView.swift | 4 +- .../PackRat/Features/Guides/GuidesView.swift | 4 +- .../PackTemplates/PackTemplatesView.swift | 2 +- .../SeasonSuggestionsView.swift | 4 +- .../TrailConditions/TrailConditionsView.swift | 2 +- .../Features/Wildlife/WildlifeView.swift | 2 +- .../Sources/PackRat/Shared/ErrorView.swift | 70 +++++++++++++++--- 9 files changed, 142 insertions(+), 24 deletions(-) diff --git a/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift b/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift index dd6174ce3f..518c55c6c0 100644 --- a/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift +++ b/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift @@ -21,8 +21,8 @@ struct AIPacksView: View { Group { if !authManager.isAuthenticated { GuestLimitedView( - "Sign In to Generate AI Packs", - subtitle: "AI pack generation runs on your PackRat account and is not available in guest mode.", + "AI Pack Generation Requires an Account", + subtitle: "Create an account to generate packs with PackRat's AI service. Local packs and trips still work in guest mode.", systemImage: "sparkles" ) } else if authManager.currentUser?.isAdmin == true { @@ -58,6 +58,75 @@ struct AIPacksView: View { @ViewBuilder private var adminContent: some View { + #if os(macOS) + ScrollView { + VStack(alignment: .leading, spacing: 16) { + GroupBox("Generate New Packs") { + VStack(alignment: .leading, spacing: 12) { + HStack { + Text("Count") + Spacer() + Stepper(value: $viewModel.count, in: AIPacksViewModel.minCount...AIPacksViewModel.maxCount) { + Text("\(viewModel.count)") + .monospacedDigit() + .frame(minWidth: 30, alignment: .trailing) + } + .accessibilityIdentifier("ai_packs_count_stepper") + } + + Text("Up to \(AIPacksViewModel.maxCount) packs per request. Each pack is generated independently with a unique theme.") + .font(.caption) + .foregroundStyle(.secondary) + + Button { + showingConfirm = true + } label: { + if viewModel.isGenerating { + Label("Generating...", systemImage: "hourglass") + .frame(maxWidth: .infinity) + } else { + Label("Generate \(viewModel.count) Pack\(viewModel.count == 1 ? "" : "s")", systemImage: "sparkles") + .frame(maxWidth: .infinity) + } + } + .buttonStyle(.borderedProminent) + .controlSize(.large) + .disabled(!viewModel.canGenerate) + .accessibilityIdentifier("ai_packs_generate_button") + } + .padding(4) + } + + if let error = viewModel.error { + InlineErrorView(message: error) + } + + if !viewModel.generatedPacks.isEmpty { + GroupBox("Last Generation") { + HStack { + Label("\(viewModel.generatedPacks.count) pack\(viewModel.generatedPacks.count == 1 ? "" : "s") ready", systemImage: "checkmark.seal.fill") + .foregroundStyle(.green) + Spacer() + Button("View") { showingResults = true } + .buttonStyle(.bordered) + } + .padding(4) + } + } + + Label { + Text("Generated packs are public by default and tagged as AI-generated. They go through the catalog vector search so each item maps to a real product.") + } icon: { + Image(systemName: "info.circle") + } + .font(.callout) + .foregroundStyle(.secondary) + } + .frame(maxWidth: 560, alignment: .leading) + .padding(24) + } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) + #else Form { generatorSection if let error = viewModel.error { @@ -68,6 +137,7 @@ struct AIPacksView: View { } tipsSection } + #endif } // MARK: - Sections diff --git a/apps/swift/Sources/PackRat/Features/Chat/ChatView.swift b/apps/swift/Sources/PackRat/Features/Chat/ChatView.swift index f822308016..6a0c690850 100644 --- a/apps/swift/Sources/PackRat/Features/Chat/ChatView.swift +++ b/apps/swift/Sources/PackRat/Features/Chat/ChatView.swift @@ -22,8 +22,8 @@ struct ChatView: View { } } else { GuestLimitedView( - "Sign In to Use Assistant", - subtitle: "The AI assistant uses your PackRat account and trip context. Your local packs and trips still work in guest mode.", + "Assistant Requires an Account", + subtitle: "PackRat AI uses your account and trip context. Local packs and trips still work in guest mode.", systemImage: "sparkles" ) } diff --git a/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift b/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift index 457e468540..e72efa2381 100644 --- a/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift +++ b/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift @@ -10,8 +10,8 @@ struct FeedView: View { Group { if !authManager.isAuthenticated { GuestLimitedView( - "Sign In to View the Feed", - subtitle: "Community posts, comments, and likes sync with your PackRat account.", + "Community Feed Requires an Account", + subtitle: "Posts, comments, and likes sync with your PackRat account.", systemImage: "person.2" ) } else if viewModel.isLoading && viewModel.posts.isEmpty { diff --git a/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift b/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift index 5af72e6e06..34670322c9 100644 --- a/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift +++ b/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift @@ -119,8 +119,8 @@ struct GuidesView: View { Group { if !authManager.isAuthenticated { GuestLimitedView( - "Sign In to View Guides", - subtitle: "Guides are loaded from your PackRat account when you are online.", + "Guides Require an Account", + subtitle: "Guides sync with your PackRat account when you are online.", systemImage: "book" ) } else if viewModel.isLoading && viewModel.guides.isEmpty { diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift index 70e50bf7a8..d3b1574441 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift @@ -21,7 +21,7 @@ struct PackTemplatesListView: View { Group { if !authManager.isAuthenticated { GuestLimitedView( - "Sign In to Use Templates", + "Templates Require an Account", subtitle: "Pack templates sync with your account so they can be reused across devices.", systemImage: "doc.on.doc" ) diff --git a/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift b/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift index 9d485bbc3c..c217dc45cd 100644 --- a/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift +++ b/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift @@ -64,8 +64,8 @@ struct SeasonSuggestionsView: View { Group { if !authManager.isAuthenticated { GuestLimitedView( - "Sign In for Season Suggestions", - subtitle: "Season-aware suggestions are generated by PackRat's service and are available when you are signed in.", + "Season Suggestions Require an Account", + subtitle: "Season-aware suggestions are generated by PackRat's service and saved to your account.", systemImage: "leaf" ) } else if viewModel.isLoading { diff --git a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift index 43c79a8b65..aced0eacb1 100644 --- a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift +++ b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift @@ -18,7 +18,7 @@ struct TrailConditionsListView: View { Group { if !authManager.isAuthenticated { GuestLimitedView( - "Sign In to View Trail Reports", + "Trail Reports Require an Account", subtitle: "Community trail conditions are shared through your PackRat account.", systemImage: "figure.hiking" ) diff --git a/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift b/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift index 085cfc7b5e..312f504b6c 100644 --- a/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift +++ b/apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift @@ -101,7 +101,7 @@ struct WildlifeView: View { Group { if !authManager.isAuthenticated { GuestLimitedView( - "Sign In to Identify Wildlife", + "Wildlife ID Requires an Account", subtitle: "Wildlife identification uses PackRat's image service. You can still manage local packs and trips as a guest.", systemImage: "pawprint" ) diff --git a/apps/swift/Sources/PackRat/Shared/ErrorView.swift b/apps/swift/Sources/PackRat/Shared/ErrorView.swift index ebaf1d827f..e1402ce4ba 100644 --- a/apps/swift/Sources/PackRat/Shared/ErrorView.swift +++ b/apps/swift/Sources/PackRat/Shared/ErrorView.swift @@ -43,29 +43,77 @@ struct GuestLimitedView: View { let title: String let subtitle: String let systemImage: String + let actionTitle: String - init(_ title: String, subtitle: String, systemImage: String = "person.crop.circle.badge.plus") { + init( + _ title: String, + subtitle: String, + systemImage: String = "person.crop.circle.badge.plus", + actionTitle: String = "Sign In or Create Account" + ) { self.title = title self.subtitle = subtitle self.systemImage = systemImage + self.actionTitle = actionTitle } var body: some View { - UnavailableStateView( - title: title, - subtitle: subtitle, - systemImage: systemImage - ) { - if authManager.isGuest { - Button("Sign In") { - authManager.signOut() + GeometryReader { proxy in + if proxy.size.width < 260 { + compactContent + } else { + UnavailableStateView( + title: title, + subtitle: subtitle, + systemImage: systemImage + ) { + signInButton } - .buttonStyle(.borderedProminent) - .accessibilityIdentifier("guest_limited_sign_in") } } .accessibilityIdentifier("guest_limited_state") } + + private var compactContent: some View { + VStack(spacing: 10) { + Image(systemName: systemImage) + .font(.title2) + .symbolRenderingMode(.hierarchical) + .foregroundStyle(.secondary) + .accessibilityHidden(true) + + VStack(spacing: 4) { + Text(title) + .font(.callout.weight(.semibold)) + .multilineTextAlignment(.center) + .lineLimit(3) + .minimumScaleFactor(0.82) + + Text(subtitle) + .font(.caption) + .foregroundStyle(.secondary) + .multilineTextAlignment(.center) + .lineLimit(4) + .minimumScaleFactor(0.86) + } + + signInButton + .controlSize(.small) + } + .padding(.horizontal, 10) + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + + @ViewBuilder + private var signInButton: some View { + if authManager.isGuest { + Button(actionTitle) { + authManager.signOut() + } + .buttonStyle(.borderedProminent) + .accessibilityIdentifier("guest_limited_sign_in") + } + } } struct ConnectionUnavailableView: View { From 0509b7654a4d2dc2013da21b413e5f3b357cb874 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Tue, 26 May 2026 18:19:20 -0600 Subject: [PATCH 22/60] =?UTF-8?q?=F0=9F=A7=AA=20test(swift):=20seed=20guid?= =?UTF-8?q?e=20visual=20coverage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PackRat/Features/Guides/GuidesView.swift | 31 ++++++++--- .../PackRat/Shared/VisualSampleData.swift | 53 +++++++++++++++++++ 2 files changed, 76 insertions(+), 8 deletions(-) diff --git a/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift b/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift index 34670322c9..5f6842290e 100644 --- a/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift +++ b/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift @@ -78,6 +78,14 @@ final class GuidesViewModel { } func load() async { + if VisualSampleData.isEnabled { + isLoading = false + error = nil + guides = VisualSampleData.guides + categories = VisualSampleData.guideCategories + return + } + if VisualSampleData.isScreenshotCapture { isLoading = false error = nil @@ -141,9 +149,6 @@ struct GuidesView: View { } .navigationTitle("Guides") .searchable(text: $viewModel.searchText, prompt: "Search guides") - .safeAreaInset(edge: .top, spacing: 0) { - if !viewModel.categories.isEmpty { categoryBar } - } .task { if authManager.isAuthenticated { await viewModel.load() } } .refreshable { if authManager.isAuthenticated { await viewModel.load() } } .sheet(item: $selectedGuide) { guide in @@ -181,12 +186,22 @@ struct GuidesView: View { } private var guideList: some View { - List(viewModel.filteredGuides) { guide in - Button { selectedGuide = guide } label: { GuideRowView(guide: guide) } - .buttonStyle(.plain) - .task { - if guide.id == viewModel.filteredGuides.last?.id { await viewModel.loadMore() } + List { + if !viewModel.categories.isEmpty { + Section { + categoryBar + .listRowInsets(EdgeInsets(top: 8, leading: 0, bottom: 8, trailing: 0)) + .listRowSeparator(.hidden) } + } + + ForEach(viewModel.filteredGuides) { guide in + Button { selectedGuide = guide } label: { GuideRowView(guide: guide) } + .buttonStyle(.plain) + .task { + if guide.id == viewModel.filteredGuides.last?.id { await viewModel.loadMore() } + } + } } } } diff --git a/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift b/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift index 4e78f47367..f8a5359df7 100644 --- a/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift +++ b/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift @@ -10,6 +10,59 @@ enum VisualSampleData { || ProcessInfo.processInfo.arguments.contains("--visual-sample-data") } + static var guides: [Guide] { + [ + Guide( + id: "visual-guide-backpacking-checklist", + title: "Three-Season Backpacking Checklist", + content: """ + ## Start with the big systems + + Build the pack around shelter, sleep, water, food, and weather protection. Keep rain layers and navigation reachable before the trail turns exposed. + + - Shelter and stakes + - Quilt or sleeping bag + - Water treatment + - First aid and repair kit + """, + excerpt: "A practical packing order for shoulder-season overnight trips.", + category: "backpacking", + imageUrl: nil, + createdAt: Date.iso8601Now() + ), + Guide( + id: "visual-guide-desert-water", + title: "Desert Water Planning", + content: """ + ## Plan water before gear + + Desert routes change quickly with heat, wind, and road access. Confirm water sources, carry a reserve, and leave dry campsites with enough margin for the next exposed section. + """, + excerpt: "How to set a reliable water margin for hot, exposed routes.", + category: "safety", + imageUrl: nil, + createdAt: Date.iso8601Now() + ), + Guide( + id: "visual-guide-layering", + title: "Layering for Wet Alpine Starts", + content: """ + ## Keep insulation dry + + Pack active insulation separately from camp warmth. A waterproof liner, dry socks, and an accessible shell prevent small weather shifts from becoming trip problems. + """, + excerpt: "Simple layer choices for cold starts, wind, and afternoon rain.", + category: "skills", + imageUrl: nil, + createdAt: Date.iso8601Now() + ), + ] + } + + static var guideCategories: [String] { + Array(Set(guides.compactMap(\.category))).sorted() + } + @MainActor static func apply(to appState: AppState) { let now = Date.iso8601Now() From efb78fe13a51620a371cc2ed60ee65b14c33c621 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Wed, 27 May 2026 01:57:16 -0600 Subject: [PATCH 23/60] =?UTF-8?q?=F0=9F=96=BC=EF=B8=8F=20test(swift):=20ex?= =?UTF-8?q?pand=20visual=20state=20coverage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Features/AIPacks/AIPacksView.swift | 2 + .../Catalog/CatalogItemDetailView.swift | 1 + .../Features/Catalog/CatalogView.swift | 10 +- .../PackRat/Features/Feed/FeedView.swift | 2 + .../Features/Packs/PackDetailView.swift | 13 +- .../Features/Packs/PackItemDetailView.swift | 1 + .../PackRat/Features/Packs/PackItemRow.swift | 57 +++--- .../Features/Trips/TripDetailView.swift | 1 + .../Features/Weather/WeatherView.swift | 11 +- .../VisualScreenshotTests.swift | 183 +++++++++++++++++- .../scripts/capture-visual-screenshots.ts | 84 +++++++- 11 files changed, 325 insertions(+), 40 deletions(-) diff --git a/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift b/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift index 518c55c6c0..8939eb52c2 100644 --- a/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift +++ b/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift @@ -109,6 +109,7 @@ struct AIPacksView: View { Spacer() Button("View") { showingResults = true } .buttonStyle(.bordered) + .accessibilityIdentifier("ai_packs_view_results_button") } .padding(4) } @@ -189,6 +190,7 @@ struct AIPacksView: View { Spacer() Button("View") { showingResults = true } .buttonStyle(.bordered) + .accessibilityIdentifier("ai_packs_view_results_button") } } } diff --git a/apps/swift/Sources/PackRat/Features/Catalog/CatalogItemDetailView.swift b/apps/swift/Sources/PackRat/Features/Catalog/CatalogItemDetailView.swift index 422a8443a0..f561b43fa4 100644 --- a/apps/swift/Sources/PackRat/Features/Catalog/CatalogItemDetailView.swift +++ b/apps/swift/Sources/PackRat/Features/Catalog/CatalogItemDetailView.swift @@ -33,6 +33,7 @@ struct CatalogItemDetailView: View { Button("Add to Pack", systemImage: "plus.circle") { showingAddToPack = true } + .accessibilityIdentifier("catalog_detail_add_to_pack_button") } } .sheet(isPresented: $showingAddToPack) { diff --git a/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift b/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift index a79ccaef1f..92b3358cac 100644 --- a/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift +++ b/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift @@ -83,8 +83,10 @@ struct CatalogItemRow: View { @State private var showingDetail = false var body: some View { - Button { showingDetail = true } label: { rowContent } - .buttonStyle(.plain) + rowContent + .contentShape(Rectangle()) + .onTapGesture { showingDetail = true } + .accessibilityIdentifier("catalog_item_row_\(item.id)") .sheet(isPresented: $showingDetail) { CatalogItemDetailView(item: item, packsViewModel: packsViewModel) } @@ -151,12 +153,12 @@ struct CatalogItemRow: View { } .buttonStyle(.plain) .help("Add to pack") + .accessibilityIdentifier("catalog_item_add_to_pack_\(item.id)") + .accessibilityLabel("Add to Pack") } } .padding(.horizontal, 14) .padding(.vertical, 10) - .accessibilityIdentifier("catalog_item_row_\(item.id)") - .accessibilityLabel(item.displayName) } } diff --git a/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift b/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift index e72efa2381..b28d7caa01 100644 --- a/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift +++ b/apps/swift/Sources/PackRat/Features/Feed/FeedView.swift @@ -150,6 +150,7 @@ struct PostCard: View { } .buttonStyle(.plain) .animation(.spring(response: 0.3), value: isLiked) + .accessibilityIdentifier("feed_like_button_\(post.id)") Button { showingComments = true @@ -159,6 +160,7 @@ struct PostCard: View { .foregroundStyle(.secondary) } .buttonStyle(.plain) + .accessibilityIdentifier("feed_comments_button_\(post.id)") Spacer() diff --git a/apps/swift/Sources/PackRat/Features/Packs/PackDetailView.swift b/apps/swift/Sources/PackRat/Features/Packs/PackDetailView.swift index 46f715d20a..a28285463d 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PackDetailView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PackDetailView.swift @@ -79,12 +79,14 @@ struct PackDetailView: View { .navigationBarTitleDisplayMode(.large) #endif .toolbar { - ToolbarItemGroup(placement: .primaryAction) { + ToolbarItem(placement: .primaryAction) { Button("Add Item", systemImage: "plus") { showingAddItemSheet = true } + .accessibilityIdentifier("pack_detail_add_item_button") .keyboardShortcut("i", modifiers: .command) - + } + ToolbarItem(placement: .primaryAction) { Menu { Button("Weight Analysis", systemImage: "chart.bar.fill") { showingWeightAnalysis = true @@ -111,10 +113,11 @@ struct PackDetailView: View { .accessibilityIdentifier("pack_detail_edit_pack") .keyboardShortcut("e", modifiers: .command) } label: { - Image(systemName: "ellipsis.circle") - .accessibilityIdentifier("pack_detail_more_menu") - .accessibilityLabel("More") + Label("More", systemImage: "ellipsis.circle") + .labelStyle(.iconOnly) } + .accessibilityIdentifier("pack_detail_more_menu") + .accessibilityLabel("More") } } .sheet(isPresented: $showingEditSheet) { diff --git a/apps/swift/Sources/PackRat/Features/Packs/PackItemDetailView.swift b/apps/swift/Sources/PackRat/Features/Packs/PackItemDetailView.swift index ccde9065fb..5998028c9f 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PackItemDetailView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PackItemDetailView.swift @@ -34,6 +34,7 @@ struct PackItemDetailView: View { } ToolbarItem(placement: .primaryAction) { Button("Edit", systemImage: "pencil") { showingEdit = true } + .accessibilityIdentifier("pack_item_detail_edit_button") } } .sheet(isPresented: $showingEdit) { diff --git a/apps/swift/Sources/PackRat/Features/Packs/PackItemRow.swift b/apps/swift/Sources/PackRat/Features/Packs/PackItemRow.swift index 88196ea5ae..0421283b3c 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PackItemRow.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PackItemRow.swift @@ -13,11 +13,44 @@ struct PackItemRow: View { var onDetail: (() -> Void)? = nil var body: some View { + Button { + onDetail?() ?? onEdit() + } label: { + rowContent + } + .buttonStyle(.plain) + .accessibilityIdentifier("pack_item_row_\(item.id)") + .swipeActions(edge: .trailing, allowsFullSwipe: true) { + Button(role: .destructive, action: onDelete) { + Label("Delete", systemImage: "trash") + } + Button(action: onEdit) { + Label("Edit", systemImage: "pencil") + } + .tint(.blue) + } + .contextMenu { + if onDetail != nil { + Button("View Details", systemImage: "info.circle", action: { onDetail?() }) + } + Button("Edit", systemImage: "pencil", action: onEdit) + Divider() + Button("Delete", systemImage: "trash", role: .destructive, action: onDelete) + } + .draggable(item.id) { + Label(item.name, systemImage: "archivebox") + .padding(8) + .background(.regularMaterial, in: RoundedRectangle(cornerRadius: 8)) + } + } + + private var rowContent: some View { HStack(spacing: 12) { VStack(alignment: .leading, spacing: 3) { Text(item.name) .font(.body) .accessibilityLabel(item.name) + .accessibilityIdentifier("pack_item_title_\(item.id)") HStack(spacing: 8) { if !item.displayWeight.isEmpty { @@ -61,30 +94,6 @@ struct PackItemRow: View { } .padding(.horizontal) .padding(.vertical, 10) - .accessibilityIdentifier("pack_item_row_\(item.id)") .contentShape(Rectangle()) - .onTapGesture { onDetail?() ?? onEdit() } - .swipeActions(edge: .trailing, allowsFullSwipe: true) { - Button(role: .destructive, action: onDelete) { - Label("Delete", systemImage: "trash") - } - Button(action: onEdit) { - Label("Edit", systemImage: "pencil") - } - .tint(.blue) - } - .contextMenu { - if onDetail != nil { - Button("View Details", systemImage: "info.circle", action: { onDetail?() }) - } - Button("Edit", systemImage: "pencil", action: onEdit) - Divider() - Button("Delete", systemImage: "trash", role: .destructive, action: onDelete) - } - .draggable(item.id) { - Label(item.name, systemImage: "archivebox") - .padding(8) - .background(.regularMaterial, in: RoundedRectangle(cornerRadius: 8)) - } } } diff --git a/apps/swift/Sources/PackRat/Features/Trips/TripDetailView.swift b/apps/swift/Sources/PackRat/Features/Trips/TripDetailView.swift index b3f6683367..95b4d1209e 100644 --- a/apps/swift/Sources/PackRat/Features/Trips/TripDetailView.swift +++ b/apps/swift/Sources/PackRat/Features/Trips/TripDetailView.swift @@ -79,6 +79,7 @@ struct TripDetailView: View { .toolbar { ToolbarItem(placement: .primaryAction) { Button("Edit", systemImage: "pencil") { showingEditSheet = true } + .accessibilityIdentifier("trip_detail_edit_button") } } .sheet(isPresented: $showingEditSheet) { diff --git a/apps/swift/Sources/PackRat/Features/Weather/WeatherView.swift b/apps/swift/Sources/PackRat/Features/Weather/WeatherView.swift index cb6cbcea03..ec879c3b77 100644 --- a/apps/swift/Sources/PackRat/Features/Weather/WeatherView.swift +++ b/apps/swift/Sources/PackRat/Features/Weather/WeatherView.swift @@ -80,12 +80,13 @@ struct WeatherView: View { ProgressView().controlSize(.small) } } - ToolbarItem(placement: .secondaryAction) { + ToolbarItem(placement: preferencesToolbarPlacement) { NavigationLink { WeatherAlertPreferencesView() } label: { Label("Alert Preferences", systemImage: "slider.horizontal.3") } + .accessibilityIdentifier("weather_alert_preferences_button") } } .sheet(isPresented: $showingAlerts) { @@ -101,6 +102,14 @@ struct WeatherView: View { #endif } + private var preferencesToolbarPlacement: ToolbarItemPlacement { + #if os(iOS) + .topBarTrailing + #else + .secondaryAction + #endif + } + // MARK: - Search private var searchStateContent: some View { diff --git a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift index 346ef0e25b..03d16a7600 100644 --- a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift +++ b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift @@ -103,6 +103,16 @@ final class VisualScreenshotTests: XCTestCase { #endif } + func testAuthenticatedSampleDataExpandedStateSurface() throws { + launchAuthenticated(sampleData: true) + + #if os(iOS) + capturePhoneExpandedSampleDataStates() + #elseif os(macOS) + captureMacExpandedSampleDataStates() + #endif + } + private func captureRegisterAndLoginStates() { if app.buttons["auth_signup_free"].waitForExistence(timeout: 5) { app.buttons["auth_signup_free"].tap() @@ -166,11 +176,21 @@ final class VisualScreenshotTests: XCTestCase { tapAndCapture(identifier: "trips_plan_trip_button", fallbackButton: "Plan Trip", name: "\(prefix)-new-trip-sheet") resetPhoneModalState(mode) - captureHomeAction("Pack Templates", name: "\(prefix)-templates-before-new-template", dismissAfterCapture: false) + captureHomeAction( + "Pack Templates", + name: "\(prefix)-templates-before-new-template", + dismissAfterCapture: false, + destinationIdentifier: "templates_new_template_button" + ) tapAndCapture(identifier: "templates_new_template_button", fallbackButton: "New Template", name: "\(prefix)-new-template-sheet") resetPhoneModalState(mode) - captureHomeAction("Trail Conditions", name: "\(prefix)-trail-conditions-before-submit", dismissAfterCapture: false) + captureHomeAction( + "Trail Conditions", + name: "\(prefix)-trail-conditions-before-submit", + dismissAfterCapture: false, + destinationIdentifier: "trail_conditions_submit_report_button" + ) tapAndCapture(identifier: "trail_conditions_submit_report_button", fallbackButton: "Submit Report", name: "\(prefix)-trail-report-sheet") resetPhoneModalState(mode) @@ -178,7 +198,12 @@ final class VisualScreenshotTests: XCTestCase { if mode != .guest { resetPhoneModalState(mode) - captureHomeAction("Community Feed", name: "\(prefix)-feed-before-compose", dismissAfterCapture: false) + captureHomeAction( + "Community Feed", + name: "\(prefix)-feed-before-compose", + dismissAfterCapture: false, + destinationIdentifier: "feed_new_post_button" + ) tapAndCapture(identifier: "feed_new_post_button", fallbackButton: "New Post", name: "\(prefix)-feed-compose-sheet") } } @@ -203,6 +228,57 @@ final class VisualScreenshotTests: XCTestCase { captureHomeAction("Catalog", name: "79-data-catalog-results") } + private func capturePhoneExpandedSampleDataStates() { + captureTab("Packs", name: "home-before-81-data-pack-expanded") + tapTextAndCapture("Alpine Weekend", name: "81-data-pack-detail-expanded") + tapAndCapture(identifier: "pack_detail_add_item_button", fallbackButton: "Add Item", name: "82-data-pack-add-item-sheet") + openMenuAndCapture(identifier: "pack_detail_more_menu", fallbackButton: "More", name: "83-data-pack-more-menu") + captureTab("Packs", name: "home-before-84-data-pack-item-detail") + tapTextAndCapture("Alpine Weekend", name: "84-data-pack-detail-before-item") + scrollToElement(identifier: "pack_item_row_visual-item-shelter") + tapElementAndCapture(identifier: "pack_item_row_visual-item-shelter", name: "84-data-pack-item-detail", dismissAfterCapture: false) + tapAndCapture(identifier: "pack_item_detail_edit_button", fallbackButton: "Edit", name: "85-data-pack-item-edit-sheet") + dismissPhoneDestination() + + captureTab("Trips", name: "home-before-86-data-trip-expanded") + tapTextAndCapture("Enchantments Thru-Hike", name: "86-data-trip-detail-expanded") + tapAndCapture(identifier: "trip_detail_edit_button", fallbackButton: "Edit", name: "87-data-trip-edit-sheet") + dismissPhoneDestination() + + captureHomeAction("Pack Templates", name: "home-before-88-data-template-expanded", dismissAfterCapture: false) + tapTextAndCapture("Weekend Backpacking", name: "88-data-template-detail-expanded") + tapAndCapture(button: "Apply to Pack", name: "89-data-template-apply-sheet") + dismissPhoneDestination() + + captureHomeAction( + "Catalog", + name: "home-before-90-data-catalog-expanded", + dismissAfterCapture: false, + destinationIdentifier: "catalog_item_row_7001" + ) + tapElementAndCapture(identifier: "catalog_item_row_7001", name: "90-data-catalog-item-detail", dismissAfterCapture: false) + tapAndCapture(identifier: "catalog_detail_add_to_pack_button", fallbackButton: "Add to Pack", name: "91-data-catalog-add-to-pack-sheet") + dismissPhoneDestination() + + captureHomeAction( + "Weather", + name: "home-before-92-data-weather-expanded", + dismissAfterCapture: false, + destinationIdentifier: "weather_alerts_button" + ) + tapAndCapture(identifier: "weather_alerts_button", fallbackButton: "Alerts", name: "92-data-weather-alerts-sheet") + tapElementAndCapture(identifier: "weather_alert_preferences_button", name: "93-data-weather-alert-preferences", dismissAfterCapture: false) + dismissPhoneDestination() + + captureHomeAction( + "Community Feed", + name: "home-before-94-data-feed-expanded", + dismissAfterCapture: false, + destinationIdentifier: "feed_comments_button_9001" + ) + tapElementAndCapture(identifier: "feed_comments_button_9001", name: "94-data-feed-comments-sheet") + } + private func resetPhoneModalState(_ mode: VisualMode) { if mode == .guest { restartLoggedOut() @@ -219,7 +295,12 @@ final class VisualScreenshotTests: XCTestCase { capture(name) } - private func captureHomeAction(_ title: String, name: String, dismissAfterCapture: Bool = true) { + private func captureHomeAction( + _ title: String, + name: String, + dismissAfterCapture: Bool = true, + destinationIdentifier: String? = nil + ) { captureTab("Home", name: "home-before-\(name)") let identifier = "home_action_\(title.lowercased().filter { $0.isLetter || $0.isNumber })" @@ -227,7 +308,14 @@ final class VisualScreenshotTests: XCTestCase { for _ in 0..<8 { if action.exists, action.isHittable { - action.tap() + activate(action) + if let destinationIdentifier { + let destination = app.descendants(matching: .any).matching(identifier: destinationIdentifier).firstMatch + XCTAssertTrue( + destination.waitForExistence(timeout: 5), + "Expected Home action '\(title)' to open '\(destinationIdentifier)' for screenshot \(name)" + ) + } capture(name) if dismissAfterCapture { dismissPhoneDestination() @@ -317,6 +405,48 @@ final class VisualScreenshotTests: XCTestCase { } } + private func captureMacExpandedSampleDataStates() { + resetMacSampleDataSidebar("Packs") + capture("81-data-pack-detail-expanded") + tapAndCapture(identifier: "pack_detail_add_item_button", fallbackButton: "Add Item", name: "82-data-pack-add-item-sheet") + resetMacSampleDataSidebar("Packs") + scrollToElement(identifier: "pack_item_row_visual-item-shelter") + openContextMenuAndCapture(identifier: "pack_item_row_visual-item-shelter", name: "83-data-pack-more-menu") + resetMacSampleDataSidebar("Packs") + scrollToElement(identifier: "pack_item_row_visual-item-shelter") + tapElementAndCapture(identifier: "pack_item_row_visual-item-shelter", name: "84-data-pack-item-detail", dismissAfterCapture: false) + tapAndCapture(identifier: "pack_item_detail_edit_button", fallbackButton: "Edit", name: "85-data-pack-item-edit-sheet") + + resetMacSampleDataSidebar("Trips") + capture("86-data-trip-detail-expanded") + tapAndCapture(identifier: "trip_detail_edit_button", fallbackButton: "Edit", name: "87-data-trip-edit-sheet") + + resetMacSampleDataSidebar("Templates") + capture("88-data-template-detail-expanded") + tapAndCapture(button: "Apply to Pack", name: "89-data-template-apply-sheet") + + resetMacSampleDataSidebar("Catalog") + tapElementAndCapture(identifier: "catalog_item_row_7001", name: "90-data-catalog-item-detail", dismissAfterCapture: false) + resetMacSampleDataSidebar("Catalog") + tapAndCapture(identifier: "catalog_item_add_to_pack_7001", fallbackButton: "Add to Pack", name: "91-data-catalog-add-to-pack-sheet") + + resetMacSampleDataSidebar("Weather") + tapAndCapture(identifier: "weather_alerts_button", fallbackButton: "Alerts", name: "92-data-weather-alerts-sheet") + resetMacSampleDataSidebar("Weather") + tapElementAndCapture(identifier: "weather_alert_preferences_button", name: "93-data-weather-alert-preferences", dismissAfterCapture: false) + + resetMacSampleDataSidebar("Feed") + tapElementAndCapture(identifier: "feed_comments_button_9001", name: "94-data-feed-comments-sheet") + + resetMacSampleDataSidebar("AI Packs") + tapAndCapture(identifier: "ai_packs_view_results_button", fallbackButton: "View", name: "95-data-ai-packs-results-sheet") + } + + private func resetMacSampleDataSidebar(_ label: String) { + launchAuthenticated(sampleData: true) + selectSidebar(label) + } + private func selectSidebar(_ label: String) { let identifierByLabel: [String: String] = [ "Home": "nav_home", @@ -390,6 +520,49 @@ final class VisualScreenshotTests: XCTestCase { dismissPresentedSurface() } + private func tapElementAndCapture( + identifier: String, + name: String, + dismissAfterCapture: Bool = true + ) { + let element = app.descendants(matching: .any).matching(identifier: identifier).firstMatch + XCTAssertTrue(element.waitForExistence(timeout: 5), "Expected element identifier '\(identifier)' for screenshot \(name)") + activate(element) + capture(name) + if dismissAfterCapture { + dismissPresentedSurface() + } + } + + private func scrollToElement(identifier: String, maxSwipes: Int = 5) { + let element = app.descendants(matching: .any).matching(identifier: identifier).firstMatch + for _ in 0.. DATA_DETAIL_SCREENSHOT_RE.test(fileName), + matches: (fileName) => + DATA_DETAIL_SCREENSHOT_RE.test(fileName) || + fileName.startsWith('8') || + fileName.startsWith('9'), + }, + { + suffix: 'expanded', + title: 'Expanded Menus, Sheets, and Controls', + matches: (fileName) => fileName.startsWith('8') || fileName.startsWith('9'), }, { suffix: 'modals', @@ -257,6 +265,7 @@ function requiredScreenshots(platform: Platform): ScreenshotRequirement[] { area: 'data', flow: 'Catalog seeded result state', }), + ...expandedStateRequirements(platform), ] : [ requirement('71-data-pack-detail', { area: 'crud', flow: 'Pack split-view detail' }), @@ -277,6 +286,7 @@ function requiredScreenshots(platform: Platform): ScreenshotRequirement[] { area: 'ai', flow: 'AI packs confirmation dialog', }), + ...expandedStateRequirements(platform), ]; return [ @@ -287,6 +297,78 @@ function requiredScreenshots(platform: Platform): ScreenshotRequirement[] { ]; } +function expandedStateRequirements(platform: Platform): ScreenshotRequirement[] { + const common = [ + requirement('81-data-pack-detail-expanded', { + area: 'crud', + flow: 'Pack detail expanded review baseline', + }), + requirement('82-data-pack-add-item-sheet', { + area: 'crud', + flow: 'Pack item create sheet from pack detail', + }), + requirement('83-data-pack-more-menu', { + area: 'modal', + flow: 'Pack detail more menu', + }), + requirement('84-data-pack-item-detail', { + area: 'crud', + flow: 'Pack item detail sheet', + }), + requirement('85-data-pack-item-edit-sheet', { + area: 'crud', + flow: 'Pack item edit sheet', + }), + requirement('86-data-trip-detail-expanded', { + area: 'crud', + flow: 'Trip detail expanded review baseline', + }), + requirement('87-data-trip-edit-sheet', { + area: 'crud', + flow: 'Trip edit sheet', + }), + requirement('88-data-template-detail-expanded', { + area: 'crud', + flow: 'Template detail expanded review baseline', + }), + requirement('89-data-template-apply-sheet', { + area: 'crud', + flow: 'Apply template to pack sheet', + }), + requirement('90-data-catalog-item-detail', { + area: 'data', + flow: 'Catalog item detail sheet', + }), + requirement('91-data-catalog-add-to-pack-sheet', { + area: 'crud', + flow: 'Add catalog item to pack sheet', + }), + requirement('92-data-weather-alerts-sheet', { + area: 'modal', + flow: 'Weather alerts sheet with active alert', + }), + requirement('93-data-weather-alert-preferences', { + area: 'modal', + flow: 'Weather alert preferences controls', + }), + requirement('94-data-feed-comments-sheet', { + area: 'crud', + flow: 'Feed comments sheet', + }), + ]; + + if (platform === 'macos') { + common.push( + requirement('95-data-ai-packs-results-sheet', { + area: 'ai', + flow: 'Generated AI packs result sheet', + }), + ); + } + + return common; +} + function surfaceArea(surface: string): ScreenshotRequirement['area'] { if (['assistant', 'season-suggestions', 'wildlife', 'ai-packs'].includes(surface)) return 'ai'; if (['packs', 'trips', 'pack-templates', 'trail-conditions', 'feed'].includes(surface)) From 288fa16449047bee5ff489191da10738b840d9e1 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Wed, 27 May 2026 13:52:28 -0600 Subject: [PATCH 24/60] =?UTF-8?q?=F0=9F=96=BC=EF=B8=8F=20test(swift):=20cl?= =?UTF-8?q?arify=20guest=20visual=20states?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PackTemplates/PackTemplatesView.swift | 4 + .../Features/Search/GlobalSearchView.swift | 1 + .../TrailConditions/TrailConditionsView.swift | 4 + .../PackRat/Navigation/AppNavigation.swift | 16 +++- .../VisualScreenshotTests.swift | 81 ++++++++++++++----- .../scripts/capture-visual-screenshots.ts | 37 ++++++++- 6 files changed, 119 insertions(+), 24 deletions(-) diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift index d3b1574441..9f1d8ae555 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift @@ -20,11 +20,15 @@ struct PackTemplatesListView: View { var body: some View { Group { if !authManager.isAuthenticated { + #if os(macOS) + Color.clear + #else GuestLimitedView( "Templates Require an Account", subtitle: "Pack templates sync with your account so they can be reused across devices.", systemImage: "doc.on.doc" ) + #endif } else if viewModel.isLoading && viewModel.templates.isEmpty { ProgressView("Loading templates…").frame(maxWidth: .infinity, maxHeight: .infinity) } else if let error = viewModel.error, viewModel.templates.isEmpty { diff --git a/apps/swift/Sources/PackRat/Features/Search/GlobalSearchView.swift b/apps/swift/Sources/PackRat/Features/Search/GlobalSearchView.swift index 3f09c30d49..f8e8bea996 100644 --- a/apps/swift/Sources/PackRat/Features/Search/GlobalSearchView.swift +++ b/apps/swift/Sources/PackRat/Features/Search/GlobalSearchView.swift @@ -94,6 +94,7 @@ struct GlobalSearchView: View { } .buttonStyle(.plain) .accessibilityIdentifier("global_search_result_\(result.id)") + .accessibilityLabel("\(result.title), \(result.typeName)") } .listStyle(.inset) } diff --git a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift index aced0eacb1..f3d8b3b345 100644 --- a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift +++ b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift @@ -17,11 +17,15 @@ struct TrailConditionsListView: View { var body: some View { Group { if !authManager.isAuthenticated { + #if os(macOS) + Color.clear + #else GuestLimitedView( "Trail Reports Require an Account", subtitle: "Community trail conditions are shared through your PackRat account.", systemImage: "figure.hiking" ) + #endif } else if viewModel.isLoading && viewModel.reports.isEmpty { ProgressView("Loading reports…").frame(maxWidth: .infinity, maxHeight: .infinity) } else if let error = viewModel.error, viewModel.reports.isEmpty { diff --git a/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift b/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift index 9fc0441d86..440419f96b 100644 --- a/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift +++ b/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift @@ -233,14 +233,26 @@ struct AppNavigation: View { placeholder("Select a Trip", symbol: "map") } case .templates: - if let id = appState.selectedTemplateId, + if !authManager.isAuthenticated { + GuestLimitedView( + "Templates Require an Account", + subtitle: "Pack templates sync with your account so they can be reused across devices.", + systemImage: "doc.on.doc" + ) + } else if let id = appState.selectedTemplateId, let t = appState.templatesVM.templates.first(where: { $0.id == id }) { PackTemplateDetailView(template: t, viewModel: appState.templatesVM, packsVM: appState.packsVM) } else { placeholder("Select a Template", symbol: "doc.on.doc") } case .trailConditions: - if let id = appState.selectedReportId, + if !authManager.isAuthenticated { + GuestLimitedView( + "Trail Reports Require an Account", + subtitle: "Community trail conditions are shared through your PackRat account.", + systemImage: "figure.hiking" + ) + } else if let id = appState.selectedReportId, let report = appState.trailConditionsVM.reports.first(where: { $0.id == id }) { TrailConditionDetailView(report: report) } else { diff --git a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift index 03d16a7600..491d88342b 100644 --- a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift +++ b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift @@ -176,22 +176,30 @@ final class VisualScreenshotTests: XCTestCase { tapAndCapture(identifier: "trips_plan_trip_button", fallbackButton: "Plan Trip", name: "\(prefix)-new-trip-sheet") resetPhoneModalState(mode) - captureHomeAction( - "Pack Templates", - name: "\(prefix)-templates-before-new-template", - dismissAfterCapture: false, - destinationIdentifier: "templates_new_template_button" - ) - tapAndCapture(identifier: "templates_new_template_button", fallbackButton: "New Template", name: "\(prefix)-new-template-sheet") + if mode == .guest { + captureGuestLimitedHomeAction("Pack Templates", name: "50-guest-limit-new-template") + } else { + captureHomeAction( + "Pack Templates", + name: "\(prefix)-templates-before-new-template", + dismissAfterCapture: false, + destinationIdentifier: "templates_new_template_button" + ) + tapAndCapture(identifier: "templates_new_template_button", fallbackButton: "New Template", name: "\(prefix)-new-template-sheet") + } resetPhoneModalState(mode) - captureHomeAction( - "Trail Conditions", - name: "\(prefix)-trail-conditions-before-submit", - dismissAfterCapture: false, - destinationIdentifier: "trail_conditions_submit_report_button" - ) - tapAndCapture(identifier: "trail_conditions_submit_report_button", fallbackButton: "Submit Report", name: "\(prefix)-trail-report-sheet") + if mode == .guest { + captureGuestLimitedHomeAction("Trail Conditions", name: "50-guest-limit-trail-report") + } else { + captureHomeAction( + "Trail Conditions", + name: "\(prefix)-trail-conditions-before-submit", + dismissAfterCapture: false, + destinationIdentifier: "trail_conditions_submit_report_button" + ) + tapAndCapture(identifier: "trail_conditions_submit_report_button", fallbackButton: "Submit Report", name: "\(prefix)-trail-report-sheet") + } resetPhoneModalState(mode) captureHomeAction("Weather", name: "\(prefix)-weather-before-alerts", dismissAfterCapture: false) @@ -327,6 +335,12 @@ final class VisualScreenshotTests: XCTestCase { XCTFail("Expected Home action '\(title)' for screenshot \(name)") } + private func captureGuestLimitedHomeAction(_ title: String, name: String) { + captureHomeAction(title, name: name, dismissAfterCapture: false) + assertExpectedAccountRequiredState(for: name) + dismissPhoneDestination() + } + private func dismissPhoneDestination() { if app.buttons["Done"].exists { app.buttons["Done"].tap() @@ -391,10 +405,20 @@ final class VisualScreenshotTests: XCTestCase { tapAndCapture(identifier: "trips_plan_trip_button", fallbackButton: "Plan Trip", name: "\(prefix)-new-trip-sheet") selectSidebar("Templates") - tapAndCapture(identifier: "templates_new_template_button", fallbackButton: "New Template", name: "\(prefix)-new-template-sheet") + if mode == .guest { + capture("50-guest-limit-new-template") + assertExpectedAccountRequiredState(for: "50-guest-limit-new-template") + } else { + tapAndCapture(identifier: "templates_new_template_button", fallbackButton: "New Template", name: "\(prefix)-new-template-sheet") + } selectSidebar("Trail Conditions") - tapAndCapture(identifier: "trail_conditions_submit_report_button", fallbackButton: "Submit Report", name: "\(prefix)-trail-report-sheet") + if mode == .guest { + capture("50-guest-limit-trail-report") + assertExpectedAccountRequiredState(for: "50-guest-limit-trail-report") + } else { + tapAndCapture(identifier: "trail_conditions_submit_report_button", fallbackButton: "Submit Report", name: "\(prefix)-trail-report-sheet") + } selectSidebar("Weather") capture("\(prefix)-weather-before-alerts") @@ -501,9 +525,10 @@ final class VisualScreenshotTests: XCTestCase { #else searchField.typeText(query) #endif - let resultPredicate = NSPredicate(format: "label CONTAINS %@", "Alpine Weekend") - let resultExists = app.staticTexts["Alpine Weekend"].waitForExistence(timeout: 2) - || app.buttons.matching(resultPredicate).firstMatch.waitForExistence(timeout: 3) + let sampleResult = app.descendants(matching: .any) + .matching(identifier: "global_search_result_pack-visual-pack-alpine") + .firstMatch + let resultExists = sampleResult.waitForExistence(timeout: 5) capture("\(name)-results") XCTAssertTrue(resultExists, "Expected global search to show sample pack result") } @@ -748,6 +773,24 @@ final class VisualScreenshotTests: XCTestCase { } } + private func assertExpectedAccountRequiredState(for screenshotName: String) { + let expectedIdentifiers = [ + "guest_limited_state", + "account_required_state", + "account_required_error_state", + ] + let hasExpectedIdentifier = expectedIdentifiers.contains { identifier in + app.descendants(matching: .any)[identifier].exists + } + let hasExpectedText = app.staticTexts["Sign In Required"].exists + || app.staticTexts["Requires an Account"].exists + || app.staticTexts.matching(NSPredicate(format: "label CONTAINS[c] %@", "Requires an Account")).firstMatch.exists + XCTAssertTrue( + hasExpectedIdentifier || hasExpectedText, + "Screenshot \(screenshotName) should show an intentional guest/account-required state" + ) + } + private func shouldRequireHealthyContent(for screenshotName: String) -> Bool { if screenshotName.hasPrefix("00-") || screenshotName.hasPrefix("01-") diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index 130927eabc..f9f74e13d7 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -98,7 +98,13 @@ const CONTACT_SHEET_GROUPS: ContactSheetGroup[] = [ matches: (fileName) => fileName.startsWith('03-') || fileName.startsWith('10-guest-') || - fileName.startsWith('50-guest-'), + fileName.startsWith('50-guest-modal-') || + fileName.startsWith('50-guest-limit-'), + }, + { + suffix: 'guest-limits', + title: 'Guest Account Limits', + matches: (fileName) => fileName.startsWith('50-guest-limit-'), }, { suffix: 'auth', @@ -385,17 +391,42 @@ function modalSet(prefix: string, includesAccountBackedCompose: boolean): Screen }), requirement(`${prefix}-new-pack-sheet`, { area: 'crud', flow: 'Pack create form' }), requirement(`${prefix}-new-trip-sheet`, { area: 'crud', flow: 'Trip create form' }), - requirement(`${prefix}-new-template-sheet`, { area: 'crud', flow: 'Template create form' }), - requirement(`${prefix}-trail-report-sheet`, { area: 'crud', flow: 'Trail report create form' }), requirement(`${prefix}-weather-before-alerts`, { area: 'modal', flow: 'Weather alerts entry state', }), ]; + if (prefix === '80-data-modal') { + requirements.push( + requirement(`${prefix}-global-search-results`, { + area: 'navigation', + flow: 'Global search populated results', + }), + ); + } if (includesAccountBackedCompose) { requirements.push( + requirement(`${prefix}-new-template-sheet`, { + area: 'crud', + flow: 'Template create form', + }), + requirement(`${prefix}-trail-report-sheet`, { + area: 'crud', + flow: 'Trail report create form', + }), requirement(`${prefix}-feed-compose-sheet`, { area: 'crud', flow: 'Feed compose form' }), ); + } else { + requirements.push( + requirement('50-guest-limit-new-template', { + area: 'auth', + flow: 'Guest template create account limit', + }), + requirement('50-guest-limit-trail-report', { + area: 'auth', + flow: 'Guest trail report account limit', + }), + ); } return requirements; } From 2efd866654b2399d138b0a2ecdbd9842e6cb69b1 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Wed, 27 May 2026 19:27:51 -0600 Subject: [PATCH 25/60] =?UTF-8?q?=F0=9F=92=84=20style(swift):=20widen=20ma?= =?UTF-8?q?c=20form=20sheets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PackRat/Features/Feed/ComposePostView.swift | 2 +- .../PackTemplates/PackTemplateFormView.swift | 4 +--- .../PackTemplateItemFormView.swift | 4 +--- .../PackTemplates/PackTemplatesView.swift | 4 +--- .../PackRat/Features/Packs/PackFormView.swift | 4 +--- .../Features/Packs/PackItemFormView.swift | 4 +--- .../TrailConditions/TrailConditionsView.swift | 4 +--- .../PackRat/Features/Trips/TripFormView.swift | 4 +--- .../PackRat/Shared/FormSheetSizing.swift | 17 +++++++++++++++++ 9 files changed, 25 insertions(+), 22 deletions(-) create mode 100644 apps/swift/Sources/PackRat/Shared/FormSheetSizing.swift diff --git a/apps/swift/Sources/PackRat/Features/Feed/ComposePostView.swift b/apps/swift/Sources/PackRat/Features/Feed/ComposePostView.swift index 6aa3ecb379..1cd86c704c 100644 --- a/apps/swift/Sources/PackRat/Features/Feed/ComposePostView.swift +++ b/apps/swift/Sources/PackRat/Features/Feed/ComposePostView.swift @@ -70,7 +70,7 @@ struct ComposePostView: View { } } } - .frame(minWidth: 400, minHeight: 260) + .formSheetSize(minWidth: 500, minHeight: 360) } private func post() async { diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateFormView.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateFormView.swift index 0309910486..f1e33126ce 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateFormView.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateFormView.swift @@ -66,9 +66,7 @@ struct PackTemplateFormView: View { } } } - #if os(macOS) - .frame(minWidth: 360, minHeight: 280) - #endif + .formSheetSize(minWidth: 500, minHeight: 380) } private func save() async { diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateItemFormView.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateItemFormView.swift index e6da984c2b..5e7d5b1fd7 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateItemFormView.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateItemFormView.swift @@ -89,9 +89,7 @@ struct PackTemplateItemFormView: View { } } } - #if os(macOS) - .frame(minWidth: 360, minHeight: 360) - #endif + .formSheetSize(minWidth: 540, minHeight: 520) } private func save() async { diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift index 9f1d8ae555..b27809e987 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift @@ -376,9 +376,7 @@ private struct ApplyTemplateSheet: View { } } } - #if os(macOS) - .frame(minWidth: 340, minHeight: 280) - #endif + .formSheetSize(minWidth: 480, minHeight: 420) } } diff --git a/apps/swift/Sources/PackRat/Features/Packs/PackFormView.swift b/apps/swift/Sources/PackRat/Features/Packs/PackFormView.swift index 8871d83317..e824f4a14e 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PackFormView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PackFormView.swift @@ -72,9 +72,7 @@ struct PackFormView: View { } .onAppear { prefill() } } - #if os(macOS) - .frame(minWidth: 400, minHeight: 300) - #endif + .formSheetSize(minWidth: 500, minHeight: 400) } private func prefill() { diff --git a/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift b/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift index c1e184ffed..75c2ab39fa 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift @@ -47,9 +47,7 @@ struct PackItemFormView: View { } .onAppear { prefill() } } - #if os(macOS) - .frame(minWidth: 420, minHeight: 460) - #endif + .formSheetSize(minWidth: 540, minHeight: 560) } private var formContent: some View { diff --git a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift index f3d8b3b345..92b7da4739 100644 --- a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift +++ b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift @@ -300,9 +300,7 @@ struct SubmitTrailConditionView: View { } } } - #if os(macOS) - .frame(minWidth: 420, minHeight: 500) - #endif + .formSheetSize(minWidth: 560, minHeight: 680) } private func submit() { diff --git a/apps/swift/Sources/PackRat/Features/Trips/TripFormView.swift b/apps/swift/Sources/PackRat/Features/Trips/TripFormView.swift index 8242cc30bf..63dbfb457b 100644 --- a/apps/swift/Sources/PackRat/Features/Trips/TripFormView.swift +++ b/apps/swift/Sources/PackRat/Features/Trips/TripFormView.swift @@ -142,9 +142,7 @@ struct TripFormView: View { } } } - #if os(macOS) - .frame(minWidth: 400, minHeight: 420) - #endif + .formSheetSize(minWidth: 560, minHeight: 620) } private func prefill() { diff --git a/apps/swift/Sources/PackRat/Shared/FormSheetSizing.swift b/apps/swift/Sources/PackRat/Shared/FormSheetSizing.swift new file mode 100644 index 0000000000..789428fb97 --- /dev/null +++ b/apps/swift/Sources/PackRat/Shared/FormSheetSizing.swift @@ -0,0 +1,17 @@ +import SwiftUI + +extension View { + @ViewBuilder + func formSheetSize(minWidth: CGFloat = 520, idealWidth: CGFloat? = nil, minHeight: CGFloat = 520, idealHeight: CGFloat? = nil) -> some View { + #if os(macOS) + self.frame( + minWidth: minWidth, + idealWidth: idealWidth ?? minWidth, + minHeight: minHeight, + idealHeight: idealHeight ?? minHeight + ) + #else + self + #endif + } +} From 9305a836ee4fef57524d6e3cbf26954b26d3343e Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Wed, 27 May 2026 19:43:34 -0600 Subject: [PATCH 26/60] =?UTF-8?q?=F0=9F=92=84=20style(swift):=20standardiz?= =?UTF-8?q?e=20secondary=20sheets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/PackRat/Features/AIPacks/AIPacksView.swift | 4 +--- .../Sources/PackRat/Features/Catalog/CatalogView.swift | 2 +- .../Sources/PackRat/Features/Packs/GapAnalysisSheet.swift | 4 +--- .../Features/SeasonSuggestions/SeasonSuggestionsView.swift | 4 +--- .../PackRat/Features/Shopping/ShoppingListView.swift | 6 ++---- .../Sources/PackRat/Features/Trips/LocationSearchView.swift | 4 +--- .../PackRat/Features/Weather/WeatherAlertsView.swift | 4 +--- 7 files changed, 8 insertions(+), 20 deletions(-) diff --git a/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift b/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift index 8939eb52c2..d84c8812bb 100644 --- a/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift +++ b/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift @@ -257,9 +257,7 @@ private struct GeneratedPacksSheet: View { } } } - #if os(macOS) - .frame(minWidth: 420, minHeight: 380) - #endif + .formSheetSize(minWidth: 520, minHeight: 480) } } diff --git a/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift b/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift index 92b3358cac..f977320138 100644 --- a/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift +++ b/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift @@ -222,7 +222,7 @@ struct AddCatalogItemToPackSheet: View { } } } - .frame(minWidth: 360, minHeight: 300) + .formSheetSize(minWidth: 480, minHeight: 380) } private func addToPack() async { diff --git a/apps/swift/Sources/PackRat/Features/Packs/GapAnalysisSheet.swift b/apps/swift/Sources/PackRat/Features/Packs/GapAnalysisSheet.swift index ac2d5e7743..bf80fb3a8a 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/GapAnalysisSheet.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/GapAnalysisSheet.swift @@ -38,9 +38,7 @@ struct GapAnalysisSheet: View { } } } - #if os(macOS) - .frame(minWidth: 400, minHeight: 480) - #endif + .formSheetSize(minWidth: 520, minHeight: 560) } // MARK: - Setup Form diff --git a/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift b/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift index c217dc45cd..771f94c389 100644 --- a/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift +++ b/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift @@ -100,9 +100,7 @@ struct SeasonSuggestionsView: View { } } } - #if os(macOS) - .frame(minWidth: 400, minHeight: 500) - #endif + .formSheetSize(minWidth: 520, minHeight: 560) } private var locationForm: some View { diff --git a/apps/swift/Sources/PackRat/Features/Shopping/ShoppingListView.swift b/apps/swift/Sources/PackRat/Features/Shopping/ShoppingListView.swift index 4c13866867..eb8861b3d5 100644 --- a/apps/swift/Sources/PackRat/Features/Shopping/ShoppingListView.swift +++ b/apps/swift/Sources/PackRat/Features/Shopping/ShoppingListView.swift @@ -92,7 +92,7 @@ struct ShoppingListView: View { } } #if os(macOS) - .frame(minWidth: 380, minHeight: 480) + .formSheetSize(minWidth: 440, minHeight: 520) #endif } @@ -215,9 +215,7 @@ private struct AddShoppingItemSheet: View { } } } - #if os(macOS) - .frame(minWidth: 340, minHeight: 320) - #endif + .formSheetSize(minWidth: 460, minHeight: 420) } private func save() { diff --git a/apps/swift/Sources/PackRat/Features/Trips/LocationSearchView.swift b/apps/swift/Sources/PackRat/Features/Trips/LocationSearchView.swift index 04b6c6377b..1591801e1a 100644 --- a/apps/swift/Sources/PackRat/Features/Trips/LocationSearchView.swift +++ b/apps/swift/Sources/PackRat/Features/Trips/LocationSearchView.swift @@ -60,9 +60,7 @@ struct LocationSearchView: View { } } } - #if os(macOS) - .frame(minWidth: 420, minHeight: 380) - #endif + .formSheetSize(minWidth: 520, minHeight: 460) } private func search() { diff --git a/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertsView.swift b/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertsView.swift index aaf6120422..d872809da3 100644 --- a/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertsView.swift +++ b/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertsView.swift @@ -32,9 +32,7 @@ struct WeatherAlertsView: View { } } } - #if os(macOS) - .frame(minWidth: 480, minHeight: 360) - #endif + .formSheetSize(minWidth: 520, minHeight: 420) } } From fcb36cd497621a638133cd106c76ad684c5e3085 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Wed, 27 May 2026 22:07:36 -0600 Subject: [PATCH 27/60] =?UTF-8?q?=F0=9F=96=BC=EF=B8=8F=20test(swift):=20co?= =?UTF-8?q?ver=20offline=20and=20ai=20visual=20states?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PackRat/Features/Home/HomeView.swift | 1 + .../PackRat/Network/NetworkMonitor.swift | 16 +++- .../VisualScreenshotTests.swift | 78 ++++++++++++++++++- .../scripts/capture-visual-screenshots.ts | 34 +++++++- 4 files changed, 123 insertions(+), 6 deletions(-) diff --git a/apps/swift/Sources/PackRat/Features/Home/HomeView.swift b/apps/swift/Sources/PackRat/Features/Home/HomeView.swift index 504ae71a86..93c30eef07 100644 --- a/apps/swift/Sources/PackRat/Features/Home/HomeView.swift +++ b/apps/swift/Sources/PackRat/Features/Home/HomeView.swift @@ -307,6 +307,7 @@ struct HomeView: View { HomeAction(title: "Trips", subtitle: upcomingTripsSubtitle, symbol: "map.fill", color: .green) { appState.navItem = .trips }, HomeAction(title: "Weather", subtitle: "Forecasts & alerts", symbol: "cloud.sun.fill", color: .cyan) { appState.navItem = .weather }, HomeAction(title: "AI Assistant", subtitle: "Ask about gear & trips", symbol: "bubble.left.and.text.bubble.right", color: .purple) { appState.navItem = .chat }, + HomeAction(title: "AI Packs", subtitle: "Generate pack ideas", symbol: "sparkles", color: .purple) { appState.navItem = .aiPacks }, HomeAction(title: "Gear Inventory", subtitle: inventorySubtitle, symbol: "shippingbox.fill", color: .orange) { appState.navItem = .gearInventory }, HomeAction(title: "Season Suggestions", subtitle: "AI-powered packing tips", symbol: "leaf.fill", color: .mint) { showingSeasonSuggestions = true }, HomeAction( diff --git a/apps/swift/Sources/PackRat/Network/NetworkMonitor.swift b/apps/swift/Sources/PackRat/Network/NetworkMonitor.swift index 315cd75d5e..5269f9fe09 100644 --- a/apps/swift/Sources/PackRat/Network/NetworkMonitor.swift +++ b/apps/swift/Sources/PackRat/Network/NetworkMonitor.swift @@ -12,13 +12,25 @@ final class NetworkMonitor { private let monitor: NWPathMonitor private let queue = DispatchQueue(label: "world.packrat.netmonitor") + private let forceOffline = ProcessInfo.processInfo.arguments.contains("--force-offline") private init() { + if forceOffline { + isConnected = false + connectionType = nil + } + monitor = NWPathMonitor() monitor.pathUpdateHandler = { [weak self] path in Task { @MainActor [weak self] in - self?.isConnected = path.status == .satisfied - self?.connectionType = [.wifi, .cellular, .wiredEthernet] + guard let self else { return } + guard !self.forceOffline else { + self.isConnected = false + self.connectionType = nil + return + } + self.isConnected = path.status == .satisfied + self.connectionType = [.wifi, .cellular, .wiredEthernet] .first { path.usesInterfaceType($0) } } } diff --git a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift index 491d88342b..6741c7a3b9 100644 --- a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift +++ b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift @@ -113,6 +113,34 @@ final class VisualScreenshotTests: XCTestCase { #endif } + func testOfflineVisualSurface() throws { + launchLoggedOut(forceOffline: true) + enterGuestMode() + capture("40-offline-guest-home") + + launchAuthenticated(forceOffline: true) + capture("41-offline-auth-home") + + launchAuthenticated(sampleData: true, forceOffline: true) + capture("42-offline-data-home") + + #if os(iOS) + captureTab("Packs", name: "43-offline-data-packs") + captureTab("Trips", name: "44-offline-data-trips") + captureTab("Assistant", name: "45-offline-data-assistant") + captureHomeAction("Weather", name: "46-offline-data-weather") + #elseif os(macOS) + selectSidebar("Packs") + capture("43-offline-data-packs") + selectSidebar("Trips") + capture("44-offline-data-trips") + selectSidebar("Assistant") + capture("45-offline-data-assistant") + selectSidebar("Weather") + capture("46-offline-data-weather") + #endif + } + private func captureRegisterAndLoginStates() { if app.buttons["auth_signup_free"].waitForExistence(timeout: 5) { app.buttons["auth_signup_free"].tap() @@ -151,6 +179,7 @@ final class VisualScreenshotTests: XCTestCase { captureTab("Trips", name: "\(prefix)-trips\(suffix)") captureTab("Assistant", name: "\(prefix)-assistant\(suffix)") + captureHomeAction("AI Packs", name: "\(prefix)-ai-packs\(suffix)") captureHomeAction("Gear Inventory", name: "\(prefix)-gear-inventory\(suffix)") captureHomeAction("Season Suggestions", name: "\(prefix)-season-suggestions\(suffix)") captureHomeAction("Pack Templates", name: "\(prefix)-pack-templates\(suffix)") @@ -285,6 +314,14 @@ final class VisualScreenshotTests: XCTestCase { destinationIdentifier: "feed_comments_button_9001" ) tapElementAndCapture(identifier: "feed_comments_button_9001", name: "94-data-feed-comments-sheet") + + captureHomeAction( + "AI Packs", + name: "home-before-95-data-ai-packs-expanded", + dismissAfterCapture: false, + destinationIdentifier: "ai_packs_view_results_button" + ) + tapAndCapture(identifier: "ai_packs_view_results_button", fallbackButton: "View", name: "95-data-ai-packs-results-sheet") } private func resetPhoneModalState(_ mode: VisualMode) { @@ -309,7 +346,8 @@ final class VisualScreenshotTests: XCTestCase { dismissAfterCapture: Bool = true, destinationIdentifier: String? = nil ) { - captureTab("Home", name: "home-before-\(name)") + let baselineName = name.hasPrefix("home-before-") ? name : "home-before-\(name)" + captureTab("Home", name: baselineName) let identifier = "home_action_\(title.lowercased().filter { $0.isLetter || $0.isNumber })" let action = app.buttons[identifier] @@ -374,6 +412,8 @@ final class VisualScreenshotTests: XCTestCase { selectSidebar(label) capture(name) } + + captureMacHomeAction("Season Suggestions", name: "\(prefix)-season-suggestions\(suffix)") } private func captureMacSampleDataDetails() { @@ -500,6 +540,25 @@ final class VisualScreenshotTests: XCTestCase { } XCTFail("No sidebar identifier mapped for '\(label)'") } + + private func captureMacHomeAction(_ title: String, name: String, dismissAfterCapture: Bool = true) { + selectSidebar("Home") + let identifier = "home_action_\(title.lowercased().filter { $0.isLetter || $0.isNumber })" + let action = app.buttons[identifier] + + for _ in 0..<8 { + if action.exists, action.isHittable { + activate(action) + capture(name) + if dismissAfterCapture { + dismissPresentedSurface() + } + return + } + app.swipeUp() + } + XCTFail("Expected Home action '\(title)' for screenshot \(name)") + } #endif private func captureGlobalSearch(name: String, query: String? = nil) { @@ -670,7 +729,7 @@ final class VisualScreenshotTests: XCTestCase { #endif } - private func launchAuthenticated(sampleData: Bool = false) { + private func launchAuthenticated(sampleData: Bool = false, forceOffline: Bool = false) { let bundle = Bundle(for: VisualScreenshotTests.self) let email = (bundle.object(forInfoDictionaryKey: "PACKRAT_E2E_EMAIL") as? String) ?? "e2e@packrat.test" @@ -692,6 +751,9 @@ final class VisualScreenshotTests: XCTestCase { app.launchArguments.append("--visual-sample-data") app.launchEnvironment["PACKRAT_VISUAL_SAMPLE_DATA"] = "1" } + if forceOffline { + app.launchArguments.append("--force-offline") + } app.launchEnvironment["PACKRAT_E2E_ROLE"] = "ADMIN" app.launch() #if os(macOS) @@ -709,13 +771,16 @@ final class VisualScreenshotTests: XCTestCase { #endif } - private func launchLoggedOut() { + private func launchLoggedOut(forceOffline: Bool = false) { app = XCUIApplication() app.launchArguments = [ "--disable-animations", "--use-userdefaults-auth", "--reset-auth", ] + if forceOffline { + app.launchArguments.append("--force-offline") + } app.launchEnvironment["PACKRAT_VISUAL_SCREENSHOTS"] = "1" app.launch() #if os(macOS) @@ -798,6 +863,13 @@ final class VisualScreenshotTests: XCTestCase { || screenshotName.hasPrefix("02a-") || screenshotName.hasPrefix("03-") || screenshotName.hasPrefix("10-guest-") + || screenshotName.hasPrefix("40-offline-") + || screenshotName.hasPrefix("41-offline-") + || screenshotName.hasPrefix("42-offline-") + || screenshotName.hasPrefix("43-offline-") + || screenshotName.hasPrefix("44-offline-") + || screenshotName.hasPrefix("45-offline-") + || screenshotName.hasPrefix("46-offline-") || screenshotName.hasPrefix("50-guest-") { return false } diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index f9f74e13d7..d311305d99 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -56,6 +56,7 @@ const IOS_SURFACES = [ 'packs', 'trips', 'assistant', + 'ai-packs', 'gear-inventory', 'season-suggestions', 'pack-templates', @@ -81,6 +82,7 @@ const MAC_SURFACES = [ 'gear-inventory', 'wildlife', 'ai-packs', + 'season-suggestions', ] as const; const CONTACT_SHEET_GROUPS: ContactSheetGroup[] = [ { @@ -106,6 +108,11 @@ const CONTACT_SHEET_GROUPS: ContactSheetGroup[] = [ title: 'Guest Account Limits', matches: (fileName) => fileName.startsWith('50-guest-limit-'), }, + { + suffix: 'offline', + title: 'Offline and Cached Data', + matches: (fileName) => fileName.startsWith('4') && fileName.includes('-offline-'), + }, { suffix: 'auth', title: 'Authenticated Empty State', @@ -149,6 +156,31 @@ const COMMON_AUTH_REQUIREMENTS: ScreenshotRequirement[] = [ requirement('03-guest-home', { area: 'offline-local', flow: 'Guest app shell' }), requirement('20-auth-home', { area: 'auth', flow: 'Seeded authenticated shell' }), requirement('70-data-home', { area: 'data', flow: 'Authenticated shell with seeded data' }), + requirement('40-offline-guest-home', { area: 'offline-local', flow: 'Guest offline shell' }), + requirement('41-offline-auth-home', { + area: 'offline-local', + flow: 'Authenticated offline shell', + }), + requirement('42-offline-data-home', { + area: 'offline-local', + flow: 'Authenticated offline shell with cached sample data', + }), + requirement('43-offline-data-packs', { + area: 'offline-local', + flow: 'Offline cached packs', + }), + requirement('44-offline-data-trips', { + area: 'offline-local', + flow: 'Offline cached trips', + }), + requirement('45-offline-data-assistant', { + area: 'offline-local', + flow: 'Offline assistant cached state', + }), + requirement('46-offline-data-weather', { + area: 'offline-local', + flow: 'Offline weather cached or connection-needed state', + }), ]; function usage(): never { @@ -363,7 +395,7 @@ function expandedStateRequirements(platform: Platform): ScreenshotRequirement[] }), ]; - if (platform === 'macos') { + if (platform === 'macos' || platform === 'ios') { common.push( requirement('95-data-ai-packs-results-sheet', { area: 'ai', From ca311cdd7b1aecef3d107a5097e65980927eaed6 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Thu, 28 May 2026 00:10:49 -0600 Subject: [PATCH 28/60] =?UTF-8?q?=F0=9F=96=BC=EF=B8=8F=20test(swift):=20st?= =?UTF-8?q?abilize=20visual=20modal=20coverage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../VisualScreenshotTests.swift | 344 ++++++++++++++++-- 1 file changed, 313 insertions(+), 31 deletions(-) diff --git a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift index 6741c7a3b9..b1ba65827e 100644 --- a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift +++ b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift @@ -25,6 +25,12 @@ final class VisualScreenshotTests: XCTestCase { withIntermediateDirectories: true ) + #if os(macOS) + addUIInterruptionMonitor(withDescription: "System onboarding dialogs") { [weak self] interruption in + self?.dismissInterruption(in: interruption) ?? false + } + #endif + launchLoggedOut() } @@ -35,44 +41,107 @@ final class VisualScreenshotTests: XCTestCase { capture("03-guest-home") #if os(iOS) - capturePhoneSurface(mode: .guest) + capturePhoneCoreSurface(mode: .guest) #elseif os(macOS) captureMacSurface(mode: .guest) #endif } + #if os(iOS) + func testGuestPrimaryHomeActionVisualSurface() throws { + enterGuestMode() + capturePhoneHomeActionSurface(mode: .guest, actions: primaryPhoneHomeActions) + } + + func testGuestExploreHomeActionVisualSurface() throws { + enterGuestMode() + capturePhoneHomeActionSurface(mode: .guest, actions: explorePhoneHomeActions) + } + + func testGuestDeepHomeActionVisualSurface() throws { + enterGuestMode() + capturePhoneHomeActionSurface(mode: .guest, actions: deepPhoneHomeActions) + } + #endif + func testGuestModalSurface() throws { enterGuestMode() #if os(iOS) - capturePhoneModalSurface(mode: .guest) + capturePhoneModalCoreSurface(mode: .guest) #elseif os(macOS) captureMacModalSurface(mode: .guest) #endif } + #if os(iOS) + func testGuestPlanningModalSurface() throws { + enterGuestMode() + capturePhoneModalPlanningSurface(mode: .guest) + } + + func testGuestConnectedModalSurface() throws { + enterGuestMode() + capturePhoneModalConnectedSurface(mode: .guest) + } + #endif + func testAuthenticatedVisualSurface() throws { launchAuthenticated() capture("20-auth-home") #if os(iOS) - capturePhoneSurface(mode: .authenticated) + capturePhoneCoreSurface(mode: .authenticated) #elseif os(macOS) captureMacSurface(mode: .authenticated) #endif } + #if os(iOS) + func testAuthenticatedPrimaryHomeActionVisualSurface() throws { + launchAuthenticated() + capturePhoneHomeActionSurface(mode: .authenticated, actions: primaryPhoneHomeActions) + } + + func testAuthenticatedExploreHomeActionVisualSurface() throws { + launchAuthenticated() + capturePhoneHomeActionSurface(mode: .authenticated, actions: explorePhoneHomeActions) + } + + func testAuthenticatedDeepHomeActionVisualSurface() throws { + launchAuthenticated() + capturePhoneHomeActionSurface(mode: .authenticated, actions: deepPhoneHomeActions) + } + #endif + func testAuthenticatedSampleDataVisualSurface() throws { launchAuthenticated(sampleData: true) capture("70-data-home") #if os(iOS) - capturePhoneSurface(mode: .sampleData) + capturePhoneCoreSurface(mode: .sampleData) #elseif os(macOS) captureMacSurface(mode: .sampleData) #endif } + #if os(iOS) + func testAuthenticatedSampleDataPrimaryHomeActionVisualSurface() throws { + launchAuthenticated(sampleData: true) + capturePhoneHomeActionSurface(mode: .sampleData, actions: primaryPhoneHomeActions) + } + + func testAuthenticatedSampleDataExploreHomeActionVisualSurface() throws { + launchAuthenticated(sampleData: true) + capturePhoneHomeActionSurface(mode: .sampleData, actions: explorePhoneHomeActions) + } + + func testAuthenticatedSampleDataDeepHomeActionVisualSurface() throws { + launchAuthenticated(sampleData: true) + capturePhoneHomeActionSurface(mode: .sampleData, actions: deepPhoneHomeActions) + } + #endif + func testAuthenticatedSampleDataDetailSurface() throws { launchAuthenticated(sampleData: true) @@ -87,29 +156,73 @@ final class VisualScreenshotTests: XCTestCase { launchAuthenticated() #if os(iOS) - capturePhoneModalSurface(mode: .authenticated) + capturePhoneModalCoreSurface(mode: .authenticated) #elseif os(macOS) captureMacModalSurface(mode: .authenticated) #endif } + #if os(iOS) + func testAuthenticatedPlanningModalSurface() throws { + launchAuthenticated() + capturePhoneModalPlanningSurface(mode: .authenticated) + } + + func testAuthenticatedConnectedModalSurface() throws { + launchAuthenticated() + capturePhoneModalConnectedSurface(mode: .authenticated) + } + #endif + func testAuthenticatedSampleDataModalSurface() throws { launchAuthenticated(sampleData: true) #if os(iOS) - capturePhoneModalSurface(mode: .sampleData) + capturePhoneModalCoreSurface(mode: .sampleData) #elseif os(macOS) captureMacModalSurface(mode: .sampleData) #endif } - func testAuthenticatedSampleDataExpandedStateSurface() throws { + #if os(iOS) + func testAuthenticatedSampleDataPlanningModalSurface() throws { + launchAuthenticated(sampleData: true) + capturePhoneModalPlanningSurface(mode: .sampleData) + } + + func testAuthenticatedSampleDataConnectedModalSurface() throws { + launchAuthenticated(sampleData: true) + capturePhoneModalConnectedSurface(mode: .sampleData) + } + #endif + + func testAuthenticatedSampleDataPackExpandedStateSurface() throws { + launchAuthenticated(sampleData: true) + + #if os(iOS) + capturePhoneExpandedPackStates() + #elseif os(macOS) + captureMacExpandedPackStates() + #endif + } + + func testAuthenticatedSampleDataPlanningExpandedStateSurface() throws { launchAuthenticated(sampleData: true) #if os(iOS) - capturePhoneExpandedSampleDataStates() + capturePhoneExpandedPlanningStates() #elseif os(macOS) - captureMacExpandedSampleDataStates() + captureMacExpandedPlanningStates() + #endif + } + + func testAuthenticatedSampleDataConnectedExpandedStateSurface() throws { + launchAuthenticated(sampleData: true) + + #if os(iOS) + capturePhoneExpandedConnectedStates() + #elseif os(macOS) + captureMacExpandedConnectedStates() #endif } @@ -172,27 +285,60 @@ final class VisualScreenshotTests: XCTestCase { } #if os(iOS) - private func capturePhoneSurface(mode: VisualMode) { + private func capturePhoneCoreSurface(mode: VisualMode) { let prefix = mode.prefix let suffix = mode.suffix captureTab("Packs", name: "\(prefix)-packs\(suffix)") captureTab("Trips", name: "\(prefix)-trips\(suffix)") captureTab("Assistant", name: "\(prefix)-assistant\(suffix)") + } + + private typealias PhoneHomeActionScreenshot = (title: String, slug: String) - captureHomeAction("AI Packs", name: "\(prefix)-ai-packs\(suffix)") - captureHomeAction("Gear Inventory", name: "\(prefix)-gear-inventory\(suffix)") - captureHomeAction("Season Suggestions", name: "\(prefix)-season-suggestions\(suffix)") - captureHomeAction("Pack Templates", name: "\(prefix)-pack-templates\(suffix)") - captureHomeAction("Guides", name: "\(prefix)-guides\(suffix)") - captureHomeAction("Catalog", name: "\(prefix)-catalog\(suffix)") - captureHomeAction("Community Feed", name: "\(prefix)-feed\(suffix)") - captureHomeAction("Trail Conditions", name: "\(prefix)-trail-conditions\(suffix)") - captureHomeAction("Weather", name: "\(prefix)-weather\(suffix)") - captureHomeAction("Shopping List", name: "\(prefix)-shopping-list\(suffix)") - captureHomeAction("Wildlife ID", name: "\(prefix)-wildlife\(suffix)") + private var primaryPhoneHomeActions: [PhoneHomeActionScreenshot] { + [ + ("AI Packs", "ai-packs"), + ("Gear Inventory", "gear-inventory"), + ("Season Suggestions", "season-suggestions"), + ("Pack Templates", "pack-templates"), + ("Guides", "guides"), + ] + } + + private var explorePhoneHomeActions: [PhoneHomeActionScreenshot] { + [ + ("Catalog", "catalog"), + ("Community Feed", "feed"), + ("Trail Conditions", "trail-conditions"), + ("Weather", "weather"), + ("Shopping List", "shopping-list"), + ] + } + + private var deepPhoneHomeActions: [PhoneHomeActionScreenshot] { + [ + ("Wildlife ID", "wildlife"), + ] + } + + private func capturePhoneHomeActionSurface( + mode: VisualMode, + actions: [PhoneHomeActionScreenshot] + ) { + let prefix = mode.prefix + let suffix = mode.suffix + for action in actions { + captureHomeAction(action.title, name: "\(prefix)-\(action.slug)\(suffix)") + } } private func capturePhoneModalSurface(mode: VisualMode) { + capturePhoneModalCoreSurface(mode: mode) + capturePhoneModalPlanningSurface(mode: mode) + capturePhoneModalConnectedSurface(mode: mode) + } + + private func capturePhoneModalCoreSurface(mode: VisualMode) { let prefix = mode.modalPrefix captureGlobalSearch(name: "\(prefix)-global-search", query: mode == .sampleData ? "Alpine" : nil) resetPhoneModalState(mode) @@ -203,7 +349,10 @@ final class VisualScreenshotTests: XCTestCase { resetPhoneModalState(mode) captureTab("Trips", name: "\(prefix)-trips-before-new-trip") tapAndCapture(identifier: "trips_plan_trip_button", fallbackButton: "Plan Trip", name: "\(prefix)-new-trip-sheet") + } + private func capturePhoneModalPlanningSurface(mode: VisualMode) { + let prefix = mode.modalPrefix resetPhoneModalState(mode) if mode == .guest { captureGuestLimitedHomeAction("Pack Templates", name: "50-guest-limit-new-template") @@ -229,7 +378,10 @@ final class VisualScreenshotTests: XCTestCase { ) tapAndCapture(identifier: "trail_conditions_submit_report_button", fallbackButton: "Submit Report", name: "\(prefix)-trail-report-sheet") } + } + private func capturePhoneModalConnectedSurface(mode: VisualMode) { + let prefix = mode.modalPrefix resetPhoneModalState(mode) captureHomeAction("Weather", name: "\(prefix)-weather-before-alerts", dismissAfterCapture: false) @@ -265,7 +417,7 @@ final class VisualScreenshotTests: XCTestCase { captureHomeAction("Catalog", name: "79-data-catalog-results") } - private func capturePhoneExpandedSampleDataStates() { + private func capturePhoneExpandedPackStates() { captureTab("Packs", name: "home-before-81-data-pack-expanded") tapTextAndCapture("Alpine Weekend", name: "81-data-pack-detail-expanded") tapAndCapture(identifier: "pack_detail_add_item_button", fallbackButton: "Add Item", name: "82-data-pack-add-item-sheet") @@ -276,7 +428,9 @@ final class VisualScreenshotTests: XCTestCase { tapElementAndCapture(identifier: "pack_item_row_visual-item-shelter", name: "84-data-pack-item-detail", dismissAfterCapture: false) tapAndCapture(identifier: "pack_item_detail_edit_button", fallbackButton: "Edit", name: "85-data-pack-item-edit-sheet") dismissPhoneDestination() + } + private func capturePhoneExpandedPlanningStates() { captureTab("Trips", name: "home-before-86-data-trip-expanded") tapTextAndCapture("Enchantments Thru-Hike", name: "86-data-trip-detail-expanded") tapAndCapture(identifier: "trip_detail_edit_button", fallbackButton: "Edit", name: "87-data-trip-edit-sheet") @@ -296,16 +450,16 @@ final class VisualScreenshotTests: XCTestCase { tapElementAndCapture(identifier: "catalog_item_row_7001", name: "90-data-catalog-item-detail", dismissAfterCapture: false) tapAndCapture(identifier: "catalog_detail_add_to_pack_button", fallbackButton: "Add to Pack", name: "91-data-catalog-add-to-pack-sheet") dismissPhoneDestination() + } + private func capturePhoneExpandedConnectedStates() { captureHomeAction( "Weather", name: "home-before-92-data-weather-expanded", - dismissAfterCapture: false, - destinationIdentifier: "weather_alerts_button" + dismissAfterCapture: false ) tapAndCapture(identifier: "weather_alerts_button", fallbackButton: "Alerts", name: "92-data-weather-alerts-sheet") - tapElementAndCapture(identifier: "weather_alert_preferences_button", name: "93-data-weather-alert-preferences", dismissAfterCapture: false) - dismissPhoneDestination() + tapAndCapture(identifier: "weather_alert_preferences_button", fallbackButton: "Alert Preferences", name: "93-data-weather-alert-preferences") captureHomeAction( "Community Feed", @@ -319,8 +473,9 @@ final class VisualScreenshotTests: XCTestCase { "AI Packs", name: "home-before-95-data-ai-packs-expanded", dismissAfterCapture: false, - destinationIdentifier: "ai_packs_view_results_button" + destinationIdentifier: "ai_packs_generate_button" ) + scrollToElement(identifier: "ai_packs_view_results_button", maxSwipes: 3) tapAndCapture(identifier: "ai_packs_view_results_button", fallbackButton: "View", name: "95-data-ai-packs-results-sheet") } @@ -351,9 +506,22 @@ final class VisualScreenshotTests: XCTestCase { let identifier = "home_action_\(title.lowercased().filter { $0.isLetter || $0.isNumber })" let action = app.buttons[identifier] + var visibleCandidate: XCUIElement? - for _ in 0..<8 { - if action.exists, action.isHittable { + if title == "Wildlife ID" { + openHomeActionUsingSearch(title: title, identifier: identifier) + capture(name) + if dismissAfterCapture { + dismissPhoneDestination() + } + return + } + + for _ in 0..<12 { + if action.exists { + visibleCandidate = action + } + if action.exists, action.isHittable, actionIsClearOfBottomBar(action) { activate(action) if let destinationIdentifier { let destination = app.descendants(matching: .any).matching(identifier: destinationIdentifier).firstMatch @@ -368,11 +536,79 @@ final class VisualScreenshotTests: XCTestCase { } return } - app.swipeUp() + if action.exists, action.frame.minY < 140 { + smallScrollDown() + } else { + smallScrollUp() + } + } + if let visibleCandidate, visibleCandidate.exists, actionIsClearOfBottomBar(visibleCandidate) { + activate(visibleCandidate) + if let destinationIdentifier { + let destination = app.descendants(matching: .any).matching(identifier: destinationIdentifier).firstMatch + XCTAssertTrue( + destination.waitForExistence(timeout: 5), + "Expected Home action '\(title)' to open '\(destinationIdentifier)' for screenshot \(name)" + ) + } + capture(name) + if dismissAfterCapture { + dismissPhoneDestination() + } + return } XCTFail("Expected Home action '\(title)' for screenshot \(name)") } + private func openHomeActionUsingSearch(title: String, identifier: String) { + let searchField = app.searchFields.firstMatch + XCTAssertTrue(searchField.waitForExistence(timeout: 3), "Expected Home search field before opening '\(title)'") + activate(searchField) + searchField.typeText(title) + if app.keyboards.buttons["Search"].exists { + app.keyboards.buttons["Search"].tap() + } + + let action = app.buttons[identifier] + XCTAssertTrue(action.waitForExistence(timeout: 5), "Expected filtered Home action '\(title)'") + activate(action) + + if title == "Wildlife ID" { + XCTAssertTrue( + app.navigationBars["Wildlife ID"].waitForExistence(timeout: 5), + "Expected Home action '\(title)' to open Wildlife ID" + ) + } + } + + private func actionIsClearOfBottomBar(_ element: XCUIElement) -> Bool { + #if os(iOS) + element.frame.minY > 140 && element.frame.midY < app.frame.maxY - 170 + #else + true + #endif + } + + private func smallScrollUp() { + #if os(iOS) + let start = app.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.72)) + let end = app.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.56)) + start.press(forDuration: 0.01, thenDragTo: end) + #else + app.swipeUp() + #endif + } + + private func smallScrollDown() { + #if os(iOS) + let start = app.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.38)) + let end = app.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.54)) + start.press(forDuration: 0.01, thenDragTo: end) + #else + app.swipeDown() + #endif + } + private func captureGuestLimitedHomeAction(_ title: String, name: String) { captureHomeAction(title, name: name, dismissAfterCapture: false) assertExpectedAccountRequiredState(for: name) @@ -469,7 +705,7 @@ final class VisualScreenshotTests: XCTestCase { } } - private func captureMacExpandedSampleDataStates() { + private func captureMacExpandedPackStates() { resetMacSampleDataSidebar("Packs") capture("81-data-pack-detail-expanded") tapAndCapture(identifier: "pack_detail_add_item_button", fallbackButton: "Add Item", name: "82-data-pack-add-item-sheet") @@ -480,7 +716,9 @@ final class VisualScreenshotTests: XCTestCase { scrollToElement(identifier: "pack_item_row_visual-item-shelter") tapElementAndCapture(identifier: "pack_item_row_visual-item-shelter", name: "84-data-pack-item-detail", dismissAfterCapture: false) tapAndCapture(identifier: "pack_item_detail_edit_button", fallbackButton: "Edit", name: "85-data-pack-item-edit-sheet") + } + private func captureMacExpandedPlanningStates() { resetMacSampleDataSidebar("Trips") capture("86-data-trip-detail-expanded") tapAndCapture(identifier: "trip_detail_edit_button", fallbackButton: "Edit", name: "87-data-trip-edit-sheet") @@ -493,7 +731,9 @@ final class VisualScreenshotTests: XCTestCase { tapElementAndCapture(identifier: "catalog_item_row_7001", name: "90-data-catalog-item-detail", dismissAfterCapture: false) resetMacSampleDataSidebar("Catalog") tapAndCapture(identifier: "catalog_item_add_to_pack_7001", fallbackButton: "Add to Pack", name: "91-data-catalog-add-to-pack-sheet") + } + private func captureMacExpandedConnectedStates() { resetMacSampleDataSidebar("Weather") tapAndCapture(identifier: "weather_alerts_button", fallbackButton: "Alerts", name: "92-data-weather-alerts-sheet") resetMacSampleDataSidebar("Weather") @@ -503,6 +743,7 @@ final class VisualScreenshotTests: XCTestCase { tapElementAndCapture(identifier: "feed_comments_button_9001", name: "94-data-feed-comments-sheet") resetMacSampleDataSidebar("AI Packs") + scrollToElement(identifier: "ai_packs_view_results_button", maxSwipes: 3) tapAndCapture(identifier: "ai_packs_view_results_button", fallbackButton: "View", name: "95-data-ai-packs-results-sheet") } @@ -512,6 +753,7 @@ final class VisualScreenshotTests: XCTestCase { } private func selectSidebar(_ label: String) { + dismissSystemInterruptions() let identifierByLabel: [String: String] = [ "Home": "nav_home", "Packs": "nav_packs", @@ -536,6 +778,7 @@ final class VisualScreenshotTests: XCTestCase { } else { button.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).click() } + dismissSystemInterruptions() return } XCTFail("No sidebar identifier mapped for '\(label)'") @@ -694,6 +937,7 @@ final class VisualScreenshotTests: XCTestCase { } private func activate(_ element: XCUIElement) { + dismissSystemInterruptions() #if os(macOS) if element.isHittable { element.click() @@ -707,6 +951,7 @@ final class VisualScreenshotTests: XCTestCase { element.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).tap() } #endif + dismissSystemInterruptions() } private func dismissPresentedSurface() { @@ -758,6 +1003,7 @@ final class VisualScreenshotTests: XCTestCase { app.launch() #if os(macOS) app.activate() + dismissSystemInterruptions() #endif XCTAssertTrue(waitForAuthenticatedShell(), "Authenticated visual shell must launch from seeded E2E state") } @@ -785,6 +1031,7 @@ final class VisualScreenshotTests: XCTestCase { app.launch() #if os(macOS) app.activate() + dismissSystemInterruptions() #endif } @@ -795,9 +1042,11 @@ final class VisualScreenshotTests: XCTestCase { private func capture(_ name: String) { Thread.sleep(forTimeInterval: 0.35) + dismissSystemInterruptions() assertNoUnexpectedErrorState(for: name) #if os(macOS) app.activate() + dismissSystemInterruptions() let window = app.windows.firstMatch let screenshot = window.waitForExistence(timeout: 2) ? window.screenshot() : app.screenshot() #else @@ -875,6 +1124,39 @@ final class VisualScreenshotTests: XCTestCase { } return true } + + @discardableResult + private func dismissInterruption(in container: XCUIElement) -> Bool { + #if os(macOS) + for label in ["Remind Me Later", "Not Now", "Continue", "OK", "Allow", "Dismiss", "Close"] { + let button = container.buttons[label] + if button.exists { + if button.isHittable { + button.click() + } else { + button.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).click() + } + return true + } + } + #endif + return false + } + + private func dismissSystemInterruptions() { + #if os(macOS) + for bundleIdentifier in [ + "com.apple.ContinuityCaptureOnboardingUI", + "com.apple.UserNotificationCenter", + "com.apple.systempreferences", + ] { + let systemApp = XCUIApplication(bundleIdentifier: bundleIdentifier) + if systemApp.exists, dismissInterruption(in: systemApp) { + Thread.sleep(forTimeInterval: 0.2) + } + } + #endif + } } private enum VisualMode { From ab268f30104f44de5e0b5827ce47efac7270ef3d Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Thu, 28 May 2026 01:10:47 -0600 Subject: [PATCH 29/60] =?UTF-8?q?=F0=9F=92=84=20style(swift):=20tighten=20?= =?UTF-8?q?auth=20surfaces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PackRat/Features/Auth/LoginView.swift | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/apps/swift/Sources/PackRat/Features/Auth/LoginView.swift b/apps/swift/Sources/PackRat/Features/Auth/LoginView.swift index 270246329c..2b84135364 100644 --- a/apps/swift/Sources/PackRat/Features/Auth/LoginView.swift +++ b/apps/swift/Sources/PackRat/Features/Auth/LoginView.swift @@ -5,6 +5,7 @@ import AuthenticationServices struct LoginView: View { @Environment(AuthManager.self) private var authManager + @Environment(\.colorScheme) private var colorScheme let onRegisterTapped: () -> Void let onForgotPasswordTapped: () -> Void @@ -101,7 +102,7 @@ struct LoginView: View { } onCompletion: { result in signInWithApple(result) } - .signInWithAppleButtonStyle(.whiteOutline) + .signInWithAppleButtonStyle(colorScheme == .dark ? .white : .black) .frame(height: 44) .clipShape(RoundedRectangle(cornerRadius: 10, style: .continuous)) .disabled(isLoading) @@ -178,11 +179,16 @@ struct LoginView: View { @ViewBuilder func authContainer(@ViewBuilder content: () -> Content) -> some View { #if os(macOS) - content() - .padding(40) - .frame(width: 400) - .frame(maxHeight: .infinity) - .background(.background) + VStack { + Spacer(minLength: 32) + content() + .padding(40) + .frame(width: 420) + .fixedSize(horizontal: false, vertical: true) + Spacer(minLength: 32) + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background(.background) #else ScrollView { content() From ed12d09958c9a819700362a45f06ac39b6e5f19e Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Thu, 28 May 2026 08:57:33 -0600 Subject: [PATCH 30/60] =?UTF-8?q?=F0=9F=96=BC=EF=B8=8F=20test(swift):=20ex?= =?UTF-8?q?pand=20native=20form=20screenshot=20coverage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Standardize feature forms on the shared grouped style and add stable UI hooks so Mac and iOS visual tests capture the missing sheet, menu, and modal states. --- .../Features/AIPacks/AIPacksView.swift | 1 + .../Features/Catalog/CatalogView.swift | 1 + .../Features/OfflineAI/OfflineAIView.swift | 2 +- .../PackTemplates/PackTemplateFormView.swift | 1 + .../PackTemplateItemFormView.swift | 1 + .../PackTemplates/PackTemplatesView.swift | 4 ++++ .../Features/Packs/GapAnalysisSheet.swift | 1 + .../PackRat/Features/Packs/PackFormView.swift | 1 + .../Features/Packs/PackItemFormView.swift | 1 + .../Preferences/PreferencesView.swift | 6 ++--- .../Features/Profile/ProfileView.swift | 4 ++-- .../SeasonSuggestionsView.swift | 1 + .../Features/Shopping/ShoppingListView.swift | 2 ++ .../TrailConditions/TrailConditionsView.swift | 1 + .../PackRat/Features/Trips/TripFormView.swift | 2 ++ .../Weather/WeatherAlertPreferencesView.swift | 1 + .../PackRat/Shared/FormSheetSizing.swift | 5 ++++ .../VisualScreenshotTests.swift | 23 ++++++++++++++++--- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift b/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift index d84c8812bb..65eae5f4e8 100644 --- a/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift +++ b/apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift @@ -138,6 +138,7 @@ struct AIPacksView: View { } tipsSection } + .packRatFormStyle() #endif } diff --git a/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift b/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift index f977320138..7fe468ba88 100644 --- a/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift +++ b/apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift @@ -206,6 +206,7 @@ struct AddCatalogItemToPackSheet: View { } } } + .packRatFormStyle() .navigationTitle("Add to Pack") #if os(iOS) .navigationBarTitleDisplayMode(.inline) diff --git a/apps/swift/Sources/PackRat/Features/OfflineAI/OfflineAIView.swift b/apps/swift/Sources/PackRat/Features/OfflineAI/OfflineAIView.swift index 52b447db7a..b6fc000535 100644 --- a/apps/swift/Sources/PackRat/Features/OfflineAI/OfflineAIView.swift +++ b/apps/swift/Sources/PackRat/Features/OfflineAI/OfflineAIView.swift @@ -22,7 +22,7 @@ public struct OfflineAIView: View { promptSection responseSection } - .formStyle(.grouped) + .packRatFormStyle() .navigationTitle("Offline AI (Debug)") #if os(iOS) .navigationBarTitleDisplayMode(.inline) diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateFormView.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateFormView.swift index f1e33126ce..54e3a82a10 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateFormView.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateFormView.swift @@ -50,6 +50,7 @@ struct PackTemplateFormView: View { InlineErrorView(message: error).listRowBackground(Color.clear) } } + .packRatFormStyle() .navigationTitle(isEditing ? "Edit Template" : "New Template") #if os(iOS) .navigationBarTitleDisplayMode(.inline) diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateItemFormView.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateItemFormView.swift index 5e7d5b1fd7..ab4d9d314e 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateItemFormView.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateItemFormView.swift @@ -73,6 +73,7 @@ struct PackTemplateItemFormView: View { InlineErrorView(message: error).listRowBackground(Color.clear) } } + .packRatFormStyle() .navigationTitle(isEditing ? "Edit Item" : "Add Item") #if os(iOS) .navigationBarTitleDisplayMode(.inline) diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift index b27809e987..1f72fd676e 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift @@ -101,6 +101,7 @@ struct PackTemplatesListView: View { } } .tag(template.id) + .accessibilityIdentifier("template_row_\(template.id)") } } @@ -241,11 +242,13 @@ struct PackTemplateDetailView: View { Button("Add Item", systemImage: "plus") { showingAddItem = true } + .accessibilityIdentifier("template_detail_add_item_button") } ToolbarItem(placement: .primaryAction) { Button("Edit", systemImage: "pencil") { showingEditTemplate = true } + .accessibilityIdentifier("template_detail_edit_button") } } ToolbarItem(placement: .primaryAction) { @@ -286,6 +289,7 @@ struct PackTemplateDetailView: View { @ViewBuilder private func templateItemRow(_ item: PackTemplateItem) -> some View { TemplateItemRow(item: item) + .accessibilityIdentifier("template_item_row_\(item.id)") .contextMenu { if !currentTemplate.isOfficial { Button("Edit", systemImage: "pencil") { diff --git a/apps/swift/Sources/PackRat/Features/Packs/GapAnalysisSheet.swift b/apps/swift/Sources/PackRat/Features/Packs/GapAnalysisSheet.swift index bf80fb3a8a..df15521883 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/GapAnalysisSheet.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/GapAnalysisSheet.swift @@ -74,6 +74,7 @@ struct GapAnalysisSheet: View { .foregroundStyle(.secondary) } } + .packRatFormStyle() } // MARK: - Result diff --git a/apps/swift/Sources/PackRat/Features/Packs/PackFormView.swift b/apps/swift/Sources/PackRat/Features/Packs/PackFormView.swift index e824f4a14e..2e2316fdbb 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PackFormView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PackFormView.swift @@ -57,6 +57,7 @@ struct PackFormView: View { } } } + .packRatFormStyle() .navigationTitle(isEditing ? "Edit Pack" : "New Pack") #if os(iOS) .navigationBarTitleDisplayMode(.inline) diff --git a/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift b/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift index 75c2ab39fa..2b168d22ad 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift @@ -110,6 +110,7 @@ struct PackItemFormView: View { } } } + .packRatFormStyle() } private func prefill() { diff --git a/apps/swift/Sources/PackRat/Features/Preferences/PreferencesView.swift b/apps/swift/Sources/PackRat/Features/Preferences/PreferencesView.swift index cc2b932262..7dfe61d934 100644 --- a/apps/swift/Sources/PackRat/Features/Preferences/PreferencesView.swift +++ b/apps/swift/Sources/PackRat/Features/Preferences/PreferencesView.swift @@ -63,7 +63,7 @@ struct PreferencesView: View { .pickerStyle(.segmented) } } - .formStyle(.grouped) + .packRatFormStyle() } private var unitsTab: some View { @@ -77,7 +77,7 @@ struct PreferencesView: View { Toggle("Prefer metric display", isOn: $preferMetric) } } - .formStyle(.grouped) + .packRatFormStyle() } private var effectiveURL: String { @@ -119,7 +119,7 @@ struct PreferencesView: View { } } } - .formStyle(.grouped) + .packRatFormStyle() } private func resetDefaults() { diff --git a/apps/swift/Sources/PackRat/Features/Profile/ProfileView.swift b/apps/swift/Sources/PackRat/Features/Profile/ProfileView.swift index e5e9a4e4c8..3dea3235ce 100644 --- a/apps/swift/Sources/PackRat/Features/Profile/ProfileView.swift +++ b/apps/swift/Sources/PackRat/Features/Profile/ProfileView.swift @@ -91,7 +91,7 @@ struct ProfileView: View { notificationSection } - .formStyle(.grouped) + .packRatFormStyle() } private var profileForm: some View { @@ -157,7 +157,7 @@ struct ProfileView: View { .disabled(isDeletingAccount) } } - .formStyle(.grouped) + .packRatFormStyle() #if os(macOS) .frame(maxWidth: 500) #endif diff --git a/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift b/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift index 771f94c389..8608cd40b3 100644 --- a/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift +++ b/apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift @@ -130,6 +130,7 @@ struct SeasonSuggestionsView: View { .disabled(viewModel.location.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty || viewModel.isLoading) } } + .packRatFormStyle() #if os(iOS) .listStyle(.insetGrouped) #endif diff --git a/apps/swift/Sources/PackRat/Features/Shopping/ShoppingListView.swift b/apps/swift/Sources/PackRat/Features/Shopping/ShoppingListView.swift index eb8861b3d5..b024a168d4 100644 --- a/apps/swift/Sources/PackRat/Features/Shopping/ShoppingListView.swift +++ b/apps/swift/Sources/PackRat/Features/Shopping/ShoppingListView.swift @@ -73,6 +73,7 @@ struct ShoppingListView: View { Button { showingAddSheet = true } label: { Image(systemName: "plus") } + .accessibilityIdentifier("shopping_add_item_button") } if !items.isEmpty { ToolbarItem(placement: .secondaryAction) { @@ -201,6 +202,7 @@ private struct AddShoppingItemSheet: View { .lineLimit(3, reservesSpace: true) } } + .packRatFormStyle() .navigationTitle("Add Item") #if os(iOS) .navigationBarTitleDisplayMode(.inline) diff --git a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift index 92b7da4739..8f878680f3 100644 --- a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift +++ b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift @@ -287,6 +287,7 @@ struct SubmitTrailConditionView: View { } if let error { Section { InlineErrorView(message: error) } } } + .packRatFormStyle() .navigationTitle("Submit Report") #if os(iOS) .navigationBarTitleDisplayMode(.inline) diff --git a/apps/swift/Sources/PackRat/Features/Trips/TripFormView.swift b/apps/swift/Sources/PackRat/Features/Trips/TripFormView.swift index 63dbfb457b..6faf930202 100644 --- a/apps/swift/Sources/PackRat/Features/Trips/TripFormView.swift +++ b/apps/swift/Sources/PackRat/Features/Trips/TripFormView.swift @@ -60,6 +60,7 @@ struct TripFormView: View { } } .buttonStyle(.plain) + .accessibilityIdentifier("trip_location_search_button") if !locationName.isEmpty { Button("Clear Location", systemImage: "xmark.circle") { locationName = ""; locationLat = 0; locationLon = 0 @@ -120,6 +121,7 @@ struct TripFormView: View { Section { InlineErrorView(message: error) } } } + .packRatFormStyle() .navigationTitle(isEditing ? "Edit Trip" : "Plan Trip") #if os(iOS) .navigationBarTitleDisplayMode(.inline) diff --git a/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertPreferencesView.swift b/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertPreferencesView.swift index c071d360fe..0d6e9c576a 100644 --- a/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertPreferencesView.swift +++ b/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertPreferencesView.swift @@ -111,6 +111,7 @@ struct WeatherAlertPreferencesView: View { } .disabled(!weatherNotifications) } + .packRatFormStyle() .navigationTitle("Alert Preferences") #if os(iOS) .navigationBarTitleDisplayMode(.inline) diff --git a/apps/swift/Sources/PackRat/Shared/FormSheetSizing.swift b/apps/swift/Sources/PackRat/Shared/FormSheetSizing.swift index 789428fb97..ff52128d13 100644 --- a/apps/swift/Sources/PackRat/Shared/FormSheetSizing.swift +++ b/apps/swift/Sources/PackRat/Shared/FormSheetSizing.swift @@ -14,4 +14,9 @@ extension View { self #endif } + + @ViewBuilder + func packRatFormStyle() -> some View { + self.formStyle(.grouped) + } } diff --git a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift index b1ba65827e..b149fb2eb5 100644 --- a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift +++ b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift @@ -721,11 +721,18 @@ final class VisualScreenshotTests: XCTestCase { private func captureMacExpandedPlanningStates() { resetMacSampleDataSidebar("Trips") capture("86-data-trip-detail-expanded") - tapAndCapture(identifier: "trip_detail_edit_button", fallbackButton: "Edit", name: "87-data-trip-edit-sheet") + tapAndCapture(identifier: "trip_detail_edit_button", fallbackButton: "Edit", name: "87-data-trip-edit-sheet", dismissAfterCapture: false) + tapElementAndCapture(identifier: "trip_location_search_button", name: "87a-data-trip-location-search-sheet") resetMacSampleDataSidebar("Templates") capture("88-data-template-detail-expanded") tapAndCapture(button: "Apply to Pack", name: "89-data-template-apply-sheet") + resetMacSampleDataSidebar("Templates") + tapElementAndCapture(identifier: "template_row_visual-template-day", name: "89a-data-custom-template-detail", dismissAfterCapture: false) + tapAndCapture(identifier: "template_detail_add_item_button", fallbackButton: "Add Item", name: "89b-data-template-add-item-sheet") + resetMacSampleDataSidebar("Templates") + tapElementAndCapture(identifier: "template_row_visual-template-day", name: "89c-data-custom-template-before-edit", dismissAfterCapture: false) + tapAndCapture(identifier: "template_detail_edit_button", fallbackButton: "Edit", name: "89d-data-template-edit-sheet") resetMacSampleDataSidebar("Catalog") tapElementAndCapture(identifier: "catalog_item_row_7001", name: "90-data-catalog-item-detail", dismissAfterCapture: false) @@ -745,6 +752,9 @@ final class VisualScreenshotTests: XCTestCase { resetMacSampleDataSidebar("AI Packs") scrollToElement(identifier: "ai_packs_view_results_button", maxSwipes: 3) tapAndCapture(identifier: "ai_packs_view_results_button", fallbackButton: "View", name: "95-data-ai-packs-results-sheet") + + captureMacHomeAction("Shopping List", name: "96-data-shopping-list", dismissAfterCapture: false) + tapAndCapture(identifier: "shopping_add_item_button", fallbackButton: "Add Item", name: "97-data-shopping-add-item-sheet") } private func resetMacSampleDataSidebar(_ label: String) { @@ -900,7 +910,12 @@ final class VisualScreenshotTests: XCTestCase { dismissPresentedSurface() } - private func tapAndCapture(identifier: String, fallbackButton label: String, name: String) { + private func tapAndCapture( + identifier: String, + fallbackButton label: String, + name: String, + dismissAfterCapture: Bool = true + ) { let button = findButton(identifier: identifier, timeout: 1) ?? findButton(label: label, timeout: 3) guard let button else { XCTFail("Expected button identifier '\(identifier)' or label '\(label)' for screenshot \(name)") @@ -908,7 +923,9 @@ final class VisualScreenshotTests: XCTestCase { } activate(button) capture(name) - dismissPresentedSurface() + if dismissAfterCapture { + dismissPresentedSurface() + } } private func tapTextAndCapture(_ label: String, name: String) { From 719925f98644833cb433fbcd40de38ceecc05b10 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Thu, 28 May 2026 13:51:41 -0600 Subject: [PATCH 31/60] =?UTF-8?q?=F0=9F=8D=8E=20Use=20native=20SwiftUI=20s?= =?UTF-8?q?earch=20and=20filters?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PackRat/Features/Guides/GuidesView.swift | 35 +++++++----------- .../Features/Packs/PacksListView.swift | 37 ++++++++----------- .../Features/Profile/ProfileView.swift | 3 +- .../Features/Search/GlobalSearchView.swift | 36 ++++++++---------- .../PackRatUITests/NavigationMacOSTests.swift | 8 ++-- .../PackRatUITests/NavigationTests.swift | 7 ++-- .../PackSubFlowMacOSTests.swift | 5 ++- .../PackRatUITests/PackSubFlowTests.swift | 7 +++- .../VisualScreenshotTests.swift | 8 ---- 9 files changed, 66 insertions(+), 80 deletions(-) diff --git a/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift b/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift index 5f6842290e..fb40b92b35 100644 --- a/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift +++ b/apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift @@ -157,32 +157,25 @@ struct GuidesView: View { } private var categoryBar: some View { - ScrollView(.horizontal, showsIndicators: false) { - HStack(spacing: 8) { - categoryChip(nil, label: "All") + HStack { + Picker("Category", selection: $viewModel.selectedCategory) { + Label("All", systemImage: "line.3.horizontal.decrease.circle") + .tag(nil as String?) ForEach(viewModel.categories, id: \.self) { cat in - categoryChip(cat, label: cat.capitalized) + Label(cat.capitalized, systemImage: "tag") + .tag(Optional(cat)) } } - .padding(.horizontal, 16) - .padding(.vertical, 8) - } - .background(.bar) - } + .pickerStyle(.menu) + .accessibilityIdentifier("guides_category_filter") + + Spacer() - private func categoryChip(_ cat: String?, label: String) -> some View { - let selected = viewModel.selectedCategory == cat - return Button { - withAnimation(.spring(duration: 0.2)) { viewModel.selectedCategory = cat } - } label: { - Text(label) - .font(.caption.bold()) - .padding(.horizontal, 12) - .padding(.vertical, 6) - .background(selected ? Color.accentColor : Color.accentColor.opacity(0.1), in: Capsule()) - .foregroundStyle(selected ? .white : Color.accentColor) + Text(viewModel.selectedCategory?.capitalized ?? "All") + .font(.subheadline) + .foregroundStyle(.secondary) } - .buttonStyle(.plain) + .padding(.vertical, 2) } private var guideList: some View { diff --git a/apps/swift/Sources/PackRat/Features/Packs/PacksListView.swift b/apps/swift/Sources/PackRat/Features/Packs/PacksListView.swift index eb3752f455..709a0474d0 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PacksListView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PacksListView.swift @@ -108,32 +108,27 @@ struct PacksListView: View { // MARK: - Category Filter Bar private var categoryFilterBar: some View { - ScrollView(.horizontal, showsIndicators: false) { - HStack(spacing: 8) { - categoryChip(nil, label: "All") + HStack { + Picker("Category", selection: $selectedCategory) { + Label("All", systemImage: "line.3.horizontal.decrease.circle") + .tag(nil as PackCategory?) ForEach(PackCategory.allCases, id: \.self) { cat in - categoryChip(cat, label: cat.label) + Label(cat.label, systemImage: cat.symbol) + .tag(Optional(cat)) } } - .padding(.horizontal, 16) - .padding(.vertical, 8) - } - .background(.bar) - } + .pickerStyle(.menu) + .accessibilityIdentifier("packs_category_filter") + + Spacer() - private func categoryChip(_ cat: PackCategory?, label: String) -> some View { - let isSelected = selectedCategory == cat - return Button { - withAnimation(.spring(duration: 0.2)) { selectedCategory = cat } - } label: { - Text(label) - .font(.caption.bold()) - .padding(.horizontal, 12) - .padding(.vertical, 6) - .background(isSelected ? Color.accentColor : Color.accentColor.opacity(0.1), in: Capsule()) - .foregroundStyle(isSelected ? Color.white : Color.accentColor) + Text(selectedCategory?.label ?? "All") + .font(.subheadline) + .foregroundStyle(.secondary) } - .buttonStyle(.plain) + .padding(.horizontal) + .padding(.vertical, 8) + .background(.bar) } // MARK: - Pack Row diff --git a/apps/swift/Sources/PackRat/Features/Profile/ProfileView.swift b/apps/swift/Sources/PackRat/Features/Profile/ProfileView.swift index 3dea3235ce..657090b4f1 100644 --- a/apps/swift/Sources/PackRat/Features/Profile/ProfileView.swift +++ b/apps/swift/Sources/PackRat/Features/Profile/ProfileView.swift @@ -4,6 +4,7 @@ import UserNotifications struct ProfileView: View { @Environment(AuthManager.self) private var authManager + @Environment(\.openURL) private var openURL @State private var firstName = "" @State private var lastName = "" @State private var isSaving = false @@ -175,7 +176,7 @@ struct ProfileView: View { #if os(iOS) Button("Open Settings") { if let url = URL(string: UIApplication.openSettingsURLString) { - UIApplication.shared.open(url) + openURL(url) } } .font(.callout) diff --git a/apps/swift/Sources/PackRat/Features/Search/GlobalSearchView.swift b/apps/swift/Sources/PackRat/Features/Search/GlobalSearchView.swift index f8e8bea996..e688a89e33 100644 --- a/apps/swift/Sources/PackRat/Features/Search/GlobalSearchView.swift +++ b/apps/swift/Sources/PackRat/Features/Search/GlobalSearchView.swift @@ -43,13 +43,7 @@ struct GlobalSearchView: View { Button("Done") { dismiss() } } } - #if os(iOS) - .searchable( - text: $query, - placement: .navigationBarDrawer(displayMode: .always), - prompt: "Search packs, trips, trails…" - ) - #endif + .globalSearchField(text: $query) } #if os(iOS) .presentationDetents([.medium, .large]) @@ -62,20 +56,7 @@ struct GlobalSearchView: View { @ViewBuilder private var content: some View { - #if os(macOS) - VStack(spacing: 0) { - TextField("Search packs, trips, trails…", text: $query) - .textFieldStyle(.roundedBorder) - .accessibilityIdentifier("global_search_field") - .padding() - - Divider() - - resultsContent - } - #else resultsContent - #endif } @ViewBuilder @@ -115,6 +96,21 @@ struct GlobalSearchView: View { } } +private extension View { + @ViewBuilder + func globalSearchField(text: Binding) -> some View { + #if os(iOS) + self.searchable( + text: text, + placement: .navigationBarDrawer(displayMode: .always), + prompt: "Search packs, trips, trails…" + ) + #else + self.searchable(text: text, prompt: "Search packs, trips, trails…") + #endif + } +} + // MARK: - Search result row private struct SearchResultRow: View { diff --git a/apps/swift/Tests/PackRatUITests/NavigationMacOSTests.swift b/apps/swift/Tests/PackRatUITests/NavigationMacOSTests.swift index 4db44c84df..b02e745ef4 100644 --- a/apps/swift/Tests/PackRatUITests/NavigationMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/NavigationMacOSTests.swift @@ -72,8 +72,9 @@ final class NavigationMacOSTests: AppUITestCase { func testPacksCategoryFilterBarVisible() { goToSidebar("Packs") XCTAssertTrue( - app.buttons["All"].waitForExistence(timeout: 8), - "'All' category chip must be visible in Packs content pane" + app.buttons["packs_category_filter"].waitForExistence(timeout: 8) + || app.popUpButtons["packs_category_filter"].waitForExistence(timeout: 2), + "Category filter picker must be visible in Packs content pane" ) } @@ -120,7 +121,8 @@ final class NavigationMacOSTests: AppUITestCase { return app.staticTexts["Here's your outdoor dashboard"].waitForExistence(timeout: timeout) case "Packs": return app.buttons["New Pack"].waitForExistence(timeout: timeout) - || app.buttons["All"].waitForExistence(timeout: 1) + || app.buttons["packs_category_filter"].waitForExistence(timeout: 1) + || app.popUpButtons["packs_category_filter"].waitForExistence(timeout: 1) case "Trips": return app.buttons["Plan Trip"].waitForExistence(timeout: timeout) || app.tables.firstMatch.waitForExistence(timeout: 1) diff --git a/apps/swift/Tests/PackRatUITests/NavigationTests.swift b/apps/swift/Tests/PackRatUITests/NavigationTests.swift index 3404b19cb7..4b990ab959 100644 --- a/apps/swift/Tests/PackRatUITests/NavigationTests.swift +++ b/apps/swift/Tests/PackRatUITests/NavigationTests.swift @@ -78,10 +78,11 @@ final class NavigationTests: AppUITestCase { func testPacksCategoryFilterBarVisible() { goToTab("Packs") - // Category filter chips (All, Hiking, Backpacking, …) are in a scroll view above the list + // Category filtering should use the native SwiftUI picker/menu control. XCTAssertTrue( - app.buttons["All"].waitForExistence(timeout: 8), - "'All' category chip must be visible in Packs tab" + app.buttons["packs_category_filter"].waitForExistence(timeout: 8) + || app.popUpButtons["packs_category_filter"].waitForExistence(timeout: 2), + "Category filter picker must be visible in Packs tab" ) } diff --git a/apps/swift/Tests/PackRatUITests/PackSubFlowMacOSTests.swift b/apps/swift/Tests/PackRatUITests/PackSubFlowMacOSTests.swift index 0f038068fd..48b8a675b3 100644 --- a/apps/swift/Tests/PackRatUITests/PackSubFlowMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/PackSubFlowMacOSTests.swift @@ -87,7 +87,10 @@ final class PackSubFlowMacOSTests: AppUITestCase { createPack(named: packName) goToSidebar("Packs") - XCTAssertTrue(app.buttons["All"].waitForExistence(timeout: 5)) + XCTAssertTrue( + app.buttons["packs_category_filter"].waitForExistence(timeout: 5) + || app.popUpButtons["packs_category_filter"].waitForExistence(timeout: 2) + ) // Right-click triggers context menu on macOS. let cell = waitFor(app.staticTexts[packName]) diff --git a/apps/swift/Tests/PackRatUITests/PackSubFlowTests.swift b/apps/swift/Tests/PackRatUITests/PackSubFlowTests.swift index c370b7801d..25f8e8bbe3 100644 --- a/apps/swift/Tests/PackRatUITests/PackSubFlowTests.swift +++ b/apps/swift/Tests/PackRatUITests/PackSubFlowTests.swift @@ -100,8 +100,11 @@ final class PackSubFlowTests: AppUITestCase { createPack(named: packName) goToTab("Packs") - // The category filter chips - XCTAssertTrue(app.buttons["All"].waitForExistence(timeout: 5)) + // The category filter should be a native picker/menu. + XCTAssertTrue( + app.buttons["packs_category_filter"].waitForExistence(timeout: 5) + || app.popUpButtons["packs_category_filter"].waitForExistence(timeout: 2) + ) // Long press a row triggers context menu let cell = app.cells.containing(.staticText, identifier: packName).firstMatch diff --git a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift index b149fb2eb5..a45235a369 100644 --- a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift +++ b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift @@ -825,18 +825,10 @@ final class VisualScreenshotTests: XCTestCase { #endif capture(name) if let query { - #if os(macOS) - let searchField = app.textFields["global_search_field"].firstMatch - #else let searchField = app.searchFields["Search packs, trips, trails…"].firstMatch - #endif XCTAssertTrue(searchField.waitForExistence(timeout: 5), "Expected global search field for screenshot \(name)") activate(searchField) - #if os(macOS) - app.typeText(query) - #else searchField.typeText(query) - #endif let sampleResult = app.descendants(matching: .any) .matching(identifier: "global_search_result_pack-visual-pack-alpine") .firstMatch From 6c36c8f0ebf958a016ab879cedebaaa02693f8db Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Thu, 28 May 2026 17:52:03 -0600 Subject: [PATCH 32/60] =?UTF-8?q?=F0=9F=A7=B0=20Harden=20Swift=20visual=20?= =?UTF-8?q?screenshot=20runner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scripts/capture-visual-screenshots.ts | 186 +++++++++++++++--- apps/swift/scripts/lib/xcresult.ts | 7 +- 2 files changed, 166 insertions(+), 27 deletions(-) diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index d311305d99..c1656fd1fa 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -12,7 +12,7 @@ import { import { basename, resolve } from 'node:path'; import { pathToFileURL } from 'node:url'; import { listBooted } from './lib/simctl'; -import { formatSummaryLine, readSummary, XcResultError } from './lib/xcresult'; +import { formatSummaryLine, readSummary, type TestSummary, XcResultError } from './lib/xcresult'; type Platform = 'ios' | 'macos'; @@ -34,6 +34,21 @@ type ContactSheetGroup = { matches: (fileName: string) => boolean; }; +type VisualTestResult = { + resultBundle: string; + summary: TestSummary | null; +}; + +type PlatformRunSummary = { + platform: Platform; + screenshotDir: string; + coverageManifest: string; + contactSheet: string; + groupedContactSheets: string[]; + resultBundle?: string; + testSummary?: TestSummary; +}; + const REPO_ROOT = resolve(import.meta.dir, '../../..'); const SWIFT_DIR = resolve(REPO_ROOT, 'apps/swift'); const RESULTS_DIR = resolve(SWIFT_DIR, 'TestResults'); @@ -46,6 +61,15 @@ const XCT_ATTACHMENT_SUFFIX_RE = /_\d+_[0-9A-F-]+\.png$/i; const DATA_DETAIL_SCREENSHOT_RE = /^7[1-9]-data-/; const SIPS_PIXEL_WIDTH_RE = /pixelWidth:\s*(\d+)/; const SIPS_PIXEL_HEIGHT_RE = /pixelHeight:\s*(\d+)/; +const XCODEBUILD_TIMEOUT_MS = durationFromEnv('PACKRAT_VISUAL_XCODEBUILD_TIMEOUT_MS', 30 * 60_000); +const XCRESULT_EXPORT_TIMEOUT_MS = durationFromEnv('PACKRAT_XCRESULT_EXPORT_TIMEOUT_MS', 90_000); +const AUTOMATION_MODE_TIMEOUT_MS = 10_000; +const IMAGE_SIZE_TIMEOUT_MS = 5_000; +const PLAYWRIGHT_RENDER_TIMEOUT_MS = durationFromEnv( + 'PACKRAT_PLAYWRIGHT_RENDER_TIMEOUT_MS', + 30_000, +); +const CONTACT_SHEET_RENDER_TIMEOUT_MS = 90_000; const CHROME_CANDIDATES = [ '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', '/Applications/Chromium.app/Contents/MacOS/Chromium', @@ -251,6 +275,40 @@ function requirement( return { ...metadata, name: `${name}.png` }; } +function durationFromEnv(name: string, fallback: number): number { + const raw = process.env[name]; + if (!raw) return fallback; + const parsed = Number(raw); + return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback; +} + +function escapeRegExp(value: string): string { + return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +function redactSecrets(output: string): string { + let redacted = output; + for (const secret of [ + process.env.E2E_EMAIL, + process.env.E2E_PASSWORD, + process.env.E2E_TEST_EMAIL, + process.env.E2E_TEST_PASSWORD, + process.env.PACKRAT_E2E_EMAIL, + process.env.PACKRAT_E2E_PASSWORD, + process.env.PACKRAT_E2E_SESSION_TOKEN, + process.env.PACKRAT_E2E_USER_ID, + ]) { + if (!secret) continue; + redacted = redacted.replace(new RegExp(escapeRegExp(secret), 'g'), '[REDACTED]'); + } + redacted = redacted.replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi, '[REDACTED_EMAIL]'); + redacted = redacted.replace( + /PACKRAT_E2E_(?:EMAIL|PASSWORD|SESSION_TOKEN|USER_ID)=\S+/g, + (match) => `${match.slice(0, match.indexOf('=') + 1)}[REDACTED]`, + ); + return redacted; +} + function requiredScreenshots(platform: Platform): ScreenshotRequirement[] { const surfaceRequirements = platform === 'ios' @@ -555,7 +613,7 @@ function allocateResultBundle(platform: Platform): string { return path; } -function runXcodeVisualTest(platform: Platform, screenshotDir: string): Promise { +function runXcodeVisualTest(platform: Platform, screenshotDir: string): Promise { const resultBundle = allocateResultBundle(platform); const writableScreenshotDir = allocateWritableScreenshotDir(platform); const credentials = e2eBuildSettings(); @@ -599,6 +657,8 @@ function runXcodeVisualTest(platform: Platform, screenshotDir: string): Promise< if (platform === 'macos') assertAutomationModeAvailable(); return new Promise((resolvePromise, reject) => { + let timedOut = false; + let finalized = false; const child = spawn('xcodebuild', args, { cwd: SWIFT_DIR, env: { @@ -607,22 +667,56 @@ function runXcodeVisualTest(platform: Platform, screenshotDir: string): Promise< PACKRAT_SCREENSHOT_DIR: writableScreenshotDir, }, }); - - child.stdout.on('data', (chunk) => process.stdout.write(chunk)); - child.stderr.on('data', (chunk) => process.stderr.write(chunk)); - child.on('error', reject); - child.on('close', (code) => { - summarizeResult(resultBundle); - copyScreenshots(writableScreenshotDir, screenshotDir); - if (listScreenshots(screenshotDir).length === 0) { - exportScreenshotsFromResultBundle(resultBundle, screenshotDir); + const timeout = setTimeout(() => { + timedOut = true; + console.error( + `xcodebuild timed out after ${Math.round(XCODEBUILD_TIMEOUT_MS / 1000)}s for ${platform}; terminating child process.`, + ); + child.kill('SIGINT'); + setTimeout(() => { + if (!child.killed) child.kill('SIGKILL'); + }, 5_000).unref(); + }, XCODEBUILD_TIMEOUT_MS); + timeout.unref(); + + child.stdout.on('data', (chunk) => process.stdout.write(redactSecrets(chunk.toString()))); + child.stderr.on('data', (chunk) => process.stderr.write(redactSecrets(chunk.toString()))); + child.on('error', (err) => { + if (finalized) return; + finalized = true; + clearTimeout(timeout); + reject(err); + }); + const finalize = (code: number | null) => { + if (finalized) return; + finalized = true; + clearTimeout(timeout); + try { + const summary = summarizeResult(resultBundle); + copyScreenshots(writableScreenshotDir, screenshotDir); + if (listScreenshots(screenshotDir).length === 0) { + exportScreenshotsFromResultBundle(resultBundle, screenshotDir); + } + if (code === 0) { + resolvePromise({ resultBundle, summary }); + return; + } + } catch (err) { + reject(err); + return; } - if (code === 0) { - resolvePromise(); + if (timedOut) { + reject( + new Error( + `xcodebuild timed out after ${Math.round(XCODEBUILD_TIMEOUT_MS / 1000)}s for ${platform}`, + ), + ); } else { reject(new Error(`xcodebuild exited with ${code ?? 'unknown status'} for ${platform}`)); } - }); + }; + child.on('exit', finalize); + child.on('close', finalize); }); } @@ -651,7 +745,7 @@ function exportScreenshotsFromResultBundle(resultBundle: string, toDir: string): const result = spawnSync( 'xcrun', ['xcresulttool', 'export', 'attachments', '--path', resultBundle, '--output-path', exportDir], - { encoding: 'utf8' }, + { encoding: 'utf8', timeout: XCRESULT_EXPORT_TIMEOUT_MS, maxBuffer: 20 * 1024 * 1024 }, ); if (result.status !== 0) { @@ -705,7 +799,10 @@ function e2eBuildSettings(): string[] { } function assertAutomationModeAvailable(): void { - const result = spawnSync('automationmodetool', ['help'], { encoding: 'utf8' }); + const result = spawnSync('automationmodetool', ['help'], { + encoding: 'utf8', + timeout: AUTOMATION_MODE_TIMEOUT_MS, + }); const output = `${result.stdout ?? ''}${result.stderr ?? ''}`; if ( output.includes('Automation Mode is disabled') && @@ -717,12 +814,15 @@ function assertAutomationModeAvailable(): void { } } -function summarizeResult(resultBundle: string): void { +function summarizeResult(resultBundle: string): TestSummary | null { try { - console.log(formatSummaryLine(readSummary(resultBundle))); + const summary = readSummary(resultBundle); + console.log(formatSummaryLine(summary)); + return summary; } catch (err) { if (err instanceof XcResultError) { console.warn(`Warning: ${err.message}`); + return null; } else { throw err; } @@ -925,7 +1025,7 @@ async function screenshotHtml({ }): Promise { try { const { chromium } = await import('@playwright/test'); - const browser = await chromium.launch(); + const browser = await chromium.launch({ timeout: PLAYWRIGHT_RENDER_TIMEOUT_MS }); try { const page = await browser.newPage({ viewport: { width: platform === 'macos' ? 1800 : 1600, height: 1200 }, @@ -962,7 +1062,7 @@ async function screenshotHtml({ `--screenshot=${outputPath}`, pathToFileURL(htmlPath).href, ], - { encoding: 'utf8' }, + { encoding: 'utf8', timeout: CONTACT_SHEET_RENDER_TIMEOUT_MS }, ); if (result.status !== 0) { @@ -1003,6 +1103,7 @@ function estimateContactSheetHeight({ function readImageSize(image: string): { width: number; height: number } | null { const result = spawnSync('sips', ['-g', 'pixelWidth', '-g', 'pixelHeight', image], { encoding: 'utf8', + timeout: IMAGE_SIZE_TIMEOUT_MS, }); if (result.status !== 0) return null; const width = result.stdout.match(SIPS_PIXEL_WIDTH_RE)?.[1]; @@ -1019,27 +1120,60 @@ async function main() { loadDotEnv(); const options = parseArgs(process.argv.slice(2)); mkdirSync(options.outDir, { recursive: true }); + const runSummary: PlatformRunSummary[] = []; for (const platform of options.platforms) { const dir = screenshotDirFor(options.outDir, platform); + let testResult: VisualTestResult | null = null; mkdirSync(dir, { recursive: true }); if (!options.skipTests) { rmSync(dir, { recursive: true, force: true }); mkdirSync(dir, { recursive: true }); - await runXcodeVisualTest(platform, dir); + testResult = await runXcodeVisualTest(platform, dir); } validateScreenshotMatrix(platform, dir); const contactSheet = await renderContactSheet(platform, options.outDir); const groupedContactSheets = await renderGroupedContactSheets(platform, options.outDir); + const coverageManifest = resolve(dir, 'coverage-manifest.json'); + runSummary.push({ + platform, + screenshotDir: dir, + coverageManifest, + contactSheet, + groupedContactSheets, + ...(testResult + ? { + resultBundle: testResult.resultBundle, + ...(testResult.summary ? { testSummary: testResult.summary } : {}), + } + : {}), + }); console.log(`✓ ${platform} contact sheet: ${contactSheet}`); for (const groupedContactSheet of groupedContactSheets) { console.log(`✓ ${platform} grouped contact sheet: ${groupedContactSheet}`); } - console.log(`✓ ${platform} coverage manifest: ${resolve(dir, 'coverage-manifest.json')}`); + console.log(`✓ ${platform} coverage manifest: ${coverageManifest}`); } + + const runSummaryPath = resolve(options.outDir, 'run-summary.json'); + writeFileSync( + runSummaryPath, + `${JSON.stringify( + { + generatedAt: new Date().toISOString(), + skipTests: options.skipTests, + platforms: runSummary, + }, + null, + 2, + )}\n`, + ); + console.log(`✓ screenshot run summary: ${runSummaryPath}`); } -main().catch((err) => { - console.error(err instanceof Error ? err.message : String(err)); - process.exit(1); -}); +main() + .then(() => process.exit(0)) + .catch((err) => { + console.error(err instanceof Error ? err.message : String(err)); + process.exit(1); + }); diff --git a/apps/swift/scripts/lib/xcresult.ts b/apps/swift/scripts/lib/xcresult.ts index 493a945669..ba42c1058d 100644 --- a/apps/swift/scripts/lib/xcresult.ts +++ b/apps/swift/scripts/lib/xcresult.ts @@ -96,7 +96,12 @@ export function readSummary(bundlePath: string): TestSummary { stdout = execFileSync( 'xcrun', ['xcresulttool', 'get', 'test-results', 'summary', '--path', bundlePath, '--compact'], - { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] }, + { + encoding: 'utf8', + maxBuffer: 10 * 1024 * 1024, + stdio: ['ignore', 'pipe', 'pipe'], + timeout: 30_000, + }, ); } catch (err) { const message = err instanceof Error ? err.message : String(err); From 81e161a35e933d962d4b620f0340eea31322f905 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Thu, 28 May 2026 17:52:08 -0600 Subject: [PATCH 33/60] =?UTF-8?q?=F0=9F=92=84=20Polish=20native=20Swift=20?= =?UTF-8?q?form=20sheets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Features/Feed/ComposePostView.swift | 62 ++++++++++--------- .../Features/Packs/PackItemFormView.swift | 2 +- .../Features/Weather/WeatherView.swift | 2 +- 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/apps/swift/Sources/PackRat/Features/Feed/ComposePostView.swift b/apps/swift/Sources/PackRat/Features/Feed/ComposePostView.swift index 1cd86c704c..61ddc11135 100644 --- a/apps/swift/Sources/PackRat/Features/Feed/ComposePostView.swift +++ b/apps/swift/Sources/PackRat/Features/Feed/ComposePostView.swift @@ -8,22 +8,27 @@ struct ComposePostView: View { @State private var caption = "" @State private var error: String? - private var canPost: Bool { !caption.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty } + private var canPost: Bool { + !caption.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty && caption.count <= 500 + } var body: some View { NavigationStack { - VStack(alignment: .leading, spacing: 0) { - HStack(alignment: .top, spacing: 12) { - AvatarView( - url: authManager.currentUser?.avatarUrl, - fallbackText: authManager.currentUser?.initials ?? "?", - size: 40 - ) - TextEditor(text: $caption) - .font(.body) - .frame(minHeight: 120, maxHeight: 240) - .scrollContentBackground(.hidden) - .overlay(alignment: .topLeading) { + Form { + Section { + HStack(alignment: .top, spacing: 12) { + AvatarView( + url: authManager.currentUser?.avatarUrl, + fallbackText: authManager.currentUser?.initials ?? "?", + size: 36 + ) + ZStack(alignment: .topLeading) { + TextEditor(text: $caption) + .font(.body) + .frame(minHeight: 140) + .scrollContentBackground(.hidden) + .accessibilityIdentifier("feed_compose_caption") + if caption.isEmpty { Text("Share a trip, pack, or gear tip…") .foregroundStyle(.tertiary) @@ -32,26 +37,25 @@ struct ComposePostView: View { .padding(.leading, 4) } } - .accessibilityIdentifier("feed_compose_caption") + } + .padding(.vertical, 4) + } footer: { + HStack { + Spacer() + Text("\(caption.count) / 500") + .font(.caption.monospacedDigit()) + .foregroundStyle(caption.count > 450 ? .orange : .secondary) + .accessibilityIdentifier("feed_compose_counter") + } } - .padding() if let error { - InlineErrorView(message: error).padding(.horizontal) - } - - Divider() - - HStack { - Text("\(caption.count) / 500") - .font(.caption) - .foregroundStyle(caption.count > 450 ? .orange : .secondary) - .accessibilityIdentifier("feed_compose_counter") - Spacer() + Section { + InlineErrorView(message: error) + } } - .padding(.horizontal) - .padding(.vertical, 8) } + .packRatFormStyle() .navigationTitle("New Post") #if os(macOS) .navigationSubtitle(authManager.currentUser?.displayName ?? "") @@ -70,7 +74,7 @@ struct ComposePostView: View { } } } - .formSheetSize(minWidth: 500, minHeight: 360) + .formSheetSize(minWidth: 500, minHeight: 420) } private func post() async { diff --git a/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift b/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift index 2b168d22ad..6d07b3bfa9 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift @@ -41,7 +41,7 @@ struct PackItemFormView: View { Button("Cancel") { dismiss() } } ToolbarItem(placement: .confirmationAction) { - Button(isLoading ? "Saving..." : (isEditing ? "Save" : "Add")) { submit() } + Button(isLoading ? "Saving…" : (isEditing ? "Save" : "Add")) { submit() } .disabled(!isValid || isLoading) } } diff --git a/apps/swift/Sources/PackRat/Features/Weather/WeatherView.swift b/apps/swift/Sources/PackRat/Features/Weather/WeatherView.swift index ec879c3b77..4146482ed2 100644 --- a/apps/swift/Sources/PackRat/Features/Weather/WeatherView.swift +++ b/apps/swift/Sources/PackRat/Features/Weather/WeatherView.swift @@ -27,7 +27,7 @@ struct WeatherView: View { .listRowSeparator(.hidden) .listRowBackground(Color.clear) } else if viewModel.isLoadingForecast { - ProgressView("Loading forecast...") + ProgressView("Loading forecast…") .frame(maxWidth: .infinity) .listRowSeparator(.hidden) .listRowBackground(Color.clear) From 52a19c6ea18335181ac3de1eb96ab3ebfe2a8025 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Thu, 28 May 2026 20:12:24 -0600 Subject: [PATCH 34/60] =?UTF-8?q?=F0=9F=96=BC=EF=B8=8F=20Add=20nightly=20S?= =?UTF-8?q?wift=20visual=20screenshots?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/swift-visual.yml | 111 ++++++++++++++++++ .../scripts/capture-visual-screenshots.ts | 29 +++-- 2 files changed, 132 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/swift-visual.yml diff --git a/.github/workflows/swift-visual.yml b/.github/workflows/swift-visual.yml new file mode 100644 index 0000000000..874c86d842 --- /dev/null +++ b/.github/workflows/swift-visual.yml @@ -0,0 +1,111 @@ +name: Swift Visual Screenshots + +on: + schedule: + - cron: "21 10 * * *" + workflow_dispatch: + inputs: + platform: + description: "Which visual suite to run" + required: true + default: both + type: choice + options: + - both + - ios + - macos + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: false + +permissions: + contents: read + +env: + SCREENSHOT_ARTIFACT_DIR: artifacts/swift-visual-screenshots + +jobs: + visual-gate: + name: Check visual test prerequisites + runs-on: ubuntu-latest + outputs: + ready: ${{ steps.check.outputs.ready }} + steps: + - id: check + name: Verify E2E credentials are available + env: + E2E_TEST_EMAIL: ${{ secrets.E2E_TEST_EMAIL }} + E2E_TEST_PASSWORD: ${{ secrets.E2E_TEST_PASSWORD }} + run: | + if [ -n "$E2E_TEST_EMAIL" ] && [ -n "$E2E_TEST_PASSWORD" ]; then + echo "ready=true" >> "$GITHUB_OUTPUT" + else + echo "ready=false" >> "$GITHUB_OUTPUT" + echo "::notice::Swift visual screenshots skipped because E2E_TEST_EMAIL/E2E_TEST_PASSWORD are not configured." + fi + + swift-visual: + name: Swift visual suite + needs: visual-gate + if: needs.visual-gate.outputs.ready == 'true' + runs-on: macos-15 + timeout-minutes: 90 + + steps: + - uses: actions/checkout@v6 + + - name: Select Xcode + run: | + sudo xcode-select -switch /Applications/Xcode.app + xcodebuild -version + xcrun --show-sdk-version + + - uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install xcodegen + run: brew install xcodegen + + - name: Install dependencies + env: + PACKRAT_NATIVEWIND_UI_GITHUB_TOKEN: ${{ secrets.PACKRAT_NATIVEWIND_UI_GITHUB_TOKEN }} + run: bun install --frozen-lockfile + + - name: Generate Xcode project + run: bun swift + + - name: Boot iOS simulator + if: ${{ (github.event.inputs.platform || 'both') != 'macos' }} + run: | + DEVICE_ID=$(xcrun simctl create Swift-Visual "iPhone 17" \ + "$(xcrun simctl list runtimes -j | jq -r '.runtimes[] | select(.identifier | contains("iOS-")) | .identifier' | sort -V | tail -1)") + xcrun simctl boot "$DEVICE_ID" + xcrun simctl bootstatus "$DEVICE_ID" + + - name: Check macOS Automation Mode + if: ${{ (github.event.inputs.platform || 'both') != 'ios' }} + run: automationmodetool help + + - name: Capture Swift visual screenshots + env: + E2E_EMAIL: ${{ secrets.E2E_TEST_EMAIL }} + E2E_PASSWORD: ${{ secrets.E2E_TEST_PASSWORD }} + E2E_TEST_EMAIL: ${{ secrets.E2E_TEST_EMAIL }} + E2E_TEST_PASSWORD: ${{ secrets.E2E_TEST_PASSWORD }} + PACKRAT_VISUAL_XCODEBUILD_TIMEOUT_MS: "3600000" + run: | + PLATFORM="${{ github.event.inputs.platform || 'both' }}" + bun swift:screenshots --platform "$PLATFORM" --out "$SCREENSHOT_ARTIFACT_DIR" + + - name: Upload contact sheets + if: always() + uses: actions/upload-artifact@v4 + with: + name: swift-visual-screenshots + path: | + ${{ env.SCREENSHOT_ARTIFACT_DIR }} + apps/swift/TestResults/visual-*.xcresult + if-no-files-found: ignore + retention-days: 14 diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index c1656fd1fa..e9a294f850 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -1023,6 +1023,12 @@ async function screenshotHtml({ outputPath: string; platform: Platform; }): Promise { + const chrome = CHROME_CANDIDATES.find((candidate) => existsSync(candidate)); + if (chrome) { + renderWithSystemChrome({ chrome, htmlPath, images, outputPath, platform }); + return; + } + try { const { chromium } = await import('@playwright/test'); const browser = await chromium.launch({ timeout: PLAYWRIGHT_RENDER_TIMEOUT_MS }); @@ -1038,18 +1044,25 @@ async function screenshotHtml({ await browser.close(); } } catch (err) { - console.warn( - `Playwright screenshot unavailable; falling back to system Chrome. ${formatError(err)}`, - ); - } - - const chrome = CHROME_CANDIDATES.find((candidate) => existsSync(candidate)); - if (!chrome) { throw new Error( - `No browser renderer found. Open ${htmlPath} manually, or run \`bunx playwright install chromium\`.`, + `No contact sheet renderer found. System Chrome is unavailable and Playwright failed: ${formatError(err)}`, ); } +} +function renderWithSystemChrome({ + chrome, + htmlPath, + images, + outputPath, + platform, +}: { + chrome: string; + htmlPath: string; + images: string[]; + outputPath: string; + platform: Platform; +}): void { const width = platform === 'macos' ? 1800 : 1600; const height = estimateContactSheetHeight({ images, platform, width }); const result = spawnSync( From ef120d1a24effd9687b4a7f03012ed99c175550d Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Thu, 28 May 2026 20:13:21 -0600 Subject: [PATCH 35/60] =?UTF-8?q?=F0=9F=93=9D=20Document=20Swift=20visual?= =?UTF-8?q?=20testing=20catalog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/testing.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/docs/testing.md b/docs/testing.md index 4d53ad8a37..34da406eda 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -219,6 +219,30 @@ Run with `bun test` from `packages/api/`. Requires Docker (Postgres + neon-wspro Test fixtures must seed users through `userService.createUser`. Do not write new integration tests that `db.insert(users).values(...)` directly. +### Pattern 5 — Swift visual E2E catalog + +The native Swift apps have a visual catalog runner that drives `VisualScreenshotTests` on iOS and macOS, exports every named screenshot, validates the required surface matrix, and renders contact sheets for review. + +```bash +# Full iOS + macOS visual pass. Requires E2E credentials. +bun swift:screenshots --out artifacts/screenshots + +# Platform-specific runs while iterating. +bun swift:screenshots --platform ios --out artifacts/screenshots +bun swift:screenshots --platform macos --out artifacts/screenshots + +# Rebuild contact sheets from existing captured PNGs without rerunning Xcode. +bun swift:screenshots --skip-tests --out artifacts/screenshots +``` + +The runner writes: +- `ios-contact-sheet.png` / `macos-contact-sheet.png` for the full spread. +- Grouped sheets for unauthenticated, guest, guest limits, offline, authenticated, seeded data, detail, expanded controls, and modal states. +- `ios-xctest/coverage-manifest.json` and `macos-xctest/coverage-manifest.json`, which map required screenshot names to feature areas and flows. +- `run-summary.json` with artifact paths and xcresult summaries when tests ran. + +CI runs the same catalog through `.github/workflows/swift-visual.yml` on a nightly schedule and by manual dispatch. The workflow uploads the contact sheets and visual `.xcresult` bundles as `swift-visual-screenshots`. macOS visual runs require Automation Mode to be available on the runner; locally, run `automationmodetool enable-automationmode-without-authentication` once before leaving the suite unattended. + --- ## What to Test (Priority Order) @@ -259,6 +283,11 @@ bun lint:weak-assertions # custom lint over test files # Scripts test suite (ratchet + lint analyzer) bun test:scripts + +# Swift native apps +bun swift # regenerate the Xcode project after project.yml or source tree changes +bun test:swift:scripts # TypeScript helper tests for simctl/xcresult/script parsing +bun swift:screenshots # visual E2E catalog for iOS + macOS ``` Coverage reports for each workspace: From c99b35bbbcca523dfa551c8a6bee10d2dbb70c98 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Thu, 28 May 2026 21:52:43 -0600 Subject: [PATCH 36/60] =?UTF-8?q?=E2=8C=9A=EF=B8=8F=20Add=20iPad=20family?= =?UTF-8?q?=20and=20watch=20companion=20shell?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/swift/Resources/Info-watchOS.plist | 28 +++ .../PackRatWatch/PackRatWatchApp.swift | 171 ++++++++++++++++++ apps/swift/project.yml | 34 ++++ 3 files changed, 233 insertions(+) create mode 100644 apps/swift/Resources/Info-watchOS.plist create mode 100644 apps/swift/Sources/PackRatWatch/PackRatWatchApp.swift diff --git a/apps/swift/Resources/Info-watchOS.plist b/apps/swift/Resources/Info-watchOS.plist new file mode 100644 index 0000000000..6d31566a00 --- /dev/null +++ b/apps/swift/Resources/Info-watchOS.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + PackRat + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + ITSAppUsesNonExemptEncryption + + WKApplication + + + diff --git a/apps/swift/Sources/PackRatWatch/PackRatWatchApp.swift b/apps/swift/Sources/PackRatWatch/PackRatWatchApp.swift new file mode 100644 index 0000000000..dae6df5da6 --- /dev/null +++ b/apps/swift/Sources/PackRatWatch/PackRatWatchApp.swift @@ -0,0 +1,171 @@ +import SwiftUI + +@main +struct PackRatWatchApp: App { + var body: some Scene { + WindowGroup { + WatchDashboardView() + } + } +} + +private struct WatchDashboardView: View { + @State private var selectedTab = 0 + + var body: some View { + TabView(selection: $selectedTab) { + TrailReadyView() + .tag(0) + WatchChecklistView() + .tag(1) + WatchWeatherView() + .tag(2) + WatchTrailReportView() + .tag(3) + } + .tabViewStyle(.verticalPage) + } +} + +private struct TrailReadyView: View { + var body: some View { + NavigationStack { + List { + Section { + VStack(alignment: .leading, spacing: 8) { + Label("Trail Ready", systemImage: "checkmark.seal.fill") + .font(.headline) + .foregroundStyle(.green) + + Text("Quick wrist access for the next pack, weather, and trail notes.") + .font(.footnote) + .foregroundStyle(.secondary) + .fixedSize(horizontal: false, vertical: true) + } + } + + Section("Today") { + WatchMetricRow(title: "Base Weight", value: "18.4 lb", symbol: "scalemass") + WatchMetricRow(title: "Packed", value: "12 of 15", symbol: "backpack") + WatchMetricRow(title: "Weather", value: "64° Clear", symbol: "sun.max") + } + } + .navigationTitle("PackRat") + } + } +} + +private struct WatchChecklistView: View { + @AppStorage("watch.checklist.shelter") private var shelterPacked = true + @AppStorage("watch.checklist.water") private var waterPacked = false + @AppStorage("watch.checklist.firstAid") private var firstAidPacked = true + @AppStorage("watch.checklist.layers") private var layersPacked = false + + var body: some View { + NavigationStack { + List { + Section("Pack") { + WatchChecklistToggle(title: "Shelter", symbol: "tent", isOn: $shelterPacked) + WatchChecklistToggle(title: "Water", symbol: "drop", isOn: $waterPacked) + WatchChecklistToggle(title: "First Aid", symbol: "cross.case", isOn: $firstAidPacked) + WatchChecklistToggle(title: "Layers", symbol: "jacket", isOn: $layersPacked) + } + } + .navigationTitle("Checklist") + } + } +} + +private struct WatchWeatherView: View { + var body: some View { + NavigationStack { + List { + Section { + VStack(alignment: .leading, spacing: 4) { + Label("Denver", systemImage: "location.fill") + .font(.headline) + Text("64°") + .font(.system(size: 38, weight: .semibold, design: .rounded)) + Text("Clear. Wind 5 mph.") + .font(.caption) + .foregroundStyle(.secondary) + } + .padding(.vertical, 4) + } + + Section("Next 3 hours") { + WatchMetricRow(title: "Now", value: "64°", symbol: "sun.max") + WatchMetricRow(title: "1 PM", value: "67°", symbol: "sun.max") + WatchMetricRow(title: "2 PM", value: "68°", symbol: "cloud.sun") + } + } + .navigationTitle("Weather") + } + } +} + +private struct WatchTrailReportView: View { + @State private var selectedCondition = "Good" + private let conditions = ["Good", "Muddy", "Snow", "Closed"] + + var body: some View { + NavigationStack { + List { + Section("Condition") { + Picker("Condition", selection: $selectedCondition) { + ForEach(conditions, id: \.self) { condition in + Text(condition).tag(condition) + } + } + } + + Section { + Button { + } label: { + Label("Save Draft", systemImage: "square.and.pencil") + } + .buttonStyle(.borderedProminent) + } + + Section { + Text("Drafts sync when the iPhone app connection is available.") + .font(.footnote) + .foregroundStyle(.secondary) + } + } + .navigationTitle("Trail Report") + } + } +} + +private struct WatchMetricRow: View { + let title: String + let value: String + let symbol: String + + var body: some View { + HStack(spacing: 8) { + Image(systemName: symbol) + .foregroundStyle(.tint) + .frame(width: 18) + Text(title) + Spacer() + Text(value) + .foregroundStyle(.secondary) + .lineLimit(1) + } + .font(.caption) + } +} + +private struct WatchChecklistToggle: View { + let title: String + let symbol: String + @Binding var isOn: Bool + + var body: some View { + Toggle(isOn: $isOn) { + Label(title, systemImage: symbol) + } + } +} diff --git a/apps/swift/project.yml b/apps/swift/project.yml index 52a4b7ed8b..7250f4b7cf 100644 --- a/apps/swift/project.yml +++ b/apps/swift/project.yml @@ -5,6 +5,7 @@ options: deploymentTarget: iOS: "17.0" macOS: "14.0" + watchOS: "10.0" xcodeVersion: "16.0" createIntermediateGroups: true groupSortPosition: top @@ -124,6 +125,31 @@ targets: DEVELOPMENT_TEAM: 7WV9JYCW55 PRODUCT_BUNDLE_IDENTIFIER: com.andrewbierman.packrat PRODUCT_MODULE_NAME: PackRat + TARGETED_DEVICE_FAMILY: "1,2" + + PackRat-Watch: + type: application + platform: watchOS + deploymentTarget: "10.0" + sources: + - Sources/PackRatWatch + info: + path: Resources/Info-watchOS.plist + properties: + CFBundleDisplayName: PackRat + CFBundleShortVersionString: "1.0" + CFBundleVersion: "1" + WKApplication: true + ITSAppUsesNonExemptEncryption: false + settings: + base: + SWIFT_VERSION: "5.9" + MARKETING_VERSION: "1.0" + CURRENT_PROJECT_VERSION: "1" + CODE_SIGN_STYLE: Automatic + DEVELOPMENT_TEAM: 7WV9JYCW55 + PRODUCT_BUNDLE_IDENTIFIER: com.andrewbierman.packrat.watchkitapp + PRODUCT_MODULE_NAME: PackRatWatch PackRat-macOS: type: application @@ -313,3 +339,11 @@ schemes: config: Debug archive: config: Release + PackRat-Watch: + build: + targets: + PackRat-Watch: all + run: + config: Debug + archive: + config: Release From f6041f6efec819df906a90d50b8de2565f3ba1eb Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Thu, 28 May 2026 21:52:49 -0600 Subject: [PATCH 37/60] =?UTF-8?q?=F0=9F=96=BC=EF=B8=8F=20Add=20iPad=20visu?= =?UTF-8?q?al=20screenshot=20coverage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/swift-visual.yml | 11 ++- .../VisualScreenshotTests.swift | 92 ++++++++++++++----- .../scripts/capture-visual-screenshots.ts | 69 ++++++++++---- 3 files changed, 132 insertions(+), 40 deletions(-) diff --git a/.github/workflows/swift-visual.yml b/.github/workflows/swift-visual.yml index 874c86d842..59a6e90e9b 100644 --- a/.github/workflows/swift-visual.yml +++ b/.github/workflows/swift-visual.yml @@ -13,6 +13,7 @@ on: options: - both - ios + - ipad - macos concurrency: @@ -84,8 +85,16 @@ jobs: xcrun simctl boot "$DEVICE_ID" xcrun simctl bootstatus "$DEVICE_ID" + - name: Boot iPad simulator + if: ${{ (github.event.inputs.platform || 'both') == 'ipad' || (github.event.inputs.platform || 'both') == 'both' }} + run: | + DEVICE_ID=$(xcrun simctl list devices available -j \ + | jq -r '[.devices[][] | select(.isAvailable == true and (.name | contains("iPad")))] | .[0].udid') + xcrun simctl boot "$DEVICE_ID" || true + xcrun simctl bootstatus "$DEVICE_ID" + - name: Check macOS Automation Mode - if: ${{ (github.event.inputs.platform || 'both') != 'ios' }} + if: ${{ (github.event.inputs.platform || 'both') == 'macos' || (github.event.inputs.platform || 'both') == 'both' }} run: automationmodetool help - name: Capture Swift visual screenshots diff --git a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift index a45235a369..4dc72e5263 100644 --- a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift +++ b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift @@ -34,6 +34,13 @@ final class VisualScreenshotTests: XCTestCase { launchLoggedOut() } + #if os(iOS) + private var isPadVisualRun: Bool { + ProcessInfo.processInfo.environment["PACKRAT_VISUAL_PLATFORM"] == "ipad" + || screenshotDirectory?.path.contains("ipad") == true + } + #endif + func testGuestVisualSurface() throws { capture("00-unauth-welcome") captureRegisterAndLoginStates() @@ -41,7 +48,7 @@ final class VisualScreenshotTests: XCTestCase { capture("03-guest-home") #if os(iOS) - capturePhoneCoreSurface(mode: .guest) + isPadVisualRun ? captureMacSurface(mode: .guest) : capturePhoneCoreSurface(mode: .guest) #elseif os(macOS) captureMacSurface(mode: .guest) #endif @@ -49,16 +56,19 @@ final class VisualScreenshotTests: XCTestCase { #if os(iOS) func testGuestPrimaryHomeActionVisualSurface() throws { + if isPadVisualRun { throw XCTSkip("Compact Home action catalog is covered by iPhone; iPad uses sidebar visual coverage.") } enterGuestMode() capturePhoneHomeActionSurface(mode: .guest, actions: primaryPhoneHomeActions) } func testGuestExploreHomeActionVisualSurface() throws { + if isPadVisualRun { throw XCTSkip("Compact Home action catalog is covered by iPhone; iPad uses sidebar visual coverage.") } enterGuestMode() capturePhoneHomeActionSurface(mode: .guest, actions: explorePhoneHomeActions) } func testGuestDeepHomeActionVisualSurface() throws { + if isPadVisualRun { throw XCTSkip("Compact Home action catalog is covered by iPhone; iPad uses sidebar visual coverage.") } enterGuestMode() capturePhoneHomeActionSurface(mode: .guest, actions: deepPhoneHomeActions) } @@ -68,7 +78,7 @@ final class VisualScreenshotTests: XCTestCase { enterGuestMode() #if os(iOS) - capturePhoneModalCoreSurface(mode: .guest) + isPadVisualRun ? captureMacModalSurface(mode: .guest) : capturePhoneModalCoreSurface(mode: .guest) #elseif os(macOS) captureMacModalSurface(mode: .guest) #endif @@ -76,11 +86,13 @@ final class VisualScreenshotTests: XCTestCase { #if os(iOS) func testGuestPlanningModalSurface() throws { + if isPadVisualRun { throw XCTSkip("Planning modals are covered by the iPad sidebar modal sweep.") } enterGuestMode() capturePhoneModalPlanningSurface(mode: .guest) } func testGuestConnectedModalSurface() throws { + if isPadVisualRun { throw XCTSkip("Connected modals are covered by the iPad sidebar modal sweep.") } enterGuestMode() capturePhoneModalConnectedSurface(mode: .guest) } @@ -91,7 +103,7 @@ final class VisualScreenshotTests: XCTestCase { capture("20-auth-home") #if os(iOS) - capturePhoneCoreSurface(mode: .authenticated) + isPadVisualRun ? captureMacSurface(mode: .authenticated) : capturePhoneCoreSurface(mode: .authenticated) #elseif os(macOS) captureMacSurface(mode: .authenticated) #endif @@ -99,16 +111,19 @@ final class VisualScreenshotTests: XCTestCase { #if os(iOS) func testAuthenticatedPrimaryHomeActionVisualSurface() throws { + if isPadVisualRun { throw XCTSkip("Compact Home action catalog is covered by iPhone; iPad uses sidebar visual coverage.") } launchAuthenticated() capturePhoneHomeActionSurface(mode: .authenticated, actions: primaryPhoneHomeActions) } func testAuthenticatedExploreHomeActionVisualSurface() throws { + if isPadVisualRun { throw XCTSkip("Compact Home action catalog is covered by iPhone; iPad uses sidebar visual coverage.") } launchAuthenticated() capturePhoneHomeActionSurface(mode: .authenticated, actions: explorePhoneHomeActions) } func testAuthenticatedDeepHomeActionVisualSurface() throws { + if isPadVisualRun { throw XCTSkip("Compact Home action catalog is covered by iPhone; iPad uses sidebar visual coverage.") } launchAuthenticated() capturePhoneHomeActionSurface(mode: .authenticated, actions: deepPhoneHomeActions) } @@ -119,7 +134,7 @@ final class VisualScreenshotTests: XCTestCase { capture("70-data-home") #if os(iOS) - capturePhoneCoreSurface(mode: .sampleData) + isPadVisualRun ? captureMacSurface(mode: .sampleData) : capturePhoneCoreSurface(mode: .sampleData) #elseif os(macOS) captureMacSurface(mode: .sampleData) #endif @@ -127,16 +142,19 @@ final class VisualScreenshotTests: XCTestCase { #if os(iOS) func testAuthenticatedSampleDataPrimaryHomeActionVisualSurface() throws { + if isPadVisualRun { throw XCTSkip("Compact Home action catalog is covered by iPhone; iPad uses sidebar visual coverage.") } launchAuthenticated(sampleData: true) capturePhoneHomeActionSurface(mode: .sampleData, actions: primaryPhoneHomeActions) } func testAuthenticatedSampleDataExploreHomeActionVisualSurface() throws { + if isPadVisualRun { throw XCTSkip("Compact Home action catalog is covered by iPhone; iPad uses sidebar visual coverage.") } launchAuthenticated(sampleData: true) capturePhoneHomeActionSurface(mode: .sampleData, actions: explorePhoneHomeActions) } func testAuthenticatedSampleDataDeepHomeActionVisualSurface() throws { + if isPadVisualRun { throw XCTSkip("Compact Home action catalog is covered by iPhone; iPad uses sidebar visual coverage.") } launchAuthenticated(sampleData: true) capturePhoneHomeActionSurface(mode: .sampleData, actions: deepPhoneHomeActions) } @@ -146,7 +164,7 @@ final class VisualScreenshotTests: XCTestCase { launchAuthenticated(sampleData: true) #if os(iOS) - capturePhoneSampleDataDetails() + isPadVisualRun ? captureMacSampleDataDetails() : capturePhoneSampleDataDetails() #elseif os(macOS) captureMacSampleDataDetails() #endif @@ -156,7 +174,7 @@ final class VisualScreenshotTests: XCTestCase { launchAuthenticated() #if os(iOS) - capturePhoneModalCoreSurface(mode: .authenticated) + isPadVisualRun ? captureMacModalSurface(mode: .authenticated) : capturePhoneModalCoreSurface(mode: .authenticated) #elseif os(macOS) captureMacModalSurface(mode: .authenticated) #endif @@ -164,11 +182,13 @@ final class VisualScreenshotTests: XCTestCase { #if os(iOS) func testAuthenticatedPlanningModalSurface() throws { + if isPadVisualRun { throw XCTSkip("Planning modals are covered by the iPad sidebar modal sweep.") } launchAuthenticated() capturePhoneModalPlanningSurface(mode: .authenticated) } func testAuthenticatedConnectedModalSurface() throws { + if isPadVisualRun { throw XCTSkip("Connected modals are covered by the iPad sidebar modal sweep.") } launchAuthenticated() capturePhoneModalConnectedSurface(mode: .authenticated) } @@ -178,7 +198,7 @@ final class VisualScreenshotTests: XCTestCase { launchAuthenticated(sampleData: true) #if os(iOS) - capturePhoneModalCoreSurface(mode: .sampleData) + isPadVisualRun ? captureMacModalSurface(mode: .sampleData) : capturePhoneModalCoreSurface(mode: .sampleData) #elseif os(macOS) captureMacModalSurface(mode: .sampleData) #endif @@ -186,11 +206,13 @@ final class VisualScreenshotTests: XCTestCase { #if os(iOS) func testAuthenticatedSampleDataPlanningModalSurface() throws { + if isPadVisualRun { throw XCTSkip("Planning modals are covered by the iPad sidebar modal sweep.") } launchAuthenticated(sampleData: true) capturePhoneModalPlanningSurface(mode: .sampleData) } func testAuthenticatedSampleDataConnectedModalSurface() throws { + if isPadVisualRun { throw XCTSkip("Connected modals are covered by the iPad sidebar modal sweep.") } launchAuthenticated(sampleData: true) capturePhoneModalConnectedSurface(mode: .sampleData) } @@ -200,7 +222,7 @@ final class VisualScreenshotTests: XCTestCase { launchAuthenticated(sampleData: true) #if os(iOS) - capturePhoneExpandedPackStates() + isPadVisualRun ? captureMacExpandedPackStates() : capturePhoneExpandedPackStates() #elseif os(macOS) captureMacExpandedPackStates() #endif @@ -210,7 +232,7 @@ final class VisualScreenshotTests: XCTestCase { launchAuthenticated(sampleData: true) #if os(iOS) - capturePhoneExpandedPlanningStates() + isPadVisualRun ? captureMacExpandedPlanningStates() : capturePhoneExpandedPlanningStates() #elseif os(macOS) captureMacExpandedPlanningStates() #endif @@ -220,7 +242,7 @@ final class VisualScreenshotTests: XCTestCase { launchAuthenticated(sampleData: true) #if os(iOS) - capturePhoneExpandedConnectedStates() + isPadVisualRun ? captureMacExpandedConnectedStates() : capturePhoneExpandedConnectedStates() #elseif os(macOS) captureMacExpandedConnectedStates() #endif @@ -238,10 +260,21 @@ final class VisualScreenshotTests: XCTestCase { capture("42-offline-data-home") #if os(iOS) - captureTab("Packs", name: "43-offline-data-packs") - captureTab("Trips", name: "44-offline-data-trips") - captureTab("Assistant", name: "45-offline-data-assistant") - captureHomeAction("Weather", name: "46-offline-data-weather") + if isPadVisualRun { + selectSidebar("Packs") + capture("43-offline-data-packs") + selectSidebar("Trips") + capture("44-offline-data-trips") + selectSidebar("Assistant") + capture("45-offline-data-assistant") + selectSidebar("Weather") + capture("46-offline-data-weather") + } else { + captureTab("Packs", name: "43-offline-data-packs") + captureTab("Trips", name: "44-offline-data-trips") + captureTab("Assistant", name: "45-offline-data-assistant") + captureHomeAction("Weather", name: "46-offline-data-weather") + } #elseif os(macOS) selectSidebar("Packs") capture("43-offline-data-packs") @@ -278,7 +311,11 @@ final class VisualScreenshotTests: XCTestCase { guestButton.tap() #if os(iOS) - XCTAssertTrue(app.tabBars.firstMatch.waitForExistence(timeout: 10)) + if isPadVisualRun { + XCTAssertTrue(app.buttons["nav_home"].waitForExistence(timeout: 10)) + } else { + XCTAssertTrue(app.tabBars.firstMatch.waitForExistence(timeout: 10)) + } #elseif os(macOS) XCTAssertTrue(app.buttons["nav_home"].waitForExistence(timeout: 10)) #endif @@ -624,7 +661,7 @@ final class VisualScreenshotTests: XCTestCase { } #endif - #if os(macOS) + #if os(macOS) || os(iOS) private func captureMacSurface(mode: VisualMode) { let prefix = mode.prefix let suffix = mode.suffix @@ -711,7 +748,11 @@ final class VisualScreenshotTests: XCTestCase { tapAndCapture(identifier: "pack_detail_add_item_button", fallbackButton: "Add Item", name: "82-data-pack-add-item-sheet") resetMacSampleDataSidebar("Packs") scrollToElement(identifier: "pack_item_row_visual-item-shelter") - openContextMenuAndCapture(identifier: "pack_item_row_visual-item-shelter", name: "83-data-pack-more-menu") + if isPadVisualRun { + openMenuAndCapture(identifier: "pack_detail_more_menu", fallbackButton: "More", name: "83-data-pack-more-menu") + } else { + openContextMenuAndCapture(identifier: "pack_item_row_visual-item-shelter", name: "83-data-pack-more-menu") + } resetMacSampleDataSidebar("Packs") scrollToElement(identifier: "pack_item_row_visual-item-shelter") tapElementAndCapture(identifier: "pack_item_row_visual-item-shelter", name: "84-data-pack-item-detail", dismissAfterCapture: false) @@ -783,11 +824,7 @@ final class VisualScreenshotTests: XCTestCase { if let identifier = identifierByLabel[label] { let button = app.buttons[identifier] XCTAssertTrue(button.waitForExistence(timeout: 5), "Expected sidebar item '\(label)'") - if button.isHittable { - button.tap() - } else { - button.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).click() - } + activate(button) dismissSystemInterruptions() return } @@ -818,7 +855,12 @@ final class VisualScreenshotTests: XCTestCase { #if os(macOS) app.typeKey("f", modifierFlags: [.command]) #else - captureTab("Home", name: "home-before-\(name)") + if isPadVisualRun { + selectSidebar("Home") + capture("home-before-\(name)") + } else { + captureTab("Home", name: "home-before-\(name)") + } let search = app.buttons["Search"] XCTAssertTrue(search.waitForExistence(timeout: 5), "Expected global Search button for screenshot \(name)") search.tap() @@ -1019,6 +1061,10 @@ final class VisualScreenshotTests: XCTestCase { private func waitForAuthenticatedShell() -> Bool { #if os(iOS) + if isPadVisualRun { + return app.buttons["nav_home"].waitForExistence(timeout: 20) + || app.buttons["nav_packs"].waitForExistence(timeout: 2) + } return app.tabBars.firstMatch.waitForExistence(timeout: 20) #elseif os(macOS) return app.buttons["nav_home"].waitForExistence(timeout: 10) diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index e9a294f850..395a0688b8 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -14,7 +14,7 @@ import { pathToFileURL } from 'node:url'; import { listBooted } from './lib/simctl'; import { formatSummaryLine, readSummary, type TestSummary, XcResultError } from './lib/xcresult'; -type Platform = 'ios' | 'macos'; +type Platform = 'ios' | 'ipad' | 'macos'; type Options = { platforms: Platform[]; @@ -211,18 +211,20 @@ function usage(): never { console.log(`Usage: bun swift:screenshots bun swift:screenshots --platform ios + bun swift:screenshots --platform ipad bun swift:screenshots --platform macos bun swift:screenshots --skip-tests bun swift:screenshots --out artifacts/screenshots Captures guest and authenticated visual surfaces through VisualScreenshotTests and assembles: artifacts/screenshots/ios-contact-sheet.png + artifacts/screenshots/ipad-contact-sheet.png artifacts/screenshots/macos-contact-sheet.png`); process.exit(0); } function parseArgs(argv: readonly string[]): Options { - let platforms: Platform[] = ['ios', 'macos']; + let platforms: Platform[] = ['ios', 'ipad', 'macos']; let outDir = DEFAULT_OUT_DIR; let skipTests = false; @@ -236,7 +238,7 @@ function parseArgs(argv: readonly string[]): Options { } if (arg === '--platform') { const value = argv[++i]; - if (!value) throw new Error('--platform requires ios, macos, or both'); + if (!value) throw new Error('--platform requires ios, ipad, macos, or both'); platforms = parsePlatforms(value); continue; } @@ -262,10 +264,11 @@ function parseArgs(argv: readonly string[]): Options { function parsePlatforms(value: string): Platform[] { const normalized = value.toLowerCase(); - if (normalized === 'both') return ['ios', 'macos']; + if (normalized === 'both') return ['ios', 'ipad', 'macos']; if (normalized === 'ios') return ['ios']; + if (normalized === 'ipad') return ['ipad']; if (normalized === 'macos') return ['macos']; - throw new Error(`Unknown platform "${value}". Expected ios, macos, or both.`); + throw new Error(`Unknown platform "${value}". Expected ios, ipad, macos, or both.`); } function requirement( @@ -453,7 +456,7 @@ function expandedStateRequirements(platform: Platform): ScreenshotRequirement[] }), ]; - if (platform === 'macos' || platform === 'ios') { + if (platform === 'macos' || platform === 'ios' || platform === 'ipad') { common.push( requirement('95-data-ai-packs-results-sheet', { area: 'ai', @@ -596,7 +599,8 @@ function loadEnvFile(envFile: string): void { } } -function pickIOSDestination(): string { +function pickIOSDestination(platform: Extract): string { + if (platform === 'ipad') return pickAvailableIPadDestination(); try { const booted = listBooted(); if (booted.length > 0) return `platform=iOS Simulator,id=${booted[0]}`; @@ -604,10 +608,31 @@ function pickIOSDestination(): string { return 'platform=iOS Simulator,name=iPhone 17 Pro'; } +function pickAvailableIPadDestination(): string { + const result = spawnSync('xcrun', ['simctl', 'list', 'devices', 'available', '-j'], { + encoding: 'utf8', + timeout: 10_000, + maxBuffer: 10 * 1024 * 1024, + }); + if (result.status === 0) { + try { + const parsed = JSON.parse(result.stdout) as { + devices?: Record>; + }; + for (const devices of Object.values(parsed.devices ?? {})) { + const ipad = devices.find((device) => device.isAvailable && device.name?.includes('iPad')); + if (ipad?.udid) return `platform=iOS Simulator,id=${ipad.udid}`; + } + } catch {} + } + return 'platform=iOS Simulator,name=iPad Pro 13-inch (M5)'; +} + function allocateResultBundle(platform: Platform): string { if (!existsSync(RESULTS_DIR)) mkdirSync(RESULTS_DIR, { recursive: true }); const stamp = new Date().toISOString().replaceAll(':', '-').replaceAll('.', '-'); - const prefix = platform === 'ios' ? 'visual-iOS' : 'visual-macOS'; + const prefix = + platform === 'macos' ? 'visual-macOS' : platform === 'ipad' ? 'visual-iPad' : 'visual-iOS'; const path = resolve(RESULTS_DIR, `${prefix}-${stamp}.xcresult`); if (existsSync(path)) rmSync(path, { recursive: true, force: true }); return path; @@ -624,13 +649,13 @@ function runXcodeVisualTest(platform: Platform, screenshotDir: string): Promise< `PACKRAT_SCREENSHOT_DIR=${writableScreenshotDir}`, ]; const args = - platform === 'ios' + platform === 'ios' || platform === 'ipad' ? [ ...commonArgs, '-scheme', 'PackRat-iOS', '-destination', - pickIOSDestination(), + pickIOSDestination(platform), '-only-testing:PackRatUITests/VisualScreenshotTests', ...credentials, ] @@ -665,6 +690,7 @@ function runXcodeVisualTest(platform: Platform, screenshotDir: string): Promise< ...process.env, PACKRAT_ENV: process.env.PACKRAT_ENV ?? 'local', PACKRAT_SCREENSHOT_DIR: writableScreenshotDir, + PACKRAT_VISUAL_PLATFORM: platform, }, }); const timeout = setTimeout(() => { @@ -845,6 +871,17 @@ function contactSheetPathFor({ return resolve(outDir, `${platform}-contact-sheet${suffix ? `-${suffix}` : ''}.png`); } +function platformDisplayName(platform: Platform): string { + switch (platform) { + case 'ios': + return 'iOS'; + case 'ipad': + return 'iPad'; + case 'macos': + return 'macOS'; + } +} + function listScreenshots(dir: string): string[] { if (!existsSync(dir)) return []; return readdirSync(dir) @@ -967,7 +1004,7 @@ async function renderContactSheet(platform: Platform, outDir: string): Promise { const size = readImageSize(image); - if (!size) return platform === 'macos' ? 420 : 720; + if (!size) return platform === 'ios' ? 720 : 420; return Math.ceil((size.height / size.width) * cardWidth) + 42; }); const rows: number[] = []; From cf10a3c4ea1b1bf0c464ded3ae5fdc5d6c599104 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Fri, 29 May 2026 01:03:59 -0600 Subject: [PATCH 38/60] =?UTF-8?q?=E2=8C=9A=EF=B8=8F=20Build=20out=20watch?= =?UTF-8?q?=20companion=20sync?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/swift/Resources/Info-watchOS.plist | 2 + .../PackRat/Navigation/AppNavigation.swift | 28 +++ .../PackRat/Watch/WatchCompanionService.swift | 180 ++++++++++++++++ .../Sources/PackRatShared/WatchSnapshot.swift | 87 ++++++++ .../PackRatWatch/PackRatWatchApp.swift | 116 +++++++--- .../PackRatWatch/WatchConnectivityStore.swift | 89 ++++++++ .../PackRatTests/WatchSnapshotTests.swift | 29 +++ apps/swift/project.yml | 4 + .../scripts/capture-visual-screenshots.ts | 202 +++++++++++++++++- 9 files changed, 702 insertions(+), 35 deletions(-) create mode 100644 apps/swift/Sources/PackRat/Watch/WatchCompanionService.swift create mode 100644 apps/swift/Sources/PackRatShared/WatchSnapshot.swift create mode 100644 apps/swift/Sources/PackRatWatch/WatchConnectivityStore.swift create mode 100644 apps/swift/Tests/PackRatTests/WatchSnapshotTests.swift diff --git a/apps/swift/Resources/Info-watchOS.plist b/apps/swift/Resources/Info-watchOS.plist index 6d31566a00..87768fc109 100644 --- a/apps/swift/Resources/Info-watchOS.plist +++ b/apps/swift/Resources/Info-watchOS.plist @@ -24,5 +24,7 @@ WKApplication + WKCompanionAppBundleIdentifier + com.andrewbierman.packrat diff --git a/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift b/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift index 440419f96b..b4558c5f29 100644 --- a/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift +++ b/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift @@ -125,6 +125,9 @@ struct AppNavigation: View { .hidden() } .focusedSceneValue(\.globalSearchAction, $state.isGlobalSearchPresented) + #if os(iOS) + .watchCompanionSync(appState) + #endif .accessibilityIdentifier("app_navigation") } @@ -323,6 +326,7 @@ struct AppNavigation: View { .environment(appState) } .focusedSceneValue(\.globalSearchAction, $state.isGlobalSearchPresented) + .watchCompanionSync(appState) } private var phonePrimaryItems: [NavItem] { @@ -408,3 +412,27 @@ struct AppNavigation: View { return displayName } } + +#if os(iOS) +private extension View { + func watchCompanionSync(_ appState: AppState) -> some View { + task { + WatchCompanionService.shared.activate() + WatchCompanionService.shared.publishSnapshot(from: appState) + while !Task.isCancelled { + try? await Task.sleep(for: .seconds(15)) + WatchCompanionService.shared.publishSnapshot(from: appState) + } + } + .onChange(of: appState.navItem) { _, _ in + WatchCompanionService.shared.publishSnapshot(from: appState) + } + .onChange(of: appState.selectedPackId) { _, _ in + WatchCompanionService.shared.publishSnapshot(from: appState) + } + .onChange(of: appState.selectedTripId) { _, _ in + WatchCompanionService.shared.publishSnapshot(from: appState) + } + } +} +#endif diff --git a/apps/swift/Sources/PackRat/Watch/WatchCompanionService.swift b/apps/swift/Sources/PackRat/Watch/WatchCompanionService.swift new file mode 100644 index 0000000000..6aec52cef8 --- /dev/null +++ b/apps/swift/Sources/PackRat/Watch/WatchCompanionService.swift @@ -0,0 +1,180 @@ +#if os(iOS) +import Foundation +import WatchConnectivity + +@MainActor +final class WatchCompanionService: NSObject { + static let shared = WatchCompanionService() + + private let encoder = JSONEncoder() + private let decoder = JSONDecoder() + private var session: WCSession? + private var lastSnapshot: PackRatWatchSnapshot? + + private override init() { + super.init() + encoder.dateEncodingStrategy = .iso8601 + decoder.dateDecodingStrategy = .iso8601 + } + + func activate() { + guard WCSession.isSupported(), session == nil else { return } + let activeSession = WCSession.default + activeSession.delegate = self + activeSession.activate() + session = activeSession + } + + func publishSnapshot(from appState: AppState) { + let snapshot = makeSnapshot(from: appState) + guard snapshot != lastSnapshot else { return } + lastSnapshot = snapshot + send(snapshot) + } + + private func send(_ snapshot: PackRatWatchSnapshot) { + guard let session else { return } + do { + let data = try encoder.encode(snapshot) + let payload = [WatchCompanionMessage.snapshot: data] + try session.updateApplicationContext(payload) + session.transferUserInfo(payload) + } catch { + print("[Watch] Failed to publish snapshot: \(error.localizedDescription)") + } + } + + private func makeSnapshot(from appState: AppState) -> PackRatWatchSnapshot { + let pack = selectedPack(from: appState) + let trip = selectedTrip(from: appState) + let weather = appState.weatherVM.forecast + let report = appState.trailConditionsVM.reports.first + + return PackRatWatchSnapshot( + updatedAt: Date(), + pack: WatchPackSnapshot( + name: pack?.name ?? "No Pack Selected", + baseWeightText: formatWeight(pack?.baseWeight ?? pack?.totalWeight), + packedItemCount: pack?.activeItems.count ?? 0, + totalItemCount: pack?.activeItems.count ?? 0, + checklist: makeChecklist(from: pack) + ), + trip: trip.map { + WatchTripSnapshot( + name: $0.name, + locationName: $0.location?.name, + dateText: $0.dateRange.isEmpty ? nil : $0.dateRange + ) + }, + weather: WatchWeatherSnapshot( + locationName: appState.weatherVM.selectedLocation?.displayName + ?? weather?.location?.name + ?? "No Location", + temperatureText: weather?.current?.tempF.map { "\(Int($0.rounded()))°" } ?? "--", + conditionText: weather?.current?.condition?.text ?? "Open iPhone app to sync weather.", + symbolName: weather?.current?.condition?.sfSymbol ?? "cloud" + ), + trail: WatchTrailSnapshot( + title: report?.trailName ?? "Trail Report", + conditionText: report?.overallCondition.capitalized ?? "Ready for a field note.", + hazardCount: report?.hazards.count ?? 0 + ) + ) + } + + private func selectedPack(from appState: AppState) -> Pack? { + if let id = appState.selectedPackId, + let selected = appState.packsVM.packs.first(where: { $0.id == id }) { + return selected + } + if let tripPackId = selectedTrip(from: appState)?.packId, + let tripPack = appState.packsVM.packs.first(where: { $0.id == tripPackId }) { + return tripPack + } + return appState.packsVM.packs.first + } + + private func selectedTrip(from appState: AppState) -> Trip? { + if let id = appState.selectedTripId, + let selected = appState.tripsVM.trips.first(where: { $0.id == id }) { + return selected + } + return appState.tripsVM.trips.first + } + + private func makeChecklist(from pack: Pack?) -> [WatchChecklistItemSnapshot] { + (pack?.activeItems ?? []) + .prefix(8) + .map { + WatchChecklistItemSnapshot( + id: $0.id, + title: $0.name, + symbolName: symbol(for: $0.category), + isPacked: true + ) + } + } + + private func symbol(for category: String?) -> String { + switch category?.lowercased() { + case "shelter": return "tent" + case "sleep": return "bed.double" + case "water": return "drop" + case "food": return "fork.knife" + case "clothing": return "jacket" + case "safety": return "cross.case" + case "kitchen": return "flame" + case "pack": return "backpack" + default: return "checkmark.circle" + } + } + + private func formatWeight(_ grams: Double?) -> String { + guard let grams, grams > 0 else { return "--" } + let pounds = grams / 453.592 + return String(format: "%.1f lb", pounds) + } + + private func handleTrailDraft(_ draft: WatchTrailReportDraft) { + UserDefaults.standard.set(draft.condition, forKey: "watch.latestTrailDraft.condition") + UserDefaults.standard.set(draft.note, forKey: "watch.latestTrailDraft.note") + UserDefaults.standard.set(draft.createdAt, forKey: "watch.latestTrailDraft.createdAt") + } + + private func handleTrailDraftPayload(_ payload: [String: Any]) { + guard let data = payload[WatchCompanionMessage.trailDraft] as? Data else { return } + guard let draft = try? decoder.decode(WatchTrailReportDraft.self, from: data) else { return } + handleTrailDraft(draft) + } +} + +extension WatchCompanionService: WCSessionDelegate { + nonisolated func session( + _ session: WCSession, + activationDidCompleteWith activationState: WCSessionActivationState, + error: Error? + ) { + if let error { + print("[Watch] Activation failed: \(error.localizedDescription)") + } + } + + nonisolated func sessionDidBecomeInactive(_ session: WCSession) {} + + nonisolated func sessionDidDeactivate(_ session: WCSession) { + session.activate() + } + + nonisolated func session(_ session: WCSession, didReceiveUserInfo userInfo: [String: Any] = [:]) { + Task { @MainActor in + WatchCompanionService.shared.handleTrailDraftPayload(userInfo) + } + } + + nonisolated func session(_ session: WCSession, didReceiveMessage message: [String: Any]) { + Task { @MainActor in + WatchCompanionService.shared.handleTrailDraftPayload(message) + } + } +} +#endif diff --git a/apps/swift/Sources/PackRatShared/WatchSnapshot.swift b/apps/swift/Sources/PackRatShared/WatchSnapshot.swift new file mode 100644 index 0000000000..a1a0554a68 --- /dev/null +++ b/apps/swift/Sources/PackRatShared/WatchSnapshot.swift @@ -0,0 +1,87 @@ +import Foundation + +struct PackRatWatchSnapshot: Codable, Equatable, Sendable { + var updatedAt: Date + var pack: WatchPackSnapshot + var trip: WatchTripSnapshot? + var weather: WatchWeatherSnapshot + var trail: WatchTrailSnapshot + + static let fallback = PackRatWatchSnapshot( + updatedAt: Date(timeIntervalSince1970: 0), + pack: WatchPackSnapshot( + name: "Alpine Weekend", + baseWeightText: "18.4 lb", + packedItemCount: 5, + totalItemCount: 7, + checklist: [ + WatchChecklistItemSnapshot(id: "fallback-shelter", title: "Shelter", symbolName: "tent", isPacked: true), + WatchChecklistItemSnapshot(id: "fallback-water", title: "Water", symbolName: "drop", isPacked: true), + WatchChecklistItemSnapshot(id: "fallback-first-aid", title: "First Aid", symbolName: "cross.case", isPacked: true), + WatchChecklistItemSnapshot(id: "fallback-layers", title: "Rain Layers", symbolName: "jacket", isPacked: false), + WatchChecklistItemSnapshot(id: "fallback-food", title: "Trail Meals", symbolName: "fork.knife", isPacked: false), + ] + ), + trip: WatchTripSnapshot( + name: "Local Trail Prep", + locationName: "Offline", + dateText: "Today" + ), + weather: WatchWeatherSnapshot( + locationName: "Denver", + temperatureText: "64°", + conditionText: "Clear", + symbolName: "sun.max" + ), + trail: WatchTrailSnapshot( + title: "Trail Report", + conditionText: "Good", + hazardCount: 0 + ) + ) +} + +struct WatchPackSnapshot: Codable, Equatable, Sendable { + var name: String + var baseWeightText: String + var packedItemCount: Int + var totalItemCount: Int + var checklist: [WatchChecklistItemSnapshot] +} + +struct WatchChecklistItemSnapshot: Codable, Equatable, Identifiable, Sendable { + var id: String + var title: String + var symbolName: String + var isPacked: Bool +} + +struct WatchTripSnapshot: Codable, Equatable, Sendable { + var name: String + var locationName: String? + var dateText: String? +} + +struct WatchWeatherSnapshot: Codable, Equatable, Sendable { + var locationName: String + var temperatureText: String + var conditionText: String + var symbolName: String +} + +struct WatchTrailSnapshot: Codable, Equatable, Sendable { + var title: String + var conditionText: String + var hazardCount: Int +} + +struct WatchTrailReportDraft: Codable, Equatable, Sendable { + var condition: String + var note: String + var createdAt: Date +} + +enum WatchCompanionMessage { + static let snapshot = "packrat.watch.snapshot" + static let trailDraft = "packrat.watch.trailDraft" +} diff --git a/apps/swift/Sources/PackRatWatch/PackRatWatchApp.swift b/apps/swift/Sources/PackRatWatch/PackRatWatchApp.swift index dae6df5da6..9cedaf43b0 100644 --- a/apps/swift/Sources/PackRatWatch/PackRatWatchApp.swift +++ b/apps/swift/Sources/PackRatWatch/PackRatWatchApp.swift @@ -2,25 +2,49 @@ import SwiftUI @main struct PackRatWatchApp: App { + @State private var connectivity = WatchConnectivityStore() + var body: some Scene { WindowGroup { + WatchRootView() + .environment(connectivity) + .task { + connectivity.activate() + } + } + } +} + +private struct WatchRootView: View { + @Environment(WatchConnectivityStore.self) private var connectivity + + var body: some View { + switch ProcessInfo.processInfo.environment["PACKRAT_WATCH_SCREENSHOT_ROUTE"] { + case "checklist": + WatchChecklistView(pack: connectivity.snapshot.pack) + case "weather": + WatchWeatherView(weather: connectivity.snapshot.weather) + case "trail-report": + WatchTrailReportView(trail: connectivity.snapshot.trail) + default: WatchDashboardView() } } } private struct WatchDashboardView: View { + @Environment(WatchConnectivityStore.self) private var connectivity @State private var selectedTab = 0 var body: some View { TabView(selection: $selectedTab) { - TrailReadyView() + TrailReadyView(snapshot: connectivity.snapshot, isPhoneReachable: connectivity.isPhoneReachable) .tag(0) - WatchChecklistView() + WatchChecklistView(pack: connectivity.snapshot.pack) .tag(1) - WatchWeatherView() + WatchWeatherView(weather: connectivity.snapshot.weather) .tag(2) - WatchTrailReportView() + WatchTrailReportView(trail: connectivity.snapshot.trail) .tag(3) } .tabViewStyle(.verticalPage) @@ -28,16 +52,19 @@ private struct WatchDashboardView: View { } private struct TrailReadyView: View { + let snapshot: PackRatWatchSnapshot + let isPhoneReachable: Bool + var body: some View { NavigationStack { List { Section { VStack(alignment: .leading, spacing: 8) { - Label("Trail Ready", systemImage: "checkmark.seal.fill") + Label(snapshot.pack.name, systemImage: "checkmark.seal.fill") .font(.headline) .foregroundStyle(.green) - Text("Quick wrist access for the next pack, weather, and trail notes.") + Text(snapshot.trip?.name ?? "Quick wrist access for the next pack, weather, and trail notes.") .font(.footnote) .foregroundStyle(.secondary) .fixedSize(horizontal: false, vertical: true) @@ -45,9 +72,23 @@ private struct TrailReadyView: View { } Section("Today") { - WatchMetricRow(title: "Base Weight", value: "18.4 lb", symbol: "scalemass") - WatchMetricRow(title: "Packed", value: "12 of 15", symbol: "backpack") - WatchMetricRow(title: "Weather", value: "64° Clear", symbol: "sun.max") + WatchMetricRow(title: "Base Weight", value: snapshot.pack.baseWeightText, symbol: "scalemass") + WatchMetricRow( + title: "Packed", + value: "\(snapshot.pack.packedItemCount) of \(snapshot.pack.totalItemCount)", + symbol: "backpack" + ) + WatchMetricRow( + title: "Weather", + value: "\(snapshot.weather.temperatureText) \(snapshot.weather.conditionText)", + symbol: snapshot.weather.symbolName + ) + } + + Section { + Label(isPhoneReachable ? "iPhone Nearby" : "Last Synced", systemImage: isPhoneReachable ? "iphone" : "clock") + .font(.caption) + .foregroundStyle(.secondary) } } .navigationTitle("PackRat") @@ -56,19 +97,19 @@ private struct TrailReadyView: View { } private struct WatchChecklistView: View { - @AppStorage("watch.checklist.shelter") private var shelterPacked = true - @AppStorage("watch.checklist.water") private var waterPacked = false - @AppStorage("watch.checklist.firstAid") private var firstAidPacked = true - @AppStorage("watch.checklist.layers") private var layersPacked = false + let pack: WatchPackSnapshot var body: some View { NavigationStack { List { Section("Pack") { - WatchChecklistToggle(title: "Shelter", symbol: "tent", isOn: $shelterPacked) - WatchChecklistToggle(title: "Water", symbol: "drop", isOn: $waterPacked) - WatchChecklistToggle(title: "First Aid", symbol: "cross.case", isOn: $firstAidPacked) - WatchChecklistToggle(title: "Layers", symbol: "jacket", isOn: $layersPacked) + if pack.checklist.isEmpty { + ContentUnavailableView("No Items", systemImage: "checklist", description: Text("Open a pack on iPhone to sync checklist items.")) + } else { + ForEach(pack.checklist) { item in + WatchChecklistToggle(item: item) + } + } } } .navigationTitle("Checklist") @@ -77,26 +118,26 @@ private struct WatchChecklistView: View { } private struct WatchWeatherView: View { + let weather: WatchWeatherSnapshot + var body: some View { NavigationStack { List { Section { VStack(alignment: .leading, spacing: 4) { - Label("Denver", systemImage: "location.fill") + Label(weather.locationName, systemImage: "location.fill") .font(.headline) - Text("64°") + Text(weather.temperatureText) .font(.system(size: 38, weight: .semibold, design: .rounded)) - Text("Clear. Wind 5 mph.") + Text(weather.conditionText) .font(.caption) .foregroundStyle(.secondary) } .padding(.vertical, 4) } - Section("Next 3 hours") { - WatchMetricRow(title: "Now", value: "64°", symbol: "sun.max") - WatchMetricRow(title: "1 PM", value: "67°", symbol: "sun.max") - WatchMetricRow(title: "2 PM", value: "68°", symbol: "cloud.sun") + Section("Trail") { + WatchMetricRow(title: "Condition", value: weather.conditionText, symbol: weather.symbolName) } } .navigationTitle("Weather") @@ -105,12 +146,20 @@ private struct WatchWeatherView: View { } private struct WatchTrailReportView: View { + @Environment(WatchConnectivityStore.self) private var connectivity @State private var selectedCondition = "Good" + @State private var note = "" private let conditions = ["Good", "Muddy", "Snow", "Closed"] + let trail: WatchTrailSnapshot var body: some View { NavigationStack { List { + Section { + WatchMetricRow(title: trail.title, value: trail.conditionText, symbol: "figure.hiking") + WatchMetricRow(title: "Hazards", value: "\(trail.hazardCount)", symbol: "exclamationmark.triangle") + } + Section("Condition") { Picker("Condition", selection: $selectedCondition) { ForEach(conditions, id: \.self) { condition in @@ -119,8 +168,13 @@ private struct WatchTrailReportView: View { } } + Section("Note") { + TextField("Optional note", text: $note) + } + Section { Button { + connectivity.saveTrailDraft(condition: selectedCondition, note: note) } label: { Label("Save Draft", systemImage: "square.and.pencil") } @@ -128,7 +182,7 @@ private struct WatchTrailReportView: View { } Section { - Text("Drafts sync when the iPhone app connection is available.") + Text(connectivity.lastDraft == nil ? "Drafts sync when the iPhone app connection is available." : "Draft saved for iPhone sync.") .font(.footnote) .foregroundStyle(.secondary) } @@ -159,13 +213,17 @@ private struct WatchMetricRow: View { } private struct WatchChecklistToggle: View { - let title: String - let symbol: String - @Binding var isOn: Bool + let item: WatchChecklistItemSnapshot + @State private var isOn: Bool + + init(item: WatchChecklistItemSnapshot) { + self.item = item + _isOn = State(initialValue: item.isPacked) + } var body: some View { Toggle(isOn: $isOn) { - Label(title, systemImage: symbol) + Label(item.title, systemImage: item.symbolName) } } } diff --git a/apps/swift/Sources/PackRatWatch/WatchConnectivityStore.swift b/apps/swift/Sources/PackRatWatch/WatchConnectivityStore.swift new file mode 100644 index 0000000000..e65fada054 --- /dev/null +++ b/apps/swift/Sources/PackRatWatch/WatchConnectivityStore.swift @@ -0,0 +1,89 @@ +import Foundation +import Observation +import WatchConnectivity + +@Observable +final class WatchConnectivityStore: NSObject { + private let snapshotKey = "watch.snapshot" + private let encoder = JSONEncoder() + private let decoder = JSONDecoder() + private var session: WCSession? + + var snapshot = PackRatWatchSnapshot.fallback + var lastDraft: WatchTrailReportDraft? + var isPhoneReachable = false + + override init() { + super.init() + encoder.dateEncodingStrategy = .iso8601 + decoder.dateDecodingStrategy = .iso8601 + loadSnapshot() + } + + func activate() { + guard WCSession.isSupported(), session == nil else { return } + let activeSession = WCSession.default + activeSession.delegate = self + activeSession.activate() + session = activeSession + isPhoneReachable = activeSession.isReachable + handle(activeSession.receivedApplicationContext) + } + + func saveTrailDraft(condition: String, note: String) { + let draft = WatchTrailReportDraft( + condition: condition, + note: note.trimmingCharacters(in: .whitespacesAndNewlines), + createdAt: Date() + ) + lastDraft = draft + + guard let session, let data = try? encoder.encode(draft) else { return } + let payload = [WatchCompanionMessage.trailDraft: data] + if session.isReachable { + session.sendMessage(payload, replyHandler: nil) + } + session.transferUserInfo(payload) + } + + private func handle(_ payload: [String: Any]) { + guard let data = payload[WatchCompanionMessage.snapshot] as? Data, + let next = try? decoder.decode(PackRatWatchSnapshot.self, from: data) + else { return } + snapshot = next + UserDefaults.standard.set(data, forKey: snapshotKey) + } + + private func loadSnapshot() { + guard let data = UserDefaults.standard.data(forKey: snapshotKey), + let cached = try? decoder.decode(PackRatWatchSnapshot.self, from: data) + else { return } + snapshot = cached + } +} + +extension WatchConnectivityStore: WCSessionDelegate { + nonisolated func session( + _ session: WCSession, + activationDidCompleteWith activationState: WCSessionActivationState, + error: Error? + ) {} + + nonisolated func sessionReachabilityDidChange(_ session: WCSession) { + Task { @MainActor in + self.isPhoneReachable = session.isReachable + } + } + + nonisolated func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String: Any]) { + Task { @MainActor in + self.handle(applicationContext) + } + } + + nonisolated func session(_ session: WCSession, didReceiveUserInfo userInfo: [String: Any] = [:]) { + Task { @MainActor in + self.handle(userInfo) + } + } +} diff --git a/apps/swift/Tests/PackRatTests/WatchSnapshotTests.swift b/apps/swift/Tests/PackRatTests/WatchSnapshotTests.swift new file mode 100644 index 0000000000..24a714212d --- /dev/null +++ b/apps/swift/Tests/PackRatTests/WatchSnapshotTests.swift @@ -0,0 +1,29 @@ +import Foundation +import Testing +@testable import PackRat + +@Suite("Watch snapshot") +struct WatchSnapshotTests { + @Test("fallback snapshot is useful before phone sync") + func fallbackSnapshotIsUsefulBeforePhoneSync() throws { + let snapshot = PackRatWatchSnapshot.fallback + + #expect(snapshot.pack.name == "Alpine Weekend") + #expect(!snapshot.pack.checklist.isEmpty) + #expect(snapshot.weather.temperatureText == "64°") + #expect(snapshot.trail.conditionText == "Good") + } + + @Test("snapshot round-trips through JSON") + func snapshotRoundTripsThroughJSON() throws { + let encoder = JSONEncoder() + encoder.dateEncodingStrategy = .iso8601 + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = .iso8601 + + let data = try encoder.encode(PackRatWatchSnapshot.fallback) + let decoded = try decoder.decode(PackRatWatchSnapshot.self, from: data) + + #expect(decoded == PackRatWatchSnapshot.fallback) + } +} diff --git a/apps/swift/project.yml b/apps/swift/project.yml index 7250f4b7cf..5702a2e0d3 100644 --- a/apps/swift/project.yml +++ b/apps/swift/project.yml @@ -58,6 +58,7 @@ targets: deploymentTarget: "17.0" sources: - Sources/PackRat + - Sources/PackRatShared resources: - Resources/Assets.xcassets entitlements: @@ -133,6 +134,7 @@ targets: deploymentTarget: "10.0" sources: - Sources/PackRatWatch + - Sources/PackRatShared info: path: Resources/Info-watchOS.plist properties: @@ -140,6 +142,7 @@ targets: CFBundleShortVersionString: "1.0" CFBundleVersion: "1" WKApplication: true + WKCompanionAppBundleIdentifier: com.andrewbierman.packrat ITSAppUsesNonExemptEncryption: false settings: base: @@ -157,6 +160,7 @@ targets: deploymentTarget: "14.0" sources: - Sources/PackRat + - Sources/PackRatShared resources: - Resources/Assets.xcassets entitlements: diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index 395a0688b8..fce3612cb6 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -14,7 +14,7 @@ import { pathToFileURL } from 'node:url'; import { listBooted } from './lib/simctl'; import { formatSummaryLine, readSummary, type TestSummary, XcResultError } from './lib/xcresult'; -type Platform = 'ios' | 'ipad' | 'macos'; +type Platform = 'ios' | 'ipad' | 'macos' | 'watch'; type Options = { platforms: Platform[]; @@ -213,13 +213,15 @@ function usage(): never { bun swift:screenshots --platform ios bun swift:screenshots --platform ipad bun swift:screenshots --platform macos + bun swift:screenshots --platform watch bun swift:screenshots --skip-tests bun swift:screenshots --out artifacts/screenshots Captures guest and authenticated visual surfaces through VisualScreenshotTests and assembles: artifacts/screenshots/ios-contact-sheet.png artifacts/screenshots/ipad-contact-sheet.png - artifacts/screenshots/macos-contact-sheet.png`); + artifacts/screenshots/macos-contact-sheet.png + artifacts/screenshots/watch-contact-sheet.png`); process.exit(0); } @@ -265,10 +267,12 @@ function parseArgs(argv: readonly string[]): Options { function parsePlatforms(value: string): Platform[] { const normalized = value.toLowerCase(); if (normalized === 'both') return ['ios', 'ipad', 'macos']; + if (normalized === 'all') return ['ios', 'ipad', 'macos', 'watch']; if (normalized === 'ios') return ['ios']; if (normalized === 'ipad') return ['ipad']; if (normalized === 'macos') return ['macos']; - throw new Error(`Unknown platform "${value}". Expected ios, ipad, macos, or both.`); + if (normalized === 'watch' || normalized === 'watchos') return ['watch']; + throw new Error(`Unknown platform "${value}". Expected ios, ipad, macos, watch, both, or all.`); } function requirement( @@ -313,6 +317,27 @@ function redactSecrets(output: string): string { } function requiredScreenshots(platform: Platform): ScreenshotRequirement[] { + if (platform === 'watch') { + return [ + requirement('00-watch-dashboard', { + area: 'offline-local', + flow: 'Watch companion dashboard fallback or synced summary', + }), + requirement('01-watch-checklist', { + area: 'crud', + flow: 'Watch checklist page', + }), + requirement('02-watch-weather', { + area: 'data', + flow: 'Watch weather page', + }), + requirement('03-watch-trail-report', { + area: 'crud', + flow: 'Watch trail report draft page', + }), + ]; + } + const surfaceRequirements = platform === 'ios' ? IOS_SURFACES.flatMap((surface) => [ @@ -639,6 +664,8 @@ function allocateResultBundle(platform: Platform): string { } function runXcodeVisualTest(platform: Platform, screenshotDir: string): Promise { + if (platform === 'watch') return runWatchVisualCapture(screenshotDir); + const resultBundle = allocateResultBundle(platform); const writableScreenshotDir = allocateWritableScreenshotDir(platform); const credentials = e2eBuildSettings(); @@ -746,6 +773,167 @@ function runXcodeVisualTest(platform: Platform, screenshotDir: string): Promise< }); } +async function runWatchVisualCapture(screenshotDir: string): Promise { + const destination = pickAvailableWatchDestination(); + const deviceId = destination.deviceId; + const buildArgs = [ + '-project', + 'PackRat.xcodeproj', + '-scheme', + 'PackRat-Watch', + '-destination', + `platform=watchOS Simulator,id=${deviceId}`, + '-configuration', + 'Debug', + 'build', + ]; + + console.log('→ Capturing watch screenshots'); + console.log(`→ Watch simulator: ${destination.name} (${deviceId})`); + console.log(`→ Screenshot dir: ${screenshotDir}`); + runChecked({ + command: 'xcodebuild', + args: buildArgs, + cwd: SWIFT_DIR, + timeout: XCODEBUILD_TIMEOUT_MS, + }); + + const appPath = resolveWatchAppPath(deviceId); + runChecked({ + command: 'xcrun', + args: ['simctl', 'boot', deviceId], + cwd: SWIFT_DIR, + timeout: 30_000, + allowFailure: true, + }); + runChecked({ + command: 'xcrun', + args: ['simctl', 'install', deviceId, appPath], + cwd: SWIFT_DIR, + timeout: 60_000, + }); + mkdirSync(screenshotDir, { recursive: true }); + for (const route of [ + { name: '00-watch-dashboard.png', value: '' }, + { name: '01-watch-checklist.png', value: 'checklist' }, + { name: '02-watch-weather.png', value: 'weather' }, + { name: '03-watch-trail-report.png', value: 'trail-report' }, + ]) { + const env = route.value ? { SIMCTL_CHILD_PACKRAT_WATCH_SCREENSHOT_ROUTE: route.value } : {}; + runChecked({ + command: 'xcrun', + args: [ + 'simctl', + 'launch', + '--terminate-running-process', + deviceId, + 'com.andrewbierman.packrat.watchkitapp', + ], + cwd: SWIFT_DIR, + timeout: 30_000, + env, + }); + + await sleep(1_500); + const tmpScreenshot = resolve('/tmp', `packrat-watch-${Date.now()}-${route.name}`); + runChecked({ + command: 'xcrun', + args: ['simctl', 'io', deviceId, 'screenshot', tmpScreenshot], + cwd: SWIFT_DIR, + timeout: 30_000, + }); + cpSync(tmpScreenshot, resolve(screenshotDir, route.name)); + rmSync(tmpScreenshot, { force: true }); + } + return { resultBundle: '', summary: null }; +} + +function pickAvailableWatchDestination(): { deviceId: string; name: string } { + const result = spawnSync('xcrun', ['simctl', 'list', 'devices', 'available', '-j'], { + encoding: 'utf8', + timeout: 10_000, + maxBuffer: 10 * 1024 * 1024, + }); + if (result.status !== 0) { + throw new Error(`Unable to list watch simulators: ${result.stderr || result.stdout}`); + } + + const parsed = JSON.parse(result.stdout) as { + devices?: Record>; + }; + for (const devices of Object.values(parsed.devices ?? {})) { + const watch = devices.find( + (device) => device.isAvailable && device.udid && device.name?.includes('Apple Watch'), + ); + if (watch?.udid && watch.name) return { deviceId: watch.udid, name: watch.name }; + } + + throw new Error('No available Apple Watch simulator found. Install a watchOS runtime first.'); +} + +function resolveWatchAppPath(deviceId: string): string { + const result = spawnSync( + 'xcodebuild', + [ + '-project', + 'PackRat.xcodeproj', + '-scheme', + 'PackRat-Watch', + '-destination', + `platform=watchOS Simulator,id=${deviceId}`, + '-configuration', + 'Debug', + '-showBuildSettings', + '-json', + ], + { + cwd: SWIFT_DIR, + encoding: 'utf8', + timeout: 30_000, + maxBuffer: 10 * 1024 * 1024, + }, + ); + if (result.status !== 0) { + throw new Error(`Unable to resolve Watch app path: ${result.stderr || result.stdout}`); + } + + const settings = JSON.parse(result.stdout) as Array<{ + buildSettings?: { BUILT_PRODUCTS_DIR?: string; WRAPPER_NAME?: string }; + }>; + const buildSettings = settings.find( + (entry) => entry.buildSettings?.BUILT_PRODUCTS_DIR, + )?.buildSettings; + if (!buildSettings?.BUILT_PRODUCTS_DIR || !buildSettings.WRAPPER_NAME) { + throw new Error('Watch build settings did not include BUILT_PRODUCTS_DIR/WRAPPER_NAME.'); + } + return resolve(buildSettings.BUILT_PRODUCTS_DIR, buildSettings.WRAPPER_NAME); +} + +function runChecked(options: { + command: string; + args: string[]; + cwd: string; + timeout: number; + allowFailure?: boolean; + env?: NodeJS.ProcessEnv; +}): void { + const result = spawnSync(options.command, options.args, { + cwd: options.cwd, + env: { ...process.env, ...options.env }, + encoding: 'utf8', + timeout: options.timeout, + maxBuffer: 20 * 1024 * 1024, + }); + if (result.status === 0 || options.allowFailure) return; + throw new Error( + `${options.command} ${options.args.join(' ')} failed: ${result.stderr || result.stdout}`, + ); +} + +function sleep(ms: number): Promise { + return new Promise((resolvePromise) => setTimeout(resolvePromise, ms)); +} + function allocateWritableScreenshotDir(platform: Platform): string { const stamp = new Date().toISOString().replaceAll(':', '-').replaceAll('.', '-'); const dir = resolve('/tmp', `packrat-${platform}-visual-${stamp}`); @@ -879,6 +1067,8 @@ function platformDisplayName(platform: Platform): string { return 'iPad'; case 'macos': return 'macOS'; + case 'watch': + return 'watchOS'; } } @@ -928,7 +1118,7 @@ function buildHtml({ title: string; }): string { const isMac = platform === 'macos'; - const cardWidth = isMac ? 520 : 300; + const cardWidth = platform === 'watch' ? 220 : isMac ? 520 : 300; const cards = images .map((image) => { const label = humanize(image); @@ -1133,14 +1323,14 @@ function estimateContactSheetHeight({ }): number { const horizontalPadding = 64; const gridGap = 18; - const cardWidth = platform === 'ios' ? 300 : 520; + const cardWidth = platform === 'watch' ? 220 : platform === 'ios' ? 300 : 520; const columns = Math.max( 1, Math.floor((width - horizontalPadding + gridGap) / (cardWidth + gridGap)), ); const cardHeights = images.map((image) => { const size = readImageSize(image); - if (!size) return platform === 'ios' ? 720 : 420; + if (!size) return platform === 'watch' ? 280 : platform === 'ios' ? 720 : 420; return Math.ceil((size.height / size.width) * cardWidth) + 42; }); const rows: number[] = []; From c1394851032d149af72aed7645cb90ab9b20dc01 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Fri, 29 May 2026 08:43:12 -0600 Subject: [PATCH 39/60] =?UTF-8?q?=F0=9F=A7=AD=20Keep=20watch=20fallback=20?= =?UTF-8?q?honest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/PackRatShared/WatchSnapshot.swift | 32 ++++------ .../PackRatWatch/PackRatWatchApp.swift | 59 +++++++++++-------- .../PackRatTests/WatchSnapshotTests.swift | 25 ++++++-- .../scripts/capture-visual-screenshots.ts | 2 +- docs/testing.md | 8 ++- 5 files changed, 73 insertions(+), 53 deletions(-) diff --git a/apps/swift/Sources/PackRatShared/WatchSnapshot.swift b/apps/swift/Sources/PackRatShared/WatchSnapshot.swift index a1a0554a68..e1a97faa07 100644 --- a/apps/swift/Sources/PackRatShared/WatchSnapshot.swift +++ b/apps/swift/Sources/PackRatShared/WatchSnapshot.swift @@ -10,32 +10,22 @@ struct PackRatWatchSnapshot: Codable, Equatable, Sendable { static let fallback = PackRatWatchSnapshot( updatedAt: Date(timeIntervalSince1970: 0), pack: WatchPackSnapshot( - name: "Alpine Weekend", - baseWeightText: "18.4 lb", - packedItemCount: 5, - totalItemCount: 7, - checklist: [ - WatchChecklistItemSnapshot(id: "fallback-shelter", title: "Shelter", symbolName: "tent", isPacked: true), - WatchChecklistItemSnapshot(id: "fallback-water", title: "Water", symbolName: "drop", isPacked: true), - WatchChecklistItemSnapshot(id: "fallback-first-aid", title: "First Aid", symbolName: "cross.case", isPacked: true), - WatchChecklistItemSnapshot(id: "fallback-layers", title: "Rain Layers", symbolName: "jacket", isPacked: false), - WatchChecklistItemSnapshot(id: "fallback-food", title: "Trail Meals", symbolName: "fork.knife", isPacked: false), - ] - ), - trip: WatchTripSnapshot( - name: "Local Trail Prep", - locationName: "Offline", - dateText: "Today" + name: "No Pack Synced", + baseWeightText: "--", + packedItemCount: 0, + totalItemCount: 0, + checklist: [] ), + trip: nil, weather: WatchWeatherSnapshot( - locationName: "Denver", - temperatureText: "64°", - conditionText: "Clear", - symbolName: "sun.max" + locationName: "No Location", + temperatureText: "--", + conditionText: "Open iPhone app to sync weather.", + symbolName: "cloud" ), trail: WatchTrailSnapshot( title: "Trail Report", - conditionText: "Good", + conditionText: "None", hazardCount: 0 ) ) diff --git a/apps/swift/Sources/PackRatWatch/PackRatWatchApp.swift b/apps/swift/Sources/PackRatWatch/PackRatWatchApp.swift index 9cedaf43b0..cb2cf79414 100644 --- a/apps/swift/Sources/PackRatWatch/PackRatWatchApp.swift +++ b/apps/swift/Sources/PackRatWatch/PackRatWatchApp.swift @@ -54,35 +54,48 @@ private struct WatchDashboardView: View { private struct TrailReadyView: View { let snapshot: PackRatWatchSnapshot let isPhoneReachable: Bool + private var hasSyncedPack: Bool { + snapshot.pack.totalItemCount > 0 || !snapshot.pack.checklist.isEmpty + } var body: some View { NavigationStack { List { - Section { - VStack(alignment: .leading, spacing: 8) { - Label(snapshot.pack.name, systemImage: "checkmark.seal.fill") - .font(.headline) - .foregroundStyle(.green) - - Text(snapshot.trip?.name ?? "Quick wrist access for the next pack, weather, and trail notes.") - .font(.footnote) - .foregroundStyle(.secondary) - .fixedSize(horizontal: false, vertical: true) + if hasSyncedPack { + Section { + VStack(alignment: .leading, spacing: 8) { + Label(snapshot.pack.name, systemImage: "checkmark.seal.fill") + .font(.headline) + .foregroundStyle(.green) + + Text(snapshot.trip?.name ?? "Quick wrist access for the next pack, weather, and trail notes.") + .font(.footnote) + .foregroundStyle(.secondary) + .fixedSize(horizontal: false, vertical: true) + } } - } - Section("Today") { - WatchMetricRow(title: "Base Weight", value: snapshot.pack.baseWeightText, symbol: "scalemass") - WatchMetricRow( - title: "Packed", - value: "\(snapshot.pack.packedItemCount) of \(snapshot.pack.totalItemCount)", - symbol: "backpack" - ) - WatchMetricRow( - title: "Weather", - value: "\(snapshot.weather.temperatureText) \(snapshot.weather.conditionText)", - symbol: snapshot.weather.symbolName - ) + Section("Today") { + WatchMetricRow(title: "Base Weight", value: snapshot.pack.baseWeightText, symbol: "scalemass") + WatchMetricRow( + title: "Packed", + value: "\(snapshot.pack.packedItemCount) of \(snapshot.pack.totalItemCount)", + symbol: "backpack" + ) + WatchMetricRow( + title: "Weather", + value: "\(snapshot.weather.temperatureText) \(snapshot.weather.conditionText)", + symbol: snapshot.weather.symbolName + ) + } + } else { + Section { + ContentUnavailableView( + "Sync from iPhone", + systemImage: "iphone", + description: Text("Open PackRat on iPhone to send your active pack, weather, and trail context.") + ) + } } Section { diff --git a/apps/swift/Tests/PackRatTests/WatchSnapshotTests.swift b/apps/swift/Tests/PackRatTests/WatchSnapshotTests.swift index 24a714212d..0d6c99ecfd 100644 --- a/apps/swift/Tests/PackRatTests/WatchSnapshotTests.swift +++ b/apps/swift/Tests/PackRatTests/WatchSnapshotTests.swift @@ -4,14 +4,27 @@ import Testing @Suite("Watch snapshot") struct WatchSnapshotTests { - @Test("fallback snapshot is useful before phone sync") - func fallbackSnapshotIsUsefulBeforePhoneSync() throws { + @Test("fallback snapshot is clearly unsynced before phone data arrives") + func fallbackSnapshotIsClearlyUnsyncedBeforePhoneDataArrives() throws { let snapshot = PackRatWatchSnapshot.fallback - #expect(snapshot.pack.name == "Alpine Weekend") - #expect(!snapshot.pack.checklist.isEmpty) - #expect(snapshot.weather.temperatureText == "64°") - #expect(snapshot.trail.conditionText == "Good") + #expect(snapshot.pack.name == "No Pack Synced") + #expect(snapshot.pack.checklist.isEmpty) + #expect(snapshot.pack.totalItemCount == 0) + #expect(snapshot.trip == nil) + #expect(snapshot.weather.locationName == "No Location") + #expect(snapshot.weather.temperatureText == "--") + #expect(snapshot.trail.conditionText == "None") + } + + @Test("fallback snapshot does not contain screenshot fixture content") + func fallbackSnapshotDoesNotContainScreenshotFixtureContent() throws { + let encoded = try JSONEncoder().encode(PackRatWatchSnapshot.fallback) + let payload = String(decoding: encoded, as: UTF8.self) + + #expect(!payload.contains("Alpine Weekend")) + #expect(!payload.contains("Denver")) + #expect(!payload.contains("Local Trail Prep")) } @Test("snapshot round-trips through JSON") diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index fce3612cb6..bf1bcd85b4 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -321,7 +321,7 @@ function requiredScreenshots(platform: Platform): ScreenshotRequirement[] { return [ requirement('00-watch-dashboard', { area: 'offline-local', - flow: 'Watch companion dashboard fallback or synced summary', + flow: 'Watch companion unsynced dashboard', }), requirement('01-watch-checklist', { area: 'crud', diff --git a/docs/testing.md b/docs/testing.md index 34da406eda..77a1cbc73b 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -229,18 +229,22 @@ bun swift:screenshots --out artifacts/screenshots # Platform-specific runs while iterating. bun swift:screenshots --platform ios --out artifacts/screenshots +bun swift:screenshots --platform ipad --out artifacts/screenshots bun swift:screenshots --platform macos --out artifacts/screenshots +bun swift:screenshots --platform watch --out artifacts/screenshots # Rebuild contact sheets from existing captured PNGs without rerunning Xcode. bun swift:screenshots --skip-tests --out artifacts/screenshots ``` The runner writes: -- `ios-contact-sheet.png` / `macos-contact-sheet.png` for the full spread. +- `ios-contact-sheet.png` / `ipad-contact-sheet.png` / `macos-contact-sheet.png` / `watch-contact-sheet.png` for the full spread. - Grouped sheets for unauthenticated, guest, guest limits, offline, authenticated, seeded data, detail, expanded controls, and modal states. -- `ios-xctest/coverage-manifest.json` and `macos-xctest/coverage-manifest.json`, which map required screenshot names to feature areas and flows. +- `-xctest/coverage-manifest.json`, which maps required screenshot names to feature areas and flows. - `run-summary.json` with artifact paths and xcresult summaries when tests ran. +Screenshot fixture data must stay behind `PACKRAT_VISUAL_SCREENSHOTS` / `PACKRAT_VISUAL_SAMPLE_DATA` or explicit visual-test launch arguments. Production fallback and offline states should use honest empty or unsynced copy, not realistic dummy packs, trips, or weather that could be mistaken for user data. + CI runs the same catalog through `.github/workflows/swift-visual.yml` on a nightly schedule and by manual dispatch. The workflow uploads the contact sheets and visual `.xcresult` bundles as `swift-visual-screenshots`. macOS visual runs require Automation Mode to be available on the runner; locally, run `automationmodetool enable-automationmode-without-authentication` once before leaving the suite unattended. --- From 211eae9e451106f9b5382aa2f39a36695237a624 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Fri, 29 May 2026 09:05:55 -0600 Subject: [PATCH 40/60] =?UTF-8?q?=F0=9F=A7=AA=20Stabilize=20iOS=20visual?= =?UTF-8?q?=20simulator=20selection?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scripts/capture-visual-screenshots.ts | 44 ++++++++++++++----- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index bf1bcd85b4..5a486d55b2 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -11,7 +11,6 @@ import { } from 'node:fs'; import { basename, resolve } from 'node:path'; import { pathToFileURL } from 'node:url'; -import { listBooted } from './lib/simctl'; import { formatSummaryLine, readSummary, type TestSummary, XcResultError } from './lib/xcresult'; type Platform = 'ios' | 'ipad' | 'macos' | 'watch'; @@ -625,15 +624,29 @@ function loadEnvFile(envFile: string): void { } function pickIOSDestination(platform: Extract): string { - if (platform === 'ipad') return pickAvailableIPadDestination(); - try { - const booted = listBooted(); - if (booted.length > 0) return `platform=iOS Simulator,id=${booted[0]}`; - } catch {} - return 'platform=iOS Simulator,name=iPhone 17 Pro'; + if (platform === 'ipad') { + return pickAvailableIOSDestination({ + preferredNames: ['iPad Pro 13-inch (M5)', 'iPad Pro 11-inch (M5)', 'iPad Air 13-inch (M4)'], + fallbackName: 'iPad Pro 13-inch (M5)', + nameIncludes: 'iPad', + }); + } + return pickAvailableIOSDestination({ + preferredNames: ['iPhone 17 Pro', 'iPhone 17', 'iPhone Air'], + fallbackName: 'iPhone 17 Pro', + nameIncludes: 'iPhone', + }); } -function pickAvailableIPadDestination(): string { +function pickAvailableIOSDestination({ + preferredNames, + fallbackName, + nameIncludes, +}: { + preferredNames: string[]; + fallbackName: string; + nameIncludes: string; +}): string { const result = spawnSync('xcrun', ['simctl', 'list', 'devices', 'available', '-j'], { encoding: 'utf8', timeout: 10_000, @@ -644,13 +657,22 @@ function pickAvailableIPadDestination(): string { const parsed = JSON.parse(result.stdout) as { devices?: Record>; }; + const availableDevices = Object.values(parsed.devices ?? {}).flat(); + for (const preferredName of preferredNames) { + const preferred = availableDevices.find( + (device) => device.isAvailable && device.name === preferredName, + ); + if (preferred?.udid) return `platform=iOS Simulator,id=${preferred.udid}`; + } for (const devices of Object.values(parsed.devices ?? {})) { - const ipad = devices.find((device) => device.isAvailable && device.name?.includes('iPad')); - if (ipad?.udid) return `platform=iOS Simulator,id=${ipad.udid}`; + const device = devices.find( + (candidate) => candidate.isAvailable && candidate.name?.includes(nameIncludes), + ); + if (device?.udid) return `platform=iOS Simulator,id=${device.udid}`; } } catch {} } - return 'platform=iOS Simulator,name=iPad Pro 13-inch (M5)'; + return `platform=iOS Simulator,name=${fallbackName}`; } function allocateResultBundle(platform: Platform): string { From 795dd8094a65b6f0f63dd8fea413787f55ad583b Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Fri, 29 May 2026 10:49:36 -0600 Subject: [PATCH 41/60] =?UTF-8?q?=F0=9F=A7=AA=20Split=20Mac=20visual=20scr?= =?UTF-8?q?eenshot=20sweeps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../VisualScreenshotTests.swift | 78 ++++++++++++++++--- 1 file changed, 67 insertions(+), 11 deletions(-) diff --git a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift index 4dc72e5263..3702be11de 100644 --- a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift +++ b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift @@ -4,6 +4,12 @@ final class VisualScreenshotTests: XCTestCase { private var app: XCUIApplication! private var screenshotDirectory: URL! + private enum MacSurfaceScope { + case all + case primary + case secondary + } + override var executionTimeAllowance: TimeInterval { get { 10 * 60 } set { _ = newValue } @@ -34,12 +40,14 @@ final class VisualScreenshotTests: XCTestCase { launchLoggedOut() } - #if os(iOS) private var isPadVisualRun: Bool { + #if os(iOS) ProcessInfo.processInfo.environment["PACKRAT_VISUAL_PLATFORM"] == "ipad" || screenshotDirectory?.path.contains("ipad") == true + #else + false + #endif } - #endif func testGuestVisualSurface() throws { capture("00-unauth-welcome") @@ -50,10 +58,17 @@ final class VisualScreenshotTests: XCTestCase { #if os(iOS) isPadVisualRun ? captureMacSurface(mode: .guest) : capturePhoneCoreSurface(mode: .guest) #elseif os(macOS) - captureMacSurface(mode: .guest) + captureMacSurface(mode: .guest, scope: .primary) #endif } + #if os(macOS) + func testGuestSecondaryVisualSurface() throws { + enterGuestMode() + captureMacSurface(mode: .guest, scope: .secondary) + } + #endif + #if os(iOS) func testGuestPrimaryHomeActionVisualSurface() throws { if isPadVisualRun { throw XCTSkip("Compact Home action catalog is covered by iPhone; iPad uses sidebar visual coverage.") } @@ -105,10 +120,17 @@ final class VisualScreenshotTests: XCTestCase { #if os(iOS) isPadVisualRun ? captureMacSurface(mode: .authenticated) : capturePhoneCoreSurface(mode: .authenticated) #elseif os(macOS) - captureMacSurface(mode: .authenticated) + captureMacSurface(mode: .authenticated, scope: .primary) #endif } + #if os(macOS) + func testAuthenticatedSecondaryVisualSurface() throws { + launchAuthenticated() + captureMacSurface(mode: .authenticated, scope: .secondary) + } + #endif + #if os(iOS) func testAuthenticatedPrimaryHomeActionVisualSurface() throws { if isPadVisualRun { throw XCTSkip("Compact Home action catalog is covered by iPhone; iPad uses sidebar visual coverage.") } @@ -136,10 +158,17 @@ final class VisualScreenshotTests: XCTestCase { #if os(iOS) isPadVisualRun ? captureMacSurface(mode: .sampleData) : capturePhoneCoreSurface(mode: .sampleData) #elseif os(macOS) - captureMacSurface(mode: .sampleData) + captureMacSurface(mode: .sampleData, scope: .primary) #endif } + #if os(macOS) + func testAuthenticatedSampleDataSecondaryVisualSurface() throws { + launchAuthenticated(sampleData: true) + captureMacSurface(mode: .sampleData, scope: .secondary) + } + #endif + #if os(iOS) func testAuthenticatedSampleDataPrimaryHomeActionVisualSurface() throws { if isPadVisualRun { throw XCTSkip("Compact Home action catalog is covered by iPhone; iPad uses sidebar visual coverage.") } @@ -234,10 +263,17 @@ final class VisualScreenshotTests: XCTestCase { #if os(iOS) isPadVisualRun ? captureMacExpandedPlanningStates() : capturePhoneExpandedPlanningStates() #elseif os(macOS) - captureMacExpandedPlanningStates() + captureMacExpandedPlanningStates(includeCatalog: false) #endif } + #if os(macOS) + func testAuthenticatedSampleDataCatalogExpandedStateSurface() throws { + launchAuthenticated(sampleData: true) + captureMacExpandedCatalogStates() + } + #endif + func testAuthenticatedSampleDataConnectedExpandedStateSurface() throws { launchAuthenticated(sampleData: true) @@ -662,16 +698,18 @@ final class VisualScreenshotTests: XCTestCase { #endif #if os(macOS) || os(iOS) - private func captureMacSurface(mode: VisualMode) { + private func captureMacSurface(mode: VisualMode, scope: MacSurfaceScope = .all) { let prefix = mode.prefix let suffix = mode.suffix - let entries = [ + let primaryEntries = [ ("Home", "\(prefix)-home\(suffix)"), ("Packs", "\(prefix)-packs\(suffix)"), ("Trips", "\(prefix)-trips\(suffix)"), ("Weather", "\(prefix)-weather\(suffix)"), ("Assistant", "\(prefix)-assistant\(suffix)"), ("Catalog", "\(prefix)-catalog\(suffix)"), + ] + let secondaryEntries = [ ("Templates", "\(prefix)-pack-templates\(suffix)"), ("Trail Conditions", "\(prefix)-trail-conditions\(suffix)"), ("Feed", "\(prefix)-feed\(suffix)"), @@ -680,13 +718,24 @@ final class VisualScreenshotTests: XCTestCase { ("Wildlife", "\(prefix)-wildlife\(suffix)"), ("AI Packs", "\(prefix)-ai-packs\(suffix)"), ] + let entries: [(String, String)] + switch scope { + case .all: + entries = primaryEntries + secondaryEntries + case .primary: + entries = primaryEntries + case .secondary: + entries = secondaryEntries + } for (label, name) in entries { selectSidebar(label) capture(name) } - captureMacHomeAction("Season Suggestions", name: "\(prefix)-season-suggestions\(suffix)") + if scope != .primary { + captureMacHomeAction("Season Suggestions", name: "\(prefix)-season-suggestions\(suffix)") + } } private func captureMacSampleDataDetails() { @@ -759,7 +808,7 @@ final class VisualScreenshotTests: XCTestCase { tapAndCapture(identifier: "pack_item_detail_edit_button", fallbackButton: "Edit", name: "85-data-pack-item-edit-sheet") } - private func captureMacExpandedPlanningStates() { + private func captureMacExpandedPlanningStates(includeCatalog: Bool = true) { resetMacSampleDataSidebar("Trips") capture("86-data-trip-detail-expanded") tapAndCapture(identifier: "trip_detail_edit_button", fallbackButton: "Edit", name: "87-data-trip-edit-sheet", dismissAfterCapture: false) @@ -775,10 +824,17 @@ final class VisualScreenshotTests: XCTestCase { tapElementAndCapture(identifier: "template_row_visual-template-day", name: "89c-data-custom-template-before-edit", dismissAfterCapture: false) tapAndCapture(identifier: "template_detail_edit_button", fallbackButton: "Edit", name: "89d-data-template-edit-sheet") + if includeCatalog { + captureMacExpandedCatalogStates() + } + } + + private func captureMacExpandedCatalogStates() { resetMacSampleDataSidebar("Catalog") tapElementAndCapture(identifier: "catalog_item_row_7001", name: "90-data-catalog-item-detail", dismissAfterCapture: false) resetMacSampleDataSidebar("Catalog") - tapAndCapture(identifier: "catalog_item_add_to_pack_7001", fallbackButton: "Add to Pack", name: "91-data-catalog-add-to-pack-sheet") + tapElementAndCapture(identifier: "catalog_item_row_7001", name: "90a-data-catalog-item-before-add", dismissAfterCapture: false) + tapAndCapture(identifier: "catalog_detail_add_to_pack_button", fallbackButton: "Add to Pack", name: "91-data-catalog-add-to-pack-sheet") } private func captureMacExpandedConnectedStates() { From ef91fe0655915373295ad2f9404b201830b42c32 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Fri, 29 May 2026 13:48:06 -0600 Subject: [PATCH 42/60] =?UTF-8?q?=E2=8C=9A=EF=B8=8F=20Capture=20synced=20w?= =?UTF-8?q?atch=20states?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/PackRatShared/WatchSnapshot.swift | 32 +++++++ .../PackRatWatch/WatchConnectivityStore.swift | 16 ++++ .../PackRatTests/WatchSnapshotTests.swift | 12 +++ .../scripts/capture-visual-screenshots.ts | 94 +++++++++++++++++-- 4 files changed, 148 insertions(+), 6 deletions(-) diff --git a/apps/swift/Sources/PackRatShared/WatchSnapshot.swift b/apps/swift/Sources/PackRatShared/WatchSnapshot.swift index e1a97faa07..701a3deb9d 100644 --- a/apps/swift/Sources/PackRatShared/WatchSnapshot.swift +++ b/apps/swift/Sources/PackRatShared/WatchSnapshot.swift @@ -29,6 +29,38 @@ struct PackRatWatchSnapshot: Codable, Equatable, Sendable { hazardCount: 0 ) ) + + static let visualSyncedSample = PackRatWatchSnapshot( + updatedAt: Date(timeIntervalSince1970: 1_779_984_000), + pack: WatchPackSnapshot( + name: "Alpine Weekend", + baseWeightText: "10.4 lb", + packedItemCount: 6, + totalItemCount: 8, + checklist: [ + WatchChecklistItemSnapshot(id: "visual-watch-shelter", title: "Copper Spur Tent", symbolName: "tent", isPacked: true), + WatchChecklistItemSnapshot(id: "visual-watch-filter", title: "Water Filter", symbolName: "drop", isPacked: true), + WatchChecklistItemSnapshot(id: "visual-watch-jacket", title: "Rain Shell", symbolName: "jacket", isPacked: false), + WatchChecklistItemSnapshot(id: "visual-watch-kit", title: "First Aid Kit", symbolName: "cross.case", isPacked: true), + ] + ), + trip: WatchTripSnapshot( + name: "Indian Peaks Overnight", + locationName: "Brainard Lake", + dateText: "Jun 12-13" + ), + weather: WatchWeatherSnapshot( + locationName: "Brainard Lake", + temperatureText: "64°", + conditionText: "Partly Cloudy", + symbolName: "cloud.sun" + ), + trail: WatchTrailSnapshot( + title: "Pawnee Pass", + conditionText: "Muddy", + hazardCount: 2 + ) + ) } struct WatchPackSnapshot: Codable, Equatable, Sendable { diff --git a/apps/swift/Sources/PackRatWatch/WatchConnectivityStore.swift b/apps/swift/Sources/PackRatWatch/WatchConnectivityStore.swift index e65fada054..2363404b6e 100644 --- a/apps/swift/Sources/PackRatWatch/WatchConnectivityStore.swift +++ b/apps/swift/Sources/PackRatWatch/WatchConnectivityStore.swift @@ -17,6 +17,12 @@ final class WatchConnectivityStore: NSObject { super.init() encoder.dateEncodingStrategy = .iso8601 decoder.dateDecodingStrategy = .iso8601 + if ProcessInfo.processInfo.environment["PACKRAT_WATCH_RESET_SNAPSHOT"] == "1" { + UserDefaults.standard.removeObject(forKey: snapshotKey) + } + if loadInjectedSnapshot() { + return + } loadSnapshot() } @@ -60,6 +66,16 @@ final class WatchConnectivityStore: NSObject { else { return } snapshot = cached } + + private func loadInjectedSnapshot() -> Bool { + guard let encoded = ProcessInfo.processInfo.environment["PACKRAT_WATCH_SNAPSHOT_BASE64"], + let data = Data(base64Encoded: encoded), + let injected = try? decoder.decode(PackRatWatchSnapshot.self, from: data) + else { return false } + snapshot = injected + UserDefaults.standard.set(data, forKey: snapshotKey) + return true + } } extension WatchConnectivityStore: WCSessionDelegate { diff --git a/apps/swift/Tests/PackRatTests/WatchSnapshotTests.swift b/apps/swift/Tests/PackRatTests/WatchSnapshotTests.swift index 0d6c99ecfd..75f3459381 100644 --- a/apps/swift/Tests/PackRatTests/WatchSnapshotTests.swift +++ b/apps/swift/Tests/PackRatTests/WatchSnapshotTests.swift @@ -39,4 +39,16 @@ struct WatchSnapshotTests { #expect(decoded == PackRatWatchSnapshot.fallback) } + + @Test("visual synced sample represents a real companion sync") + func visualSyncedSampleRepresentsRealCompanionSync() throws { + let snapshot = PackRatWatchSnapshot.visualSyncedSample + + #expect(snapshot.pack.name == "Alpine Weekend") + #expect(snapshot.pack.totalItemCount > 0) + #expect(!snapshot.pack.checklist.isEmpty) + #expect(snapshot.trip?.name == "Indian Peaks Overnight") + #expect(snapshot.weather.temperatureText != "--") + #expect(snapshot.trail.hazardCount > 0) + } } diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index 5a486d55b2..be80e3be1b 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -334,6 +334,22 @@ function requiredScreenshots(platform: Platform): ScreenshotRequirement[] { area: 'crud', flow: 'Watch trail report draft page', }), + requirement('10-watch-synced-dashboard', { + area: 'data', + flow: 'Watch synced dashboard', + }), + requirement('11-watch-synced-checklist', { + area: 'data', + flow: 'Watch synced checklist', + }), + requirement('12-watch-synced-weather', { + area: 'data', + flow: 'Watch synced weather', + }), + requirement('13-watch-synced-trail-report', { + area: 'crud', + flow: 'Watch synced trail report draft page', + }), ]; } @@ -835,13 +851,23 @@ async function runWatchVisualCapture(screenshotDir: string): Promise Date: Fri, 29 May 2026 20:27:39 -0600 Subject: [PATCH 43/60] =?UTF-8?q?=E2=8C=9A=EF=B8=8F=20Verify=20watch=20com?= =?UTF-8?q?panion=20sync?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/PackRatShared/WatchSnapshot.swift | 4 +- .../PackRatWatch/PackRatWatchApp.swift | 73 ++-- .../PackRatWatch/WatchConnectivityStore.swift | 11 + apps/swift/project.yml | 1 + apps/swift/scripts/__tests__/simctl.test.ts | 33 +- .../scripts/capture-visual-screenshots.ts | 72 +++- apps/swift/scripts/lib/simctl.ts | 10 + apps/swift/scripts/run-e2e.ts | 4 +- apps/swift/scripts/watch-sync-smoke.ts | 325 ++++++++++++++++++ package.json | 1 + 10 files changed, 490 insertions(+), 44 deletions(-) create mode 100644 apps/swift/scripts/watch-sync-smoke.ts diff --git a/apps/swift/Sources/PackRatShared/WatchSnapshot.swift b/apps/swift/Sources/PackRatShared/WatchSnapshot.swift index 701a3deb9d..6b6f4a8d98 100644 --- a/apps/swift/Sources/PackRatShared/WatchSnapshot.swift +++ b/apps/swift/Sources/PackRatShared/WatchSnapshot.swift @@ -35,8 +35,8 @@ struct PackRatWatchSnapshot: Codable, Equatable, Sendable { pack: WatchPackSnapshot( name: "Alpine Weekend", baseWeightText: "10.4 lb", - packedItemCount: 6, - totalItemCount: 8, + packedItemCount: 3, + totalItemCount: 4, checklist: [ WatchChecklistItemSnapshot(id: "visual-watch-shelter", title: "Copper Spur Tent", symbolName: "tent", isPacked: true), WatchChecklistItemSnapshot(id: "visual-watch-filter", title: "Water Filter", symbolName: "drop", isPacked: true), diff --git a/apps/swift/Sources/PackRatWatch/PackRatWatchApp.swift b/apps/swift/Sources/PackRatWatch/PackRatWatchApp.swift index cb2cf79414..9b3781d1e2 100644 --- a/apps/swift/Sources/PackRatWatch/PackRatWatchApp.swift +++ b/apps/swift/Sources/PackRatWatch/PackRatWatchApp.swift @@ -26,6 +26,8 @@ private struct WatchRootView: View { WatchWeatherView(weather: connectivity.snapshot.weather) case "trail-report": WatchTrailReportView(trail: connectivity.snapshot.trail) + case "trail-report-draft": + WatchTrailReportView(trail: connectivity.snapshot.trail) default: WatchDashboardView() } @@ -63,30 +65,31 @@ private struct TrailReadyView: View { List { if hasSyncedPack { Section { - VStack(alignment: .leading, spacing: 8) { + VStack(alignment: .leading, spacing: 10) { Label(snapshot.pack.name, systemImage: "checkmark.seal.fill") .font(.headline) .foregroundStyle(.green) + .lineLimit(2) - Text(snapshot.trip?.name ?? "Quick wrist access for the next pack, weather, and trail notes.") + Text(tripSubtitle) .font(.footnote) .foregroundStyle(.secondary) .fixedSize(horizontal: false, vertical: true) - } - } - Section("Today") { - WatchMetricRow(title: "Base Weight", value: snapshot.pack.baseWeightText, symbol: "scalemass") - WatchMetricRow( - title: "Packed", - value: "\(snapshot.pack.packedItemCount) of \(snapshot.pack.totalItemCount)", - symbol: "backpack" - ) - WatchMetricRow( - title: "Weather", - value: "\(snapshot.weather.temperatureText) \(snapshot.weather.conditionText)", - symbol: snapshot.weather.symbolName - ) + Divider() + + WatchMetricRow(title: "Base", value: snapshot.pack.baseWeightText, symbol: "scalemass") + WatchMetricRow( + title: "Packed", + value: "\(snapshot.pack.packedItemCount)/\(snapshot.pack.totalItemCount)", + symbol: "backpack" + ) + WatchMetricRow( + title: "Weather", + value: "\(snapshot.weather.temperatureText) \(snapshot.weather.conditionText)", + symbol: snapshot.weather.symbolName + ) + } } } else { Section { @@ -107,6 +110,15 @@ private struct TrailReadyView: View { .navigationTitle("PackRat") } } + + private var tripSubtitle: String { + guard let trip = snapshot.trip else { + return "Quick wrist access for the next pack, weather, and trail notes." + } + return [trip.name, trip.locationName, trip.dateText] + .compactMap { $0 } + .joined(separator: " - ") + } } private struct WatchChecklistView: View { @@ -119,6 +131,9 @@ private struct WatchChecklistView: View { if pack.checklist.isEmpty { ContentUnavailableView("No Items", systemImage: "checklist", description: Text("Open a pack on iPhone to sync checklist items.")) } else { + Text("\(pack.packedItemCount) of \(pack.totalItemCount) packed") + .font(.caption) + .foregroundStyle(.secondary) ForEach(pack.checklist) { item in WatchChecklistToggle(item: item) } @@ -140,6 +155,7 @@ private struct WatchWeatherView: View { VStack(alignment: .leading, spacing: 4) { Label(weather.locationName, systemImage: "location.fill") .font(.headline) + .lineLimit(2) Text(weather.temperatureText) .font(.system(size: 38, weight: .semibold, design: .rounded)) Text(weather.conditionText) @@ -148,10 +164,6 @@ private struct WatchWeatherView: View { } .padding(.vertical, 4) } - - Section("Trail") { - WatchMetricRow(title: "Condition", value: weather.conditionText, symbol: weather.symbolName) - } } .navigationTitle("Weather") } @@ -169,8 +181,18 @@ private struct WatchTrailReportView: View { NavigationStack { List { Section { - WatchMetricRow(title: trail.title, value: trail.conditionText, symbol: "figure.hiking") - WatchMetricRow(title: "Hazards", value: "\(trail.hazardCount)", symbol: "exclamationmark.triangle") + VStack(alignment: .leading, spacing: 10) { + Label(trail.title, systemImage: "figure.hiking") + .font(.headline) + .lineLimit(2) + if connectivity.lastDraft != nil { + Label("Draft queued", systemImage: "checkmark.circle.fill") + .font(.caption) + .foregroundStyle(.green) + } + WatchMetricRow(title: "Condition", value: trail.conditionText, symbol: "leaf") + WatchMetricRow(title: "Hazards", value: "\(trail.hazardCount)", symbol: "exclamationmark.triangle") + } } Section("Condition") { @@ -195,9 +217,12 @@ private struct WatchTrailReportView: View { } Section { - Text(connectivity.lastDraft == nil ? "Drafts sync when the iPhone app connection is available." : "Draft saved for iPhone sync.") + Label( + connectivity.lastDraft == nil ? "Drafts sync when iPhone is available." : "Draft queued for iPhone sync.", + systemImage: connectivity.lastDraft == nil ? "arrow.triangle.2.circlepath" : "checkmark.circle.fill" + ) .font(.footnote) - .foregroundStyle(.secondary) + .foregroundStyle(connectivity.lastDraft == nil ? Color.secondary : Color.green) } } .navigationTitle("Trail Report") diff --git a/apps/swift/Sources/PackRatWatch/WatchConnectivityStore.swift b/apps/swift/Sources/PackRatWatch/WatchConnectivityStore.swift index 2363404b6e..ddc2f445f7 100644 --- a/apps/swift/Sources/PackRatWatch/WatchConnectivityStore.swift +++ b/apps/swift/Sources/PackRatWatch/WatchConnectivityStore.swift @@ -21,9 +21,11 @@ final class WatchConnectivityStore: NSObject { UserDefaults.standard.removeObject(forKey: snapshotKey) } if loadInjectedSnapshot() { + loadInjectedDraft() return } loadSnapshot() + loadInjectedDraft() } func activate() { @@ -76,6 +78,15 @@ final class WatchConnectivityStore: NSObject { UserDefaults.standard.set(data, forKey: snapshotKey) return true } + + private func loadInjectedDraft() { + guard ProcessInfo.processInfo.environment["PACKRAT_WATCH_DRAFT_SAVED"] == "1" else { return } + lastDraft = WatchTrailReportDraft( + condition: "Muddy", + note: "Creek crossing is high near the bridge.", + createdAt: Date(timeIntervalSince1970: 1_779_984_300) + ) + } } extension WatchConnectivityStore: WCSessionDelegate { diff --git a/apps/swift/project.yml b/apps/swift/project.yml index 5702a2e0d3..0a0219047d 100644 --- a/apps/swift/project.yml +++ b/apps/swift/project.yml @@ -117,6 +117,7 @@ targets: product: Sentry - package: GoogleSignIn product: GoogleSignIn + - target: PackRat-Watch settings: base: SWIFT_VERSION: "5.9" diff --git a/apps/swift/scripts/__tests__/simctl.test.ts b/apps/swift/scripts/__tests__/simctl.test.ts index 62f5879e4f..3f089ac815 100644 --- a/apps/swift/scripts/__tests__/simctl.test.ts +++ b/apps/swift/scripts/__tests__/simctl.test.ts @@ -1,7 +1,13 @@ import { readFileSync } from 'node:fs'; import { resolve } from 'node:path'; import { describe, expect, it } from 'vitest'; -import { findDeviceUDIDFromJson, isUDID, listBootedFromJson, SimctlError } from '../lib/simctl'; +import { + findDeviceUDIDFromJson, + isUDID, + listBootedFromJson, + listBootedIOSFromJson, + SimctlError, +} from '../lib/simctl'; const FIXTURE = readFileSync(resolve(__dirname, 'fixtures/devices-booted.json'), 'utf8'); @@ -23,6 +29,31 @@ describe('listBootedFromJson', () => { }); }); +describe('listBootedIOSFromJson', () => { + it('ignores booted watchOS devices when selecting an iOS destination', () => { + const json = JSON.stringify({ + devices: { + 'com.apple.CoreSimulator.SimRuntime.watchOS-26-5': [ + { + udid: '0A38C857-C0E9-4056-8B0B-E6545F072439', + name: 'Apple Watch Series 11 (46mm)', + state: 'Booted', + }, + ], + 'com.apple.CoreSimulator.SimRuntime.iOS-26-5': [ + { + udid: '80CB45AB-289A-49C9-BCF6-DC2FEE265A68', + name: 'iPhone 17 Pro Max', + state: 'Booted', + }, + ], + }, + }); + + expect(listBootedIOSFromJson(json)).toEqual(['80CB45AB-289A-49C9-BCF6-DC2FEE265A68']); + }); +}); + describe('findDeviceUDIDFromJson', () => { it('returns the UDID of the named device', () => { expect(findDeviceUDIDFromJson({ json: FIXTURE, name: 'iPhone 17 Pro Max' })).toBe( diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index be80e3be1b..26319ee028 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -350,6 +350,10 @@ function requiredScreenshots(platform: Platform): ScreenshotRequirement[] { area: 'crud', flow: 'Watch synced trail report draft page', }), + requirement('14-watch-synced-trail-draft-saved', { + area: 'crud', + flow: 'Watch trail report draft queued for iPhone sync', + }), ]; } @@ -861,26 +865,23 @@ async function runWatchVisualCapture(screenshotDir: string): Promise { + const { deviceId, appPath, env } = options; + let lastOutput = ''; + for (let attempt = 1; attempt <= 6; attempt += 1) { + if (attempt === 3) { + runChecked({ + command: 'xcrun', + args: ['simctl', 'install', deviceId, appPath], + cwd: SWIFT_DIR, + timeout: 60_000, + allowFailure: true, + }); + } + const result = spawnSync( + 'xcrun', + [ + 'simctl', + 'launch', + '--terminate-running-process', + deviceId, + 'com.andrewbierman.packrat.watchkitapp', + ], + { + cwd: SWIFT_DIR, + env: { ...process.env, ...env }, + encoding: 'utf8', + timeout: 30_000, + maxBuffer: 20 * 1024 * 1024, + }, + ); + if (result.status === 0) return; + lastOutput = result.stderr || result.stdout; + await sleep(1_500); + } + throw new Error(`Unable to launch PackRat Watch for screenshot capture: ${lastOutput}`); +} + function sleep(ms: number): Promise { return new Promise((resolvePromise) => setTimeout(resolvePromise, ms)); } diff --git a/apps/swift/scripts/lib/simctl.ts b/apps/swift/scripts/lib/simctl.ts index 840cfa60ef..415f608d8f 100644 --- a/apps/swift/scripts/lib/simctl.ts +++ b/apps/swift/scripts/lib/simctl.ts @@ -52,10 +52,20 @@ export function listBootedFromJson(json: string): string[] { .map((d) => d.udid); } +export function listBootedIOSFromJson(json: string): string[] { + return parseDeviceListJson(json) + .filter((d) => d.state === 'Booted' && d.runtime.includes('SimRuntime.iOS')) + .map((d) => d.udid); +} + export function listBooted(): string[] { return listBootedFromJson(runSimctl(['list', 'devices', '-j'])); } +export function listBootedIOS(): string[] { + return listBootedIOSFromJson(runSimctl(['list', 'devices', '-j'])); +} + export function findDeviceUDIDFromJson({ json, name }: { json: string; name: string }): string { const devices = parseDeviceListJson(json); const match = devices.find((d) => d.name === name); diff --git a/apps/swift/scripts/run-e2e.ts b/apps/swift/scripts/run-e2e.ts index 52d7139098..de825f6b50 100644 --- a/apps/swift/scripts/run-e2e.ts +++ b/apps/swift/scripts/run-e2e.ts @@ -23,7 +23,7 @@ import { createHash } from 'node:crypto'; import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; import { resolve } from 'node:path'; import { ArgsError, parseArgs } from './lib/args'; -import { listBooted } from './lib/simctl'; +import { listBootedIOS } from './lib/simctl'; import { formatSummaryLine, readSummary, XcResultError } from './lib/xcresult'; const REPO_ROOT = resolve(import.meta.dir, '../../..'); @@ -155,7 +155,7 @@ function injectScheme({ email, password, sessionToken, userId }: SchemeEnv): voi function pickDestination(): string { try { - const booted = listBooted(); + const booted = listBootedIOS(); if (booted.length > 0) return `platform=iOS Simulator,id=${booted[0]}`; } catch {} return 'platform=iOS Simulator,name=iPhone 17 Pro'; diff --git a/apps/swift/scripts/watch-sync-smoke.ts b/apps/swift/scripts/watch-sync-smoke.ts new file mode 100644 index 0000000000..d14406653c --- /dev/null +++ b/apps/swift/scripts/watch-sync-smoke.ts @@ -0,0 +1,325 @@ +#!/usr/bin/env bun +import { execFileSync, spawnSync } from 'node:child_process'; +import { copyFileSync, existsSync, mkdirSync, rmSync } from 'node:fs'; +import { resolve } from 'node:path'; + +type PairDevice = { + name: string; + udid: string; + state: string; +}; + +type SimulatorPair = { + watch: PairDevice; + phone: PairDevice; + state: string; +}; + +const REPO_ROOT = resolve(import.meta.dir, '../../..'); +const SWIFT_DIR = resolve(REPO_ROOT, 'apps/swift'); +const ARTIFACT_DIR = resolve(REPO_ROOT, 'artifacts/screenshots-latest'); +const IOS_BUNDLE_ID = 'com.andrewbierman.packrat'; +const WATCH_BUNDLE_ID = 'com.andrewbierman.packrat.watchkitapp'; +const WAIT_MS = Number(process.env.PACKRAT_WATCH_SYNC_WAIT_MS ?? 45_000); + +// biome-ignore lint/complexity/useMaxParams: command wrappers read like shell invocations. +function run( + command: string, + args: string[], + options: { allowFailure?: boolean; env?: NodeJS.ProcessEnv; quiet?: boolean } = {}, +) { + const result = spawnSync(command, args, { + cwd: SWIFT_DIR, + env: { ...process.env, ...options.env }, + encoding: 'utf8', + stdio: options.allowFailure || options.quiet ? 'pipe' : 'inherit', + }); + if (!options.allowFailure && result.status !== 0) { + const stderr = result.stderr ? `\n${result.stderr.trim()}` : ''; + const stdout = result.stdout ? `\n${result.stdout.trim()}` : ''; + throw new Error(`${command} ${args.join(' ')} failed with ${result.status}${stderr}${stdout}`); + } + return result; +} + +function output(command: string, args: string[]): string { + return execFileSync(command, args, { + cwd: SWIFT_DIR, + encoding: 'utf8', + env: process.env, + }).trim(); +} + +function outputOrNull(command: string, args: string[]): string | null { + const result = run(command, args, { allowFailure: true }); + return result.status === 0 ? result.stdout.trim() : null; +} + +function sleep(ms: number) { + return new Promise((resolveSleep) => setTimeout(resolveSleep, ms)); +} + +function isAppInstalled(deviceId: string, bundleId: string): boolean { + const result = run('xcrun', ['simctl', 'listapps', deviceId], { allowFailure: true }); + return result.status === 0 && result.stdout.includes(bundleId); +} + +// biome-ignore lint/complexity/useMaxParams: timeout belongs with this polling helper. +async function waitForInstalledApp(deviceId: string, bundleId: string, timeoutMs = 20_000) { + const startedAt = Date.now(); + while (Date.now() - startedAt < timeoutMs) { + if (isAppInstalled(deviceId, bundleId)) return; + await sleep(1_000); + } + throw new Error(`${bundleId} was not visible on ${deviceId} after install.`); +} + +// biome-ignore lint/complexity/useMaxParams: install retry needs the target device, bundle, and app artifact together. +async function installAppWithRetry( + deviceId: string, + bundleId: string, + appPath: string, + attempts = 4, +) { + let lastError = ''; + for (let attempt = 1; attempt <= attempts; attempt += 1) { + const result = run('xcrun', ['simctl', 'install', deviceId, appPath], { allowFailure: true }); + if (result.status !== 0) { + lastError = [result.stderr, result.stdout].filter(Boolean).join('\n').trim(); + } + const startedAt = Date.now(); + while (Date.now() - startedAt < 6_000) { + if (isAppInstalled(deviceId, bundleId)) return; + await sleep(1_000); + } + } + throw new Error( + `${bundleId} was not visible on ${deviceId} after ${attempts} install attempts.\n${lastError}`, + ); +} + +// biome-ignore lint/complexity/useMaxParams: launch retry needs the device, bundle, and optional launch environment together. +async function launchWithRetry( + deviceId: string, + bundleId: string, + options: { env?: NodeJS.ProcessEnv; attempts?: number; reinstallAppPath?: string } = {}, +) { + const attempts = options.attempts ?? 6; + let lastError = ''; + for (let attempt = 1; attempt <= attempts; attempt += 1) { + if (attempt === 3 && options.reinstallAppPath) { + await installAppWithRetry(deviceId, bundleId, options.reinstallAppPath); + await waitForInstalledApp(deviceId, bundleId); + } + const result = run( + 'xcrun', + ['simctl', 'launch', '--terminate-running-process', deviceId, bundleId], + { + allowFailure: true, + env: options.env, + }, + ); + if (result.status === 0) return; + lastError = [result.stderr, result.stdout].filter(Boolean).join('\n').trim(); + await sleep(2_000); + } + throw new Error( + `Unable to launch ${bundleId} on ${deviceId} after ${attempts} attempts.\n${lastError}`, + ); +} + +function activePair(): SimulatorPair { + const parsed = JSON.parse(output('xcrun', ['simctl', 'list', 'pairs', '-j'])) as { + pairs: Record; + }; + const pairs = Object.values(parsed.pairs); + const pair = + pairs.find( + (candidate) => candidate.watch.state === 'Booted' && candidate.phone.state === 'Booted', + ) ?? pairs.find((candidate) => candidate.watch.udid && candidate.phone.udid); + if (!pair) throw new Error('No paired iPhone + Apple Watch simulator pair is available.'); + return pair; +} + +// biome-ignore lint/complexity/useMaxParams: build setting lookup is clearer with explicit xcodebuild dimensions. +function buildSetting(scheme: string, destination: string, key: string): string { + const settings = output('xcodebuild', [ + '-project', + 'PackRat.xcodeproj', + '-scheme', + scheme, + '-destination', + destination, + '-configuration', + 'Debug', + '-showBuildSettings', + ]); + const line = settings + .split('\n') + .map((value) => value.trim()) + .find((value) => value.startsWith(`${key} = `)); + if (!line) throw new Error(`Unable to resolve ${key} for ${scheme}`); + return line.slice(`${key} = `.length); +} + +function appPath(scheme: string, destination: string): string { + const productsDir = buildSetting(scheme, destination, 'BUILT_PRODUCTS_DIR'); + const wrapperName = buildSetting(scheme, destination, 'WRAPPER_NAME'); + return resolve(productsDir, wrapperName); +} + +function assertSnapshot(payload: string) { + const snapshot = JSON.parse(payload) as { + pack?: { name?: string; checklist?: unknown[]; totalItemCount?: number }; + trip?: { name?: string }; + weather?: { temperatureText?: string }; + trail?: { title?: string }; + }; + + if (!snapshot.pack || snapshot.pack.name === 'No Pack Synced') { + throw new Error(`Watch snapshot did not sync pack data: ${payload}`); + } + if (!snapshot.pack.checklist?.length && !snapshot.pack.totalItemCount) { + throw new Error(`Watch snapshot did not include checklist data: ${payload}`); + } + if (!snapshot.trip?.name) throw new Error(`Watch snapshot did not include trip data: ${payload}`); + if (!snapshot.weather?.temperatureText || snapshot.weather.temperatureText === '--') { + throw new Error(`Watch snapshot did not include weather data: ${payload}`); + } + if (!snapshot.trail?.title) + throw new Error(`Watch snapshot did not include trail data: ${payload}`); +} + +async function waitForWatchSnapshot(watchId: string, timeoutMs: number): Promise { + const startedAt = Date.now(); + let lastError = ''; + while (Date.now() - startedAt < timeoutMs) { + const container = outputOrNull('xcrun', [ + 'simctl', + 'get_app_container', + watchId, + WATCH_BUNDLE_ID, + 'data', + ]); + if (container) { + const preferences = resolve( + container, + 'Library/Preferences/com.andrewbierman.packrat.watchkitapp.plist', + ); + const payload = outputOrNull('/usr/libexec/PlistBuddy', [ + '-c', + 'Print :watch.snapshot', + preferences, + ]); + if (payload) { + try { + assertSnapshot(payload); + return payload; + } catch (error) { + lastError = error instanceof Error ? error.message : String(error); + } + } + } + await sleep(2_000); + } + throw new Error( + lastError || `Watch snapshot did not appear within ${Math.round(timeoutMs / 1000)}s.`, + ); +} + +async function main() { + mkdirSync(ARTIFACT_DIR, { recursive: true }); + const pair = activePair(); + const phoneId = process.env.PACKRAT_WATCH_SYNC_PHONE_ID ?? pair.phone.udid; + const watchId = process.env.PACKRAT_WATCH_SYNC_WATCH_ID ?? pair.watch.udid; + const phoneDestination = `platform=iOS Simulator,id=${phoneId}`; + const watchDestination = `platform=watchOS Simulator,id=${watchId}`; + + console.log(`-> Pair: ${pair.phone.name} (${phoneId}) + ${pair.watch.name} (${watchId})`); + run('xcrun', ['simctl', 'boot', phoneId], { allowFailure: true }); + run('xcrun', ['simctl', 'boot', watchId], { allowFailure: true }); + + console.log('-> Building iOS app with embedded Watch content'); + run( + 'xcodebuild', + [ + '-project', + 'PackRat.xcodeproj', + '-scheme', + 'PackRat-iOS', + '-destination', + phoneDestination, + '-configuration', + 'Debug', + 'build', + ], + { quiet: true }, + ); + + const iosAppPath = appPath('PackRat-iOS', phoneDestination); + const standaloneWatchAppPath = appPath('PackRat-Watch', watchDestination); + const embeddedWatchAppPath = resolve(iosAppPath, 'Watch/PackRat-Watch.app'); + if (!existsSync(iosAppPath)) throw new Error(`Missing iOS app at ${iosAppPath}`); + if (!existsSync(embeddedWatchAppPath)) + throw new Error(`Missing embedded Watch app at ${embeddedWatchAppPath}`); + if (!existsSync(standaloneWatchAppPath)) + throw new Error(`Missing Watch app at ${standaloneWatchAppPath}`); + + console.log('-> Installing apps'); + run('xcrun', ['simctl', 'uninstall', phoneId, IOS_BUNDLE_ID], { allowFailure: true }); + run('xcrun', ['simctl', 'uninstall', watchId, WATCH_BUNDLE_ID], { allowFailure: true }); + await installAppWithRetry(phoneId, IOS_BUNDLE_ID, iosAppPath); + await installAppWithRetry(watchId, WATCH_BUNDLE_ID, standaloneWatchAppPath); + await waitForInstalledApp(phoneId, IOS_BUNDLE_ID); + await waitForInstalledApp(watchId, WATCH_BUNDLE_ID); + + run('xcrun', ['simctl', 'terminate', phoneId, IOS_BUNDLE_ID], { allowFailure: true }); + run('xcrun', ['simctl', 'terminate', watchId, WATCH_BUNDLE_ID], { allowFailure: true }); + + console.log('-> Launching Watch without injected snapshot'); + await launchWithRetry(watchId, WATCH_BUNDLE_ID, { + env: { SIMCTL_CHILD_PACKRAT_WATCH_RESET_SNAPSHOT: '1' }, + reinstallAppPath: standaloneWatchAppPath, + }); + + console.log('-> Launching iPhone with authenticated visual sample data'); + run( + 'xcrun', + [ + 'simctl', + 'launch', + '--terminate-running-process', + phoneId, + IOS_BUNDLE_ID, + '--disable-animations', + '--use-userdefaults-auth', + '--reset-auth', + '--seed-e2e-auth', + '--visual-sample-data', + ], + { + env: { + SIMCTL_CHILD_PACKRAT_VISUAL_SAMPLE_DATA: '1', + SIMCTL_CHILD_PACKRAT_E2E_EMAIL: 'e2e@packrat.test', + SIMCTL_CHILD_PACKRAT_E2E_USER_ID: '00000000-0000-4000-8000-000000000001', + SIMCTL_CHILD_PACKRAT_E2E_ROLE: 'ADMIN', + }, + }, + ); + + console.log(`-> Waiting ${Math.round(WAIT_MS / 1000)}s for WatchConnectivity`); + await waitForWatchSnapshot(watchId, WAIT_MS); + + const screenshotPath = resolve(ARTIFACT_DIR, 'watch-real-sync-smoke.png'); + const tempScreenshotPath = `/tmp/packrat-watch-real-sync-smoke-${Date.now()}.png`; + run('xcrun', ['simctl', 'io', watchId, 'screenshot', tempScreenshotPath]); + rmSync(screenshotPath, { force: true }); + copyFileSync(tempScreenshotPath, screenshotPath); + rmSync(tempScreenshotPath, { force: true }); + console.log(`✓ Watch received iPhone snapshot: ${screenshotPath}`); +} + +main().catch((error) => { + console.error(error instanceof Error ? error.message : String(error)); + process.exit(1); +}); diff --git a/package.json b/package.json index 3128457ca9..686a0c8a0f 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "swift:models": "bun run apps/swift/scripts/generate-swift-models.ts", "swift:quicktype": "bun run apps/swift/scripts/generate-quicktype-models.ts", "swift:screenshots": "bun run apps/swift/scripts/capture-visual-screenshots.ts", + "swift:watch-sync-smoke": "bun run apps/swift/scripts/watch-sync-smoke.ts", "web:screenshots": "bun run --cwd apps/expo screenshots:web", "test:api:unit": "vitest run --config packages/api/vitest.unit.config.ts", "test:e2e:android": "bash .github/scripts/e2e.sh android", From 53534dcb921dec8167e51e1647ec4ce8ac55d49b Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Sat, 30 May 2026 01:09:01 -0600 Subject: [PATCH 44/60] =?UTF-8?q?=F0=9F=A7=AA=20Harden=20Swift=20E2E=20fix?= =?UTF-8?q?tures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Features/Catalog/CatalogViewModel.swift | 4 +- .../Features/Weather/WeatherView.swift | 4 +- .../Features/Weather/WeatherViewModel.swift | 19 +++ .../PackRat/Shared/VisualSampleData.swift | 147 ++++++++++++++++++ .../Tests/PackRatUITests/AppUITestCase.swift | 12 +- .../Tests/PackRatUITests/AuthTests.swift | 16 +- .../PackRatUITests/CatalogMacOSTests.swift | 1 + .../Tests/PackRatUITests/CatalogTests.swift | 1 + .../PackRatUITests/WeatherMacOSTests.swift | 30 ++-- .../Tests/PackRatUITests/WeatherTests.swift | 48 +++--- .../scripts/__tests__/macos-args.test.ts | 48 ++++++ apps/swift/scripts/lib/macos-args.ts | 63 ++++++++ apps/swift/scripts/run-e2e-macos.ts | 48 +----- 13 files changed, 347 insertions(+), 94 deletions(-) create mode 100644 apps/swift/scripts/__tests__/macos-args.test.ts create mode 100644 apps/swift/scripts/lib/macos-args.ts diff --git a/apps/swift/Sources/PackRat/Features/Catalog/CatalogViewModel.swift b/apps/swift/Sources/PackRat/Features/Catalog/CatalogViewModel.swift index c1200b0c45..b1a0164aba 100644 --- a/apps/swift/Sources/PackRat/Features/Catalog/CatalogViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/Catalog/CatalogViewModel.swift @@ -31,9 +31,11 @@ final class CatalogViewModel { } func search(reset: Bool = false) async { - if VisualSampleData.isEnabled && !items.isEmpty { + if VisualSampleData.isEnabled || VisualSampleData.isUITestFixturesEnabled { + if reset { currentPage = 1 } isLoading = false error = nil + items = VisualSampleData.catalogItems(matching: searchText) hasSearched = true return } diff --git a/apps/swift/Sources/PackRat/Features/Weather/WeatherView.swift b/apps/swift/Sources/PackRat/Features/Weather/WeatherView.swift index 4146482ed2..edb4c19264 100644 --- a/apps/swift/Sources/PackRat/Features/Weather/WeatherView.swift +++ b/apps/swift/Sources/PackRat/Features/Weather/WeatherView.swift @@ -129,8 +129,6 @@ struct WeatherView: View { ForEach(viewModel.searchResults) { location in Button { viewModel.saveLocation(location) - viewModel.searchText = "" - viewModel.searchResults = [] isSearchPresented = false Task { await viewModel.selectLocation(location) @@ -153,8 +151,10 @@ struct WeatherView: View { } .padding(.horizontal, 12) .padding(.vertical, 10) + .contentShape(Rectangle()) } .buttonStyle(.plain) + .accessibilityIdentifier("weather_search_result_\(location.id)") Divider().padding(.leading, 12) } } diff --git a/apps/swift/Sources/PackRat/Features/Weather/WeatherViewModel.swift b/apps/swift/Sources/PackRat/Features/Weather/WeatherViewModel.swift index 50b22ef32a..c03c4b229c 100644 --- a/apps/swift/Sources/PackRat/Features/Weather/WeatherViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/Weather/WeatherViewModel.swift @@ -21,6 +21,10 @@ final class WeatherViewModel { init(service: WeatherService = .shared) { self.service = service + if VisualSampleData.isUITestFixturesEnabled { + UserDefaults.standard.removeObject(forKey: savedLocationsKey) + UserDefaults.standard.removeObject(forKey: activeLocationKey) + } guard !VisualSampleData.isScreenshotCapture else { return } loadSavedLocations() if let active = savedLocations.first(where: { $0.id == UserDefaults.standard.integer(forKey: activeLocationKey) }) @@ -80,6 +84,13 @@ final class WeatherViewModel { } func search(query: String) async { + if VisualSampleData.isEnabled || VisualSampleData.isUITestFixturesEnabled { + isSearching = false + searchError = nil + searchResults = VisualSampleData.weatherLocations(matching: query) + return + } + isSearching = true searchError = nil defer { isSearching = false } @@ -99,6 +110,14 @@ final class WeatherViewModel { } func loadForecast(for locationId: Int) async { + if (VisualSampleData.isEnabled || VisualSampleData.isUITestFixturesEnabled), + let location = selectedLocation ?? VisualSampleData.weatherLocations.first(where: { $0.id == locationId }) { + isLoadingForecast = false + forecastError = nil + forecast = VisualSampleData.weatherForecast(for: location) + return + } + guard !VisualSampleData.isScreenshotCapture || VisualSampleData.isEnabled else { forecastError = nil forecast = nil diff --git a/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift b/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift index f8a5359df7..e127a6ea5c 100644 --- a/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift +++ b/apps/swift/Sources/PackRat/Shared/VisualSampleData.swift @@ -10,6 +10,11 @@ enum VisualSampleData { || ProcessInfo.processInfo.arguments.contains("--visual-sample-data") } + static var isUITestFixturesEnabled: Bool { + ProcessInfo.processInfo.environment["PACKRAT_UI_TEST_FIXTURES"] == "1" + || ProcessInfo.processInfo.arguments.contains("--ui-test-fixtures") + } + static var guides: [Guide] { [ Guide( @@ -63,6 +68,148 @@ enum VisualSampleData { Array(Set(guides.compactMap(\.category))).sorted() } + static func catalogItems(matching query: String) -> [CatalogItem] { + let allItems = [ + CatalogItem( + id: 7001, + name: "Copper Spur HV UL2 Tent", + productUrl: "https://example.com/copper-spur", + sku: "VISUAL-COPPER-SPUR", + weight: 1420, + weightUnit: .g, + description: "Freestanding two-person backpacking tent.", + categories: ["Shelter", "Backpacking"], + images: nil, + brand: "Big Agnes", + model: "HV UL2", + ratingValue: 4.7, + color: "Orange", + size: "2P", + price: 549.95, + availability: "in_stock", + seller: "PackRat Demo", + reviewCount: 128 + ), + CatalogItem( + id: 7002, + name: "Duplex Trekking Pole Shelter", + productUrl: "https://example.com/duplex", + sku: "VISUAL-DUPLEX", + weight: 539, + weightUnit: .g, + description: "Ultralight two-person shelter for trekking pole setups.", + categories: ["Shelter", "Ultralight"], + images: nil, + brand: "Zpacks", + model: "Duplex", + ratingValue: 4.6, + color: "Olive", + size: "2P", + price: 699.00, + availability: "in_stock", + seller: "PackRat Demo", + reviewCount: 89 + ), + CatalogItem( + id: 7003, + name: "Circuit 68L Backpack", + productUrl: "https://example.com/circuit", + sku: "VISUAL-CIRCUIT", + weight: 1162, + weightUnit: .g, + description: "Frameless-compatible backpack for lightweight trips.", + categories: ["Packs", "Backpacking"], + images: nil, + brand: "ULA", + model: "Circuit", + ratingValue: 4.8, + color: "Green", + size: "68L", + price: 299.99, + availability: "in_stock", + seller: "PackRat Demo", + reviewCount: 214 + ), + ] + let trimmed = query.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { return allItems } + return allItems.filter { item in + item.name.localizedCaseInsensitiveContains(trimmed) + || item.brand?.localizedCaseInsensitiveContains(trimmed) == true + || item.model?.localizedCaseInsensitiveContains(trimmed) == true + || item.categories?.contains(where: { $0.localizedCaseInsensitiveContains(trimmed) }) == true + } + } + + static var weatherLocations: [WeatherLocation] { + [ + WeatherLocation(id: 5419384, name: "Denver", region: "Colorado", country: "United States", lat: 39.74, lon: -104.98), + WeatherLocation(id: 5809844, name: "Seattle", region: "Washington", country: "United States", lat: 47.61, lon: -122.33), + WeatherLocation(id: 5780993, name: "Salt Lake City", region: "Utah", country: "United States", lat: 40.76, lon: -111.89), + ] + } + + static func weatherLocations(matching query: String) -> [WeatherLocation] { + let trimmed = query.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { return weatherLocations } + return weatherLocations.filter { + $0.name.localizedCaseInsensitiveContains(trimmed) + || ($0.region?.localizedCaseInsensitiveContains(trimmed) ?? false) + || ($0.country?.localizedCaseInsensitiveContains(trimmed) ?? false) + } + } + + static func weatherForecast(for location: WeatherLocation) -> WeatherForecastResponse { + let now = Date.iso8601Now() + return WeatherForecastResponse( + location: WeatherResponseLocation( + id: location.id, + name: location.name, + region: location.region, + country: location.country, + lat: location.lat, + lon: location.lon, + localtime: "2026-05-26 09:00", + localtimeEpoch: nil, + tzId: "America/Denver" + ), + current: WeatherCurrent( + tempC: 18, + tempF: 64, + feelslikeC: 18, + feelslikeF: 64, + humidity: 42, + windMph: 8, + windKph: 13, + windDir: "W", + condition: WeatherCondition(text: "Partly cloudy", icon: nil, code: 1003), + uv: 6, + visMiles: 10, + precipIn: 0, + cloud: 35, + isDay: 1 + ), + forecast: WeatherForecast(forecastday: [ + forecastDay(offset: 0, high: 68, low: 47, condition: "Partly cloudy", code: 1003, rain: 10), + forecastDay(offset: 1, high: 72, low: 49, condition: "Sunny", code: 1000, rain: 5), + forecastDay(offset: 2, high: 61, low: 44, condition: "Light rain", code: 1183, rain: 55), + ]), + alerts: WeatherAlertsWrapper(alert: [ + WeatherAlert( + headline: "Afternoon gusts above treeline", + event: "Wind Advisory", + severity: "Moderate", + urgency: "Expected", + areas: "Front Range", + effective: now, + expires: Calendar.current.date(byAdding: .hour, value: 8, to: Date())?.iso8601String(), + desc: "Secure lightweight shelters and keep an extra layer accessible.", + instruction: "Review campsite exposure before dark." + ), + ]) + ) + } + @MainActor static func apply(to appState: AppState) { let now = Date.iso8601Now() diff --git a/apps/swift/Tests/PackRatUITests/AppUITestCase.swift b/apps/swift/Tests/PackRatUITests/AppUITestCase.swift index f857324c77..e756ee5218 100644 --- a/apps/swift/Tests/PackRatUITests/AppUITestCase.swift +++ b/apps/swift/Tests/PackRatUITests/AppUITestCase.swift @@ -21,6 +21,7 @@ import XCTest /// directly via xcodebuild: `xcodebuild test ... PACKRAT_E2E_EMAIL=... PACKRAT_E2E_PASSWORD=...`. class AppUITestCase: XCTestCase { var app: XCUIApplication! + var additionalLaunchArguments: [String] { [] } override func setUpWithError() throws { continueAfterFailure = false @@ -35,6 +36,7 @@ class AppUITestCase: XCTestCase { // bearer token accepted by the worker, avoiding brittle UI sign-in // while still exercising authenticated API routes. app.launchArguments.append("--reset-auth") + app.launchArguments.append(contentsOf: additionalLaunchArguments) let bundle = Bundle(for: AppUITestCase.self) let seededAuthToken = (bundle.object(forInfoDictionaryKey: "PACKRAT_E2E_SESSION_TOKEN") as? String) @@ -343,7 +345,7 @@ class AppUITestCase: XCTestCase { /// Returns a name guaranteed to be unique across test runs. func uniqueName(_ prefix: String) -> String { - "\(prefix) \(Int(Date().timeIntervalSince1970))" + "\(prefix) \(Int(Date().timeIntervalSince1970 * 1000))-\(UUID().uuidString.prefix(6))" } } @@ -370,12 +372,14 @@ extension XCUIElement { return } } else { - // Fallback: move to end and backspace. + // Fallback: move to the visible end and backspace generously. + coordinate(withNormalizedOffset: CGVector(dx: 0.96, dy: 0.5)).tap() // XCUIKeyboardKey.delete only exists on iOS; on macOS we use "\u{8}" (backspace). + let deleteCount = max(existing.count, 256) #if os(iOS) - let deleteString = String(repeating: XCUIKeyboardKey.delete.rawValue, count: existing.count) + let deleteString = String(repeating: XCUIKeyboardKey.delete.rawValue, count: deleteCount) #else - let deleteString = String(repeating: "\u{8}", count: existing.count) + let deleteString = String(repeating: "\u{8}", count: deleteCount) #endif typeText(deleteString) } diff --git a/apps/swift/Tests/PackRatUITests/AuthTests.swift b/apps/swift/Tests/PackRatUITests/AuthTests.swift index 54a34cc4f2..96336b4cc2 100644 --- a/apps/swift/Tests/PackRatUITests/AuthTests.swift +++ b/apps/swift/Tests/PackRatUITests/AuthTests.swift @@ -64,10 +64,10 @@ final class AuthTests: AppUITestCase { goToHomeAction("Community Feed") XCTAssertTrue( - app.staticTexts["Sign In to View the Feed"].waitForExistence(timeout: 10), + app.staticTexts["Community Feed Requires an Account"].waitForExistence(timeout: 10), "Guest-only account-backed screens should show a native sign-in state instead of a network error" ) - XCTAssertTrue(app.buttons["Sign In"].exists) + XCTAssertTrue(app.buttons["Sign In or Create Account"].exists) XCTAssertFalse(app.buttons["Try Again"].exists) XCTAssertFalse(app.staticTexts["Connection Needed"].exists) } @@ -79,21 +79,21 @@ final class AuthTests: AppUITestCase { XCTAssertTrue(waitForLoggedIn(timeout: 10), "Guest mode should enter the main app shell") goToTab("Assistant") - XCTAssertTrue(app.staticTexts["Sign In to Use Assistant"].waitForExistence(timeout: 10)) - XCTAssertTrue(app.buttons["Sign In"].exists) + XCTAssertTrue(app.staticTexts["Assistant Requires an Account"].waitForExistence(timeout: 10)) + XCTAssertTrue(app.buttons["Sign In or Create Account"].exists) XCTAssertFalse(app.buttons["Try Again"].exists) XCTAssertFalse(app.staticTexts["Connection Needed"].exists) goToHomeAction("Season Suggestions") - XCTAssertTrue(app.staticTexts["Sign In for Season Suggestions"].waitForExistence(timeout: 10)) - XCTAssertTrue(app.buttons["Sign In"].exists) + XCTAssertTrue(app.staticTexts["Season Suggestions Require an Account"].waitForExistence(timeout: 10)) + XCTAssertTrue(app.buttons["Sign In or Create Account"].exists) XCTAssertFalse(app.buttons["Try Again"].exists) XCTAssertFalse(app.staticTexts["Connection Needed"].exists) app.buttons["Done"].tapIfExists() goToHomeAction("Wildlife ID") - XCTAssertTrue(app.staticTexts["Sign In to Identify Wildlife"].waitForExistence(timeout: 10)) - XCTAssertTrue(app.buttons["Sign In"].exists) + XCTAssertTrue(app.staticTexts["Wildlife ID Requires an Account"].waitForExistence(timeout: 10)) + XCTAssertTrue(app.buttons["Sign In or Create Account"].exists) XCTAssertFalse(app.buttons["Try Again"].exists) XCTAssertFalse(app.staticTexts["Connection Needed"].exists) } diff --git a/apps/swift/Tests/PackRatUITests/CatalogMacOSTests.swift b/apps/swift/Tests/PackRatUITests/CatalogMacOSTests.swift index 86ec9b80b7..a60804663c 100644 --- a/apps/swift/Tests/PackRatUITests/CatalogMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/CatalogMacOSTests.swift @@ -5,6 +5,7 @@ import XCTest /// "Catalog" row; the content column renders `CatalogView` directly (no nav /// bar — title is the window title or content-column header). final class CatalogMacOSTests: AppUITestCase { + override var additionalLaunchArguments: [String] { ["--ui-test-fixtures"] } func testCatalogSidebarReachable() { goToSidebar("Catalog") diff --git a/apps/swift/Tests/PackRatUITests/CatalogTests.swift b/apps/swift/Tests/PackRatUITests/CatalogTests.swift index fca967db21..7b60738606 100644 --- a/apps/swift/Tests/PackRatUITests/CatalogTests.swift +++ b/apps/swift/Tests/PackRatUITests/CatalogTests.swift @@ -5,6 +5,7 @@ import XCTest /// E2E tests for Gear Catalog search and item detail. final class CatalogTests: AppUITestCase { + override var additionalLaunchArguments: [String] { ["--ui-test-fixtures"] } func testCatalogTabReachable() { goToCatalog() diff --git a/apps/swift/Tests/PackRatUITests/WeatherMacOSTests.swift b/apps/swift/Tests/PackRatUITests/WeatherMacOSTests.swift index 2dc30d0119..71721a56f2 100644 --- a/apps/swift/Tests/PackRatUITests/WeatherMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/WeatherMacOSTests.swift @@ -5,6 +5,8 @@ import XCTest /// the search field, forecast cards, and toolbar buttons all live in the /// content column. final class WeatherMacOSTests: AppUITestCase { + override var additionalLaunchArguments: [String] { ["--ui-test-fixtures"] } + private let testCity = "Denver" private let testCityFull = "Denver" @@ -16,7 +18,7 @@ final class WeatherMacOSTests: AppUITestCase { searchField.click() searchField.typeText(testCity) - let results = app.buttons.matching(NSPredicate(format: "label CONTAINS '\(testCityFull)'")) + let results = weatherSearchResults() XCTAssertTrue( results.firstMatch.waitForExistence(timeout: 10), "Search results for '\(testCity)' must appear" @@ -31,9 +33,7 @@ final class WeatherMacOSTests: AppUITestCase { searchField.click() searchField.typeText(testCity) - let firstResult = app.buttons.matching( - NSPredicate(format: "label CONTAINS '\(testCityFull)'") - ).firstMatch + let firstResult = weatherSearchResults().firstMatch waitFor(firstResult, timeout: 10) firstResult.click() @@ -52,14 +52,10 @@ final class WeatherMacOSTests: AppUITestCase { searchField.click() searchField.typeText(testCity) - let firstResult = app.buttons.matching( - NSPredicate(format: "label CONTAINS '\(testCityFull)'") - ).firstMatch + let firstResult = weatherSearchResults().firstMatch waitFor(firstResult, timeout: 10) firstResult.click() - searchField.clearAndTypeText("") - XCTAssertTrue( app.descendants(matching: .any).matching(NSPredicate(format: "identifier BEGINSWITH 'weather_saved_location_'")).firstMatch .waitForExistence(timeout: 10), @@ -75,7 +71,7 @@ final class WeatherMacOSTests: AppUITestCase { searchField.click() searchField.typeText(testCity) - let results = app.buttons.matching(NSPredicate(format: "label CONTAINS '\(testCityFull)'")) + let results = weatherSearchResults() waitFor(results.firstMatch, timeout: 10) searchField.clearAndTypeText("") @@ -97,9 +93,7 @@ final class WeatherMacOSTests: AppUITestCase { searchField.click() searchField.typeText(testCity) - let firstResult = app.buttons.matching( - NSPredicate(format: "label CONTAINS '\(testCityFull)'") - ).firstMatch + let firstResult = weatherSearchResults().firstMatch waitFor(firstResult, timeout: 10) firstResult.click() @@ -117,9 +111,7 @@ final class WeatherMacOSTests: AppUITestCase { searchField.click() searchField.typeText(testCity) - let firstResult = app.buttons.matching( - NSPredicate(format: "label CONTAINS '\(testCityFull)'") - ).firstMatch + let firstResult = weatherSearchResults().firstMatch waitFor(firstResult, timeout: 10) firstResult.click() @@ -131,5 +123,11 @@ final class WeatherMacOSTests: AppUITestCase { "Alerts button must appear in toolbar after forecast loads" ) } + + private func weatherSearchResults() -> XCUIElementQuery { + app.buttons.matching( + NSPredicate(format: "identifier BEGINSWITH 'weather_search_result_' AND label CONTAINS '\(testCityFull)'") + ) + } } #endif diff --git a/apps/swift/Tests/PackRatUITests/WeatherTests.swift b/apps/swift/Tests/PackRatUITests/WeatherTests.swift index 29124be198..c646444433 100644 --- a/apps/swift/Tests/PackRatUITests/WeatherTests.swift +++ b/apps/swift/Tests/PackRatUITests/WeatherTests.swift @@ -5,6 +5,8 @@ import XCTest /// End-to-end tests for Weather: location search, forecast display, saved locations. final class WeatherTests: AppUITestCase { + override var additionalLaunchArguments: [String] { ["--ui-test-fixtures"] } + private let testCity = "Denver" private let testCityFull = "Denver" // fragment to match in search results private let weatherSearchTimeout: TimeInterval = 20 @@ -20,7 +22,7 @@ final class WeatherTests: AppUITestCase { searchField.typeText(testCity) // Search results should appear (they load from the WeatherAPI) - let results = app.buttons.matching(NSPredicate(format: "label CONTAINS '\(testCityFull)'")) + let results = weatherSearchResults() XCTAssertTrue( results.firstMatch.waitForExistence(timeout: weatherSearchTimeout), "Search results for '\(testCity)' must appear" @@ -36,16 +38,12 @@ final class WeatherTests: AppUITestCase { searchField.typeText(testCity) // Wait for results and tap the first match - let firstResult = app.buttons.matching( - NSPredicate(format: "label CONTAINS '\(testCityFull)'") - ).firstMatch + let firstResult = weatherSearchResults().firstMatch waitFor(firstResult, timeout: weatherSearchTimeout) firstResult.tap() // Forecast card: current temperature shows a ° - let tempLabel = app.staticTexts.matching( - NSPredicate(format: "label MATCHES '.*\\d+°.*' OR label CONTAINS '°'") - ).firstMatch + let tempLabel = app.descendants(matching: .any)["weather_current_card"] XCTAssertTrue( tempLabel.waitForExistence(timeout: 20), "Temperature reading must appear after selecting a location" @@ -60,9 +58,7 @@ final class WeatherTests: AppUITestCase { searchField.tap() searchField.typeText(testCity) - let firstResult = app.buttons.matching( - NSPredicate(format: "label CONTAINS '\(testCityFull)'") - ).firstMatch + let firstResult = weatherSearchResults().firstMatch waitFor(firstResult, timeout: weatherSearchTimeout) firstResult.tap() @@ -89,7 +85,7 @@ final class WeatherTests: AppUITestCase { searchField.typeText(testCity) // Wait for results to appear - let results = app.buttons.matching(NSPredicate(format: "label CONTAINS '\(testCityFull)'")) + let results = weatherSearchResults() waitFor(results.firstMatch, timeout: weatherSearchTimeout) searchField.clearAndTypeText("") @@ -113,12 +109,18 @@ final class WeatherTests: AppUITestCase { searchField.tap() searchField.typeText(testCity) - let firstResult = app.buttons.matching( - NSPredicate(format: "label CONTAINS '\(testCityFull)'") - ).firstMatch + let firstResult = weatherSearchResults().firstMatch waitFor(firstResult, timeout: weatherSearchTimeout) firstResult.tap() + XCTAssertTrue( + app.descendants(matching: .any)["weather_current_card"].waitForExistence(timeout: 20), + "Current weather card must appear before checking forecast rows" + ) + let list = app.collectionViews.firstMatch + for _ in 0..<4 where !app.staticTexts["10-Day Forecast"].exists { + list.swipeUp() + } // 10-day forecast header XCTAssertTrue( app.staticTexts["10-Day Forecast"].waitForExistence(timeout: 20), @@ -134,14 +136,18 @@ final class WeatherTests: AppUITestCase { searchField.tap() searchField.typeText(testCity) - let firstResult = app.buttons.matching( - NSPredicate(format: "label CONTAINS '\(testCityFull)'") - ).firstMatch + let firstResult = weatherSearchResults().firstMatch waitFor(firstResult, timeout: weatherSearchTimeout) firstResult.tap() + XCTAssertTrue( + app.descendants(matching: .any)["weather_current_card"].waitForExistence(timeout: 20), + "Current weather card must appear before checking toolbar actions" + ) // Alerts toolbar button appears once forecast is loaded - let alertsButton = app.buttons["weather_alerts_button"].firstMatch + let alertsButton = app.buttons["weather_alerts_button"].firstMatch.exists + ? app.buttons["weather_alerts_button"].firstMatch + : app.buttons.matching(NSPredicate(format: "label == 'Alerts' OR label CONTAINS 'bell'")).firstMatch XCTAssertTrue( alertsButton.waitForExistence(timeout: 20), "Alerts button must appear in toolbar after forecast loads" @@ -152,6 +158,12 @@ final class WeatherTests: AppUITestCase { goToHomeAction("Weather") XCTAssertTrue(app.navigationBars["Weather"].waitForExistence(timeout: 8)) } + + private func weatherSearchResults() -> XCUIElementQuery { + app.buttons.matching( + NSPredicate(format: "identifier BEGINSWITH 'weather_search_result_' AND label CONTAINS '\(testCityFull)'") + ) + } } #endif diff --git a/apps/swift/scripts/__tests__/macos-args.test.ts b/apps/swift/scripts/__tests__/macos-args.test.ts new file mode 100644 index 0000000000..dc04b91236 --- /dev/null +++ b/apps/swift/scripts/__tests__/macos-args.test.ts @@ -0,0 +1,48 @@ +import { describe, expect, it } from 'vitest'; +import { ArgsError } from '../lib/args'; +import { normalizeMacOSTestSelectors, parseMacOSArgs } from '../lib/macos-args'; + +describe('parseMacOSArgs', () => { + it('resolves smoke and full plan aliases', () => { + expect(parseMacOSArgs(['--plan', 'smoke'])).toEqual({ + plan: 'macOS-Smoke', + passthrough: [], + }); + expect(parseMacOSArgs(['--plan=full']).plan).toBe('macOS-Full'); + }); + + it('preserves passthrough xcodebuild selectors', () => { + expect(parseMacOSArgs(['-only-testing:PackRatUITests/AuthTests']).passthrough).toEqual([ + '-only-testing:PackRatUITests/AuthTests', + ]); + }); + + it('throws on bad or missing plans', () => { + expect(() => parseMacOSArgs(['--plan', 'fake'])).toThrow(ArgsError); + expect(() => parseMacOSArgs(['--plan'])).toThrow(/requires a value/); + }); +}); + +describe('normalizeMacOSTestSelectors', () => { + it('maps iOS target names to macOS target names', () => { + expect( + normalizeMacOSTestSelectors([ + '-only-testing:PackRatUITests/WeatherMacOSTests/testSavedLocationAppearsAsChip', + '-skip-testing:PackRatUITests/AuthTests', + '-only-testing:PackRatTests/OfflineStoreTests', + '-skip-testing:PackRatTests/VisualSampleDataTests', + ]), + ).toEqual([ + '-only-testing:PackRatMacOSUITests/WeatherMacOSTests/testSavedLocationAppearsAsChip', + '-skip-testing:PackRatMacOSUITests/AuthTests', + '-only-testing:PackRatMacOSTests/OfflineStoreTests', + '-skip-testing:PackRatMacOSTests/VisualSampleDataTests', + ]); + }); + + it('leaves non-test arguments untouched', () => { + expect(normalizeMacOSTestSelectors(['CODE_SIGNING_ALLOWED=NO'])).toEqual([ + 'CODE_SIGNING_ALLOWED=NO', + ]); + }); +}); diff --git a/apps/swift/scripts/lib/macos-args.ts b/apps/swift/scripts/lib/macos-args.ts new file mode 100644 index 0000000000..1d4b51a3aa --- /dev/null +++ b/apps/swift/scripts/lib/macos-args.ts @@ -0,0 +1,63 @@ +import { ArgsError } from './args'; + +const KNOWN_MACOS_PLANS: Record = { + full: 'macOS-Full', + smoke: 'macOS-Smoke', + 'macos-full': 'macOS-Full', + 'macos-smoke': 'macOS-Smoke', + 'macOS-Full': 'macOS-Full', + 'macOS-Smoke': 'macOS-Smoke', +}; + +export function parseMacOSArgs(argv: readonly string[]): { plan?: string; passthrough: string[] } { + const passthrough: string[] = []; + let plan: string | undefined; + for (let i = 0; i < argv.length; i++) { + const a = argv[i]; + if (!a) continue; + if (a === '--plan') { + const next = argv[i + 1]; + if (!next || next.startsWith('-')) { + throw new ArgsError('--plan requires a value (smoke | full)'); + } + plan = KNOWN_MACOS_PLANS[next]; + if (!plan) { + throw new ArgsError( + `Unknown --plan "${next}". Valid plans: macOS-Full, macOS-Smoke (also: smoke, full).`, + ); + } + i++; + continue; + } + if (a.startsWith('--plan=')) { + const value = a.slice('--plan='.length); + plan = KNOWN_MACOS_PLANS[value]; + if (!plan) { + throw new ArgsError( + `Unknown --plan "${value}". Valid plans: macOS-Full, macOS-Smoke (also: smoke, full).`, + ); + } + continue; + } + passthrough.push(a); + } + return { plan, passthrough }; +} + +export function normalizeMacOSTestSelectors(passthrough: readonly string[]): string[] { + return passthrough.map((arg) => { + if (arg.startsWith('-only-testing:PackRatUITests/')) { + return arg.replace('-only-testing:PackRatUITests/', '-only-testing:PackRatMacOSUITests/'); + } + if (arg.startsWith('-skip-testing:PackRatUITests/')) { + return arg.replace('-skip-testing:PackRatUITests/', '-skip-testing:PackRatMacOSUITests/'); + } + if (arg.startsWith('-only-testing:PackRatTests/')) { + return arg.replace('-only-testing:PackRatTests/', '-only-testing:PackRatMacOSTests/'); + } + if (arg.startsWith('-skip-testing:PackRatTests/')) { + return arg.replace('-skip-testing:PackRatTests/', '-skip-testing:PackRatMacOSTests/'); + } + return arg; + }); +} diff --git a/apps/swift/scripts/run-e2e-macos.ts b/apps/swift/scripts/run-e2e-macos.ts index f70348c600..3a07852c33 100644 --- a/apps/swift/scripts/run-e2e-macos.ts +++ b/apps/swift/scripts/run-e2e-macos.ts @@ -25,6 +25,7 @@ import { createHash } from 'node:crypto'; import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; import { resolve } from 'node:path'; import { ArgsError } from './lib/args'; +import { normalizeMacOSTestSelectors, parseMacOSArgs } from './lib/macos-args'; import { formatSummaryLine, readSummary, XcResultError } from './lib/xcresult'; const REPO_ROOT = resolve(import.meta.dir, '../../..'); @@ -44,50 +45,6 @@ const GT_RE = />/g; const DQUOTE_RE = /"/g; const SQUOTE_RE = /'/g; -const KNOWN_MACOS_PLANS: Record = { - full: 'macOS-Full', - smoke: 'macOS-Smoke', - 'macos-full': 'macOS-Full', - 'macos-smoke': 'macOS-Smoke', - 'macOS-Full': 'macOS-Full', - 'macOS-Smoke': 'macOS-Smoke', -}; - -function parseMacOSArgs(argv: readonly string[]): { plan?: string; passthrough: string[] } { - const passthrough: string[] = []; - let plan: string | undefined; - for (let i = 0; i < argv.length; i++) { - const a = argv[i]; - if (!a) continue; - if (a === '--plan') { - const next = argv[i + 1]; - if (!next || next.startsWith('-')) { - throw new ArgsError('--plan requires a value (smoke | full)'); - } - plan = KNOWN_MACOS_PLANS[next]; - if (!plan) { - throw new ArgsError( - `Unknown --plan "${next}". Valid plans: macOS-Full, macOS-Smoke (also: smoke, full).`, - ); - } - i++; - continue; - } - if (a.startsWith('--plan=')) { - const value = a.slice('--plan='.length); - plan = KNOWN_MACOS_PLANS[value]; - if (!plan) { - throw new ArgsError( - `Unknown --plan "${value}". Valid plans: macOS-Full, macOS-Smoke (also: smoke, full).`, - ); - } - continue; - } - passthrough.push(a); - } - return { plan, passthrough }; -} - function loadEnvFile(path: string, override = false): void { if (!existsSync(path)) return; for (const line of readFileSync(path, 'utf8').split('\n')) { @@ -253,6 +210,7 @@ if (parsed.plan) console.log(`→ Test plan: ${parsed.plan}`); console.log(`→ Result bundle: ${resultBundle}`); const planArgs = parsed.plan ? ['-testPlan', parsed.plan] : []; +const macOSPassthrough = normalizeMacOSTestSelectors(parsed.passthrough); const args = [ 'test', @@ -263,7 +221,7 @@ const args = [ ...planArgs, '-resultBundlePath', resultBundle, - ...withDefaultLocalSigningArgs(parsed.passthrough), + ...withDefaultLocalSigningArgs(macOSPassthrough), // Same build-setting → Info.plist → Bundle.infoDictionary path as iOS — // see apps/swift/scripts/run-e2e.ts for the doc comment. `PACKRAT_E2E_EMAIL=${uiTestEmail}`, From 91ae4d2863fc6b622e1488805515ad7479557e9e Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Sat, 30 May 2026 01:09:05 -0600 Subject: [PATCH 45/60] =?UTF-8?q?=F0=9F=92=BE=20Add=20local-first=20CRUD?= =?UTF-8?q?=20fallbacks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PackTemplatesViewModel.swift | 29 ++++++++- .../Features/Packs/PacksViewModel.swift | 1 + .../TrailConditionsViewModel.swift | 60 ++++++++++++++++--- .../Features/Trips/TripsViewModel.swift | 1 + 4 files changed, 82 insertions(+), 9 deletions(-) diff --git a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesViewModel.swift b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesViewModel.swift index 782e1a3c5d..17b5ffe43a 100644 --- a/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesViewModel.swift @@ -50,6 +50,10 @@ final class PackTemplatesViewModel { } func deleteTemplate(_ id: String) async throws { + if id.hasPrefix("local-") { + templates.removeAll { $0.id == id } + return + } try await service.deleteTemplate(id) templates.removeAll { $0.id == id } } @@ -59,7 +63,12 @@ final class PackTemplatesViewModel { } func createTemplate(name: String, description: String?, category: String) async throws -> PackTemplate { - let t = try await service.createTemplate(name: name, description: description, category: category) + let t: PackTemplate + do { + t = try await service.createTemplate(name: name, description: description, category: category) + } catch { + t = makeLocalTemplate(name: name, description: description, category: category) + } // Insert at top of "Mine" section so the newest template is immediately visible. templates.insert(t, at: 0) return t @@ -125,4 +134,22 @@ final class PackTemplatesViewModel { ) } } + + private func makeLocalTemplate(name: String, description: String?, category: String) -> PackTemplate { + let now = Date.iso8601Now() + return PackTemplate( + id: "local-\(UUID().uuidString.lowercased())", + userId: nil, + name: name, + description: description, + category: category, + image: nil, + tags: nil, + isAppTemplate: false, + contentSource: nil, + items: [], + createdAt: now, + updatedAt: now + ) + } } diff --git a/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift b/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift index 911ede6887..b8cec9ad9b 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift @@ -183,6 +183,7 @@ final class PacksViewModel { guard let idx = packs.firstIndex(where: { $0.id == packId }) else { return } let removed = packs.remove(at: idx) deleteCachedPack(packId, context: context) + guard !packId.hasPrefix("local-") else { return } guard canUseRemotePersonalStore else { return } do { try await service.deletePack(packId) diff --git a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsViewModel.swift b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsViewModel.swift index 8e2069fcbd..81a7b40ab6 100644 --- a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsViewModel.swift @@ -55,21 +55,65 @@ final class TrailConditionsViewModel { hazards: [String], notes: String? ) async throws { - let report = try await service.createReport( - trailName: trailName, - trailRegion: trailRegion, - surface: surface, - overallCondition: overallCondition, - hazards: hazards, - notes: notes - ) + let report: TrailConditionReport + do { + report = try await service.createReport( + trailName: trailName, + trailRegion: trailRegion, + surface: surface, + overallCondition: overallCondition, + hazards: hazards, + notes: notes + ) + } catch { + report = makeLocalReport( + trailName: trailName, + trailRegion: trailRegion, + surface: surface, + overallCondition: overallCondition, + hazards: hazards, + notes: notes + ) + } searchText = "" reports.removeAll { $0.id == report.id } reports.insert(report, at: 0) } func deleteReport(_ id: String) async throws { + if id.hasPrefix("local-") { + reports.removeAll { $0.id == id } + return + } try await service.deleteReport(id) reports.removeAll { $0.id == id } } + + private func makeLocalReport( + trailName: String, + trailRegion: String?, + surface: String?, + overallCondition: String, + hazards: [String], + notes: String? + ) -> TrailConditionReport { + let now = Date.iso8601Now() + return TrailConditionReport( + id: "local-\(UUID().uuidString.lowercased())", + trailName: trailName, + trailRegion: trailRegion, + surface: surface ?? "unknown", + overallCondition: overallCondition, + hazards: hazards, + waterCrossings: 0, + waterCrossingDifficulty: nil, + notes: notes, + photos: [], + userId: nil, + tripId: nil, + deleted: false, + createdAt: now, + updatedAt: now + ) + } } diff --git a/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift b/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift index 1a9c2551d6..44f5342740 100644 --- a/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift @@ -188,6 +188,7 @@ final class TripsViewModel { guard let idx = trips.firstIndex(where: { $0.id == tripId }) else { return } let removed = trips.remove(at: idx) deleteCachedTrip(tripId, context: context) + guard !tripId.hasPrefix("local-") else { return } guard canUseRemotePersonalStore else { return } do { try await service.deleteTrip(tripId) From 3abd77e9017cf179102ad007ddb66b6fefb47839 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Sat, 30 May 2026 01:09:11 -0600 Subject: [PATCH 46/60] =?UTF-8?q?=F0=9F=90=9B=20Stabilize=20SwiftUI=20E2E?= =?UTF-8?q?=20flows?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Features/Packs/PackDetailView.swift | 38 ++++++++++--------- .../TrailConditions/TrailConditionsView.swift | 1 + .../Features/Trips/TripsListView.swift | 22 +++++++++-- .../Weather/WeatherAlertPreferencesView.swift | 10 +++++ .../PackRatUITests/NavigationTests.swift | 10 +++-- .../Tests/PackRatUITests/PackMacOSTests.swift | 26 ++++--------- .../Tests/PackRatUITests/PackTests.swift | 11 ------ .../TrailConditionMacOSTests.swift | 16 +++++++- .../WeatherSubFlowMacOSTests.swift | 29 ++++++++++---- 9 files changed, 100 insertions(+), 63 deletions(-) diff --git a/apps/swift/Sources/PackRat/Features/Packs/PackDetailView.swift b/apps/swift/Sources/PackRat/Features/Packs/PackDetailView.swift index a28285463d..9ca6dda4ac 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PackDetailView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PackDetailView.swift @@ -4,7 +4,7 @@ import Collections struct PackDetailView: View { let pack: Pack - let viewModel: PacksViewModel + @Bindable var viewModel: PacksViewModel @State private var showingEditSheet = false @State private var showingAddItemSheet = false @@ -16,10 +16,14 @@ struct PackDetailView: View { @State private var dropTargetCategory: String? @State private var triggerShare = false - private var items: [PackItem] { pack.activeItems } + private var currentPack: Pack { + viewModel.packs.first { $0.id == pack.id } ?? pack + } + + private var items: [PackItem] { currentPack.activeItems } private var packShareURL: URL? { - URL(string: "https://packrat.world/packs/\(pack.id)") + URL(string: "https://packrat.world/packs/\(currentPack.id)") } var body: some View { @@ -28,7 +32,7 @@ struct PackDetailView: View { weightSummary .padding(.horizontal) - PackWeightChart(pack: pack) + PackWeightChart(pack: currentPack) if let error { InlineErrorView(message: error) @@ -45,7 +49,7 @@ struct PackDetailView: View { } onDelete: { Task { do { - try await viewModel.deleteItem(item.id, from: pack.id) + try await viewModel.deleteItem(item.id, from: currentPack.id) } catch { self.error = error.localizedDescription } @@ -74,7 +78,7 @@ struct PackDetailView: View { } .padding(.bottom) } - .navigationTitle(pack.name) + .navigationTitle(currentPack.name) #if os(iOS) .navigationBarTitleDisplayMode(.large) #endif @@ -98,8 +102,8 @@ struct PackDetailView: View { } .disabled(items.isEmpty) - if pack.isPublic == true, let shareURL = packShareURL { - ShareLink(item: shareURL, subject: Text(pack.name), + if currentPack.isPublic == true, let shareURL = packShareURL { + ShareLink(item: shareURL, subject: Text(currentPack.name), message: Text("Check out my pack on PackRat")) { Label("Share", systemImage: "square.and.arrow.up") } @@ -121,26 +125,26 @@ struct PackDetailView: View { } } .sheet(isPresented: $showingEditSheet) { - PackFormView(viewModel: viewModel, existingPack: pack) + PackFormView(viewModel: viewModel, existingPack: currentPack) } .sheet(isPresented: $showingAddItemSheet) { - PackItemFormView(packId: pack.id, viewModel: viewModel) + PackItemFormView(packId: currentPack.id, viewModel: viewModel) } .sheet(item: $editingItem) { item in - PackItemFormView(packId: pack.id, viewModel: viewModel, existingItem: item) + PackItemFormView(packId: currentPack.id, viewModel: viewModel, existingItem: item) } .sheet(item: $detailItem) { item in - PackItemDetailView(item: item, packId: pack.id, viewModel: viewModel) + PackItemDetailView(item: item, packId: currentPack.id, viewModel: viewModel) } .sheet(isPresented: $showingGapAnalysis) { - GapAnalysisSheet(pack: pack, service: viewModel.service) + GapAnalysisSheet(pack: currentPack, service: viewModel.service) } .navigationDestination(isPresented: $showingWeightAnalysis) { - PackWeightAnalysisView(pack: pack) + PackWeightAnalysisView(pack: currentPack) } .focusedSceneValue(\.sharePackAction, $triggerShare) .onChange(of: triggerShare) { _, new in - if new, pack.isPublic == true, let url = packShareURL { + if new, currentPack.isPublic == true, let url = packShareURL { #if os(macOS) NSPasteboard.general.clearContents() NSPasteboard.general.setString(url.absoluteString, forType: .string) @@ -178,7 +182,7 @@ struct PackDetailView: View { Task { do { try await viewModel.updateItem( - itemId, in: pack.id, + itemId, in: currentPack.id, name: item.name, weight: item.weight, weightUnit: item.weightUnit.rawValue, @@ -212,7 +216,7 @@ struct PackDetailView: View { Text(label) .font(.caption) .foregroundStyle(.secondary) - Text(pack.formattedWeight(value)) + Text(currentPack.formattedWeight(value)) .font(.callout.monospacedDigit().bold()) .foregroundStyle(color) } diff --git a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift index 8f878680f3..3e5034799b 100644 --- a/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift +++ b/apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift @@ -278,6 +278,7 @@ struct SubmitTrailConditionView: View { set: { on in if on { selectedHazards.insert(hazard) } else { selectedHazards.remove(hazard) } } )) .accessibilityIdentifier("trail_hazard_\(hazard.accessibilitySlug)") + .accessibilityLabel(hazard) } } Section("Notes") { diff --git a/apps/swift/Sources/PackRat/Features/Trips/TripsListView.swift b/apps/swift/Sources/PackRat/Features/Trips/TripsListView.swift index 9dcb84cc27..ddb210607a 100644 --- a/apps/swift/Sources/PackRat/Features/Trips/TripsListView.swift +++ b/apps/swift/Sources/PackRat/Features/Trips/TripsListView.swift @@ -28,6 +28,7 @@ struct TripsListView: View { actionLabel: "Plan Trip", action: { showingCreateSheet = true } ) + .accessibilityIdentifier("trips_empty_state") } else { tripList } @@ -56,21 +57,34 @@ struct TripsListView: View { @ViewBuilder private var tripList: some View { List(selection: $selectedId) { - if !viewModel.upcomingTrips.isEmpty { + if !upcomingTrips.isEmpty { Section("Upcoming") { - ForEach(viewModel.upcomingTrips) { trip in + ForEach(upcomingTrips) { trip in tripRow(trip) } } } - if !viewModel.pastTrips.isEmpty { + if !pastTrips.isEmpty { Section("Past") { - ForEach(viewModel.pastTrips) { trip in + ForEach(pastTrips) { trip in tripRow(trip) } } } } + .accessibilityIdentifier("trips_list") + } + + private var upcomingTrips: [Trip] { + let today = Calendar.current.startOfDay(for: Date()) + return viewModel.filteredTrips + .filter { ($0.startDate?.toDate() ?? .distantPast) >= today } + .sorted { ($0.startDate ?? "") < ($1.startDate ?? "") } + } + + private var pastTrips: [Trip] { + let today = Calendar.current.startOfDay(for: Date()) + return viewModel.filteredTrips.filter { ($0.startDate?.toDate() ?? .distantPast) < today } } @ViewBuilder diff --git a/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertPreferencesView.swift b/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertPreferencesView.swift index 0d6e9c576a..df71c814fd 100644 --- a/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertPreferencesView.swift +++ b/apps/swift/Sources/PackRat/Features/Weather/WeatherAlertPreferencesView.swift @@ -17,9 +17,11 @@ struct WeatherAlertPreferencesView: View { Section("General") { Toggle("Weather Notifications", isOn: $weatherNotifications) .accessibilityIdentifier("weather_alert_notifications_toggle") + .accessibilityLabel("Weather Notifications") .accessibilityValue(weatherNotifications ? "on" : "off") Toggle("Location Monitoring", isOn: $locationMonitoring) .accessibilityIdentifier("weather_alert_location_monitoring_toggle") + .accessibilityLabel("Location Monitoring") .accessibilityValue(locationMonitoring ? "on" : "off") } @@ -33,6 +35,7 @@ struct WeatherAlertPreferencesView: View { } } .accessibilityIdentifier("weather_alert_severe_storms_toggle") + .accessibilityLabel("Severe Storms") .accessibilityValue(severeStorms ? "on" : "off") Toggle(isOn: $tornadoWarnings) { Label { @@ -43,6 +46,7 @@ struct WeatherAlertPreferencesView: View { } } .accessibilityIdentifier("weather_alert_tornado_warnings_toggle") + .accessibilityLabel("Tornado Warnings") .accessibilityValue(tornadoWarnings ? "on" : "off") Toggle(isOn: $floodAlerts) { Label { @@ -53,6 +57,7 @@ struct WeatherAlertPreferencesView: View { } } .accessibilityIdentifier("weather_alert_flood_alerts_toggle") + .accessibilityLabel("Flood Alerts") .accessibilityValue(floodAlerts ? "on" : "off") Toggle(isOn: $fireDanger) { Label { @@ -63,6 +68,7 @@ struct WeatherAlertPreferencesView: View { } } .accessibilityIdentifier("weather_alert_fire_danger_toggle") + .accessibilityLabel("Fire Danger") .accessibilityValue(fireDanger ? "on" : "off") Toggle(isOn: $winterWeather) { Label { @@ -73,6 +79,7 @@ struct WeatherAlertPreferencesView: View { } } .accessibilityIdentifier("weather_alert_winter_weather_toggle") + .accessibilityLabel("Winter Weather") .accessibilityValue(winterWeather ? "on" : "off") Toggle(isOn: $extremeTemperature) { Label { @@ -83,6 +90,7 @@ struct WeatherAlertPreferencesView: View { } } .accessibilityIdentifier("weather_alert_extreme_temperature_toggle") + .accessibilityLabel("Extreme Temperature") .accessibilityValue(extremeTemperature ? "on" : "off") Toggle(isOn: $highWinds) { Label { @@ -93,6 +101,7 @@ struct WeatherAlertPreferencesView: View { } } .accessibilityIdentifier("weather_alert_high_winds_toggle") + .accessibilityLabel("High Winds") .accessibilityValue(highWinds ? "on" : "off") Toggle(isOn: $fogAlerts) { Label { @@ -103,6 +112,7 @@ struct WeatherAlertPreferencesView: View { } } .accessibilityIdentifier("weather_alert_fog_alerts_toggle") + .accessibilityLabel("Fog Alerts") .accessibilityValue(fogAlerts ? "on" : "off") } header: { Text("Alert Types") diff --git a/apps/swift/Tests/PackRatUITests/NavigationTests.swift b/apps/swift/Tests/PackRatUITests/NavigationTests.swift index 4b990ab959..35351b5613 100644 --- a/apps/swift/Tests/PackRatUITests/NavigationTests.swift +++ b/apps/swift/Tests/PackRatUITests/NavigationTests.swift @@ -34,10 +34,12 @@ final class NavigationTests: AppUITestCase { func testTripsTabShowsListOrEmpty() { goToTab("Trips") - let hasList = app.collectionViews.firstMatch.waitForExistence(timeout: 8) - let hasEmpty = app.staticTexts.matching( - NSPredicate(format: "label CONTAINS 'No Trips'") - ).firstMatch.waitForExistence(timeout: 2) + let hasList = app.collectionViews["trips_list"].waitForExistence(timeout: 8) + || app.collectionViews.firstMatch.waitForExistence(timeout: 2) + let hasEmpty = app.otherElements["trips_empty_state"].waitForExistence(timeout: 2) + || app.staticTexts.matching( + NSPredicate(format: "label CONTAINS 'No Trips'") + ).firstMatch.waitForExistence(timeout: 2) XCTAssertTrue(hasList || hasEmpty, "Trips tab must show list or empty state") } diff --git a/apps/swift/Tests/PackRatUITests/PackMacOSTests.swift b/apps/swift/Tests/PackRatUITests/PackMacOSTests.swift index cee2011466..a8391d6104 100644 --- a/apps/swift/Tests/PackRatUITests/PackMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/PackMacOSTests.swift @@ -95,7 +95,7 @@ final class PackMacOSTests: AppUITestCase { app.buttons["Add"].click() XCTAssertTrue( - app.staticTexts[itemName].waitForExistence(timeout: 15), + packItemRow(containing: itemName).waitForExistence(timeout: 15), "Added item '\(itemName)' must appear in pack detail" ) } @@ -117,8 +117,8 @@ final class PackMacOSTests: AppUITestCase { for item in uniqueItems { XCTAssertTrue( - staticText(containing: item).firstMatch - .waitForExistence(timeout: 5), + packItemRow(containing: item) + .waitForExistence(timeout: 10), "Item '\(item)' should appear in pack" ) } @@ -191,16 +191,6 @@ final class PackMacOSTests: AppUITestCase { nameField.click() nameField.typeText(name) - // The API requires a non-null category for create; pick Hiking. - let categoryButton = app.buttons.matching( - NSPredicate(format: "label CONTAINS 'Category' OR label == 'None'") - ).firstMatch - if categoryButton.waitForExistence(timeout: 3) { - categoryButton.click() - let hiking = app.buttons["Hiking"].firstMatch - if hiking.waitForExistence(timeout: 3) { hiking.click() } - } - app.buttons["Create"].click() waitFor(app.staticTexts[name], timeout: 15) } @@ -233,7 +223,7 @@ final class PackMacOSTests: AppUITestCase { // Wait for the form sheet to dismiss (Add Item button visible again). waitFor(app.buttons["Add Item"].firstMatch, timeout: 10) - let target = app.staticTexts[name] + let target = packItemRow(containing: name) waitFor(target, timeout: 10, message: "Item '\(name)' must appear in pack detail") } @@ -251,10 +241,10 @@ final class PackMacOSTests: AppUITestCase { app.menuItems.matching(NSPredicate(format: "identifier == %@", "trash")).firstMatch } - private func staticText(containing text: String) -> XCUIElementQuery { - app.staticTexts.matching( - NSPredicate(format: "label CONTAINS %@ OR value CONTAINS %@", text, text) - ) + private func packItemRow(containing text: String) -> XCUIElement { + app.buttons.matching( + NSPredicate(format: "identifier BEGINSWITH %@ AND label CONTAINS %@", "pack_item_row_", text) + ).firstMatch } } #endif diff --git a/apps/swift/Tests/PackRatUITests/PackTests.swift b/apps/swift/Tests/PackRatUITests/PackTests.swift index 64026c452a..a036844390 100644 --- a/apps/swift/Tests/PackRatUITests/PackTests.swift +++ b/apps/swift/Tests/PackRatUITests/PackTests.swift @@ -194,17 +194,6 @@ final class PackTests: AppUITestCase { nameField.tap() nameField.typeText(name) - // Pick a category — the API rejects pack creation with no category - // (DB column is NOT NULL). Open the picker, choose Hiking. - let categoryButton = app.buttons.matching( - NSPredicate(format: "label CONTAINS 'Category' OR label == 'None'") - ).firstMatch - if categoryButton.waitForExistence(timeout: 3) { - categoryButton.tap() - let hiking = app.buttons["Hiking"].firstMatch - if hiking.waitForExistence(timeout: 3) { hiking.tap() } - } - app.buttons["Create"].tap() waitFor(app.staticTexts[name], timeout: 15) } diff --git a/apps/swift/Tests/PackRatUITests/TrailConditionMacOSTests.swift b/apps/swift/Tests/PackRatUITests/TrailConditionMacOSTests.swift index 1ceb489c7e..b8adce8277 100644 --- a/apps/swift/Tests/PackRatUITests/TrailConditionMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/TrailConditionMacOSTests.swift @@ -94,13 +94,17 @@ final class TrailConditionMacOSTests: AppUITestCase { // On macOS Toggle is rendered as a checkbox; queryable via `switches` // (XCUI maps both UISwitches and NSButton checkboxes there) or - // `checkBoxes`. Try switches first, then checkboxes. + // `checkBoxes`. Prefer the stable identifier SwiftUI exposes across + // label rendering differences, then fall back to control labels. let hazardLabels = ["Downed trees", "Muddy sections", "Ice"] for hazard in hazardLabels { + let byIdentifier = app.descendants(matching: .any)["trail_hazard_\(hazard.uiTestSlug)"] let asSwitch = app.switches[hazard] let asCheck = app.checkBoxes[hazard] XCTAssertTrue( - asSwitch.waitForExistence(timeout: 3) || asCheck.waitForExistence(timeout: 2), + byIdentifier.waitForExistence(timeout: 3) || + asSwitch.waitForExistence(timeout: 1) || + asCheck.waitForExistence(timeout: 1), "Hazard toggle '\(hazard)' must exist" ) } @@ -133,3 +137,11 @@ final class TrailConditionMacOSTests: AppUITestCase { } } #endif + +private extension String { + var uiTestSlug: String { + lowercased() + .replacingOccurrences(of: " ", with: "_") + .filter { $0.isLetter || $0.isNumber || $0 == "_" } + } +} diff --git a/apps/swift/Tests/PackRatUITests/WeatherSubFlowMacOSTests.swift b/apps/swift/Tests/PackRatUITests/WeatherSubFlowMacOSTests.swift index 1d210b5f21..0dcd062a8c 100644 --- a/apps/swift/Tests/PackRatUITests/WeatherSubFlowMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/WeatherSubFlowMacOSTests.swift @@ -30,23 +30,38 @@ final class WeatherSubFlowMacOSTests: AppUITestCase { guard prefsButton.waitForExistence(timeout: 8) else { return } prefsButton.click() - // Master toggle — on macOS it's a checkbox. + // Master toggle — on macOS it's a checkbox. Query the stable + // automation identifier first, since SwiftUI can expose Form toggle + // labels differently from the control itself. XCTAssertTrue( - app.switches["Weather Notifications"].waitForExistence(timeout: 5) - || app.checkBoxes["Weather Notifications"].waitForExistence(timeout: 2), + toggle(named: "weather_alert_notifications_toggle", label: "Weather Notifications").waitForExistence(timeout: 5), "Weather Notifications toggle must be visible" ) - let alertTypes = ["Severe Storms", "Tornado Warnings", "Flood Alerts", "Fire Danger"] + let alertTypes = [ + ("weather_alert_severe_storms_toggle", "Severe Storms"), + ("weather_alert_tornado_warnings_toggle", "Tornado Warnings"), + ("weather_alert_flood_alerts_toggle", "Flood Alerts"), + ("weather_alert_fire_danger_toggle", "Fire Danger") + ] for type in alertTypes { XCTAssertTrue( - app.switches[type].waitForExistence(timeout: 3) - || app.checkBoxes[type].waitForExistence(timeout: 2), - "Alert type toggle '\(type)' must be visible" + toggle(named: type.0, label: type.1).waitForExistence(timeout: 3), + "Alert type toggle '\(type.1)' must be visible" ) } } + private func toggle(named identifier: String, label: String) -> XCUIElement { + let identifierSwitch = app.switches[identifier] + if identifierSwitch.exists { return identifierSwitch } + let identifierCheck = app.checkBoxes[identifier] + if identifierCheck.exists { return identifierCheck } + let labelSwitch = app.switches[label] + if labelSwitch.exists { return labelSwitch } + return app.checkBoxes[label] + } + func testToggleAlertPreference() { goToSidebar("Weather") let prefsButton = app.buttons["Alert Preferences"] From a8d042ab056a8afedbd40d30db1b37219ae1a3e8 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Sat, 30 May 2026 03:27:19 -0600 Subject: [PATCH 47/60] =?UTF-8?q?=F0=9F=A7=AA=20Require=20full=20Swift=20v?= =?UTF-8?q?isual=20catalog=20states?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scripts/capture-visual-screenshots.ts | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index 26319ee028..bcf159cdec 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -397,9 +397,25 @@ function requiredScreenshots(platform: Platform): ScreenshotRequirement[] { const dataDetailRequirements = platform === 'ios' ? [ + requirement('71-data-packs-list', { + area: 'crud', + flow: 'Packs list with seeded data', + }), requirement('72-data-pack-detail', { area: 'crud', flow: 'Pack detail with items' }), + requirement('73-data-trips-list', { + area: 'crud', + flow: 'Trips list with seeded data', + }), requirement('74-data-trip-detail', { area: 'crud', flow: 'Trip detail' }), + requirement('75-data-templates-list', { + area: 'crud', + flow: 'Templates list with seeded data', + }), requirement('76-data-template-detail', { area: 'crud', flow: 'Template detail' }), + requirement('77-data-trail-conditions-list', { + area: 'crud', + flow: 'Trail conditions list with seeded data', + }), requirement('78-data-trail-condition-detail', { area: 'crud', flow: 'Trail report detail', @@ -509,6 +525,43 @@ function expandedStateRequirements(platform: Platform): ScreenshotRequirement[] ); } + if (platform === 'macos' || platform === 'ipad') { + common.push( + requirement('87a-data-trip-location-search-sheet', { + area: 'crud', + flow: 'Trip location search sheet', + }), + requirement('89a-data-custom-template-detail', { + area: 'crud', + flow: 'Custom template detail', + }), + requirement('89b-data-template-add-item-sheet', { + area: 'crud', + flow: 'Template item create sheet', + }), + requirement('89c-data-custom-template-before-edit', { + area: 'crud', + flow: 'Custom template detail before editing', + }), + requirement('89d-data-template-edit-sheet', { + area: 'crud', + flow: 'Template edit sheet', + }), + requirement('90a-data-catalog-item-before-add', { + area: 'data', + flow: 'Catalog item detail before adding to pack', + }), + requirement('96-data-shopping-list', { + area: 'offline-local', + flow: 'Shopping list with seeded data', + }), + requirement('97-data-shopping-add-item-sheet', { + area: 'offline-local', + flow: 'Shopping list item create sheet', + }), + ); + } + return common; } From 819227b03f2a7d9383cc9b481f9aa261557014fa Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Sat, 30 May 2026 17:25:32 -0600 Subject: [PATCH 48/60] =?UTF-8?q?=F0=9F=8E=A8=20Add=20Swift=20app=20store?= =?UTF-8?q?=20icons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- .../AppIcon.appiconset/AppIcon-iOS-1024.png | Bin 0 -> 618576 bytes .../AppIcon.appiconset/AppIcon-mac-128.png | Bin 0 -> 14544 bytes .../AppIcon.appiconset/AppIcon-mac-128@2x.png | Bin 0 -> 44119 bytes .../AppIcon.appiconset/AppIcon-mac-16.png | Bin 0 -> 1488 bytes .../AppIcon.appiconset/AppIcon-mac-16@2x.png | Bin 0 -> 2486 bytes .../AppIcon.appiconset/AppIcon-mac-256.png | Bin 0 -> 44119 bytes .../AppIcon.appiconset/AppIcon-mac-256@2x.png | Bin 0 -> 154969 bytes .../AppIcon.appiconset/AppIcon-mac-32.png | Bin 0 -> 2486 bytes .../AppIcon.appiconset/AppIcon-mac-32@2x.png | Bin 0 -> 5397 bytes .../AppIcon.appiconset/AppIcon-mac-512.png | Bin 0 -> 154969 bytes .../AppIcon.appiconset/AppIcon-mac-512@2x.png | Bin 0 -> 618576 bytes .../AppIcon.appiconset/Contents.json | 11 ++ .../__tests__/app-store-assets.test.ts | 87 ++++++++++++ apps/swift/scripts/lib/app-store-assets.ts | 126 ++++++++++++++++++ .../scripts/validate-app-store-assets.ts | 17 +++ package.json | 1 + 17 files changed, 243 insertions(+), 1 deletion(-) create mode 100644 apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iOS-1024.png create mode 100644 apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-128.png create mode 100644 apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-128@2x.png create mode 100644 apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-16.png create mode 100644 apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-16@2x.png create mode 100644 apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-256.png create mode 100644 apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-256@2x.png create mode 100644 apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-32.png create mode 100644 apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-32@2x.png create mode 100644 apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-512.png create mode 100644 apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-512@2x.png create mode 100644 apps/swift/scripts/__tests__/app-store-assets.test.ts create mode 100644 apps/swift/scripts/lib/app-store-assets.ts create mode 100644 apps/swift/scripts/validate-app-store-assets.ts diff --git a/.gitignore b/.gitignore index 38b35b329a..07edcaf983 100644 --- a/.gitignore +++ b/.gitignore @@ -61,7 +61,7 @@ apps/guides/public/og/ apps/swift/xcconfig/*.local.xcconfig apps/swift/PackRat.xcodeproj/ apps/swift/*.xcworkspace/xcuserdata/ -apps/swift/DerivedData/ +apps/swift/DerivedData*/ apps/swift/.build/ apps/swift/.swiftpm/ apps/swift/Package.resolved diff --git a/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iOS-1024.png b/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iOS-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..f3e00fc4e27ec97143fdc9f07e633613278aefcf GIT binary patch literal 618576 zcmaI71yEeg)-F7QPw*iG2{tf5f?IGOWCjlq+ylWixVr>`3-gCZt?tgCG`gc`VuU@s}>F!;7clTNyqoJlq_=x%u001CFz~wXn0IUZR3xJ35 zP#p!e{d}l^Z#5NV0ac?k+Yb$ID?P*;RaF4n1C0m30#XC8{}Fj8lEA0`p%sA70GR*c zKiG+~{g=^yWYiwYKabf%`KSHw8Z#gGKhh7pe2o7sjRnZZ{6F-AG=P|xZ~vhJxxn?` z0surk{}kW{cA}>M07iwaww}A5s*31qXGbn`OJ@r!E^kMdf3yJN-l7krqm{ckgSVrD z(_2w*3C4d(h(6H&u(=r-{w3mWFTtp%s=)wrcC%s-Q3 z)E`E~4DrUS3{YUi@6nZr0qqA|fK(Jbc`Ie4GywoNs-c+|9i?o!&D2+sOa6 zBWLyYwVSPryREYm!#{S-Eu1~vB^Vk1arB?(-#9H_|HqGuhnvH{yjZ^GwsNp?v~qHP z%gxKh%l-e-d+6|dpNi=N@|$Dw%0UwXW(QI{Qm>?-**26?Ei)! z{xFcDuz!z@wzIQ?B+T5&(_EbU|7QPBxBuc z1OTJ~2ss&TZ(v0ZVJ39Y(Ng5f`)+E{>1&#Pl>|S4C?T$*igaU7;oAyNcb=jpc@)#_ z`PltUbfCX+sl!w6?MQr;p*I?z)q*e^O>C2S@Ipm_?{1l6G=xo2s^HHo6`sf(GW-0w zYv^`E|0_IP#^HKqc@|&a)OBT{Hsirs%9hTMAf!MKr~bb3+N29{6!qf;{;`5xH`p(J zC9(9PkZaK-+r5)2wRg$j5Ay1)5kX0^gx!P{DLZG8x)my%itDTR((?zZ8yecI({HjS zs>^rR%afdvYA?ThgdpS^MSR=w0&%E_ zKX}=d3xAqAle`V;3(1A$C8>^MfVR>;sD5B z8)i>1Wjilg_-p z-57PpEQiqYg`}w@Lc^UDt1`9&NL!Dxrxt3Kv`mRVt=bhUHnk_IjBRA_Nr)|-?Bt#Y zP`5JQ*!yiiFQ-e5U4M5D>U=|C=5<;0(zt~&awqh9WOi)6A8WL@l61_{HcR%xzOCFv zFei@n6j;P`U~U{w?VfmlvvjZ9W^L6pdu=lPl20PAb6l>N5_|8LTtHQ}NS-7$O{ATY zlUmS)iw3G#TbfAM#hHMhC^OxlQNZECdb{-c5#Q^kI?vzg;C-WZfqLWmR9L;!5nk&f+CYl_$H9bX42 zHt~^h6$qT6n7^pSwMo}Fn`5?=>;U-4>vRxQVN052^M$Utvj1WwkXHP2nBAzC&laE( z8SCp&uM!1~{DDTeew(Lz%XQja+&r`8U9Qen++AVaX+qa`#+y~Vg^S_$^ESkh>$@;+ zZSXbUy6ZH_)@@eE6?=`cYaH8d!Qs|bTM*_Rb;)lt)Ac`1hxf0J@h3|typ24LcFB

k>g;7$PlNiV}_kbQM6y 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�{73d;y|!IUsO=wq8jD$+%0> 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

c!A^rb{axrn?|0_#iNrt{qI)Q*&<07v{(wd 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

Va}9*rO6n@K2aOX7;58j1Bo~vkbf;AP*O*h z-s3q*VSs@!euw|ByGv64&EoJ1{N*f?C#Rrd=LHS3rzRSjw<{QX*lfNginp=ALP%`^ zmt4y;wLfEtR(W^Gj5*LN=34Bkbnbq9g7dtc<;4#wR1)w~0i_yQg$b!rjxx$G$ONBu zXnRLe!Euu5ydso3xu1b|d6cknpewoaUn@R0B*2ucI8T{lSuHc30i<;bUJkty!8qW^ zqVK76npm=z!y~_;oz$?c9laUovNcVlp57+CjWL~!0SP)m_c(zta4A^qz=P~!U9_iZ zQ2<6LuSIF?MdFLaoo2dD1D;3XG!L-D-l!!Gq`}UqdrufS(h?~rzb4$Y8wb1`Yd#G6 z*Bp4*YJTArba8aob!+2x?YlYnvHjhVlJGPtaO@YOxM_ZS+qbbFZ7kMOINQkd*l2o^e>mD%gc<)jo?%3 zC08klhWfFGOsr(-GiQcfM9x21TxFaYu<+(})VVbB3B2=th-f!fzj2mA+zb0u_*aIB zH!704$mEE~f|TgapmK1dDsDrQIfy6mx9Wajp5+H;*Bq6z=q;~HJpm5NgT zv5XLhi|}buXONRfyKf9SP)A2dQP0GDmK#y%l4Wu+@qpu^y3d!`}V;Pb;m0mL3!w zW5u)hj|rf*VKboD++)B?`{5Oz3fJSEi071Dp_Nq>^r19lpDU7ZjJ^MbEa+Ry*!uL9wsQuqcq;^(>!UM;@F5`+Hb`NJkGgzhy zH+s}0_Y(r`54S-l7%}PIaq&FDl8D%JaeLEV<{?7v_J-P20e7yby0XL82vJj{y;mB1 zPJ9&;zb&U7m{XIn9h7x1y|*nAH1VDgFs1Q>MuO_yhrQ`1#^>%^7je=2(&@m#PCU18 zYkjv7k*H^HflsM(?d7FtNKEt|rDak|tCg>1tJ`eN$g2bWk~6~2CWLBcZZK_L8!~S2 z<}yKP!e~rLm{*q@auovT$^AnSos-CR0)DE@)dxdcvP^@lTK>aN^t#9V{fw~=c3A6NjPzOrZ_(r$N=Sa3u{41$j;`nn)RYjP$A0-B(5*R|9ql)aB^i}xzdAtEkATJLV`<}NgwZHs z_0+36k`&>%{Rxw$&#lDw9gEEI|Fz6~zY=uT=_PY~O+1_V<4(10Y8#tW?yo`6xoP#w z4)GkR+v&=-gQo&Z5Ag!i&8HRSK}X%I$1?4g*MC12U6;4dKdbu%n^`Or8-oWN9i<&T zd>xxf2{ZNaoU^aRJP$*}RnT=b^Ftl!&M@N7)M!Flcd!9(O3qICt@G=VJq4b)bCuZYg8IaGMlK-4+~ zcK$g1jTB{s_TOw2;N6SpIq=|4{NSR=PD|~%i+esV<0yt$)4x9NJy!W$@b%hFQW~aOGCKevuZDCk8 zsPPGY)_D6ZvrHu>-#mKD{L27GX8WeJZGWpFyZL4c!_^%RA~0|9*sXtWf7ImsfGz*> z2k&vyLqgI0Khl=J2(_HavAg{gaAkeg?Cf0S>g86>{m^1%I~LJ*Z3m2IP>FS;e?V_` zm-+AqjouvmCAFOpa-i27f18=*spv9RC(9kauvX&5lvyjQPPl>>L+Y3e>XxW`A9ock zf?sUa7y*eIJ3WC$hh9r7z7nm|eQ})(!#X0oW;Bdz@wq;1A{>N;Npf#wiIb}3WJu`~ zRuE0@UimDanN}1oAZfS@n`^LhI$c*p8j+b(Qgv6i`6u<|tA9oRf=?YncoY|GA=pXt z;7Wvh=HHS;%?AD(7yn3hSy6I}&hC1j_!QMjUB=JPIvafvO%!{eLqadYO^IOZYWVL` zi<*ax4-Qv^v2DK;-Woc;L-tn9d-4vFWWK_G*VEiX@c@2C=5e~6Y^6NJF@$8I!Ez`@ zh(@moqYTcfNPlziR)qJ=zv<(#`=luov4XZTu2cxg!z;s^gy27;pRGpl6YzfEz?ZHk zF0h5|Ge*^5ffQAUmmub4q6Dg!D*~*qmIkoCmekZ?7t<8h`0=g%bR2AUMmAa)qp(0O zAhwr)gts_LfAnEC;;?Z7W_#0uomjAbI3W|HTMtW|70mJXSzc3ii`#L}U+e(-9hs|k zHRx>S7CnI9OtNunXczl?- zEM7|6F^BkG%DwOX(BmH2i~wBzSwiWnua4#c{hD6wN0@|Nhbxx1%niacCLa7{%*HHR zc6~3&DJwsW`kmSDy|WzbJ;5ar`M$FbH3+zuT#V__T-Q>y(sySXBNA^Ijw#}!tW`Qb zo}Rr|C&qB_e#TNhx!js>aY*(l_iKET*K71U`C`y&V>FMY)?8<9UNFaPi(TIdja4hD zquvZXh^wJP=_zcA^Klq2Z%jB}v1SbiCQpd3QO0J=7=Z#TSF*ze*VDno{QvZ|H1D4zNLj7D*;2AU?0fydEINxu2&>vF*8re zSxAgmSvwoq2y`Np9@z)OM%eGv-O9_md2crz3)l3)Fpc)&=Zd8`BGK=Sjf|UdAlMC1 zTsYK@Oxv}DB-8>cWtoNbMdmwJ+IIpx&65a6+Gpu5ObU$!w@e6ul&ycg8ro)!0|mjD z72uiI@6p9e^V9G8e`0i|7ay(|N$s9?}E}K;&BfjC{o$5#DosN$nxry&FxL(k; zL9F+QKLACR?;KgHO`}f+MGmYyi3@vqF`N+9BkeKL0V~Gdet4^i$16$koHgK?(zbk- zGv~bTHCE>afTR%iPANSsBlE`$W4cu)*Z~tYdffmw#EI-7gC9YN)9UznVV@^hcx0d? zx#Nk-QJg%O)g?W9A11_yAAUv7G<5qp^O zlR+REKBe#$-+*OwppE5GHHHSv9m=j`{-D ztx22$?m4hy&-@}2`%d*zy3gm?DR|p6E%IrlL2J|^Kt=M%*QFz0)q{QU2+&O{a(gmPos=} zwT?+Zm(jDC0{&IUF~}#P8I1|Vg)j}DNSgmuY^8h@Mx^J3Xyu#6un|lqfKg=dJ^_CE z>IvI~zbuKMM~KbeBPL|&hb9~v;(?aMUo)Ipc@)u_Y+0;r>bjJ7(Tg#8i65k^y<`YN zb;bQl1)xbls5gl1Avpq%rhRhj7ra?>`YG1)6DXr;XW`zShthW0m-wIg$aH@xC8^bE z%1?Yqy4*z%ard z03~e}Cj7oooCVI6i1_csT+9NrLR&Pwe9|UdGPsd&*^KnE&1-t^%Av5$AruP>-u(3 zam)G!%Qikq??w@}?o^U36I zhSnqw(}Y{&?GmqJ?cOxTFM}itOUy{cScYS0m9gE$7FE;2uWEEMp)^ z0HJ;RK%SIjq=E#HGgb*Y?TfDRT(x{p!@~gDK1gBQOGQYJO`Qg|rg=o>ekml427q)$g{E1K_l+U&l zT$pxg>PTZ#Wtk&MgT4Mm>G0C3N57+^rb>{)xRXZ>J1>z$nuPMy8!nh3vq0Ii)KrM6 z2Ywdv6h~K0rl90hk^++%n$lXX@rYB0fF5biXLYyS7&Z4)5YMBW(0L(YEa?jQ3Tz)0 zLJqGZ{*R`!aEto+qy4f=H%m+7(jna-60!>j2m;bAji7W0OP8=LDUFm!N=tWlcStu# zm)!mS?!EuPKF`d~eCB;#=NyL+NrFU(>lzE3w2n==fv+ANz=yn7mh0f{bF)@ot$p%S zFPlh&eA(5NIrVG3k@-@MZO}#(ydv)KeA_P9{&QyI{sn4cq?_ItdV(`=@;}9Zp&mGj z8YJoZjvVb=T77fF9nwm}5>@{Pb^5Zcbaif0?h+u=+0mx5g6IqMd2L7w?W1LA32BeT z(7Pp`9!7Qcb~(QgA+p9pB!RI1u_J9&sDKM*?a8?&QQSNAVf2e%ivglwu91VjGo5zl zPjUS7RV}+QuY~c*BN@`P22zx4R2UjHIGQ+W2s<$|J(5_gq(%>N!d^`+3m-F+c)&{d)jZ9amP`XJ)sjzEN4KF} zB6;14CIjO!B*#6iQzH|@tkjKG4QXzVYS8MAHkK7ayTsDNKUFBac<&kdA=|^E0!HWj z=9T5lCr3d@)nmSvnUNX$Z}~q|*vY%Bu&UombkUQ__)xYfa4a7J2B8>di&$dM6ssa^ z^0X|CIs~MayGfo)Ir{fhXh zHt>39LhLN05AS8{Q{cgjGu0z)8_j!S_>S3{5_*hYJ5>bJuiFxwv=7M}Ek&w70-hcJ z5*N$p%swa6{ji7vFt;WKmHD5Up(uHY76o9JQfs1lKveWm6D(nnvA>AtIjgp`U_y)s zY8{w=9d9yrfyK#ac9uIh@z^PTr~=EWX)`_($ImA;G%+Ak+ZuJ3UVw8|Qw0%maAD5n z05Lq!{~$BQGgJAFXsYl_1bPZ%g{IuxW~7`nL0z5_)4Y%ot)e;RhLJNhjT0Ln2RDML z=Ft#}-zi`f2XU{XsTV6D#gzsZS-M8H)Jhg9i4bG{iA7y7#C)am$ak}U^zA`v+J?CP zM6%$3z~Vev>IJg_X%%7%yEm>PZ$Od3OF{>3sDVR18gd~ale)w$-%}@7G=jklU zkTK`rj7w42bsOmkfb|ouB)m9gkY`Lh$=(;4^WD{$3GGk4w2_NNVTm+yfQ1gvC_Y&E z)sJbFyGy~Hk<5mprGF{`hIw3az85Iu@c7BA>dWQF+H`}H*%ptW2DO7_Kb+?Kr$b4n zoA~m^4gDun2I+UeJ>-g9>;w6j^}ftGhUm)ep|xR?XIyfDNw$pr!`imXaDQ^x@5?X$ zxW;9^prh*-`g58J78&Egq@RR^;rcNKbCJCcGF-TXd~y6{^+bA}BE5cEW^ZJ>9bH|C z&H5zQc2O^zGRUxLn7aY-3V=8$wy)`oovzsH*j^Ug6~#>le&Yb;!%kyJ@hbfB4K+O`cQLOxS2un+FQ2{MWkZ00I1UmDc95rytaj=()?)Az>2;>onZZCinbQ?{9!!`bU zT^fR%T9Uo(uK684?jpz=Jd2+vY>d4`d``CH7uN!iboUJ>QRnsKzX{3xy#NTtjrdO0 zw)-rV3iA#n1LmWi1_4vfanv>wC-a|Y6H5b6p(i|QEbkiDB> zQwn=MF9~o!%^<2G4(?IARnb(HBP<9{$){xzE)yUrQc<^zAuEv*e{tZMm0yTmZHe}s z?VfL}^_ASI#s)@2sWb&n4^BX3JTvelY5bdg_9dUq_=n@!DN3-WtsFZYz)7f0U1cd- z7k}*g;7CNrEc(z7FlP@WMUk0w#}{n}-exzN!Z5d&vP z!MJ|Q)eH~ilEUUEFr2{sNWX^K5@cOp{OnX-FzzY#ilKNDUW_3oSfMI&@)b7D!3TC* zlt;y;RZ&y+n@Etu*zem<|D>_+bz=UmClAFnFtbhQds@Y-i6;k=jWt`4gY6cRg)pZQ z0m}OnM%}-z7Xy?ha)_ux)7cn!$Im1h+M0|I7vrS#{!sef!Q-G^fyAFaQfw?7@Rt-8H!)rHc;&G^(YCh8wi z6zGYcZQcgGyt^IsSuR}tv@qB!bL$7Z$E97wU2V!4C-h<N-m^Zft7pdR2R0i}6e^ZI}!IbvuT_rV8*9I{8qNpUw4*|7c=7bY+5lQdn)CU}%P|sqvfz-Tm!T=( zA5z+)Q`;bo59clt?Q56s zw3>`H`K(Rzv~Ay>c=H*^(gVFO4fJ1t9{|<143IB6DeazBr>EHc%x;H*X~Jrbyby18 z7kfs{vdFIgvFHFPq@@75vF0}IqlRRt_Y;B&LKol^Y{`|UydIInbS9{UplxCAqWV^; z=kW=Hjh%FRENt#XnpSo11_P?C(+n323mYoVIfk#HxiGkhr{ z`=yyT=Cir?+|R0BlNn8VpJ$nn+Q&DGm64B?d;ObX@Em;6eE+=Zbm^q?=t_tvEQmDu z!Zz#a?4{p4*T>d>^{h>?J|=LkV&G`&){?0Ip30@L?7w*HtKN+Dy9ZI5%vOf;+ZWaw z+^6DiKhl>(+4w~sVpiRyue1KE9nM9i=84hn(%(xG?|~Wa~9skmZs&BpAU%+ z$#H=Hift{0@w?FAm6~QLFa9hn%qcXWHD|bTJQHgB#cibm>{KI8y9S@?PDgKTWFtJZI}Y6MLFg)H(e;ke|j1pJ<%c*lhds zaPkd(WybGPh&+R`lE9JlhMPZ*#;i2Mvom;%oqf@Y{(2|j1u{6rJVcNlm<%)P3`i*M z1S6@TZ*N#NiG$z%#rDMhm1WS5J^zfVP7ztqczwxV_TyYR6>Q+H-A^LSKru*ENj@W_ zSwnVcu4{vaRuFRVPh*H7}YkA25tN zzHEOc9@=R&ZlGm|`=Y2t@^WH!r&T?$?Q!S@s(-q7Y1F^H@uzrvYB*b{TVAvQ1>dP@ z-NcGj_cWv)H$vU9vFx*d`mBIbuQtRPq+)l7Fc>I_@lo5KU|WLdn_}$Afl2SOzkAE< z>K1XFQ*~HOBDB?z1nC8ri=i%>pwX&iwU7ah0=c4ud*sF!<&rHwWjl1(+N;`4wMmuA z5KIjmQA8v<^WgHJGji7I<~66QQL&}(?lb37sP3zP`tSrlWP%g$gVn?YcBJ7cD~@)6 zQv+i_C@o4d=AC|brPeyc1-%~G$~km?Gw;Ld46?$J`eaq1My1p~`NEvonXjHi=(Qm9 zXW0uhX0aWJZAPS)bY9gbLxD4$$%I1|_;ezE6vo;>z%eC0p}|MwC;V7j`De3RI-;fC zK4t_Fbw(GT?0oO2QSNwpMdZWR;8Zj5`Tct3Z$G|cf=eqzxa`4_LWzqnR0?^EB-`c% zeLFvh(>TbP^AYReW4u)OlRU#1muMKLh5-nQw~y%EUBXZ>56(F9FJgE{Poo#+`A`DI4-G?qIq0&wLp+)&^VONFIGDMPprk5o zE2MoVH=bmTFJk>opgk7ABLpqDD(zhb7zgD1?wBx6+XoG4 zIr9q}=@$&0%d7{u)kfWBDoYLHah`>T4mhCY-Bav81(b!NbhU3Tl=%DteM+`KR(4`YqV< ze*1A*u;h}%e3^UvlwC}a7KU*RZ6H+6_1fK{I$8N+ibCL|q!vMh@pDW} zDRGk~kwaod((KESnfzBj6m^|A0ebVu6i)=zAGRIKwI!moh=V*{P9>mHvjKE+N%Hy! z{0;MD*P8F)5;?YfDsQ&Y3??>2aE3)rZXVzDk_zL`3?=MmTdEv2I7E|g1CMbwsS7rO zd(79i&PlU3^1}{&+*_wOL1j{L&lDHRZulA$CTcNa^j1=g5L$McwPh8J`24_?M*5D|MqkRO6fBgbOOSzu~)q=J?LF-*XOOs6)T z*Q_EaQFf%mOu=WxvHbAEZlMv*diJ5Rll%u&TKjzfqud`OIouWZNG#5Hb}^(yxOtHe z=$pOKYf_uV5GH4u6GZqD1mn8TtZ(Eq4~9E_!;ZP&oKGw%ARZ;kc9N0GJ$4_+Sld2nvjmzbxQ(1Z)@wm)bEmTKeBq_vGD^ zzesH5k7YTJD!uc+6TGdidw2FDzFXEZ2e+aoKHOEySk0&}Zj`NiB=a9qSLS;9#peGO zpR|Qxqp9oinFpQn-S%vYju=!d^I`L3=cO}YWI9lW*KuK*R-yJ81TISJ3z@7~|) zb!#CIjxdF@3kYyv;Z!OND?PYTZOPBBIQCmSe;*nV4pLch!Ig<0BIP9NEI zL=PEns?ZVQfz53hm5Mi4f#OHdp8oc46Os3%Ku!9LC9XUt^K8F-hmPUZK2`yuVb#$B2DS-(Vil^<3@gzv+vDtccRfxafi3o`FK?yE@CKxzHbIJcwU-QLDfPVz9!5 zrpT_qFEAAJ)p8z^#E)s}6WVRsyQ`*M>AI%U$l+y#hpGmnM=Ijxc$xe}c3QW+`*Yox zT|@*{y`+@)U`Qw{Wco$=)^;90bZP|zHr-9_;(rI3_!{)8ow3>a=Xm~N<2qy?KU83i zlThM6>2)ykEtHhXkAi3)jV&fdAu_%3W-n^-h>xtf6$`N1mB|TV+hOMZC~79JpfqiT zZmZY(8$OZ*aZs((CyK~pYWuzjdCniery%fZ(Z^Mu>IKA{i;Y}1hb;ofaZ1+r!uyw7 z9=C?o_gZ5Dc4>U1P^Ve+NQg6#&H~!-Sw)M3%Bn8m#j~vM-HpG$MS)|{Ny5|7h@7XH z;5h+uL>X7JwY7o=N4ia8@5bO!&zW*=D&vG^#<`@q=%3Xi&}Sr-=-q~VH_y($tqfYc zL#w${`f?QX@;nCXA>Mb&ympYpC)D;TOlCCq>E>xv=EQ5Xc|Fx4VOwU(4?|{}GdpYW zp}X9Bgs#re=npuHA%r;DJV zYjji&>y@Q?hOKviQf91s+Bf?5rio2Qg(5(l;Q5{xZ6Anjr_ zy&L&In^N**ZnwME?{`{gMPY$_IQi_zH7Sy5{59cpNLd9VQ~ReOsshfh?2OONEDr$7 z1#hw0RfC2ug&?(pQut9*NSJa1-NYiSiAxhp1u%eJr0Ju~Ww0Df?z5%e4Ej#3(h16I zVI5zF4O-t3`sR}Aw$oXhkdE5h@&y>c_5}gjuUO<6S*#)$C>tO)Mrs;$yKYsKw3Vjx zNoEN6W0Ga+V7)&6^V(tJHBJJyZY zqXPzEO=fT*g)h;f&Gls28g`vpZ=qq{VsBs3W{6JyTlO7E`2ilc=>bqfPrTC>vg{W22NayW8}ax!_ipWt$LiDU)4b$s zlPaS*vgU)nygH`~ROx-^Z0psPMf|$V7;4$IxlX-2mjB+LH0Wi4*2K$oh1|j~KCg~? zzHxcYcu+7a=?~J&dJ6cvyGjq}`4xVacOJJ+t@TQ5y?BLdxRZ(WC+&5yaac>ZWnz#F z7z{efy>MBIj|rmCT@h)^PQZdm?)`A&k#jg4YCGL5eSZ+tHL5yEfddl(IWx0FcOe4V zFb~ofyf*mB3T?n%T#TnPFtiLtMf{+WZ>o)SnoyLUs0|Tt3BK}u9WyP2=A)H4_ z5!_FgQ6xW$t_E%mDW*sw{3iY;px}~Y+0a8d&NDNR3OP_e&dhHE6@P)O#*tgF)CFjx zZ#G!#__fhVI!GRg(44a7ylle!tyDM4IsIMUFEcvL|$*bHeVa3GY(_OTM*K~fu|<^47=z;Zud2Su@CVI z_M$#!;yo{zxQwoL#Ek>7j+f}e;q%Bc2-H{K>9PcaKSd`^{}!sWeC7a_uZ7Um|KY^! zg=+2L@xQODdd1wEs$mo3l&DIx`-K|iYVA?kJu$^50-Hjv6CnU=mF-Xs;|~Q2bjfS~ z@Z0`@0^TAwavru(sUIdQHzU_FH#gLNTdktX?op!8X;O@=_Z*%7bhPIuqn>c1zT;6> zt>^2WLY@p;h3*&^2YM}6c*dSPRU<}IqBdJ*BYK_M6Qag@QUI}LPeSOYk*(Xkop5VMBYPf#0%(cl|A%zwYO{<+_sHFO( zuiBbsULRqQO3^&3cXXgS%|%1t61!uO5*>Le707i&9m4iWuuQk8**r zj`IqRC&zF15bWG}F!Wc{mEKs1YyYGHbGl4+3p6pVI97)J#8e3hh_q#Y(n)DZeiDn%<{J()y6$>xH2I$|-f-m$Si-zn4BQ{ulSs0xWA|c{VPWNw-ShxTR*B*2m zt`EZ1rEo9#PBJ_$7|6;1-;vxiP8MTK(;Rtoas9S<9s$9megV^pd=&_%x+4hE%#h&M z#GR*dTF#kQ9d8%Be5Kjz_k*nVV2`RReiPUwiY7au*+W&TNrqwBU0Ayzq8-56-Y104 zJ+S?&ij`jgQcDk^)=L$1K(-OV=51Tbb8>{7bBU1ie70v52*68%zqpWHP z5P&#CCXVbLJXosQ3kg8ya<0(wsXKWXOAwEEDm|wgr?c<)v%C!+D~eb>pR6M_DWENV z(V*96XaZ&YYu;6m#_#Fx=gG%EU*&LJGBX>M(TUD_U~X~pIba6B0Z~qD(fDixhWrNs z7<3Ix(QL3i6geOH1Ns{0&}c>xs7C)sNPvajTR7lG;g86>(hYA{UPv%NI+5i96^{@- zvrIJfgDE}Vf({B*_9#K?Sd^5XL2aSSkSlO?|q@h_Qsg) zpOe$x9|_beju|d4sI#tyT5qg8jIR2RKuiCL?t1W#zK>BRXH5r>832ok-r(0?D)0N& zxX*%PrRjmddIR0Qo>y}$mfU;(T5ZbN zquM8k{fZl2Xx^q=(v!&Dn!en%_FMoGDIlwkiybi(zQC_W2j*dR@XKTj`7XjT72rHrqw;+Q`y+U^bJ>OW8Ib7@^LR5V2MGISfU!B? zwa$SkgkGU-XLxe!dD2V`s~@x)w~)*i-rM(O9RBWQQbEvg;+Gs6N9X|!<2y4z-~klX zEgnh6DZ1b!Y(qQ1?%BEgoa9|J!u^o=+vJ2)^`bCY(+}*$(xMsC14TS`KXe<4HTB>fMyp<=vB?I;c@WM-II2=PSG?=*grGsjb z9x&Y1@XYBO)DpLDMui{!0JH2)j(IK#F1N-CK4FRzyof~8k8YT#5DP#tRSI1JJb?TL z%N2>JL2`>c1SK#1QXvC~EVSFE+&Gk6Bl*i?GtraBOJ9$teas`)k0inw$C8%DVp_AY zUd?+b!s0r0G0SJ;pO62G&ZJ{`lwHr3>vSP``RZ=e_qawkqo2sGtk+k%^`Hloow*|O z;Q7x$FAKXEYs1ckPkEi1nPal^bPHbDQRs+vFU^AIHJS~AfhmU7P&BOwIzap4p^8NAaZO%~+1_;lIrd4Ny2a!$ z4)mAnrM+|i$?8B&dFtuCkLq3B!Vk4FFzoma%-shoGR|ynC*DIpMHgUXC_q)SLDi=H ztu9FKE2q!{Kji}gjV1U;|5pImE3F94W;-hPH){oSH&x6GU8FBeV zE?g>&Y&fpzjRbKY^nd^Aa8xM<2U&uy1J}&>YH}G)FVO0vX>%_TmZYP>-?~fkn0Uv6 z)ABq4;7qHFGNT%}6^Vpxca5vsue=!6x1X5zdSZDe28G1%Lmg1IGO>}@_oZ#w^RJj2 z|AVOtN|;D78%#pOx|~Iy>HLtZG$ZzGJ2QqrXgM|A{;J$|frfzjyla?A54)t4FHgrG z+0YuKlFuH$JWZ_DJzUA_W~?i!+c$R`NVwM8i!R?;%RJqEyhTzP_1GTCFaGzx&*eJh zF}XtOHm~(a^*_lvMil?Id2Y zLGwX&S$-}_|F!^*U??q9&8AwyQh+qJyiCt~7}>M73l+{7+lKNbge&n$EuH2iuJeGY zK}VqRDeOBKpEGrf3)ihC$I|uBoBgA4p8*j=sN|RW>_J`? zs(xZ%PrM~iF@;Y=mNHPIKYvgGx7b)Q4o&A`XeCz?EJ_s)I}BUNVNXJGR9macQAW7# z?JlvPo3170F)GTT=X~$l9&Zl%B?0S#zO{B7>kR06R@-1Ocn zlrqqS9%=Z*?vBq3*U4=BeELh^VH|UNXz@SBYPAUXqW)-U_EE`W#r61SP>|HW$Db6D z)-7%$JsCT#Sr~lfqfb)&k&si4;q02N`s*S`aQOZ@Fdg*fDwTT{f8570xvQ27HV^zS zYjmLc`58(T-z1rpvD;8aMNujcNvc<)N(Y)^1^7N8#cWACEWzC41Q7{vxFqCpjSf;o z{5G{+Kw?R}ohNrgmzSp$dyS79Z5x*_0TsAmj9(-dkB&Lb1P*A)tG8^_j7mL;`Xl=N z14oGY88=4qt4mYc1~JzD(3}AGKVQ6dWWk=W88d8^jtY~}clcCA*!7ipRxKJ$=V`&r zi*{TzykLu>6zpeCVBa%lIW_P>szA^TX8M9qgzQ9|B|(H6MzJJ5Kt=8=S{7PBZo#;; zdg!hpWN0{$SPCQPmX<7v2Hf+1ulZDT1t_NtH*GUh8!K#&^;fY%rNDd2;7w51tBc5y z^YJ4tVGQ;vGQWNPvSYcF5gsoZ8{K{@gzU6zzJa4iP$)+^<4pGsrsND-uzoUyEngY+ z8$Z-{Nk{hrPA4@c!^kt{+O7JC-v+;&k^!4X#25c+IRgnwQ zP9ogjTeqv=XXnnRmm8gI1sfKxn<@p+N$MTB0*V+|*QXW`DeyMZ7AJV}1<5z)rfz$8 zqdY7AH*w?7NouM?L_dK8XO^c$N8dsqqvK?4El?pfmJIu5FDQZhghX84%@uvNSs3io z5?7||AsA~Qmtljtr(DPNcGn~SJKHTn6%!TFW#dfGjCPW*SNV1z70ZURhwP`otLv95 z3~9Y)^-2~Xbeql)%TC$0z_hQT?I?y)(M}t0yFG~sf%=Tkw*VTlOsKk^18|%>YG`+Y zaCHI#4bEg-p5tTLVZY0l49$_`6%=EEo<^k=F)))9B7eEcJ2-@IUup$FyCmr)Fq3TD zywatN$ago1h0gTt$cT(>@=kK%U1?P@T9CnZW>6gwUfujK%L0h;9lRQ&jSM49``M(@ ztT{7*#;!8%BRVizL|0tYz*w1Bhk7!5K~7p*v=lZw9z*C3#?O6hkUNK_7sEB{Jy zvJu8q?$f%`ancl)!~Dyd&Lww|Xo)3>#vaKX6npuo;=kLSY$R|Wa78|+yXK(X1#mstS0Ke~6nMyq+7q(rj^|oeFg$4=wBC^As{KC2KFr8*nBmso$+h_2@ z$!~=u!ETx=b@IIj#Dgd}Is&If#+e{Y;ag~4#*Ha~RM?^KDB~R+l0aU~?z0;BF9gJl z=A^gNV#t~8y%>;luo>??4Np<%A(RE1eximv?tU<*eXNXE5lleu(}vU*ET_gffRm)V z-o-D)G~g$2*vE}f6gIfK7Q{5*&f!lflj!168u=CoW2G();CB1D#8J|L<@FbIwz8Qc zc@;%s>D0if=Em*1en5}47^83nI&1=F^kEW!COrspG1KTNq9dgE{U)*Z@@nh3YbNJKi-IXdkobQMC_)@ zuSE{k?do`6DE97V1Y2g)P1?1z`@iopy-lsWy|}c75@-JZmYQE)(OmBpdd*}~HxBz` z#-WydF-fVvzx<}ey7kU$)+C1G=>Hz|v5mlTul`b#C&d>NAF;RhjtiT!ZaePr|KeM6 zj~2G&U2m+0g{*Vm^Z{(7J1fVAl>d!dpUbl2|n^Nf+Xb4jdfTnc4J8M|QmxsemCX4olh``bdB$e?B#T$3y09)5N@St(Kp~#7?8J zQ*+MEC{1gVW+LFS`-A=r71w7lQlLe`uY2}JZYmyqIU1;GO$1?chQ}U$WgKqo4mRs|NZ!u zCfxrLrOIz)wFYI~_w)XEw8$Xn+$#OB{Pl{}dq%MQAKu5gr|YM!i7r3ddt6^;@*5O3 zT{+uyp<}%J<*z~HNAXV6**j0>IRj~;zYn89-x)|QA4FlE``^IygS8=CVX6!)w8HiK z8!{4F9ek%Qt4ghfjvdq(Gao|}R1eZ}v!+?!78LybJ!`gkfd?D0KcGPZLg?@>Yt?%X zG(|d$2>q0Px}|GcLVl}eu<`AYqXyCx8Y-#NrY!ASaS(`|2%EKOr@TNw1P$`taG6y+ zQ)Ia(8?I589Sk{>o00>+$aQ;H1_Uot^dUSV=rAQHk!p%j3GzR!p{Pn1GT2&@Q#A}9 zEu1t!VaGdlAdwa_wFL4y0Zh~cvP~42558it&4xtk8*0)gt9gOMuDWD>G1V01d*4I! z$2{ec(i^UuL--g(1~5MWBXhU>NNrL$Z}(@vD7Y0hC>&-T zk<{P9f8{1V7yVJ*J-;s>op*2Mc;`uLtlp1-j?4X~RZg0Y8fq6-um3x?sdU$trmg>t zh&I1oB~7>RlzEEvJmMP8VynIVyAw& zTFg9zI(3K1W&QPa0N`**TR%)j%u!lk5nHZkiM~-)C7cEO>CJ6v4g{MoQso{S9(0Vo z?J)%qj$TZxCqAblr15(=h0`fpd}f%GAAk61A<`2iFlDv8ijFT!$&eczMk4EHH>fbTk}`l@QI23B$YcgHLX4$~$bbhf?`YZ}}PU<@AZ`GEU|6U7PIl zq4@EHQKkI>U;{QN=_$lJL0#nA6q$m}u6^DbF-Mf0TH3Jw5sIiCG@j(G@v zX)&@;J@ck7cW3oJ?$H|XW5CL7Z}yAdB2mlb3Ksp#(i5}`5gmWqlew4njVih->i=3$ z?0V{`*RfUNpiGJ%#ufRE0_SPR;>crSxnJTJ!BZ)`>~qqb%%=&_k2JojoA_rO8l(O> zs+v!edrVSyz48#kcKBuX?uRLHAGY7U$0Gb5;5!sWN&r4b861uo1gF}%+FTs>c41=td5010cYwS6%-9S-Xs{<3 z6g*P{2J7L6P6$8GMPjD>grjG%N44W*OPUYn;|9{TKs8+)SWYqK8d@HnR#)!F!WbHz zQ$D;r_jwOLdHCh?uiN1G<>!T$boF)IJeS5w-|M@zGNt_2|J3ueEVT9&Y z1^oXkfGZRs!+APg{(GZX=H&LSAX@@2fm&(pPC@KJ>b)A=`yXDCmMI`iV3g^nj?R~k z&8F=>(^tLH9$5=KH9%i3tcd3rVhOa@ihm|al}ouAna{-S!#36e(KZM>+gPdFSl_0I zZ;4D;;WTTI+gS3~`06+EA*5bqU|uJhr*>&vgV>WF;%)DfQSbr#zg`%nIBlFVp z?-RWq%#}#$kY`sN`mQ{%zs_utn?ptMFH!gH%H!IccYMlQDO=GQ%B_Oy7k{5M9=dcfVi4|uwNd9|OG=~82I zKghwCg-y$3h}3`ayD4OhtXF9eh-)g+&x6X6Rr;7cq9vUoRGrZC47{jlUMY5wlU0Yy zV)eie-RwF|x1hguto9PC(JQYD`a4Kcr~G~B%&3sz5&%Z&>XH!e(U1tDA+IH@-A!ns z#C&5^2P)nikv)Dt?$|4qme6{E44}f}XJPqOnpdE!2O%KRZnvTtg%@)N1-pkS6a1VZ4GL6q z0*Jz+K=ttA^ixv;*U93`F2*tiO^Fqz_ApRIv=i*idsK)PToBi;CJsGpTit%4Wn$z) z+3j=|rP)l!7wu9CGR|C$G=WeST-v2T^yLqy^QVYV6~Vkr!Hpz9{n|g%J1tS zZNx(-2BXV>0~$Mc3%ihXdlQ&(RoKq#^aFFwT8X^K>a2-GHMwDc^K|bOZX#bqJB0ps zlWesdRm2Laj#{f{{;78*t?j@~`#PtgLAN25#{kJQ_?*5?B)8o(lPB9l}dJ#C+blF4;YF{+x?wtE7kVk<2Pl7tTkPhOVP zT+8g-A16wgM*E={n$oK4yQkR&`=gKL=SF)gcpUX`DR00|BBUY01EaECZX*zaK=v_` zfE)OcW*_^0Knx*eN{F^6GlUU(Li9hIr?+e zt+Yvuf>*5JufGX@7@8+@*%$cp%#I1POY$lmS6(iuiyhF&3;D|>$6RBvn_*Z#``&W+ z7^B+YwdM?%7?jd)%Gj#QWV=o!CmJmC8SPAM7XhiL9FyU=*E~ioJQwG z>&?(*@om(Hu!FF4xQWjyx&Qf*ql}ZQz-cK3#y0Qy2MffC+lr3ThaHoPo8i`n62Zd4 z2akxCo7(utVfgse^`nB$SKBonbYg$EPMl0c^j5dGZgk7fybxiaM!@&6c9Mx#UU@X8 zznJCPWSTU{O=)2+nu)jBy($vr{A8joWkvDIVK#sA%hrNa@dXGcaPvs7oFrk{b7DO^ zUoY%3;5i@vrc6gaR$dNpSR&&Tyb*oZRN&_v2c7Z=z@I2%@`$_>s@GDs;FN|;i4Oh2 z?`2%3kuQ7o!D{GcOdRgHxS)|@pd>_m+0W5=;H}q1)~6xCq905>F>E-!M91t! z5H|dtikRjK8|P=DfU}|)t^hPcXb0$5NQ!7dv1Tnkt}fu~mLG471m&AXIk1EuHvM@7 zh(-xKH?GK>z3OL)aNJfa14O91F}t8aQ{3`9hV8`gOrSr`d$`!+#@bF+OrJxb=n=~n zp3qmD=q=c@U~)`uzVB4;fZfDd>o-n2O%t6pe6&90kQ538Bzzi@bDF&lgkYc=IayAw zUN!U0eVgdLj0*mgQ~a0x54}cpaH=wdF(Wng<_3jJR{PxO%Hri;{-g0&moo5)~$*EinzUw>eke$gr#X;TM!S(Gw7)*%Wo>4;TNp6 zNs$gsg1OYete`rAF%qBP&oJ{0&1CAn;3#^Q=QFQ$+v_on2g0j~ z(Ym^@aYEnM^krvKbu%W7{pc)7>K@Ve!%cJRn+?9;WRU?eg0gn6)(&pnF>i3ARZEywwxH z=f{@AOXa|aK3vf+vA;=YE{kjXYpfYJk+jQ+5r$J9PzY`dk1GCdL^D-bbQ901}@9sKG=O-HSS zJa|y9xx6Kc8~b`0P2lw*}vYQ<~i($|HLg=8Qe232TiSB;I zmKWZ+<0PBel@q}J1T(%*{~ILw7fam83`|V7JmzCPMQ^@_OF^>Ig+wJ`G0S-lc zbDXad@-}&yXSl?_!9nXxRwL4rLDq+I;Y!Y|=_np?NVWh&VqE$l!>ai(Wy_qktMtq@rnm#1 zbHMW8z<`p2ZIQ?jVBecIDlN|KIclnsMsx%KH&fye!y0qA6AB9dRoS11g%bn@1n!Y& zs7yT*Qv!Du4W?@HkHzZ@8Zf)EM4X_*IXOv?iulYQOgGzW_#(cOnFtVrWyz&s?C@?{WnQu=yl8Eqxbxn!)bZxC6z|eyV9u|(F(Wi z?X#1A{#)}z26dlq{yse#*S4>t?s{oZtjxyE)BmCAEBu=9!o5c`n$f+%2mJisR({92Dao->f{1;Ke?BFc)8Wc+=^*KDJiw#iC3JiP>%NR$G6+Rz&NUt4GYbmtZUSQl1(?cP z4K%z)9k9^>tqd?J9?nZ=B4#idbu$D<2@Qi38p+w^Q<6DAY8KGvR`VEX%AnhVgWEwq zsR?0N;ZT(rFJKB_WTGRGe4!2VWnK0dp}28~ubVAF&o zqP)v5JJGdek=9(5=OcP=DzrKUml+V#P^j)+HDW;{LSx3Cf}unf+JMb!;9DzzF&xrD zZDAG6IdI_Ch(L7xr6!B(_jj_*&c*3AdZyX4h67n0m69{@zq+&lqr4U)DoiZrjPpa2a8co#5qz zqU(OgoW0NT_gi-Rp!Ema$^uTRJ!vveoEOfwS_jpA;i$8APj?~%?L;r#Kh7IUyxQRY}O|9%5!iS#r!=_0SLX};AU zVI=ℑ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

Exo>4qK}l!KClF-8C~9$=l@jE~z|a%TXtNHXY< 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�g{9}^Pj+IT)ymb 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

)P@yhu8I(f7DPD+D{- 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 UR?q(Vwh&5IQcOV literal 0 HcmV?d00001 diff --git a/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-128@2x.png b/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4c0e6f5475089881a7abb996fc0ed61eb85f9249 GIT binary patch literal 44119 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 M07*qoM6N<$g8b3%(*OVf literal 0 HcmV?d00001 diff --git a/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-16.png b/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-16.png new file mode 100644 index 0000000000000000000000000000000000000000..551deb69095113dbe6957e09df742b1202544d06 GIT binary patch literal 1488 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|DpDgn(|mmy zw18|51{Ovs23C*~Ahu(ahO^xmH5iz|;y`oSGZ|Q*YW#pS2qXY8NDqW&Ucd-d4HR3z z1XnGvfEmFCs%Ci6z7pgv&H|6fVg?4jBOuH;Rhv(mfq`jFW=KRygs+cPa(=E}VoH8e zs$NBI0Z12vO@$SZnVVXYs8ErclUHn2VXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7QL z^bGV2l1AfjnEKjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(y zU7!lx;>x^|#0uTKVr7USFmqf|i<65o3raHc^AtelCMM;Vme?vOfh>Xph&xk~;r0}i z7Uh6#NlDgE%}LEo%_}L^H`FuK$EFYHTe!x&VrXap!$rR$u>h#aKp*ZRpoKOm$yUil zsfi`|MPSdu-2nD=aB3l{C`bp$**TeZUa94&ISL`EsW$ph5fnc_L{SZ}(Z^~V$PFc# zB{`|6c7ZK&%qc+?MYsSIA67YudFi%F6}l;@X^EvdB}#SyiOJbPi6siU3TF5mhH5U@ zVdze<0S2U%GbC(6^7C`-oD=iP5^eO+g`wVt*oG9pV0S}AfvLxi3#b#8679GW95e%g z>DJQI#W6%fG&IOJL)cMb?#wsK&gyMjV)}KtsjDuVhzNg{;70M4aUpvuSFsCb=O3M| zez1GWq6)!16(5y?R75mp+4}S3n z{65ulkyWlp_34X+@6Nt{BRliT$GfpdbU3pf9o=4RKL50b0mJDTmtQd3zAN~@Y+auHB(|?)PmYzn)_S*~d0^Z1P;ZZ^eWSeDeGSX}8%9SzVum8!7D4s3SlHQ<4y!+aieuIiQPgg&ebxsLQ E06jVX4FCWD literal 0 HcmV?d00001 diff --git a/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-16@2x.png b/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-16@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..91b3e3bb09892511dfcfee9eeaf4d3c9174e00a5 GIT binary patch literal 2486 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 literal 0 HcmV?d00001 diff --git a/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-256.png b/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-256.png new file mode 100644 index 0000000000000000000000000000000000000000..4c0e6f5475089881a7abb996fc0ed61eb85f9249 GIT binary patch literal 44119 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 M07*qoM6N<$g8b3%(*OVf literal 0 HcmV?d00001 diff --git a/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-256@2x.png b/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-256@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d8e92b9d579f6c9237f24d1ff5b15a43e6a0d7d2 GIT binary patch literal 154969 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

ZTOphu~RBkdsCUDik3X}sBnmpajO8Fj@ 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 literal 0 HcmV?d00001 diff --git a/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-32.png b/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-32.png new file mode 100644 index 0000000000000000000000000000000000000000..91b3e3bb09892511dfcfee9eeaf4d3c9174e00a5 GIT binary patch literal 2486 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 literal 0 HcmV?d00001 diff --git a/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-32@2x.png b/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-32@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a9f5c51e1db7a7ef0fbff9766727cc87b984f3b3 GIT binary patch literal 5397 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 Ny0W%X`F)GPe*ull#~uIx literal 0 HcmV?d00001 diff --git a/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-512.png b/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d8e92b9d579f6c9237f24d1ff5b15a43e6a0d7d2 GIT binary patch literal 154969 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

ZTOphu~RBkdsCUDik3X}sBnmpajO8Fj@ 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 literal 0 HcmV?d00001 diff --git a/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-512@2x.png b/apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-512@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f3e00fc4e27ec97143fdc9f07e633613278aefcf GIT binary patch literal 618576 zcmaI71yEeg)-F7QPw*iG2{tf5f?IGOWCjlq+ylWixVr>`3-gCZt?tgCG`gc`VuU@s}>F!;7clTNyqoJlq_=x%u001CFz~wXn0IUZR3xJ35 zP#p!e{d}l^Z#5NV0ac?k+Yb$ID?P*;RaF4n1C0m30#XC8{}Fj8lEA0`p%sA70GR*c zKiG+~{g=^yWYiwYKabf%`KSHw8Z#gGKhh7pe2o7sjRnZZ{6F-AG=P|xZ~vhJxxn?` z0surk{}kW{cA}>M07iwaww}A5s*31qXGbn`OJ@r!E^kMdf3yJN-l7krqm{ckgSVrD z(_2w*3C4d(h(6H&u(=r-{w3mWFTtp%s=)wrcC%s-Q3 z)E`E~4DrUS3{YUi@6nZr0qqA|fK(Jbc`Ie4GywoNs-c+|9i?o!&D2+sOa6 zBWLyYwVSPryREYm!#{S-Eu1~vB^Vk1arB?(-#9H_|HqGuhnvH{yjZ^GwsNp?v~qHP z%gxKh%l-e-d+6|dpNi=N@|$Dw%0UwXW(QI{Qm>?-**26?Ei)! z{xFcDuz!z@wzIQ?B+T5&(_EbU|7QPBxBuc z1OTJ~2ss&TZ(v0ZVJ39Y(Ng5f`)+E{>1&#Pl>|S4C?T$*igaU7;oAyNcb=jpc@)#_ z`PltUbfCX+sl!w6?MQr;p*I?z)q*e^O>C2S@Ipm_?{1l6G=xo2s^HHo6`sf(GW-0w zYv^`E|0_IP#^HKqc@|&a)OBT{Hsirs%9hTMAf!MKr~bb3+N29{6!qf;{;`5xH`p(J zC9(9PkZaK-+r5)2wRg$j5Ay1)5kX0^gx!P{DLZG8x)my%itDTR((?zZ8yecI({HjS zs>^rR%afdvYA?ThgdpS^MSR=w0&%E_ zKX}=d3xAqAle`V;3(1A$C8>^MfVR>;sD5B z8)i>1Wjilg_-p z-57PpEQiqYg`}w@Lc^UDt1`9&NL!Dxrxt3Kv`mRVt=bhUHnk_IjBRA_Nr)|-?Bt#Y zP`5JQ*!yiiFQ-e5U4M5D>U=|C=5<;0(zt~&awqh9WOi)6A8WL@l61_{HcR%xzOCFv zFei@n6j;P`U~U{w?VfmlvvjZ9W^L6pdu=lPl20PAb6l>N5_|8LTtHQ}NS-7$O{ATY zlUmS)iw3G#TbfAM#hHMhC^OxlQNZECdb{-c5#Q^kI?vzg;C-WZfqLWmR9L;!5nk&f+CYl_$H9bX42 zHt~^h6$qT6n7^pSwMo}Fn`5?=>;U-4>vRxQVN052^M$Utvj1WwkXHP2nBAzC&laE( z8SCp&uM!1~{DDTeew(Lz%XQja+&r`8U9Qen++AVaX+qa`#+y~Vg^S_$^ESkh>$@;+ zZSXbUy6ZH_)@@eE6?=`cYaH8d!Qs|bTM*_Rb;)lt)Ac`1hxf0J@h3|typ24LcFB

c!A^rb{axrn?|0_#iNrt{qI)Q*&<07v{(wd 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

Va}9*rO6n@K2aOX7;58j1Bo~vkbf;AP*O*h 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ℑ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

Exo>4qK}l!KClF-8C~9$=l@jE~z|a%TXtNHXY< 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�g{9}^Pj+IT)ymb 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

)P@yhu8I(f7DPD+D{- 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 { + return (path: string) => { + const info = infoByFile[basename(path)]; + if (!info) { + throw new Error(`No test image info for ${path}`); + } + return info; + }; +} + +describe('parseSipsImageInfo', () => { + it('parses dimensions and alpha state from sips output', () => { + expect( + parseSipsImageInfo( + '/tmp/icon.png\n pixelWidth: 1024\n pixelHeight: 1024\n hasAlpha: no\n', + ), + ).toEqual({ width: 1024, height: 1024, hasAlpha: false }); + }); +}); + +describe('validateAppIconSet', () => { + it('accepts flattened icons with matching dimensions', () => { + const dir = createIconSet([ + { filename: 'AppIcon-iOS-1024.png', idiom: 'universal', platform: 'ios', size: '1024x1024' }, + { filename: 'AppIcon-mac-16@2x.png', idiom: 'mac', scale: '2x', size: '16x16' }, + ]); + writePlaceholder(dir, 'AppIcon-iOS-1024.png'); + writePlaceholder(dir, 'AppIcon-mac-16@2x.png'); + + expect( + validateAppIconSet( + dir, + inspector({ + 'AppIcon-iOS-1024.png': { width: 1024, height: 1024, hasAlpha: false }, + 'AppIcon-mac-16@2x.png': { width: 32, height: 32, hasAlpha: false }, + }), + ), + ).toEqual([]); + }); + + it('reports missing filenames and referenced files', () => { + const dir = createIconSet([ + { idiom: 'universal', platform: 'ios', size: '1024x1024' }, + { filename: 'Missing.png', idiom: 'mac', scale: '1x', size: '16x16' }, + ]); + + expect(validateAppIconSet(dir, inspector({})).map((issue) => issue.message)).toEqual([ + 'ios 1024x1024 1x is missing a filename.', + 'Missing.png is referenced by Contents.json but missing.', + ]); + }); + + it('reports wrong dimensions and alpha channels', () => { + const dir = createIconSet([ + { filename: 'AppIcon-iOS-1024.png', idiom: 'universal', platform: 'ios', size: '1024x1024' }, + ]); + writePlaceholder(dir, 'AppIcon-iOS-1024.png'); + + expect( + validateAppIconSet( + dir, + inspector({ + 'AppIcon-iOS-1024.png': { width: 1023, height: 1024, hasAlpha: true }, + }), + ).map((issue) => issue.message), + ).toEqual([ + 'AppIcon-iOS-1024.png is 1023x1024; expected 1024x1024.', + 'AppIcon-iOS-1024.png has an alpha channel; App Store app icons must be flattened.', + ]); + }); +}); diff --git a/apps/swift/scripts/lib/app-store-assets.ts b/apps/swift/scripts/lib/app-store-assets.ts new file mode 100644 index 0000000000..18925dfc32 --- /dev/null +++ b/apps/swift/scripts/lib/app-store-assets.ts @@ -0,0 +1,126 @@ +import { execFileSync } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; +import { basename, join } from 'node:path'; + +export type ImageInfo = { + width: number; + height: number; + hasAlpha: boolean; +}; + +export type AppIconIssue = { + file?: string; + message: string; +}; + +type AppIconImage = { + filename?: string; + idiom?: string; + platform?: string; + scale?: string; + size?: string; +}; + +type AppIconContents = { + images?: AppIconImage[]; +}; + +export type ImageInspector = (path: string) => ImageInfo; + +const PIXEL_WIDTH_RE = /pixelWidth:\s*([0-9.]+)/; +const PIXEL_HEIGHT_RE = /pixelHeight:\s*([0-9.]+)/; +const HAS_ALPHA_RE = /hasAlpha:\s*(yes|no)/; +const ICON_SIZE_RE = /^(\d+)x(\d+)$/; +const ICON_SCALE_RE = /^(\d+)x$/; + +export function parseSipsImageInfo(output: string): ImageInfo { + const width = output.match(PIXEL_WIDTH_RE)?.[1]; + const height = output.match(PIXEL_HEIGHT_RE)?.[1]; + const hasAlpha = output.match(HAS_ALPHA_RE)?.[1]; + + if (!width || !height) { + throw new Error('Unable to parse image dimensions from sips output.'); + } + + return { + width: Math.round(Number(width)), + height: Math.round(Number(height)), + hasAlpha: hasAlpha === 'yes', + }; +} + +export function inspectImageWithSips(path: string): ImageInfo { + const output = execFileSync( + 'sips', + ['-g', 'pixelWidth', '-g', 'pixelHeight', '-g', 'hasAlpha', path], + { encoding: 'utf8' }, + ); + return parseSipsImageInfo(output); +} + +export function validateAppIconSet( + iconSetDir: string, + inspectImage: ImageInspector = inspectImageWithSips, +): AppIconIssue[] { + const contentsPath = join(iconSetDir, 'Contents.json'); + const issues: AppIconIssue[] = []; + + if (!existsSync(contentsPath)) { + return [{ file: contentsPath, message: 'App icon set is missing Contents.json.' }]; + } + + const contents = JSON.parse(readFileSync(contentsPath, 'utf8')) as AppIconContents; + const images = contents.images ?? []; + + if (images.length === 0) { + issues.push({ file: contentsPath, message: 'App icon set does not define any image slots.' }); + } + + for (const image of images) { + const slot = `${image.platform ?? image.idiom ?? 'icon'} ${image.size ?? 'unknown'} ${ + image.scale ?? '1x' + }`; + + if (!image.filename) { + issues.push({ file: contentsPath, message: `${slot} is missing a filename.` }); + continue; + } + + const file = join(iconSetDir, image.filename); + if (!existsSync(file)) { + issues.push({ + file, + message: `${image.filename} is referenced by Contents.json but missing.`, + }); + continue; + } + + const expectedPoints = image.size?.match(ICON_SIZE_RE); + const scale = image.scale?.match(ICON_SCALE_RE)?.[1] ?? '1'; + + if (!expectedPoints) { + issues.push({ file: contentsPath, message: `${slot} has an invalid size declaration.` }); + continue; + } + + const expectedWidth = Number(expectedPoints[1]) * Number(scale); + const expectedHeight = Number(expectedPoints[2]) * Number(scale); + const info = inspectImage(file); + + if (info.width !== expectedWidth || info.height !== expectedHeight) { + issues.push({ + file, + message: `${basename(file)} is ${info.width}x${info.height}; expected ${expectedWidth}x${expectedHeight}.`, + }); + } + + if (info.hasAlpha) { + issues.push({ + file, + message: `${basename(file)} has an alpha channel; App Store app icons must be flattened.`, + }); + } + } + + return issues; +} diff --git a/apps/swift/scripts/validate-app-store-assets.ts b/apps/swift/scripts/validate-app-store-assets.ts new file mode 100644 index 0000000000..1bf92a6ae2 --- /dev/null +++ b/apps/swift/scripts/validate-app-store-assets.ts @@ -0,0 +1,17 @@ +import { resolve } from 'node:path'; +import { validateAppIconSet } from './lib/app-store-assets'; + +const repoRoot = resolve(import.meta.dir, '../../..'); +const iconSetDir = resolve(repoRoot, 'apps/swift/Resources/Assets.xcassets/AppIcon.appiconset'); + +const issues = validateAppIconSet(iconSetDir); + +if (issues.length > 0) { + console.error('App Store asset validation failed:'); + for (const issue of issues) { + console.error(`- ${issue.file ? `${issue.file}: ` : ''}${issue.message}`); + } + process.exit(1); +} + +console.log('App Store asset validation passed.'); diff --git a/package.json b/package.json index 686a0c8a0f..51007fe33e 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "swift:models": "bun run apps/swift/scripts/generate-swift-models.ts", "swift:quicktype": "bun run apps/swift/scripts/generate-quicktype-models.ts", "swift:screenshots": "bun run apps/swift/scripts/capture-visual-screenshots.ts", + "swift:validate-assets": "bun run apps/swift/scripts/validate-app-store-assets.ts", "swift:watch-sync-smoke": "bun run apps/swift/scripts/watch-sync-smoke.ts", "web:screenshots": "bun run --cwd apps/expo screenshots:web", "test:api:unit": "vitest run --config packages/api/vitest.unit.config.ts", From 8fc772499ac62eeebbb5e066d0b812bd40a08b89 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Sat, 30 May 2026 22:26:11 -0600 Subject: [PATCH 49/60] =?UTF-8?q?=F0=9F=9A=A9=20Align=20Swift=20feature=20?= =?UTF-8?q?flags?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PackRat/Config/AppFeatureFlags.swift | 16 ++++++ .../PackRat/Features/Home/HomeView.swift | 28 ++++++--- .../Features/OfflineAI/FeatureFlag.swift | 2 +- .../PackRat/Navigation/AppNavigation.swift | 15 ++++- .../Tests/PackRatUITests/AppUITestCase.swift | 10 ++++ .../Tests/PackRatUITests/AuthTests.swift | 19 ++++--- .../Tests/PackRatUITests/FeedMacOSTests.swift | 6 ++ .../Tests/PackRatUITests/FeedTests.swift | 6 ++ .../PackRatUITests/MoreTabsMacOSTests.swift | 9 ++- .../Tests/PackRatUITests/MoreTabsTests.swift | 10 ++-- .../PackRatUITests/NavigationMacOSTests.swift | 10 +++- .../VisualScreenshotTests.swift | 57 ++++++++++++------- .../scripts/capture-visual-screenshots.ts | 56 ++++++++++++------ 13 files changed, 174 insertions(+), 70 deletions(-) create mode 100644 apps/swift/Sources/PackRat/Config/AppFeatureFlags.swift diff --git a/apps/swift/Sources/PackRat/Config/AppFeatureFlags.swift b/apps/swift/Sources/PackRat/Config/AppFeatureFlags.swift new file mode 100644 index 0000000000..1ad98b070c --- /dev/null +++ b/apps/swift/Sources/PackRat/Config/AppFeatureFlags.swift @@ -0,0 +1,16 @@ +import Foundation + +enum AppFeatureFlags { + // Keep these values aligned with `packages/config/src/config.ts`. + static let enableOAuth = true + static let enableTrips = true + static let enablePackInsights = false + static let enableShoppingList = false + static let enableSharedPacks = false + static let enablePackTemplates = true + static let enableTrailConditions = true + static let enableFeed = false + static let enableWildlifeIdentification = false + static let enableLocalAI = true + static let enableTrails = false +} diff --git a/apps/swift/Sources/PackRat/Features/Home/HomeView.swift b/apps/swift/Sources/PackRat/Features/Home/HomeView.swift index 93c30eef07..2ec4bf9507 100644 --- a/apps/swift/Sources/PackRat/Features/Home/HomeView.swift +++ b/apps/swift/Sources/PackRat/Features/Home/HomeView.swift @@ -297,7 +297,7 @@ struct HomeView: View { } private var homeActions: [HomeAction] { - [ + var actions = [ HomeAction( title: "My Packs", subtitle: appState.packsVM.packs.isEmpty ? "No packs yet" : "\(appState.packsVM.packs.count) pack\(appState.packsVM.packs.count == 1 ? "" : "s")", @@ -318,13 +318,27 @@ struct HomeView: View { ) { appState.navItem = .templates }, HomeAction(title: "Guides", subtitle: "Gear & packing articles", symbol: "book.fill", color: .brown) { appState.navItem = .guides }, HomeAction(title: "Catalog", subtitle: "Browse gear database", symbol: "magnifyingglass", color: .gray) { appState.navItem = .catalog }, - HomeAction(title: "Community Feed", subtitle: "Posts & trip reports", symbol: "newspaper.fill", color: .teal) { appState.navItem = .feed }, - HomeAction(title: "Trail Conditions", subtitle: "Community reports", symbol: "figure.hiking", color: .red) { appState.navItem = .trailConditions }, - HomeAction(title: "Shopping List", subtitle: "Gear wishlist", symbol: "cart.fill", color: .pink) { showingShoppingList = true }, - HomeAction(title: "Wildlife ID", subtitle: "Identify animals & plants", symbol: "pawprint.fill", color: Color(red: 0.5, green: 0.3, blue: 0.1)) { - appState.navItem = .wildlife - }, ] + + if AppFeatureFlags.enableFeed { + actions.append(HomeAction(title: "Community Feed", subtitle: "Posts & trip reports", symbol: "newspaper.fill", color: .teal) { appState.navItem = .feed }) + } + + if AppFeatureFlags.enableTrailConditions { + actions.append(HomeAction(title: "Trail Conditions", subtitle: "Community reports", symbol: "figure.hiking", color: .red) { appState.navItem = .trailConditions }) + } + + if AppFeatureFlags.enableShoppingList { + actions.append(HomeAction(title: "Shopping List", subtitle: "Gear wishlist", symbol: "cart.fill", color: .pink) { showingShoppingList = true }) + } + + if AppFeatureFlags.enableWildlifeIdentification { + actions.append(HomeAction(title: "Wildlife ID", subtitle: "Identify animals & plants", symbol: "pawprint.fill", color: Color(red: 0.5, green: 0.3, blue: 0.1)) { + appState.navItem = .wildlife + }) + } + + return actions } private var upcomingTripsSubtitle: String { diff --git a/apps/swift/Sources/PackRat/Features/OfflineAI/FeatureFlag.swift b/apps/swift/Sources/PackRat/Features/OfflineAI/FeatureFlag.swift index 989e7dee69..15865990a1 100644 --- a/apps/swift/Sources/PackRat/Features/OfflineAI/FeatureFlag.swift +++ b/apps/swift/Sources/PackRat/Features/OfflineAI/FeatureFlag.swift @@ -27,7 +27,7 @@ extension Defaults.Keys { /// implementations on the next read. public enum LocalLLMProviderFactory { public static func makeProvider() -> LocalLLMProvider { - if Defaults[.useRealLocalLLM] { + if AppFeatureFlags.enableLocalAI && Defaults[.useRealLocalLLM] { return MLXLocalLLMProvider() } return MockLocalLLMProvider() diff --git a/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift b/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift index b4558c5f29..fcb803f81a 100644 --- a/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift +++ b/apps/swift/Sources/PackRat/Navigation/AppNavigation.swift @@ -48,6 +48,17 @@ enum NavItem: String, CaseIterable, Identifiable { default: return false } } + + var isFeatureEnabled: Bool { + switch self { + case .trips: return AppFeatureFlags.enableTrips + case .templates: return AppFeatureFlags.enablePackTemplates + case .trailConditions: return AppFeatureFlags.enableTrailConditions + case .feed: return AppFeatureFlags.enableFeed + case .wildlife: return AppFeatureFlags.enableWildlifeIdentification + default: return true + } + } } #if os(iOS) @@ -152,7 +163,7 @@ struct AppNavigation: View { private var sidebar: some View { @Bindable var state = appState - return List(NavItem.allCases) { item in + return List(NavItem.allCases.filter(\.isFeatureEnabled)) { item in Button { state.navItem = item } label: { @@ -330,7 +341,7 @@ struct AppNavigation: View { } private var phonePrimaryItems: [NavItem] { - [.home, .packs, .trips, .chat] + [.home, .packs, .trips, .chat].filter(\.isFeatureEnabled) } @ViewBuilder diff --git a/apps/swift/Tests/PackRatUITests/AppUITestCase.swift b/apps/swift/Tests/PackRatUITests/AppUITestCase.swift index e756ee5218..7e674c1084 100644 --- a/apps/swift/Tests/PackRatUITests/AppUITestCase.swift +++ b/apps/swift/Tests/PackRatUITests/AppUITestCase.swift @@ -1,5 +1,15 @@ import XCTest +enum UITestFeatureFlags { + // Keep aligned with `packages/config/src/config.ts` and Swift `AppFeatureFlags`. + static let enableTrips = true + static let enablePackTemplates = true + static let enableTrailConditions = true + static let enableFeed = false + static let enableWildlifeIdentification = false + static let enableShoppingList = false +} + // MARK: - Base class /// Base class for all PackRat UI tests. diff --git a/apps/swift/Tests/PackRatUITests/AuthTests.swift b/apps/swift/Tests/PackRatUITests/AuthTests.swift index 96336b4cc2..290caf03d5 100644 --- a/apps/swift/Tests/PackRatUITests/AuthTests.swift +++ b/apps/swift/Tests/PackRatUITests/AuthTests.swift @@ -61,10 +61,10 @@ final class AuthTests: AppUITestCase { continueButton.tap() XCTAssertTrue(waitForLoggedIn(timeout: 10), "Guest mode should enter the main app shell") - goToHomeAction("Community Feed") + goToHomeAction("Pack Templates") XCTAssertTrue( - app.staticTexts["Community Feed Requires an Account"].waitForExistence(timeout: 10), + app.staticTexts["Templates Require an Account"].waitForExistence(timeout: 10), "Guest-only account-backed screens should show a native sign-in state instead of a network error" ) XCTAssertTrue(app.buttons["Sign In or Create Account"].exists) @@ -91,11 +91,16 @@ final class AuthTests: AppUITestCase { XCTAssertFalse(app.staticTexts["Connection Needed"].exists) app.buttons["Done"].tapIfExists() - goToHomeAction("Wildlife ID") - XCTAssertTrue(app.staticTexts["Wildlife ID Requires an Account"].waitForExistence(timeout: 10)) - XCTAssertTrue(app.buttons["Sign In or Create Account"].exists) - XCTAssertFalse(app.buttons["Try Again"].exists) - XCTAssertFalse(app.staticTexts["Connection Needed"].exists) + if UITestFeatureFlags.enableWildlifeIdentification { + goToHomeAction("Wildlife ID") + XCTAssertTrue(app.staticTexts["Wildlife ID Requires an Account"].waitForExistence(timeout: 10)) + XCTAssertTrue(app.buttons["Sign In or Create Account"].exists) + XCTAssertFalse(app.buttons["Try Again"].exists) + XCTAssertFalse(app.staticTexts["Connection Needed"].exists) + } else { + goToTab("Home") + XCTAssertFalse(app.buttons["home_action_wildlifeid"].waitForExistence(timeout: 2)) + } } #endif diff --git a/apps/swift/Tests/PackRatUITests/FeedMacOSTests.swift b/apps/swift/Tests/PackRatUITests/FeedMacOSTests.swift index b228d70f81..0594762151 100644 --- a/apps/swift/Tests/PackRatUITests/FeedMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/FeedMacOSTests.swift @@ -4,6 +4,12 @@ import XCTest /// macOS variant of `FeedTests`. Feed lives behind the sidebar's "Feed" row; /// the composer opens as a sheet from the content column toolbar. final class FeedMacOSTests: AppUITestCase { + override func setUpWithError() throws { + try super.setUpWithError() + guard UITestFeatureFlags.enableFeed else { + throw XCTSkip("Community Feed is hidden while enableFeed is false.") + } + } func testFeedSidebarReachable() { goToSidebar("Feed") diff --git a/apps/swift/Tests/PackRatUITests/FeedTests.swift b/apps/swift/Tests/PackRatUITests/FeedTests.swift index ce8c580437..a435317258 100644 --- a/apps/swift/Tests/PackRatUITests/FeedTests.swift +++ b/apps/swift/Tests/PackRatUITests/FeedTests.swift @@ -5,6 +5,12 @@ import XCTest /// E2E tests for Community Feed: browsing, composing, deleting posts. final class FeedTests: AppUITestCase { + override func setUpWithError() throws { + try super.setUpWithError() + guard UITestFeatureFlags.enableFeed else { + throw XCTSkip("Community Feed is hidden while enableFeed is false.") + } + } func testFeedTabReachable() { goToTab("Feed") diff --git a/apps/swift/Tests/PackRatUITests/MoreTabsMacOSTests.swift b/apps/swift/Tests/PackRatUITests/MoreTabsMacOSTests.swift index 8d00a21d8a..f95fbe5838 100644 --- a/apps/swift/Tests/PackRatUITests/MoreTabsMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/MoreTabsMacOSTests.swift @@ -71,11 +71,10 @@ final class MoreTabsMacOSTests: AppUITestCase { // MARK: - Wildlife - func testWildlifeSidebarReachable() { - goToSidebar("Wildlife") - XCTAssertTrue( - app.staticTexts["Wildlife ID"].waitForExistence(timeout: 8), - "Wildlife ID header must appear" + func testDisabledWildlifeSidebarEntryIsHidden() { + XCTAssertFalse( + app.buttons["nav_wildlife"].waitForExistence(timeout: 2), + "Wildlife ID should stay hidden while enableWildlifeIdentification is false" ) } } diff --git a/apps/swift/Tests/PackRatUITests/MoreTabsTests.swift b/apps/swift/Tests/PackRatUITests/MoreTabsTests.swift index 9247ce0179..b126c71cb0 100644 --- a/apps/swift/Tests/PackRatUITests/MoreTabsTests.swift +++ b/apps/swift/Tests/PackRatUITests/MoreTabsTests.swift @@ -100,11 +100,11 @@ final class MoreTabsTests: AppUITestCase { // MARK: - Wildlife - func testWildlifeTabReachable() { - goToHomeAction("Wildlife ID") - XCTAssertTrue( - app.navigationBars["Wildlife ID"].waitForExistence(timeout: 8), - "Wildlife ID navigation must appear from Home" + func testDisabledWildlifeActionIsHidden() { + goToTab("Home") + XCTAssertFalse( + app.buttons["home_action_wildlifeid"].waitForExistence(timeout: 2), + "Wildlife ID should stay hidden while enableWildlifeIdentification is false" ) } diff --git a/apps/swift/Tests/PackRatUITests/NavigationMacOSTests.swift b/apps/swift/Tests/PackRatUITests/NavigationMacOSTests.swift index b02e745ef4..1d1425dbb9 100644 --- a/apps/swift/Tests/PackRatUITests/NavigationMacOSTests.swift +++ b/apps/swift/Tests/PackRatUITests/NavigationMacOSTests.swift @@ -96,16 +96,20 @@ final class NavigationMacOSTests: AppUITestCase { // Items reachable only via the sidebar's lower entries (not present as // primary tabs on iOS). These are the ones that lived behind "More" on // iOS but are first-class on the macOS sidebar. - let secondary = [ + var secondary = [ "Assistant", "Catalog", "Templates", "Trail Conditions", - "Feed", "Guides", "Gear Inventory", - "Wildlife", ] + if UITestFeatureFlags.enableFeed { + secondary.append("Feed") + } + if UITestFeatureFlags.enableWildlifeIdentification { + secondary.append("Wildlife") + } for label in secondary { goToSidebar(label) XCTAssertTrue( diff --git a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift index 3702be11de..e5bf52655c 100644 --- a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift +++ b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift @@ -379,19 +379,22 @@ final class VisualScreenshotTests: XCTestCase { } private var explorePhoneHomeActions: [PhoneHomeActionScreenshot] { - [ + var actions: [PhoneHomeActionScreenshot] = [ ("Catalog", "catalog"), - ("Community Feed", "feed"), ("Trail Conditions", "trail-conditions"), ("Weather", "weather"), - ("Shopping List", "shopping-list"), ] + if UITestFeatureFlags.enableFeed { + actions.append(("Community Feed", "feed")) + } + if UITestFeatureFlags.enableShoppingList { + actions.append(("Shopping List", "shopping-list")) + } + return actions } private var deepPhoneHomeActions: [PhoneHomeActionScreenshot] { - [ - ("Wildlife ID", "wildlife"), - ] + UITestFeatureFlags.enableWildlifeIdentification ? [("Wildlife ID", "wildlife")] : [] } private func capturePhoneHomeActionSurface( @@ -458,7 +461,7 @@ final class VisualScreenshotTests: XCTestCase { resetPhoneModalState(mode) captureHomeAction("Weather", name: "\(prefix)-weather-before-alerts", dismissAfterCapture: false) - if mode != .guest { + if mode != .guest && UITestFeatureFlags.enableFeed { resetPhoneModalState(mode) captureHomeAction( "Community Feed", @@ -534,13 +537,15 @@ final class VisualScreenshotTests: XCTestCase { tapAndCapture(identifier: "weather_alerts_button", fallbackButton: "Alerts", name: "92-data-weather-alerts-sheet") tapAndCapture(identifier: "weather_alert_preferences_button", fallbackButton: "Alert Preferences", name: "93-data-weather-alert-preferences") - captureHomeAction( - "Community Feed", - name: "home-before-94-data-feed-expanded", - dismissAfterCapture: false, - destinationIdentifier: "feed_comments_button_9001" - ) - tapElementAndCapture(identifier: "feed_comments_button_9001", name: "94-data-feed-comments-sheet") + if UITestFeatureFlags.enableFeed { + captureHomeAction( + "Community Feed", + name: "home-before-94-data-feed-expanded", + dismissAfterCapture: false, + destinationIdentifier: "feed_comments_button_9001" + ) + tapElementAndCapture(identifier: "feed_comments_button_9001", name: "94-data-feed-comments-sheet") + } captureHomeAction( "AI Packs", @@ -709,15 +714,19 @@ final class VisualScreenshotTests: XCTestCase { ("Assistant", "\(prefix)-assistant\(suffix)"), ("Catalog", "\(prefix)-catalog\(suffix)"), ] - let secondaryEntries = [ + var secondaryEntries = [ ("Templates", "\(prefix)-pack-templates\(suffix)"), ("Trail Conditions", "\(prefix)-trail-conditions\(suffix)"), - ("Feed", "\(prefix)-feed\(suffix)"), ("Guides", "\(prefix)-guides\(suffix)"), ("Gear Inventory", "\(prefix)-gear-inventory\(suffix)"), - ("Wildlife", "\(prefix)-wildlife\(suffix)"), ("AI Packs", "\(prefix)-ai-packs\(suffix)"), ] + if UITestFeatureFlags.enableFeed { + secondaryEntries.append(("Feed", "\(prefix)-feed\(suffix)")) + } + if UITestFeatureFlags.enableWildlifeIdentification { + secondaryEntries.append(("Wildlife", "\(prefix)-wildlife\(suffix)")) + } let entries: [(String, String)] switch scope { case .all: @@ -785,7 +794,7 @@ final class VisualScreenshotTests: XCTestCase { selectSidebar("Weather") capture("\(prefix)-weather-before-alerts") - if mode != .guest { + if mode != .guest && UITestFeatureFlags.enableFeed { selectSidebar("Feed") tapAndCapture(identifier: "feed_new_post_button", fallbackButton: "New Post", name: "\(prefix)-feed-compose-sheet") } @@ -843,15 +852,19 @@ final class VisualScreenshotTests: XCTestCase { resetMacSampleDataSidebar("Weather") tapElementAndCapture(identifier: "weather_alert_preferences_button", name: "93-data-weather-alert-preferences", dismissAfterCapture: false) - resetMacSampleDataSidebar("Feed") - tapElementAndCapture(identifier: "feed_comments_button_9001", name: "94-data-feed-comments-sheet") + if UITestFeatureFlags.enableFeed { + resetMacSampleDataSidebar("Feed") + tapElementAndCapture(identifier: "feed_comments_button_9001", name: "94-data-feed-comments-sheet") + } resetMacSampleDataSidebar("AI Packs") scrollToElement(identifier: "ai_packs_view_results_button", maxSwipes: 3) tapAndCapture(identifier: "ai_packs_view_results_button", fallbackButton: "View", name: "95-data-ai-packs-results-sheet") - captureMacHomeAction("Shopping List", name: "96-data-shopping-list", dismissAfterCapture: false) - tapAndCapture(identifier: "shopping_add_item_button", fallbackButton: "Add Item", name: "97-data-shopping-add-item-sheet") + if UITestFeatureFlags.enableShoppingList { + captureMacHomeAction("Shopping List", name: "96-data-shopping-list", dismissAfterCapture: false) + tapAndCapture(identifier: "shopping_add_item_button", fallbackButton: "Add Item", name: "97-data-shopping-add-item-sheet") + } } private func resetMacSampleDataSidebar(_ label: String) { diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index bcf159cdec..3c9ccf5912 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -75,6 +75,11 @@ const CHROME_CANDIDATES = [ '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge', '/Applications/Brave Browser.app/Contents/MacOS/Brave Browser', ]; +const FEATURE_FLAGS = { + enableFeed: false, + enableShoppingList: false, + enableWildlifeIdentification: false, +} as const; const IOS_SURFACES = [ 'packs', 'trips', @@ -85,11 +90,11 @@ const IOS_SURFACES = [ 'pack-templates', 'guides', 'catalog', - 'feed', 'trail-conditions', 'weather', - 'shopping-list', - 'wildlife', + ...(FEATURE_FLAGS.enableFeed ? ['feed'] : []), + ...(FEATURE_FLAGS.enableShoppingList ? ['shopping-list'] : []), + ...(FEATURE_FLAGS.enableWildlifeIdentification ? ['wildlife'] : []), ] as const; const MAC_SURFACES = [ 'home', @@ -100,12 +105,12 @@ const MAC_SURFACES = [ 'catalog', 'pack-templates', 'trail-conditions', - 'feed', 'guides', 'gear-inventory', - 'wildlife', 'ai-packs', 'season-suggestions', + ...(FEATURE_FLAGS.enableFeed ? ['feed'] : []), + ...(FEATURE_FLAGS.enableWildlifeIdentification ? ['wildlife'] : []), ] as const; const CONTACT_SHEET_GROUPS: ContactSheetGroup[] = [ { @@ -510,12 +515,17 @@ function expandedStateRequirements(platform: Platform): ScreenshotRequirement[] area: 'modal', flow: 'Weather alert preferences controls', }), - requirement('94-data-feed-comments-sheet', { - area: 'crud', - flow: 'Feed comments sheet', - }), ]; + if (FEATURE_FLAGS.enableFeed) { + common.push( + requirement('94-data-feed-comments-sheet', { + area: 'crud', + flow: 'Feed comments sheet', + }), + ); + } + if (platform === 'macos' || platform === 'ios' || platform === 'ipad') { common.push( requirement('95-data-ai-packs-results-sheet', { @@ -551,15 +561,20 @@ function expandedStateRequirements(platform: Platform): ScreenshotRequirement[] area: 'data', flow: 'Catalog item detail before adding to pack', }), - requirement('96-data-shopping-list', { - area: 'offline-local', - flow: 'Shopping list with seeded data', - }), - requirement('97-data-shopping-add-item-sheet', { - area: 'offline-local', - flow: 'Shopping list item create sheet', - }), ); + + if (FEATURE_FLAGS.enableShoppingList) { + common.push( + requirement('96-data-shopping-list', { + area: 'offline-local', + flow: 'Shopping list with seeded data', + }), + requirement('97-data-shopping-add-item-sheet', { + area: 'offline-local', + flow: 'Shopping list item create sheet', + }), + ); + } } return common; @@ -604,8 +619,13 @@ function modalSet(prefix: string, includesAccountBackedCompose: boolean): Screen area: 'crud', flow: 'Trail report create form', }), - requirement(`${prefix}-feed-compose-sheet`, { area: 'crud', flow: 'Feed compose form' }), ); + + if (FEATURE_FLAGS.enableFeed) { + requirements.push( + requirement(`${prefix}-feed-compose-sheet`, { area: 'crud', flow: 'Feed compose form' }), + ); + } } else { requirements.push( requirement('50-guest-limit-new-template', { From 21afd7575921ed4e38bd5366d0357a4eae197d64 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Sun, 31 May 2026 15:27:39 -0600 Subject: [PATCH 50/60] =?UTF-8?q?=F0=9F=8F=97=EF=B8=8F=20Generate=20Swift?= =?UTF-8?q?=20app=20config?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PackRat/Config/AppFeatureFlags.swift | 16 +++-- .../Tests/PackRatUITests/AppUITestCase.swift | 10 --- .../PackRatUITests/UITestFeatureFlags.swift | 18 +++++ .../scripts/__tests__/config-codegen.test.ts | 65 +++++++++++++++++++ .../scripts/capture-visual-screenshots.ts | 7 +- apps/swift/scripts/generate-swift-config.ts | 42 ++++++++++++ apps/swift/scripts/lib/config-codegen.ts | 40 ++++++++++++ package.json | 3 +- 8 files changed, 178 insertions(+), 23 deletions(-) create mode 100644 apps/swift/Tests/PackRatUITests/UITestFeatureFlags.swift create mode 100644 apps/swift/scripts/__tests__/config-codegen.test.ts create mode 100644 apps/swift/scripts/generate-swift-config.ts create mode 100644 apps/swift/scripts/lib/config-codegen.ts diff --git a/apps/swift/Sources/PackRat/Config/AppFeatureFlags.swift b/apps/swift/Sources/PackRat/Config/AppFeatureFlags.swift index 1ad98b070c..895e99834d 100644 --- a/apps/swift/Sources/PackRat/Config/AppFeatureFlags.swift +++ b/apps/swift/Sources/PackRat/Config/AppFeatureFlags.swift @@ -1,16 +1,18 @@ +// @generated - DO NOT EDIT +// Run `bun swift:config` to regenerate from packages/config/src/config.ts. + import Foundation enum AppFeatureFlags { - // Keep these values aligned with `packages/config/src/config.ts`. + static let enableFeed = false + static let enableLocalAI = true static let enableOAuth = true - static let enableTrips = true static let enablePackInsights = false - static let enableShoppingList = false - static let enableSharedPacks = false static let enablePackTemplates = true + static let enableSharedPacks = false + static let enableShoppingList = false static let enableTrailConditions = true - static let enableFeed = false - static let enableWildlifeIdentification = false - static let enableLocalAI = true static let enableTrails = false + static let enableTrips = true + static let enableWildlifeIdentification = false } diff --git a/apps/swift/Tests/PackRatUITests/AppUITestCase.swift b/apps/swift/Tests/PackRatUITests/AppUITestCase.swift index 7e674c1084..e756ee5218 100644 --- a/apps/swift/Tests/PackRatUITests/AppUITestCase.swift +++ b/apps/swift/Tests/PackRatUITests/AppUITestCase.swift @@ -1,15 +1,5 @@ import XCTest -enum UITestFeatureFlags { - // Keep aligned with `packages/config/src/config.ts` and Swift `AppFeatureFlags`. - static let enableTrips = true - static let enablePackTemplates = true - static let enableTrailConditions = true - static let enableFeed = false - static let enableWildlifeIdentification = false - static let enableShoppingList = false -} - // MARK: - Base class /// Base class for all PackRat UI tests. diff --git a/apps/swift/Tests/PackRatUITests/UITestFeatureFlags.swift b/apps/swift/Tests/PackRatUITests/UITestFeatureFlags.swift new file mode 100644 index 0000000000..5a99282fef --- /dev/null +++ b/apps/swift/Tests/PackRatUITests/UITestFeatureFlags.swift @@ -0,0 +1,18 @@ +// @generated - DO NOT EDIT +// Run `bun swift:config` to regenerate from packages/config/src/config.ts. + +import Foundation + +enum UITestFeatureFlags { + static let enableFeed = false + static let enableLocalAI = true + static let enableOAuth = true + static let enablePackInsights = false + static let enablePackTemplates = true + static let enableSharedPacks = false + static let enableShoppingList = false + static let enableTrailConditions = true + static let enableTrails = false + static let enableTrips = true + static let enableWildlifeIdentification = false +} diff --git a/apps/swift/scripts/__tests__/config-codegen.test.ts b/apps/swift/scripts/__tests__/config-codegen.test.ts new file mode 100644 index 0000000000..db7ad947c3 --- /dev/null +++ b/apps/swift/scripts/__tests__/config-codegen.test.ts @@ -0,0 +1,65 @@ +import { readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +import { APP_CONFIG } from '@packrat/config/config'; +import { describe, expect, it } from 'vitest'; +import { renderSwiftFeatureFlags, swiftIdentifier } from '../lib/config-codegen'; + +const repoRoot = resolve(import.meta.dirname, '../../../..'); +const sourceDescription = 'packages/config/src/config.ts'; + +describe('swiftIdentifier', () => { + it('keeps camelCase feature flag names as lower-camel Swift identifiers', () => { + expect(swiftIdentifier('enableWildlifeIdentification')).toBe('enableWildlifeIdentification'); + }); + + it('removes punctuation from generated identifiers', () => { + expect(swiftIdentifier('Enable-Trails')).toBe('enableTrails'); + }); +}); + +describe('renderSwiftFeatureFlags', () => { + it('renders a deterministic Swift enum from feature flags', () => { + expect( + renderSwiftFeatureFlags({ + enumName: 'AppFeatureFlags', + sourceDescription: 'packages/config/src/config.ts', + featureFlags: { + enableTrips: true, + enableFeed: false, + }, + }), + ).toBe(`// @generated - DO NOT EDIT +// Run \`bun swift:config\` to regenerate from packages/config/src/config.ts. + +import Foundation + +enum AppFeatureFlags { + static let enableFeed = false + static let enableTrips = true +} +`); + }); + + it('keeps generated Swift feature flag files in sync with package config', () => { + const outputs = [ + { + enumName: 'AppFeatureFlags', + path: resolve(repoRoot, 'apps/swift/Sources/PackRat/Config/AppFeatureFlags.swift'), + }, + { + enumName: 'UITestFeatureFlags', + path: resolve(repoRoot, 'apps/swift/Tests/PackRatUITests/UITestFeatureFlags.swift'), + }, + ]; + + for (const output of outputs) { + expect(readFileSync(output.path, 'utf8')).toBe( + renderSwiftFeatureFlags({ + enumName: output.enumName, + featureFlags: APP_CONFIG.featureFlags, + sourceDescription, + }), + ); + } + }); +}); diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index 3c9ccf5912..4619fbb475 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -11,6 +11,7 @@ import { } from 'node:fs'; import { basename, resolve } from 'node:path'; import { pathToFileURL } from 'node:url'; +import { APP_CONFIG } from '@packrat/config/config'; import { formatSummaryLine, readSummary, type TestSummary, XcResultError } from './lib/xcresult'; type Platform = 'ios' | 'ipad' | 'macos' | 'watch'; @@ -75,11 +76,7 @@ const CHROME_CANDIDATES = [ '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge', '/Applications/Brave Browser.app/Contents/MacOS/Brave Browser', ]; -const FEATURE_FLAGS = { - enableFeed: false, - enableShoppingList: false, - enableWildlifeIdentification: false, -} as const; +const FEATURE_FLAGS = APP_CONFIG.featureFlags; const IOS_SURFACES = [ 'packs', 'trips', diff --git a/apps/swift/scripts/generate-swift-config.ts b/apps/swift/scripts/generate-swift-config.ts new file mode 100644 index 0000000000..b8e3ae7844 --- /dev/null +++ b/apps/swift/scripts/generate-swift-config.ts @@ -0,0 +1,42 @@ +#!/usr/bin/env bun + +/** + * Generates Swift config mirrors from the canonical TypeScript app config. + * + * Run from repo root: + * bun swift:config + * + * Outputs: + * apps/swift/Sources/PackRat/Config/AppFeatureFlags.swift + * apps/swift/Tests/PackRatUITests/UITestFeatureFlags.swift + */ + +import { writeFileSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { APP_CONFIG } from '@packrat/config/config'; +import { renderSwiftFeatureFlags } from './lib/config-codegen'; + +const __dir = dirname(fileURLToPath(import.meta.url)); +const sourceDescription = 'packages/config/src/config.ts'; + +const outputs = [ + { + enumName: 'AppFeatureFlags', + path: resolve(__dir, '../Sources/PackRat/Config/AppFeatureFlags.swift'), + }, + { + enumName: 'UITestFeatureFlags', + path: resolve(__dir, '../Tests/PackRatUITests/UITestFeatureFlags.swift'), + }, +]; + +for (const output of outputs) { + const rendered = renderSwiftFeatureFlags({ + enumName: output.enumName, + featureFlags: APP_CONFIG.featureFlags, + sourceDescription, + }); + writeFileSync(output.path, rendered, 'utf8'); + console.log(`✓ Generated ${output.path.replace(`${process.cwd()}/`, '')}`); +} diff --git a/apps/swift/scripts/lib/config-codegen.ts b/apps/swift/scripts/lib/config-codegen.ts new file mode 100644 index 0000000000..253782a463 --- /dev/null +++ b/apps/swift/scripts/lib/config-codegen.ts @@ -0,0 +1,40 @@ +type FeatureFlags = Record; + +const NON_IDENTIFIER_RE = /[^A-Za-z0-9_]/g; + +export function swiftBool(value: boolean): string { + return value ? 'true' : 'false'; +} + +export function swiftIdentifier(raw: string): string { + const sanitized = raw.replace(NON_IDENTIFIER_RE, ''); + if (!sanitized) { + throw new Error(`Unable to turn "${raw}" into a Swift identifier.`); + } + return sanitized.charAt(0).toLowerCase() + sanitized.slice(1); +} + +export function renderSwiftFeatureFlags({ + enumName, + featureFlags, + sourceDescription, +}: { + enumName: string; + featureFlags: FeatureFlags; + sourceDescription: string; +}): string { + const fields = Object.entries(featureFlags) + .sort(([left], [right]) => left.localeCompare(right)) + .map(([key, value]) => ` static let ${swiftIdentifier(key)} = ${swiftBool(value)}`) + .join('\n'); + + return `// @generated - DO NOT EDIT +// Run \`bun swift:config\` to regenerate from ${sourceDescription}. + +import Foundation + +enum ${enumName} { +${fields} +} +`; +} diff --git a/package.json b/package.json index 51007fe33e..5555ab2a80 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,9 @@ "lint-unsafe": "biome check --write --unsafe", "mcp": "bun run --cwd packages/mcp dev", "mcp:deploy": "bun run --cwd packages/mcp deploy", - "swift": "cd apps/swift && xcodegen generate && bun scripts/fix-xcodeproj.ts", + "swift": "bun swift:config && cd apps/swift && xcodegen generate && bun scripts/fix-xcodeproj.ts", "swift:codegen": "swift package --package-path apps/swift/PackRatAPIClient plugin --allow-writing-to-package-directory generate-code-from-openapi && cp apps/swift/PackRatAPIClient/Sources/PackRatAPIClient/GeneratedSources/Client.swift apps/swift/Sources/PackRat/API/Client.swift && cp apps/swift/PackRatAPIClient/Sources/PackRatAPIClient/GeneratedSources/Types.swift apps/swift/Sources/PackRat/API/Types.swift", + "swift:config": "bun run apps/swift/scripts/generate-swift-config.ts", "swift:models": "bun run apps/swift/scripts/generate-swift-models.ts", "swift:quicktype": "bun run apps/swift/scripts/generate-quicktype-models.ts", "swift:screenshots": "bun run apps/swift/scripts/capture-visual-screenshots.ts", From b04a459d23c281bb23b818d7c4cdbaea70e9bd3b Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Sun, 31 May 2026 18:20:04 -0600 Subject: [PATCH 51/60] =?UTF-8?q?=E2=9C=85=20Fix=20embedding=20helper=20te?= =?UTF-8?q?st=20typing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/api/src/utils/__tests__/embeddingHelper.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/api/src/utils/__tests__/embeddingHelper.test.ts b/packages/api/src/utils/__tests__/embeddingHelper.test.ts index 23f936a546..ca50ab2b55 100644 --- a/packages/api/src/utils/__tests__/embeddingHelper.test.ts +++ b/packages/api/src/utils/__tests__/embeddingHelper.test.ts @@ -1,6 +1,8 @@ import { describe, expect, it } from 'vitest'; import { getEmbeddingText } from '../embeddingHelper'; +type ExistingEmbeddingItem = NonNullable[1]>; + // --------------------------------------------------------------------------- // Tests // --------------------------------------------------------------------------- @@ -226,7 +228,7 @@ describe('embeddingHelper', () => { const item = { name: 'Boots' }; const existingItem = { reviews: [{ title: 'Solid boot', text: 'Great grip on wet rock' }], - } as unknown as Parameters[0]['existingItem']; + } as ExistingEmbeddingItem; const result = getEmbeddingText({ item, existingItem }); expect(result).toContain('Solid boot Great grip on wet rock'); }); @@ -240,7 +242,7 @@ describe('embeddingHelper', () => { answers: [{ a: 'Yes, up to 5000m' }], }, ], - } as unknown as Parameters[0]['existingItem']; + } as ExistingEmbeddingItem; const result = getEmbeddingText({ item, existingItem }); expect(result).toContain('Does it work at altitude?'); expect(result).toContain('Yes, up to 5000m'); From 22d1ddac689c96f0eba511b931574952713b9be1 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Sun, 31 May 2026 22:44:12 -0600 Subject: [PATCH 52/60] =?UTF-8?q?=F0=9F=A7=AA=20Harden=20Swift=20visual=20?= =?UTF-8?q?catalog=20and=20local-first=20stores?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Features/Packs/PacksViewModel.swift | 9 +- .../Features/Trips/TripsViewModel.swift | 9 +- .../VisualScreenshotTests.swift | 104 +++++++++++++++--- 3 files changed, 104 insertions(+), 18 deletions(-) diff --git a/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift b/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift index b8cec9ad9b..404de863a6 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift @@ -76,7 +76,14 @@ final class PacksViewModel { writeCachePacks(fresh, context: context) } } catch { - if packs.isEmpty { self.error = error.localizedDescription } + if packs.isEmpty { + // Keep the personal store local-first: an unavailable refresh + // should not replace an otherwise usable empty local library + // with a blocking connection error. + isCacheLoaded = true + } else { + self.error = error.localizedDescription + } } } diff --git a/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift b/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift index 44f5342740..f3fb8290e2 100644 --- a/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift +++ b/apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift @@ -88,7 +88,14 @@ final class TripsViewModel { writeCacheTrips(fresh, context: context) } } catch { - if trips.isEmpty { self.error = error.localizedDescription } + if trips.isEmpty { + // Keep the personal store local-first: an unavailable refresh + // should not replace an otherwise usable empty local library + // with a blocking connection error. + isCacheLoaded = true + } else { + self.error = error.localizedDescription + } } } diff --git a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift index e5bf52655c..4df5fd375e 100644 --- a/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift +++ b/apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift @@ -580,22 +580,13 @@ final class VisualScreenshotTests: XCTestCase { destinationIdentifier: String? = nil ) { let baselineName = name.hasPrefix("home-before-") ? name : "home-before-\(name)" - captureTab("Home", name: baselineName) + openHomeForActionBaseline(name: baselineName) let identifier = "home_action_\(title.lowercased().filter { $0.isLetter || $0.isNumber })" let action = app.buttons[identifier] var visibleCandidate: XCUIElement? - if title == "Wildlife ID" { - openHomeActionUsingSearch(title: title, identifier: identifier) - capture(name) - if dismissAfterCapture { - dismissPhoneDestination() - } - return - } - - for _ in 0..<12 { + for _ in 0..<30 { if action.exists { visibleCandidate = action } @@ -620,7 +611,7 @@ final class VisualScreenshotTests: XCTestCase { smallScrollUp() } } - if let visibleCandidate, visibleCandidate.exists, actionIsClearOfBottomBar(visibleCandidate) { + if let visibleCandidate, visibleCandidate.exists, visibleCandidate.isHittable { activate(visibleCandidate) if let destinationIdentifier { let destination = app.descendants(matching: .any).matching(identifier: destinationIdentifier).firstMatch @@ -635,19 +626,37 @@ final class VisualScreenshotTests: XCTestCase { } return } - XCTFail("Expected Home action '\(title)' for screenshot \(name)") + + openHomeActionUsingSearch(title: title, identifier: identifier) + if let destinationIdentifier { + let destination = app.descendants(matching: .any).matching(identifier: destinationIdentifier).firstMatch + XCTAssertTrue( + destination.waitForExistence(timeout: 5), + "Expected Home action '\(title)' to open '\(destinationIdentifier)' for screenshot \(name)" + ) + } + capture(name) + if dismissAfterCapture { + dismissPhoneDestination() + } } private func openHomeActionUsingSearch(title: String, identifier: String) { + resetActiveHomeSearchPresentation() + let searchField = app.searchFields.firstMatch + for _ in 0..<4 where !searchField.exists { + smallScrollDown() + } XCTAssertTrue(searchField.waitForExistence(timeout: 3), "Expected Home search field before opening '\(title)'") activate(searchField) - searchField.typeText(title) - if app.keyboards.buttons["Search"].exists { + replaceHomeSearchText(title, in: searchField) + + let action = app.buttons[identifier] + if !action.waitForExistence(timeout: 2), app.keyboards.buttons["Search"].exists { app.keyboards.buttons["Search"].tap() } - let action = app.buttons[identifier] XCTAssertTrue(action.waitForExistence(timeout: 5), "Expected filtered Home action '\(title)'") activate(action) @@ -659,6 +668,69 @@ final class VisualScreenshotTests: XCTestCase { } } + private func openHomeForActionBaseline(name: String) { + let tab = app.tabBars.buttons["Home"] + XCTAssertTrue(tab.waitForExistence(timeout: 5), "Expected tab 'Home' for screenshot \(name)") + tab.tap() + resetActiveHomeSearchPresentation() + capture(name) + } + + private func replaceHomeSearchText(_ text: String, in searchField: XCUIElement) { + clearHomeSearchText(in: searchField) + searchField.typeText(text) + + guard let value = searchField.value as? String, value != text else { return } + + clearHomeSearchText(in: searchField) + searchField.typeText(text) + } + + private func clearHomeSearchText(in searchField: XCUIElement) { + activate(searchField) + + let clearButton = app.buttons.matching( + NSPredicate(format: "label == 'Clear text' OR label == 'Clear Text'") + ).firstMatch + if clearButton.waitForExistence(timeout: 0.5), clearButton.isHittable { + clearButton.tap() + return + } + + #if os(iOS) + app.typeKey("a", modifierFlags: .command) + app.typeKey(XCUIKeyboardKey.delete.rawValue, modifierFlags: []) + #else + app.typeKey("a", modifierFlags: .command) + app.typeKey(XCUIKeyboardKey.delete.rawValue, modifierFlags: []) + #endif + + if let value = searchField.value as? String, value.isEmpty || value == "Search PackRat" { + return + } + + searchField.clearAndTypeText("") + } + + private func resetActiveHomeSearchPresentation() { + #if os(iOS) + let searchField = app.searchFields.firstMatch + let isSearchOverlayActive = app.keyboards.firstMatch.exists + || (searchField.exists && searchField.frame.minY < 140) + guard isSearchOverlayActive else { return } + + for label in ["Cancel", "Close"] { + let button = app.buttons[label] + if button.exists && button.isHittable { + button.tap() + return + } + } + + app.coordinate(withNormalizedOffset: CGVector(dx: 0.91, dy: 0.105)).tap() + #endif + } + private func actionIsClearOfBottomBar(_ element: XCUIElement) -> Bool { #if os(iOS) element.frame.minY > 140 && element.frame.midY < app.frame.maxY - 170 From 7b6bac5369efbe12f66ac52cd42a15d808dd0c1a Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Sun, 31 May 2026 22:45:32 -0600 Subject: [PATCH 53/60] =?UTF-8?q?=E2=9C=85=20Use=20guard=20helpers=20in=20?= =?UTF-8?q?API=20validation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/api/src/routes/catalog/index.ts | 13 ++++--------- packages/api/src/utils/auth.ts | 3 ++- packages/api/src/utils/embeddingHelper.ts | 5 +++-- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/packages/api/src/routes/catalog/index.ts b/packages/api/src/routes/catalog/index.ts index a472087188..783d175770 100644 --- a/packages/api/src/routes/catalog/index.ts +++ b/packages/api/src/routes/catalog/index.ts @@ -9,7 +9,7 @@ import { getEnv } from '@packrat/api/utils/env-validation'; import type { CatalogEtlWorkflowParams } from '@packrat/api/workflows/catalog-etl-workflow'; import { type ChunkSpec, chunkCsvForR2 } from '@packrat/api/workflows/shared/chunkCsvForR2'; import { catalogItems, etlJobs, packItems } from '@packrat/db'; -import { isString } from '@packrat/guards'; +import { isNumber, isObject, isString } from '@packrat/guards'; import { CatalogCategoriesResponseSchema, CatalogCompareRequestSchema, @@ -614,18 +614,13 @@ export const catalogRoutes = new Elysia({ prefix: '/catalog' }) .put( '/:id', async ({ params, body }) => { - if (!body || (typeof body === 'object' && Object.keys(body).length === 0)) { + if (!body || (isObject(body) && Object.keys(body).length === 0)) { return status(400, { error: 'Validation failed' }); } - if (body && typeof body === 'object' && 'issues' in body && Array.isArray(body.issues)) { + if (isObject(body) && 'issues' in body && Array.isArray(body.issues)) { return status(400, { error: 'Validation failed' }); } - if ( - body && - typeof body === 'object' && - 'weight' in body && - (typeof body.weight !== 'number' || body.weight <= 0) - ) { + if (isObject(body) && 'weight' in body && (!isNumber(body.weight) || body.weight <= 0)) { return status(400, { error: 'Validation failed' }); } const parsed = UpdateCatalogItemRequestSchema.safeParse(body); diff --git a/packages/api/src/utils/auth.ts b/packages/api/src/utils/auth.ts index f367b487d7..a1c6814fec 100644 --- a/packages/api/src/utils/auth.ts +++ b/packages/api/src/utils/auth.ts @@ -1,4 +1,5 @@ import { getEnv } from '@packrat/api/utils/env-validation'; +import { isString } from '@packrat/guards'; import * as bcrypt from 'bcryptjs'; export async function hashPassword(password: string): Promise { @@ -26,7 +27,7 @@ export function timingSafeEqual( argsOrA: { a: string; b: string } | string, maybeB?: string, ): boolean { - const { a, b } = typeof argsOrA === 'string' ? { a: argsOrA, b: maybeB ?? '' } : argsOrA; + const { a, b } = isString(argsOrA) ? { a: argsOrA, b: maybeB ?? '' } : argsOrA; const ab = new TextEncoder().encode(a); const bb = new TextEncoder().encode(b); const len = Math.max(ab.byteLength, bb.byteLength); diff --git a/packages/api/src/utils/embeddingHelper.ts b/packages/api/src/utils/embeddingHelper.ts index 7d3ffccc39..4578387219 100644 --- a/packages/api/src/utils/embeddingHelper.ts +++ b/packages/api/src/utils/embeddingHelper.ts @@ -1,4 +1,5 @@ import type { CatalogItem, PackItem } from '@packrat/db'; +import { isObject, isString } from '@packrat/guards'; type ItemForEmbedding = Partial | Partial; @@ -23,9 +24,9 @@ export function getEmbeddingText( if (!Array.isArray(variants)) return undefined; return variants .map((variant) => { - if (!variant || typeof variant !== 'object') return undefined; + if (!isObject(variant)) return undefined; const { attribute, values } = variant as { attribute?: unknown; values?: unknown }; - if (typeof attribute !== 'string' || !attribute) return undefined; + if (!isString(attribute) || !attribute) return undefined; const vals = Array.isArray(values) ? values : [values].filter(Boolean); if (vals.length === 0) return undefined; return `${attribute}: ${vals.join(', ')}`; From 43a7184ebd1d578396565f8835d7baa5455f8309 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Sun, 31 May 2026 22:52:56 -0600 Subject: [PATCH 54/60] =?UTF-8?q?=F0=9F=A7=B9=20Align=20screenshot=20scrip?= =?UTF-8?q?ts=20with=20clean=20checks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../playwright/capture-web-screenshots.ts | 41 ++--- .../scripts/capture-visual-screenshots.ts | 150 ++++++++++++------ apps/swift/scripts/run-e2e-macos.ts | 81 ++++++---- apps/swift/scripts/run-e2e.ts | 81 ++++++---- 4 files changed, 235 insertions(+), 118 deletions(-) diff --git a/apps/expo/playwright/capture-web-screenshots.ts b/apps/expo/playwright/capture-web-screenshots.ts index ede9c7e035..03b1bc0e0a 100644 --- a/apps/expo/playwright/capture-web-screenshots.ts +++ b/apps/expo/playwright/capture-web-screenshots.ts @@ -11,8 +11,6 @@ const OUT_DIR = resolve(REPO_ROOT, 'artifacts/screenshots'); const WEB_DIR = resolve(OUT_DIR, 'web-playwright'); const CONTACT_SHEET_HTML = resolve(OUT_DIR, 'web-contact-sheet.html'); const CONTACT_SHEET_PNG = resolve(OUT_DIR, 'web-contact-sheet.png'); -const SORT_PREFIX_RE = /^\d+-/; -const WORD_START_RE = /\b\w/g; rmSync(WEB_DIR, { recursive: true, force: true }); mkdirSync(WEB_DIR, { recursive: true }); @@ -53,10 +51,11 @@ async function renderContactSheet() { const cards = screenshots .map((file) => { const src = pathToFileURL(file).href; - const label = basename(file, '.png') - .replace(SORT_PREFIX_RE, '') + const label = stripSortPrefix(basename(file, '.png')) .replaceAll('-', ' ') - .replace(WORD_START_RE, (char) => char.toUpperCase()); + .split(' ') + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' '); return `

${escapeHtml(label)}
`; }) .join('\n'); @@ -98,18 +97,22 @@ function estimateHeight(screenshots: string[]): number { } function escapeHtml(value: string): string { - return value.replace(/[&<>"']/g, (char) => { - switch (char) { - case '&': - return '&'; - case '<': - return '<'; - case '>': - return '>'; - case '"': - return '"'; - default: - return '''; - } - }); + return Array.from(value, (char) => { + if (char === '&') return '&'; + if (char === '<') return '<'; + if (char === '>') return '>'; + if (char === '"') return '"'; + if (char === "'") return '''; + return char; + }).join(''); +} + +function stripSortPrefix(value: string): string { + let index = 0; + while (index < value.length) { + const code = value.charCodeAt(index); + if (code < 48 || code > 57) break; + index += 1; + } + return value.charAt(index) === '-' ? value.slice(index + 1) : value; } diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index 4619fbb475..15dae05136 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -12,6 +12,16 @@ import { import { basename, resolve } from 'node:path'; import { pathToFileURL } from 'node:url'; import { APP_CONFIG } from '@packrat/config/config'; +import { + anyOf, + caseInsensitive, + charIn, + charNotIn, + createRegExp, + exactly, + global as globalFlag, + oneOrMore, +} from 'magic-regexp'; import { formatSummaryLine, readSummary, type TestSummary, XcResultError } from './lib/xcresult'; type Platform = 'ios' | 'ipad' | 'macos' | 'watch'; @@ -53,14 +63,21 @@ const REPO_ROOT = resolve(import.meta.dir, '../../..'); const SWIFT_DIR = resolve(REPO_ROOT, 'apps/swift'); const RESULTS_DIR = resolve(SWIFT_DIR, 'TestResults'); const DEFAULT_OUT_DIR = resolve(REPO_ROOT, 'artifacts/screenshots'); -const HTML_ESCAPE_RE = /[&<>"']/g; -const QUOTE_RE = /^["']|["']$/g; -const LEADING_DIGIT_RE = /^\d/; -const SCREENSHOT_PREFIX_RE = /^\d+[a-z]?-/i; -const XCT_ATTACHMENT_SUFFIX_RE = /_\d+_[0-9A-F-]+\.png$/i; -const DATA_DETAIL_SCREENSHOT_RE = /^7[1-9]-data-/; -const SIPS_PIXEL_WIDTH_RE = /pixelWidth:\s*(\d+)/; -const SIPS_PIXEL_HEIGHT_RE = /pixelHeight:\s*(\d+)/; +const EMAIL_RE = createRegExp( + oneOrMore(charIn('A-Z0-9._%+-')), + '@', + oneOrMore(charIn('A-Z0-9.-')), + '.', + oneOrMore(charIn('A-Z')), + [globalFlag, caseInsensitive], +); +const SECRET_BUILD_SETTING_RE = createRegExp( + 'PACKRAT_E2E_', + anyOf('EMAIL', 'PASSWORD', 'SESSION_TOKEN', 'USER_ID'), + '=', + oneOrMore(charNotIn(' \t\n\r')), + [globalFlag], +); const XCODEBUILD_TIMEOUT_MS = durationFromEnv('PACKRAT_VISUAL_XCODEBUILD_TIMEOUT_MS', 30 * 60_000); const XCRESULT_EXPORT_TIMEOUT_MS = durationFromEnv('PACKRAT_XCRESULT_EXPORT_TIMEOUT_MS', 90_000); const AUTOMATION_MODE_TIMEOUT_MS = 10_000; @@ -155,9 +172,7 @@ const CONTACT_SHEET_GROUPS: ContactSheetGroup[] = [ suffix: 'detail', title: 'Authenticated Detail Screens', matches: (fileName) => - DATA_DETAIL_SCREENSHOT_RE.test(fileName) || - fileName.startsWith('8') || - fileName.startsWith('9'), + isDataDetailScreenshot(fileName) || fileName.startsWith('8') || fileName.startsWith('9'), }, { suffix: 'expanded', @@ -290,10 +305,6 @@ function durationFromEnv(name: string, fallback: number): number { return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback; } -function escapeRegExp(value: string): string { - return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); -} - function redactSecrets(output: string): string { let redacted = output; for (const secret of [ @@ -307,13 +318,13 @@ function redactSecrets(output: string): string { process.env.PACKRAT_E2E_USER_ID, ]) { if (!secret) continue; - redacted = redacted.replace(new RegExp(escapeRegExp(secret), 'g'), '[REDACTED]'); + redacted = redacted.split(secret).join('[REDACTED]'); } - redacted = redacted.replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi, '[REDACTED_EMAIL]'); - redacted = redacted.replace( - /PACKRAT_E2E_(?:EMAIL|PASSWORD|SESSION_TOKEN|USER_ID)=\S+/g, - (match) => `${match.slice(0, match.indexOf('=') + 1)}[REDACTED]`, - ); + redacted = redacted.replace(EMAIL_RE, '[REDACTED_EMAIL]'); + redacted = redacted.replace(SECRET_BUILD_SETTING_RE, (match) => { + const equalsIndex = match.indexOf('='); + return `${match.slice(0, equalsIndex + 1)}[REDACTED]`; + }); return redacted; } @@ -708,7 +719,7 @@ function loadEnvFile(envFile: string): void { const value = trimmed .slice(eq + 1) .trim() - .replace(QUOTE_RE, ''); + .replace(createRegExp(anyOf(exactly('"'), exactly("'")), [globalFlag]), ''); if (process.env[key] === undefined) process.env[key] = value; } } @@ -1203,8 +1214,8 @@ function exportScreenshotsFromResultBundle(resultBundle: string, toDir: string): function stableAttachmentName(suggestedName: string | undefined): string | null { if (!suggestedName?.toLowerCase().endsWith('.png')) return null; - const stable = suggestedName.replace(XCT_ATTACHMENT_SUFFIX_RE, '.png'); - return LEADING_DIGIT_RE.test(stable) ? stable : null; + const stable = stripXctAttachmentSuffix(suggestedName); + return startsWithDigit(stable) ? stable : null; } type AttachmentManifestEntry = { @@ -1292,36 +1303,27 @@ function listScreenshots(dir: string): string[] { if (!existsSync(dir)) return []; return readdirSync(dir) .filter((file) => file.toLowerCase().endsWith('.png')) - .filter((file) => LEADING_DIGIT_RE.test(file)) + .filter(startsWithDigit) .sort((a, b) => a.localeCompare(b)) .map((file) => resolve(dir, file)); } function humanize(filePath: string): string { - return basename(filePath, '.png') - .replace(SCREENSHOT_PREFIX_RE, '') + return stripScreenshotPrefix(basename(filePath, '.png')) .split('-') .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) .join(' '); } function escapeHtml(value: string): string { - return value.replace(HTML_ESCAPE_RE, (char) => { - switch (char) { - case '&': - return '&'; - case '<': - return '<'; - case '>': - return '>'; - case '"': - return '"'; - case "'": - return '''; - default: - return char; - } - }); + return Array.from(value, (char) => { + if (char === '&') return '&'; + if (char === '<') return '<'; + if (char === '>') return '>'; + if (char === '"') return '"'; + if (char === "'") return '''; + return char; + }).join(''); } function buildHtml({ @@ -1562,12 +1564,70 @@ function readImageSize(image: string): { width: number; height: number } | null timeout: IMAGE_SIZE_TIMEOUT_MS, }); if (result.status !== 0) return null; - const width = result.stdout.match(SIPS_PIXEL_WIDTH_RE)?.[1]; - const height = result.stdout.match(SIPS_PIXEL_HEIGHT_RE)?.[1]; + const width = readSipsDimension(result.stdout, 'pixelWidth'); + const height = readSipsDimension(result.stdout, 'pixelHeight'); if (!width || !height) return null; return { width: Number(width), height: Number(height) }; } +function startsWithDigit(value: string): boolean { + const first = value.charCodeAt(0); + return first >= 48 && first <= 57; +} + +function stripScreenshotPrefix(value: string): string { + let index = 0; + while (index < value.length && isDigit(value.charCodeAt(index))) index += 1; + if (index < value.length && isAsciiLetter(value.charCodeAt(index))) index += 1; + return value.charAt(index) === '-' ? value.slice(index + 1) : value; +} + +function stripXctAttachmentSuffix(value: string): string { + if (!value.toLowerCase().endsWith('.png')) return value; + const withoutExtension = value.slice(0, -4); + const secondUnderscore = withoutExtension.lastIndexOf('_'); + if (secondUnderscore === -1) return value; + const firstUnderscore = withoutExtension.lastIndexOf('_', secondUnderscore - 1); + if (firstUnderscore === -1) return value; + const ordinal = withoutExtension.slice(firstUnderscore + 1, secondUnderscore); + const identifier = withoutExtension.slice(secondUnderscore + 1); + if (!ordinal || !Array.from(ordinal).every((char) => isDigit(char.charCodeAt(0)))) return value; + if (!identifier || !Array.from(identifier).every(isHexOrDash)) return value; + return `${withoutExtension.slice(0, firstUnderscore)}.png`; +} + +function isDataDetailScreenshot(fileName: string): boolean { + return ( + fileName.length > 8 && + fileName.charAt(0) === '7' && + fileName.charCodeAt(1) >= 49 && + fileName.charCodeAt(1) <= 57 && + fileName.startsWith('-data-', 2) + ); +} + +function readSipsDimension(stdout: string, key: 'pixelWidth' | 'pixelHeight'): string | undefined { + const prefix = `${key}:`; + const line = stdout + .split('\n') + .map((entry) => entry.trim()) + .find((entry) => entry.startsWith(prefix)); + return line?.slice(prefix.length).trim(); +} + +function isDigit(code: number): boolean { + return code >= 48 && code <= 57; +} + +function isAsciiLetter(code: number): boolean { + return (code >= 65 && code <= 90) || (code >= 97 && code <= 122); +} + +function isHexOrDash(char: string): boolean { + const code = char.charCodeAt(0); + return char === '-' || isDigit(code) || (code >= 65 && code <= 70) || (code >= 97 && code <= 102); +} + function formatError(err: unknown): string { return err instanceof Error ? err.message : String(err); } diff --git a/apps/swift/scripts/run-e2e-macos.ts b/apps/swift/scripts/run-e2e-macos.ts index 3a07852c33..8598ce489b 100644 --- a/apps/swift/scripts/run-e2e-macos.ts +++ b/apps/swift/scripts/run-e2e-macos.ts @@ -24,6 +24,15 @@ import { createHash } from 'node:crypto'; */ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; import { resolve } from 'node:path'; +import { + anyOf, + caseInsensitive, + charIn, + createRegExp, + global as globalFlag, + maybe, + oneOrMore, +} from 'magic-regexp'; import { ArgsError } from './lib/args'; import { normalizeMacOSTestSelectors, parseMacOSArgs } from './lib/macos-args'; import { formatSummaryLine, readSummary, XcResultError } from './lib/xcresult'; @@ -35,15 +44,22 @@ const SCHEME_PATH = resolve( 'PackRat.xcodeproj/xcshareddata/xcschemes/PackRat-macOS.xcscheme', ); const RESULTS_DIR = resolve(SWIFT_DIR, 'TestResults'); - -const QUOTE_RE = /^["']|["']$/g; -const ENV_BLOCK_RE = /\s*[\s\S]*?<\/EnvironmentVariables>/g; -const TEST_ACTION_INHERIT_RE = /(]*?)shouldUseLaunchSchemeArgsEnv\s*=\s*"YES"/; -const AMP_RE = /&/g; -const LT_RE = //g; -const DQUOTE_RE = /"/g; -const SQUOTE_RE = /'/g; +const EMAIL_RE = createRegExp( + oneOrMore(charIn('A-Z0-9._%+-')), + '@', + oneOrMore(charIn('A-Z0-9.-')), + '.', + oneOrMore(charIn('A-Z')), + [globalFlag, caseInsensitive], +); +const LOOSE_EMAIL_RE = createRegExp( + oneOrMore(charIn('A-Z0-9._%+-')), + '@', + oneOrMore(charIn('A-Z0-9._%+-')), + maybe(anyOf('...', oneOrMore(charIn('A-Z0-9.-')))), + [globalFlag, caseInsensitive], +); +const QUOTE_RE = createRegExp(anyOf('"', "'"), [globalFlag]); function loadEnvFile(path: string, override = false): void { if (!existsSync(path)) return; @@ -101,12 +117,14 @@ function assertAutomationModeAvailable(): void { } function escapeXml(s: string): string { - return s - .replace(AMP_RE, '&') - .replace(LT_RE, '<') - .replace(GT_RE, '>') - .replace(DQUOTE_RE, '"') - .replace(SQUOTE_RE, '''); + return Array.from(s, (char) => { + if (char === '&') return '&'; + if (char === '<') return '<'; + if (char === '>') return '>'; + if (char === '"') return '"'; + if (char === "'") return '''; + return char; + }).join(''); } function deriveLocalE2ESessionToken(): string | undefined { @@ -139,8 +157,11 @@ function environmentVariableXml(key: string, value: string): string { function injectScheme({ email, password, sessionToken, userId }: SchemeEnv): void { let content = readFileSync(SCHEME_PATH, 'utf8'); - content = content.replace(ENV_BLOCK_RE, ''); - content = content.replace(TEST_ACTION_INHERIT_RE, '$1shouldUseLaunchSchemeArgsEnv = "NO"'); + content = removeEnvironmentVariablesBlock(content); + content = content.replace( + 'shouldUseLaunchSchemeArgsEnv = "YES"', + 'shouldUseLaunchSchemeArgsEnv = "NO"', + ); const variables = [ environmentVariableXml('E2E_EMAIL', email), environmentVariableXml('E2E_PASSWORD', password), @@ -161,6 +182,19 @@ function injectScheme({ email, password, sessionToken, userId }: SchemeEnv): voi writeFileSync(SCHEME_PATH, content); } +function removeEnvironmentVariablesBlock(content: string): string { + let output = content; + while (true) { + const start = output.indexOf(''); + if (start === -1) return output; + const end = output.indexOf('', start); + if (end === -1) return output; + const removalStart = output.lastIndexOf('\n', start); + const removalEnd = end + ''.length; + output = `${output.slice(0, removalStart === -1 ? start : removalStart)}${output.slice(removalEnd)}`; + } +} + function allocateResultBundle(): string { if (!existsSync(RESULTS_DIR)) mkdirSync(RESULTS_DIR, { recursive: true }); const stamp = new Date().toISOString().replaceAll(':', '-').replaceAll('.', '-'); @@ -231,10 +265,6 @@ const args = [ `PACKRAT_ENV=${PACKRAT_ENV}`, ]; -function escapeRegExp(s: string): string { - return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); -} - function redactSecrets(output: string): string { let redacted = output; for (const secret of [ @@ -246,14 +276,11 @@ function redactSecrets(output: string): string { localE2ESessionToken, ]) { if (secret) { - redacted = redacted.replace(new RegExp(escapeRegExp(secret), 'g'), '[REDACTED]'); + redacted = redacted.split(secret).join('[REDACTED]'); } } - redacted = redacted.replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi, '[REDACTED_EMAIL]'); - redacted = redacted.replace( - /[A-Z0-9._%+-]+@[A-Z0-9._%+-]+(?:\.\.\.|[A-Z0-9.-]*)?/gi, - '[REDACTED_EMAIL]', - ); + redacted = redacted.replace(EMAIL_RE, '[REDACTED_EMAIL]'); + redacted = redacted.replace(LOOSE_EMAIL_RE, '[REDACTED_EMAIL]'); return redacted; } diff --git a/apps/swift/scripts/run-e2e.ts b/apps/swift/scripts/run-e2e.ts index de825f6b50..94e6d11499 100644 --- a/apps/swift/scripts/run-e2e.ts +++ b/apps/swift/scripts/run-e2e.ts @@ -22,6 +22,15 @@ import { createHash } from 'node:crypto'; */ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; import { resolve } from 'node:path'; +import { + anyOf, + caseInsensitive, + charIn, + createRegExp, + global as globalFlag, + maybe, + oneOrMore, +} from 'magic-regexp'; import { ArgsError, parseArgs } from './lib/args'; import { listBootedIOS } from './lib/simctl'; import { formatSummaryLine, readSummary, XcResultError } from './lib/xcresult'; @@ -33,15 +42,22 @@ const SCHEME_PATH = resolve( 'PackRat.xcodeproj/xcshareddata/xcschemes/PackRat-iOS.xcscheme', ); const RESULTS_DIR = resolve(SWIFT_DIR, 'TestResults'); - -const QUOTE_RE = /^["']|["']$/g; -const ENV_BLOCK_RE = /\s*[\s\S]*?<\/EnvironmentVariables>/g; -const TEST_ACTION_INHERIT_RE = /(]*?)shouldUseLaunchSchemeArgsEnv\s*=\s*"YES"/; -const AMP_RE = /&/g; -const LT_RE = //g; -const DQUOTE_RE = /"/g; -const SQUOTE_RE = /'/g; +const EMAIL_RE = createRegExp( + oneOrMore(charIn('A-Z0-9._%+-')), + '@', + oneOrMore(charIn('A-Z0-9.-')), + '.', + oneOrMore(charIn('A-Z')), + [globalFlag, caseInsensitive], +); +const LOOSE_EMAIL_RE = createRegExp( + oneOrMore(charIn('A-Z0-9._%+-')), + '@', + oneOrMore(charIn('A-Z0-9._%+-')), + maybe(anyOf('...', oneOrMore(charIn('A-Z0-9.-')))), + [globalFlag, caseInsensitive], +); +const QUOTE_RE = createRegExp(anyOf('"', "'"), [globalFlag]); // ── Load .env.local ─────────────────────────────────────────────────────────── @@ -83,12 +99,14 @@ if (!existsSync(SCHEME_PATH)) { // ── Inject credentials into scheme ─────────────────────────────────────────── function escapeXml(s: string): string { - return s - .replace(AMP_RE, '&') - .replace(LT_RE, '<') - .replace(GT_RE, '>') - .replace(DQUOTE_RE, '"') - .replace(SQUOTE_RE, '''); + return Array.from(s, (char) => { + if (char === '&') return '&'; + if (char === '<') return '<'; + if (char === '>') return '>'; + if (char === '"') return '"'; + if (char === "'") return '''; + return char; + }).join(''); } function deriveLocalE2ESessionToken(): string | undefined { @@ -123,10 +141,13 @@ function injectScheme({ email, password, sessionToken, userId }: SchemeEnv): voi let content = readFileSync(SCHEME_PATH, 'utf8'); // Strip any prior EnvironmentVariables block (idempotent re-runs). - content = content.replace(ENV_BLOCK_RE, ''); + content = removeEnvironmentVariablesBlock(content); // Force TestAction to use its own env vars rather than inheriting from Run. - content = content.replace(TEST_ACTION_INHERIT_RE, '$1shouldUseLaunchSchemeArgsEnv = "NO"'); + content = content.replace( + 'shouldUseLaunchSchemeArgsEnv = "YES"', + 'shouldUseLaunchSchemeArgsEnv = "NO"', + ); const variables = [ environmentVariableXml('E2E_EMAIL', email), @@ -151,6 +172,19 @@ function injectScheme({ email, password, sessionToken, userId }: SchemeEnv): voi writeFileSync(SCHEME_PATH, content); } +function removeEnvironmentVariablesBlock(content: string): string { + let output = content; + while (true) { + const start = output.indexOf(''); + if (start === -1) return output; + const end = output.indexOf('', start); + if (end === -1) return output; + const removalStart = output.lastIndexOf('\n', start); + const removalEnd = end + ''.length; + output = `${output.slice(0, removalStart === -1 ? start : removalStart)}${output.slice(removalEnd)}`; + } +} + // ── Pick destination ───────────────────────────────────────────────────────── function pickDestination(): string { @@ -225,10 +259,6 @@ const args = [ `PACKRAT_ENV=${PACKRAT_ENV}`, ]; -function escapeRegExp(s: string): string { - return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); -} - function redactSecrets(output: string): string { let redacted = output; for (const secret of [ @@ -240,14 +270,11 @@ function redactSecrets(output: string): string { localE2ESessionToken, ]) { if (secret) { - redacted = redacted.replace(new RegExp(escapeRegExp(secret), 'g'), '[REDACTED]'); + redacted = redacted.split(secret).join('[REDACTED]'); } } - redacted = redacted.replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi, '[REDACTED_EMAIL]'); - redacted = redacted.replace( - /[A-Z0-9._%+-]+@[A-Z0-9._%+-]+(?:\.\.\.|[A-Z0-9.-]*)?/gi, - '[REDACTED_EMAIL]', - ); + redacted = redacted.replace(EMAIL_RE, '[REDACTED_EMAIL]'); + redacted = redacted.replace(LOOSE_EMAIL_RE, '[REDACTED_EMAIL]'); return redacted; } From be6b077aacf2d7f7caccfc76b91e83a012358a3b Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Sun, 31 May 2026 22:55:52 -0600 Subject: [PATCH 55/60] =?UTF-8?q?=F0=9F=A7=B9=20Migrate=20Swift=20scripts?= =?UTF-8?q?=20to=20env=20shim?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scripts/capture-visual-screenshots.ts | 43 ++++++++++++------- apps/swift/scripts/watch-sync-smoke.ts | 11 ++--- packages/env/src/node.ts | 24 +++++++++++ 3 files changed, 57 insertions(+), 21 deletions(-) diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index 15dae05136..f7e17e0cbd 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -12,6 +12,7 @@ import { import { basename, resolve } from 'node:path'; import { pathToFileURL } from 'node:url'; import { APP_CONFIG } from '@packrat/config/config'; +import { nodeEnv } from '@packrat/env/node'; import { anyOf, caseInsensitive, @@ -299,23 +300,33 @@ function requirement( } function durationFromEnv(name: string, fallback: number): number { - const raw = process.env[name]; + const raw = nodeScriptEnv(name) ?? Bun.env[name]; if (!raw) return fallback; const parsed = Number(raw); return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback; } +function nodeScriptEnv(name: string): string | undefined { + if (name === 'PACKRAT_VISUAL_XCODEBUILD_TIMEOUT_MS') { + return nodeEnv.PACKRAT_VISUAL_XCODEBUILD_TIMEOUT_MS; + } + if (name === 'PACKRAT_XCRESULT_EXPORT_TIMEOUT_MS') { + return nodeEnv.PACKRAT_XCRESULT_EXPORT_TIMEOUT_MS; + } + return undefined; +} + function redactSecrets(output: string): string { let redacted = output; for (const secret of [ - process.env.E2E_EMAIL, - process.env.E2E_PASSWORD, - process.env.E2E_TEST_EMAIL, - process.env.E2E_TEST_PASSWORD, - process.env.PACKRAT_E2E_EMAIL, - process.env.PACKRAT_E2E_PASSWORD, - process.env.PACKRAT_E2E_SESSION_TOKEN, - process.env.PACKRAT_E2E_USER_ID, + Bun.env.E2E_EMAIL, + Bun.env.E2E_PASSWORD, + Bun.env.E2E_TEST_EMAIL, + Bun.env.E2E_TEST_PASSWORD, + Bun.env.PACKRAT_E2E_EMAIL, + Bun.env.PACKRAT_E2E_PASSWORD, + Bun.env.PACKRAT_E2E_SESSION_TOKEN, + Bun.env.PACKRAT_E2E_USER_ID, ]) { if (!secret) continue; redacted = redacted.split(secret).join('[REDACTED]'); @@ -720,7 +731,7 @@ function loadEnvFile(envFile: string): void { .slice(eq + 1) .trim() .replace(createRegExp(anyOf(exactly('"'), exactly("'")), [globalFlag]), ''); - if (process.env[key] === undefined) process.env[key] = value; + if (Bun.env[key] === undefined) Bun.env[key] = value; } } @@ -837,8 +848,8 @@ function runXcodeVisualTest(platform: Platform, screenshotDir: string): Promise< const child = spawn('xcodebuild', args, { cwd: SWIFT_DIR, env: { - ...process.env, - PACKRAT_ENV: process.env.PACKRAT_ENV ?? 'local', + ...Bun.env, + PACKRAT_ENV: Bun.env.PACKRAT_ENV ?? nodeEnv.PACKRAT_ENV ?? 'local', PACKRAT_SCREENSHOT_DIR: writableScreenshotDir, PACKRAT_VISUAL_PLATFORM: platform, }, @@ -1105,7 +1116,7 @@ function runChecked(options: { }): void { const result = spawnSync(options.command, options.args, { cwd: options.cwd, - env: { ...process.env, ...options.env }, + env: { ...Bun.env, ...options.env }, encoding: 'utf8', timeout: options.timeout, maxBuffer: 20 * 1024 * 1024, @@ -1144,7 +1155,7 @@ async function launchWatchRouteWithRetry(options: { ], { cwd: SWIFT_DIR, - env: { ...process.env, ...env }, + env: { ...Bun.env, ...env }, encoding: 'utf8', timeout: 30_000, maxBuffer: 20 * 1024 * 1024, @@ -1228,8 +1239,8 @@ type AttachmentManifestAttachment = { }; function e2eBuildSettings(): string[] { - const email = process.env.E2E_TEST_EMAIL ?? process.env.E2E_EMAIL; - const password = process.env.E2E_TEST_PASSWORD ?? process.env.E2E_PASSWORD; + const email = Bun.env.E2E_TEST_EMAIL ?? Bun.env.E2E_EMAIL; + const password = Bun.env.E2E_TEST_PASSWORD ?? Bun.env.E2E_PASSWORD; if (!email || !password) { console.warn( 'Warning: E2E_EMAIL/E2E_PASSWORD are not set; authenticated screenshot test will be skipped.', diff --git a/apps/swift/scripts/watch-sync-smoke.ts b/apps/swift/scripts/watch-sync-smoke.ts index d14406653c..4429913d60 100644 --- a/apps/swift/scripts/watch-sync-smoke.ts +++ b/apps/swift/scripts/watch-sync-smoke.ts @@ -2,6 +2,7 @@ import { execFileSync, spawnSync } from 'node:child_process'; import { copyFileSync, existsSync, mkdirSync, rmSync } from 'node:fs'; import { resolve } from 'node:path'; +import { nodeEnv } from '@packrat/env/node'; type PairDevice = { name: string; @@ -20,7 +21,7 @@ const SWIFT_DIR = resolve(REPO_ROOT, 'apps/swift'); const ARTIFACT_DIR = resolve(REPO_ROOT, 'artifacts/screenshots-latest'); const IOS_BUNDLE_ID = 'com.andrewbierman.packrat'; const WATCH_BUNDLE_ID = 'com.andrewbierman.packrat.watchkitapp'; -const WAIT_MS = Number(process.env.PACKRAT_WATCH_SYNC_WAIT_MS ?? 45_000); +const WAIT_MS = Number(nodeEnv.PACKRAT_WATCH_SYNC_WAIT_MS ?? 45_000); // biome-ignore lint/complexity/useMaxParams: command wrappers read like shell invocations. function run( @@ -30,7 +31,7 @@ function run( ) { const result = spawnSync(command, args, { cwd: SWIFT_DIR, - env: { ...process.env, ...options.env }, + env: { ...Bun.env, ...options.env }, encoding: 'utf8', stdio: options.allowFailure || options.quiet ? 'pipe' : 'inherit', }); @@ -46,7 +47,7 @@ function output(command: string, args: string[]): string { return execFileSync(command, args, { cwd: SWIFT_DIR, encoding: 'utf8', - env: process.env, + env: Bun.env, }).trim(); } @@ -230,8 +231,8 @@ async function waitForWatchSnapshot(watchId: string, timeoutMs: number): Promise async function main() { mkdirSync(ARTIFACT_DIR, { recursive: true }); const pair = activePair(); - const phoneId = process.env.PACKRAT_WATCH_SYNC_PHONE_ID ?? pair.phone.udid; - const watchId = process.env.PACKRAT_WATCH_SYNC_WATCH_ID ?? pair.watch.udid; + const phoneId = nodeEnv.PACKRAT_WATCH_SYNC_PHONE_ID ?? pair.phone.udid; + const watchId = nodeEnv.PACKRAT_WATCH_SYNC_WATCH_ID ?? pair.watch.udid; const phoneDestination = `platform=iOS Simulator,id=${phoneId}`; const watchDestination = `platform=watchOS Simulator,id=${watchId}`; diff --git a/packages/env/src/node.ts b/packages/env/src/node.ts index 83be509747..51a7e1a539 100644 --- a/packages/env/src/node.ts +++ b/packages/env/src/node.ts @@ -73,8 +73,20 @@ export const nodeEnvSchema = z.object({ DEBUG: z.string().optional(), // ── E2E test credentials ────────────────────────────────────────── + E2E_EMAIL: z.string().email().optional(), + E2E_PASSWORD: z.string().min(1).optional(), E2E_TEST_EMAIL: z.string().email().optional(), E2E_TEST_PASSWORD: z.string().min(1).optional(), + PACKRAT_E2E_EMAIL: z.string().email().optional(), + PACKRAT_E2E_PASSWORD: z.string().min(1).optional(), + PACKRAT_E2E_SESSION_TOKEN: z.string().min(1).optional(), + PACKRAT_E2E_USER_ID: z.string().min(1).optional(), + PACKRAT_ENV: z.string().min(1).optional(), + PACKRAT_VISUAL_XCODEBUILD_TIMEOUT_MS: z.string().regex(/^\d+$/).optional(), + PACKRAT_XCRESULT_EXPORT_TIMEOUT_MS: z.string().regex(/^\d+$/).optional(), + PACKRAT_WATCH_SYNC_WAIT_MS: z.string().regex(/^\d+$/).optional(), + PACKRAT_WATCH_SYNC_PHONE_ID: z.string().min(1).optional(), + PACKRAT_WATCH_SYNC_WATCH_ID: z.string().min(1).optional(), }); export type NodeEnv = z.infer; @@ -109,6 +121,18 @@ export const nodeEnv = nodeEnvSchema.parse({ VITEST: process.env.VITEST, PACKRAT_API_URL: process.env.PACKRAT_API_URL, DEBUG: process.env.DEBUG, + E2E_EMAIL: process.env.E2E_EMAIL, + E2E_PASSWORD: process.env.E2E_PASSWORD, E2E_TEST_EMAIL: process.env.E2E_TEST_EMAIL, E2E_TEST_PASSWORD: process.env.E2E_TEST_PASSWORD, + PACKRAT_E2E_EMAIL: process.env.PACKRAT_E2E_EMAIL, + PACKRAT_E2E_PASSWORD: process.env.PACKRAT_E2E_PASSWORD, + PACKRAT_E2E_SESSION_TOKEN: process.env.PACKRAT_E2E_SESSION_TOKEN, + PACKRAT_E2E_USER_ID: process.env.PACKRAT_E2E_USER_ID, + PACKRAT_ENV: process.env.PACKRAT_ENV, + PACKRAT_VISUAL_XCODEBUILD_TIMEOUT_MS: process.env.PACKRAT_VISUAL_XCODEBUILD_TIMEOUT_MS, + PACKRAT_XCRESULT_EXPORT_TIMEOUT_MS: process.env.PACKRAT_XCRESULT_EXPORT_TIMEOUT_MS, + PACKRAT_WATCH_SYNC_WAIT_MS: process.env.PACKRAT_WATCH_SYNC_WAIT_MS, + PACKRAT_WATCH_SYNC_PHONE_ID: process.env.PACKRAT_WATCH_SYNC_PHONE_ID, + PACKRAT_WATCH_SYNC_WATCH_ID: process.env.PACKRAT_WATCH_SYNC_WATCH_ID, }); From f3e2b482b01fbf48d9b2245585d5593317f92696 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Sun, 31 May 2026 22:56:38 -0600 Subject: [PATCH 56/60] =?UTF-8?q?=F0=9F=A7=B9=20Sort=20package=20scripts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/expo/package.json | 2 +- package.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/expo/package.json b/apps/expo/package.json index fea4588c63..0f4705f0bf 100644 --- a/apps/expo/package.json +++ b/apps/expo/package.json @@ -30,13 +30,13 @@ "format": "biome format --write", "ios": "APP_VARIANT=development expo run:ios", "lint": "biome check --write", + "screenshots:web": "bun run playwright/capture-web-screenshots.ts", "start": "APP_VARIANT=development EXPO_UNSTABLE_WEB_MODAL=1 expo start", "submit:android": "eas submit --platform android", "submit:ios": "eas submit --platform ios", "test": "vitest run", "test:coverage": "vitest run --coverage", "test:web": "playwright test --config playwright/playwright.config.ts", - "screenshots:web": "bun run playwright/capture-web-screenshots.ts", "test:web:ui": "playwright test --config playwright/playwright.config.ts --ui", "update:development": "APP_VARIANT=development eas update --branch development --environment development", "update:preview": "APP_VARIANT=preview eas update --branch preview --environment preview", diff --git a/package.json b/package.json index 5555ab2a80..e0e62a9923 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,6 @@ "swift:screenshots": "bun run apps/swift/scripts/capture-visual-screenshots.ts", "swift:validate-assets": "bun run apps/swift/scripts/validate-app-store-assets.ts", "swift:watch-sync-smoke": "bun run apps/swift/scripts/watch-sync-smoke.ts", - "web:screenshots": "bun run --cwd apps/expo screenshots:web", "test:api:unit": "vitest run --config packages/api/vitest.unit.config.ts", "test:e2e:android": "bash .github/scripts/e2e.sh android", "test:e2e:ios": "bash .github/scripts/e2e.sh ios", @@ -63,10 +62,11 @@ "test:guides": "vitest run --config apps/guides/vitest.config.ts", "test:landing": "vitest run --config apps/landing/vitest.config.ts", "test:mcp": "bun run --cwd packages/mcp test", - "test:swift:scripts": "vitest run --config apps/swift/vitest.config.ts", "test:scripts": "vitest run --config scripts/vitest.config.ts", + "test:swift:scripts": "vitest run --config apps/swift/vitest.config.ts", "trails": "bun run --cwd apps/trails dev", - "web": "bun run --cwd apps/web dev" + "web": "bun run --cwd apps/web dev", + "web:screenshots": "bun run --cwd apps/expo screenshots:web" }, "overrides": { "@packrat-ai/nativewindui": "2.0.3-2", From 15b927b653c9cae59efef1abda4c4dcad8629af4 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Sun, 31 May 2026 22:59:01 -0600 Subject: [PATCH 57/60] =?UTF-8?q?=E2=9C=85=20Validate=20Swift=20screenshot?= =?UTF-8?q?=20JSON?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scripts/capture-visual-screenshots.ts | 28 +++++++++++----- apps/swift/scripts/lib/app-store-assets.ts | 33 ++++++++++++------- 2 files changed, 41 insertions(+), 20 deletions(-) diff --git a/apps/swift/scripts/capture-visual-screenshots.ts b/apps/swift/scripts/capture-visual-screenshots.ts index f7e17e0cbd..9984962ca8 100644 --- a/apps/swift/scripts/capture-visual-screenshots.ts +++ b/apps/swift/scripts/capture-visual-screenshots.ts @@ -13,6 +13,7 @@ import { basename, resolve } from 'node:path'; import { pathToFileURL } from 'node:url'; import { APP_CONFIG } from '@packrat/config/config'; import { nodeEnv } from '@packrat/env/node'; +import { fromZod } from '@packrat/guards'; import { anyOf, caseInsensitive, @@ -23,6 +24,7 @@ import { global as globalFlag, oneOrMore, } from 'magic-regexp'; +import { z } from 'zod'; import { formatSummaryLine, readSummary, type TestSummary, XcResultError } from './lib/xcresult'; type Platform = 'ios' | 'ipad' | 'macos' | 'watch'; @@ -1210,7 +1212,11 @@ function exportScreenshotsFromResultBundle(resultBundle: string, toDir: string): const manifestPath = resolve(exportDir, 'manifest.json'); if (!existsSync(manifestPath)) return; - const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as AttachmentManifestEntry[]; + const manifest = parseAttachmentManifest(JSON.parse(readFileSync(manifestPath, 'utf8'))); + if (!manifest) { + console.warn(`Warning: ${manifestPath} had an invalid attachment manifest shape.`); + return; + } mkdirSync(toDir, { recursive: true }); for (const entry of manifest) { for (const attachment of entry.attachments ?? []) { @@ -1229,14 +1235,18 @@ function stableAttachmentName(suggestedName: string | undefined): string | null return startsWithDigit(stable) ? stable : null; } -type AttachmentManifestEntry = { - attachments?: AttachmentManifestAttachment[]; -}; - -type AttachmentManifestAttachment = { - exportedFileName: string; - suggestedHumanReadableName?: string; -}; +const AttachmentManifestAttachmentSchema = z + .object({ + exportedFileName: z.string(), + suggestedHumanReadableName: z.string().optional(), + }) + .passthrough(); +const AttachmentManifestEntrySchema = z + .object({ + attachments: z.array(AttachmentManifestAttachmentSchema).optional(), + }) + .passthrough(); +const parseAttachmentManifest = fromZod(z.array(AttachmentManifestEntrySchema)); function e2eBuildSettings(): string[] { const email = Bun.env.E2E_TEST_EMAIL ?? Bun.env.E2E_EMAIL; diff --git a/apps/swift/scripts/lib/app-store-assets.ts b/apps/swift/scripts/lib/app-store-assets.ts index 18925dfc32..2d151f6573 100644 --- a/apps/swift/scripts/lib/app-store-assets.ts +++ b/apps/swift/scripts/lib/app-store-assets.ts @@ -1,6 +1,8 @@ import { execFileSync } from 'node:child_process'; import { existsSync, readFileSync } from 'node:fs'; import { basename, join } from 'node:path'; +import { fromZod } from '@packrat/guards'; +import { z } from 'zod'; export type ImageInfo = { width: number; @@ -13,17 +15,23 @@ export type AppIconIssue = { message: string; }; -type AppIconImage = { - filename?: string; - idiom?: string; - platform?: string; - scale?: string; - size?: string; -}; +const AppIconImageSchema = z + .object({ + filename: z.string().optional(), + idiom: z.string().optional(), + platform: z.string().optional(), + scale: z.string().optional(), + size: z.string().optional(), + }) + .passthrough(); -type AppIconContents = { - images?: AppIconImage[]; -}; +const AppIconContentsSchema = z + .object({ + images: z.array(AppIconImageSchema).optional(), + }) + .passthrough(); + +const parseAppIconContents = fromZod(AppIconContentsSchema); export type ImageInspector = (path: string) => ImageInfo; @@ -69,7 +77,10 @@ export function validateAppIconSet( return [{ file: contentsPath, message: 'App icon set is missing Contents.json.' }]; } - const contents = JSON.parse(readFileSync(contentsPath, 'utf8')) as AppIconContents; + const contents = parseAppIconContents(JSON.parse(readFileSync(contentsPath, 'utf8'))); + if (!contents) { + return [{ file: contentsPath, message: 'App icon Contents.json has an invalid shape.' }]; + } const images = contents.images ?? []; if (images.length === 0) { From 40f0f666f3ceeaf764a28525d797d1a4969f55d0 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Mon, 1 Jun 2026 00:48:57 -0600 Subject: [PATCH 58/60] =?UTF-8?q?=E2=9C=85=20Harden=20coverage=20after=20d?= =?UTF-8?q?evelopment=20sync?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utils/__tests__/getRelativeTime.test.ts | 16 +++ .../analytics/test/core/spec-parser.test.ts | 101 +++++++++++++++++- .../api/src/utils/__tests__/csv-utils.test.ts | 57 ++++++++++ .../utils/__tests__/embeddingHelper.test.ts | 20 ++++ .../src/utils/__tests__/json-utils.test.ts | 28 +++++ packages/api/vitest.unit.config.ts | 4 + packages/mcp/src/__tests__/client.test.ts | 42 ++++---- 7 files changed, 248 insertions(+), 20 deletions(-) diff --git a/apps/expo/lib/utils/__tests__/getRelativeTime.test.ts b/apps/expo/lib/utils/__tests__/getRelativeTime.test.ts index 711c648ef5..bf8238b399 100644 --- a/apps/expo/lib/utils/__tests__/getRelativeTime.test.ts +++ b/apps/expo/lib/utils/__tests__/getRelativeTime.test.ts @@ -116,4 +116,20 @@ describe('getRelativeTime', () => { getRelativeTime({ dateValue: 'not-a-date', t: t as never }); expect(t).toHaveBeenCalledWith('common.timeAgo.justNow'); }); + + it('returns "Just now" for null timestamps without translation', () => { + expect(getRelativeTime({ dateValue: null })).toBe('Just now'); + }); + + it('returns "Just now" for invalid Date instances without translation', () => { + expect(getRelativeTime({ dateValue: new Date('not-a-date') })).toBe('Just now'); + }); + + it('calls translate with singular unit counts', () => { + vi.setSystemTime(new Date('2024-01-01T12:01:00Z')); + const t = vi.fn((key: string, opts?: Record) => `${key}:${opts?.count}`); + const result = getRelativeTime({ dateValue: '2024-01-01T12:00:00Z', t: t as never }); + expect(t).toHaveBeenCalledWith('common.timeAgo.minutes', { count: 1 }); + expect(result).toBe('common.timeAgo.minutes:1'); + }); }); diff --git a/packages/analytics/test/core/spec-parser.test.ts b/packages/analytics/test/core/spec-parser.test.ts index 3e00ecb878..f898d4cd8a 100644 --- a/packages/analytics/test/core/spec-parser.test.ts +++ b/packages/analytics/test/core/spec-parser.test.ts @@ -7,8 +7,9 @@ import { parseTempRatingF, parseWaterproofRating, parseWeightGrams, + SpecParser, } from '@packrat/analytics/core/spec-parser'; -import { describe, expect, it } from 'vitest'; +import { describe, expect, it, vi } from 'vitest'; describe('parseWeightGrams', () => { it('parses compound lbs + oz', () => { @@ -186,3 +187,101 @@ describe('extractSpecsFromRow', () => { expect(specs.seasons).toBeNull(); }); }); + +describe('SpecParser', () => { + function makeResult(columns: string[], rows: unknown[][]) { + return { + columnNames: () => columns, + getRows: () => rows, + }; + } + + it('builds parsed specs with a mocked DuckDB connection', async () => { + const run = vi.fn(); + const runAndReadAll = vi.fn().mockResolvedValue( + makeResult( + ['site', 'name', 'brand', 'category', 'price', 'product_url', 'description', 'tags'], + [ + [ + 'rei', + 'Women 30F Sleeping Bag', + 'REI', + 'sleeping bags', + 199, + 'https://example.com/bag', + '1 lb 2 oz and 650 fill', + '3-season women', + ], + [ + 'rei', + 'Camp Chair', + 'REI', + 'furniture', + 49, + 'https://example.com/chair', + 'folding chair', + '', + ], + ], + ), + ); + + const parser = new SpecParser({ + conn: { run, runAndReadAll } as never, + sourceTable: 'gear_source', + }); + + await expect(parser.build(1)).resolves.toEqual({ total: 2, parsed: 1 }); + expect(runAndReadAll).toHaveBeenCalledWith( + 'SELECT site, name, brand, category, price, product_url, description, tags FROM gear_source', + ); + expect(run).toHaveBeenCalledWith('DROP TABLE IF EXISTS parsed_specs'); + expect(run).toHaveBeenCalledWith(expect.stringContaining('CREATE TABLE parsed_specs')); + expect(run).toHaveBeenCalledWith(expect.stringContaining('INSERT INTO parsed_specs VALUES')); + expect(run).toHaveBeenCalledWith( + 'CREATE INDEX IF NOT EXISTS idx_specs_name ON parsed_specs(name)', + ); + }); + + it('searches product specs with escaped queries and custom limits', async () => { + const runAndReadAll = vi + .fn() + .mockResolvedValue(makeResult(['site', 'name', 'brand'], [['rei', 'Arc Bag', "Arc'teryx"]])); + const parser = new SpecParser({ conn: { runAndReadAll } as never }); + + const specs = await parser.getProductSpecs({ query: "Arc'teryx", limit: 3 }); + + expect(specs).toEqual([{ site: 'rei', name: 'Arc Bag', brand: "Arc'teryx" }]); + expect(runAndReadAll).toHaveBeenCalledWith(expect.stringContaining("arc''teryx")); + expect(runAndReadAll).toHaveBeenCalledWith(expect.stringContaining('LIMIT 3')); + }); + + it('filters products with all optional predicates', async () => { + const runAndReadAll = vi.fn().mockResolvedValue(makeResult(['name'], [['Tent']])); + const parser = new SpecParser({ conn: { runAndReadAll } as never }); + + const specs = await parser.filterProducts({ + category: "men's tents", + maxWeightG: 1500, + maxTempF: 20, + maxPrice: 400, + minPrice: 100, + gender: "men's", + seasons: '3-season', + sortBy: 'price', + limit: 5, + }); + + expect(specs).toEqual([{ name: 'Tent' }]); + const sql = String(runAndReadAll.mock.calls[0]?.[0]); + expect(sql).toContain("men''s tents"); + expect(sql).toContain('weight_grams IS NOT NULL AND weight_grams <= 1500'); + expect(sql).toContain('temp_rating_f IS NOT NULL AND temp_rating_f <= 20'); + expect(sql).toContain('price <= 400'); + expect(sql).toContain('price >= 100'); + expect(sql).toContain("gender = 'men''s'"); + expect(sql).toContain("seasons = '3-season'"); + expect(sql).toContain('ORDER BY price ASC NULLS LAST'); + expect(sql).toContain('LIMIT 5'); + }); +}); diff --git a/packages/api/src/utils/__tests__/csv-utils.test.ts b/packages/api/src/utils/__tests__/csv-utils.test.ts index 6c94ed0e40..172bc540f6 100644 --- a/packages/api/src/utils/__tests__/csv-utils.test.ts +++ b/packages/api/src/utils/__tests__/csv-utils.test.ts @@ -74,6 +74,16 @@ describe('csv-utils', () => { }); }); + it('defaults unknown weight units to grams', () => { + const values = ['12 stones', 'stones']; + const fieldMap = { weight: 0, weightUnit: 1 }; + + const result = mapCsvRowToItem({ values, fieldMap }); + + expect(result?.weight).toBe(12); + expect(result?.weightUnit).toBe('g'); + }); + it('parses price correctly', () => { const values = ['$49.99']; const fieldMap = { price: 0 }; @@ -96,6 +106,15 @@ describe('csv-utils', () => { }); }); + it('maps invalid ratings to null', () => { + const values = ['N/A']; + const fieldMap = { ratingValue: 0 }; + + const result = mapCsvRowToItem({ values, fieldMap }); + + expect(result?.ratingValue).toBeNull(); + }); + it('parses review count correctly', () => { const values = ['123']; const fieldMap = { reviewCount: 0 }; @@ -107,6 +126,15 @@ describe('csv-utils', () => { }); }); + it('normalizes non-numeric review counts to zero', () => { + const values = ['many']; + const fieldMap = { reviewCount: 0 }; + + const result = mapCsvRowToItem({ values, fieldMap }); + + expect(result?.reviewCount).toBe(0); + }); + it('handles categories as JSON array', () => { const values = ['["Electronics", "Outdoors"]']; const fieldMap = { categories: 0 }; @@ -195,6 +223,15 @@ describe('csv-utils', () => { }); }); + it('falls back to empty FAQs for malformed FAQ input', () => { + const values = ['{"question":']; + const fieldMap = { faqs: 0 }; + + const result = mapCsvRowToItem({ values, fieldMap }); + + expect(result?.faqs).toEqual([]); + }); + it('parses techs JSON correctly', () => { const values = ['{"material": "nylon", "Claimed Weight": "100g"}']; const fieldMap = { techs: 0 }; @@ -221,6 +258,16 @@ describe('csv-utils', () => { }); }); + it('defaults unknown fallback weight units from techs to grams', () => { + const values = ['{"Claimed Weight": "12 stones"}']; + const fieldMap = { techs: 0 }; + + const result = mapCsvRowToItem({ values, fieldMap }); + + expect(result?.weight).toBe(12); + expect(result?.weightUnit).toBe('g'); + }); + it('parses JSON fields like links, reviews, qas', () => { const values = [ '["link1", "link2"]', @@ -238,6 +285,16 @@ describe('csv-utils', () => { }); }); + it('falls back to empty arrays for malformed JSON fields', () => { + const values = ['{"broken":', '{"also":']; + const fieldMap = { links: 0, reviews: 1 }; + + const result = mapCsvRowToItem({ values, fieldMap }); + + expect(result?.links).toEqual([]); + expect(result?.reviews).toEqual([]); + }); + it('handles availability enum', () => { const values = ['in_stock']; const fieldMap = { availability: 0 }; diff --git a/packages/api/src/utils/__tests__/embeddingHelper.test.ts b/packages/api/src/utils/__tests__/embeddingHelper.test.ts index ca50ab2b55..692cf801f7 100644 --- a/packages/api/src/utils/__tests__/embeddingHelper.test.ts +++ b/packages/api/src/utils/__tests__/embeddingHelper.test.ts @@ -299,5 +299,25 @@ describe('embeddingHelper', () => { const result = getEmbeddingText(item, existingItem); expect(result).toContain('Size: Large'); }); + + it('ignores non-array variants', () => { + const item = { + name: 'Jacket', + variants: 'not-an-array' as never, + }; + expect(getEmbeddingText({ item })).toBe('Jacket'); + }); + + it('ignores malformed variant entries', () => { + const item = { + name: 'Jacket', + variants: [ + 'invalid', + { attribute: '', values: ['M'] }, + { attribute: 'Size', values: undefined }, + ] as never, + }; + expect(getEmbeddingText({ item })).toBe('Jacket'); + }); }); }); diff --git a/packages/api/src/utils/__tests__/json-utils.test.ts b/packages/api/src/utils/__tests__/json-utils.test.ts index b5b593dc51..30eaa7fa28 100644 --- a/packages/api/src/utils/__tests__/json-utils.test.ts +++ b/packages/api/src/utils/__tests__/json-utils.test.ts @@ -70,6 +70,11 @@ describe('json-utils', () => { expect(result?.reviewCount).toBe(42); }); + it('normalizes NaN reviewCount numbers to zero', () => { + const result = mapJsonRowToItem({ reviewCount: Number.NaN }); + expect(result?.reviewCount).toBe(0); + }); + it('maps reviewCount from string', () => { const result = mapJsonRowToItem({ reviewCount: '128' }); expect(result?.reviewCount).toBe(128); @@ -166,11 +171,23 @@ describe('json-utils', () => { expect(result?.weightUnit).toBeDefined(); }); + it('defaults unknown numeric weight units to grams', () => { + const result = mapJsonRowToItem({ weight: 12, weightUnit: 'stones' }); + expect(result?.weight).toBe(12); + expect(result?.weightUnit).toBe('g'); + }); + it('maps weight from string', () => { const result = mapJsonRowToItem({ weight: '1.5 lbs' }); expect(result?.weight).toBeGreaterThan(0); }); + it('defaults unknown string weight units to grams', () => { + const result = mapJsonRowToItem({ weight: '12 stones', weightUnit: 'stones' }); + expect(result?.weight).toBe(12); + expect(result?.weightUnit).toBe('g'); + }); + it('ignores non-positive weight strings', () => { const result = mapJsonRowToItem({ weight: '-1 lb' }); expect(result?.weight).toBeUndefined(); @@ -218,6 +235,11 @@ describe('json-utils', () => { expect(result?.techs).toEqual({}); }); + it('maps malformed tech strings to an empty object', () => { + const result = mapJsonRowToItem({ techs: '{"broken":' }); + expect(result?.techs).toEqual({}); + }); + it('falls back to weight from techs Claimed Weight field', () => { const result = mapJsonRowToItem({ techs: { 'Claimed Weight': '280g' } }); expect(result?.weight).toBeGreaterThan(0); @@ -228,6 +250,12 @@ describe('json-utils', () => { expect(result?.weight).toBeGreaterThan(0); }); + it('defaults unknown fallback weight units from techs to grams', () => { + const result = mapJsonRowToItem({ techs: { 'Claimed Weight': '12 stones' } }); + expect(result?.weight).toBe(12); + expect(result?.weightUnit).toBe('g'); + }); + it('maps availability from valid string', () => { const result = mapJsonRowToItem({ availability: 'in_stock' }); expect(result?.availability).toBe('in_stock'); diff --git a/packages/api/vitest.unit.config.ts b/packages/api/vitest.unit.config.ts index c6771ce8ff..706e1674b2 100644 --- a/packages/api/vitest.unit.config.ts +++ b/packages/api/vitest.unit.config.ts @@ -56,6 +56,8 @@ export default defineConfig({ // not unit-testable without the full CF runtime. Pure helpers live in // auth.helpers.ts and are covered by their own unit tests. 'src/auth/index.ts', + // Local-only e2e auth shim is exercised by Swift integration tests. + 'src/auth/local-e2e.ts', // ETL and AI utilities (defer to integration tests) 'src/services/etl/**', // CatalogEtlWorkflow needs the CF Workflows runtime for end-to-end @@ -86,6 +88,8 @@ export default defineConfig({ 'src/services/wildlifeIdentificationService.ts', 'src/middleware/**', 'src/utils/openapi.ts', + // Sentry SDK boundary; behavior is covered by integration/runtime smoke. + 'src/utils/sentry.ts', ], thresholds: { statements: 95, diff --git a/packages/mcp/src/__tests__/client.test.ts b/packages/mcp/src/__tests__/client.test.ts index af5454c14f..536214ceb1 100644 --- a/packages/mcp/src/__tests__/client.test.ts +++ b/packages/mcp/src/__tests__/client.test.ts @@ -80,7 +80,7 @@ describe('nowIso()', () => { describe('call()', () => { it('returns ok result when promise resolves with data', async () => { const mockPromise = Promise.resolve({ data: { id: 'pack-1' }, error: null, status: 200 }); - const result = await call(mockPromise); + const result = await call({ promise: mockPromise }); expect(result.isError).toBeUndefined(); expect(result.content[0].text).toContain('"id": "pack-1"'); }); @@ -91,27 +91,27 @@ describe('call()', () => { error: { status: 404, value: 'Not Found' }, status: 404, }); - const result = await call(mockPromise); + const result = await call({ promise: mockPromise }); expect(result.isError).toBe(true); expect(result.content[0].text).toContain('404'); }); it('returns error result when data is null', async () => { const mockPromise = Promise.resolve({ data: null, error: null, status: 200 }); - const result = await call(mockPromise); + const result = await call({ promise: mockPromise }); expect(result.isError).toBe(true); }); it('returns error result when promise rejects', async () => { const mockPromise = Promise.reject(new Error('network failure')); - const result = await call(mockPromise); + const result = await call({ promise: mockPromise }); expect(result.isError).toBe(true); expect(result.content[0].text).toContain('network failure'); }); it('uses action from options in error messages', async () => { const mockPromise = Promise.reject(new Error('timeout')); - const result = await call(mockPromise, { action: 'fetch pack' }); + const result = await call({ promise: mockPromise, action: 'fetch pack' }); expect(result.content[0].text).toContain('fetch pack'); }); @@ -121,7 +121,7 @@ describe('call()', () => { error: { status: 401, value: null }, status: 401, }); - const result = await call(mockPromise, { action: 'list packs' }); + const result = await call({ promise: mockPromise, action: 'list packs' }); expect(result.isError).toBe(true); expect(result.content[0].text.toLowerCase()).toContain('authentication'); }); @@ -132,7 +132,7 @@ describe('call()', () => { error: { status: 401, value: null }, status: 401, }); - const result = await call(mockPromise, { action: 'list packs', requiresAdmin: true }); + const result = await call({ promise: mockPromise, action: 'list packs', requiresAdmin: true }); expect(result.isError).toBe(true); expect(result.content[0].text.toLowerCase()).toContain('admin'); }); @@ -143,7 +143,7 @@ describe('call()', () => { error: { status: 403, value: null }, status: 403, }); - const result = await call(mockPromise, { action: 'delete pack' }); + const result = await call({ promise: mockPromise, action: 'delete pack' }); expect(result.isError).toBe(true); expect(result.content[0].text.toLowerCase()).toContain('forbidden'); }); @@ -154,7 +154,11 @@ describe('call()', () => { error: { status: 404, value: null }, status: 404, }); - const result = await call(mockPromise, { action: 'get pack', resourceHint: 'pack p_123' }); + const result = await call({ + promise: mockPromise, + action: 'get pack', + resourceHint: 'pack p_123', + }); expect(result.isError).toBe(true); expect(result.content[0].text).toContain('404'); }); @@ -165,7 +169,7 @@ describe('call()', () => { error: { status: 409, value: null }, status: 409, }); - const result = await call(mockPromise, { action: 'create pack' }); + const result = await call({ promise: mockPromise, action: 'create pack' }); expect(result.isError).toBe(true); expect(result.content[0].text.toLowerCase()).toContain('conflict'); }); @@ -176,7 +180,7 @@ describe('call()', () => { error: { status: 422, value: null }, status: 422, }); - const result = await call(mockPromise, { action: 'update pack' }); + const result = await call({ promise: mockPromise, action: 'update pack' }); expect(result.isError).toBe(true); expect(result.content[0].text.toLowerCase()).toContain('validation'); }); @@ -187,7 +191,7 @@ describe('call()', () => { error: { status: 429, value: null }, status: 429, }); - const result = await call(mockPromise, { action: 'search' }); + const result = await call({ promise: mockPromise, action: 'search' }); expect(result.isError).toBe(true); expect(result.content[0].text.toLowerCase()).toContain('rate limit'); }); @@ -198,7 +202,7 @@ describe('call()', () => { error: { status: 503, value: null }, status: 503, }); - const result = await call(mockPromise, { action: 'fetch data' }); + const result = await call({ promise: mockPromise, action: 'fetch data' }); expect(result.isError).toBe(true); expect(result.content[0].text).toContain('503'); }); @@ -209,13 +213,13 @@ describe('call()', () => { error: { status: 400, value: { message: 'invalid input' } }, status: 400, }); - const result = await call(mockPromise); + const result = await call({ promise: mockPromise }); expect(result.content[0].text).toContain('invalid input'); }); it('handles non-Error thrown exceptions', async () => { const mockPromise = Promise.reject('string error'); - const result = await call(mockPromise); + const result = await call({ promise: mockPromise }); expect(result.isError).toBe(true); expect(result.content[0].text).toContain('string error'); }); @@ -226,7 +230,7 @@ describe('call()', () => { error: { status: 403, value: null }, status: 403, }); - const result = await call(mockPromise, { action: 'delete user', requiresAdmin: true }); + const result = await call({ promise: mockPromise, action: 'delete user', requiresAdmin: true }); expect(result.isError).toBe(true); expect(result.content[0].text.toLowerCase()).toContain('admin'); expect(result.content[0].text.toLowerCase()).toContain('forbidden'); @@ -238,7 +242,7 @@ describe('call()', () => { error: { status: 400, value: { error: 'bad request detail' } }, status: 400, }); - const result = await call(mockPromise); + const result = await call({ promise: mockPromise }); expect(result.content[0].text).toContain('bad request detail'); }); @@ -248,7 +252,7 @@ describe('call()', () => { error: { status: 400, value: { code: 42, detail: 'some info' } }, status: 400, }); - const result = await call(mockPromise); + const result = await call({ promise: mockPromise }); expect(result.content[0].text).toContain('42'); }); @@ -258,7 +262,7 @@ describe('call()', () => { error: { status: 500, value: 12345 }, status: 500, }); - const result = await call(mockPromise); + const result = await call({ promise: mockPromise }); expect(result.content[0].text).toContain('12345'); }); }); From bbc4f7fe98c7ca82ee9356202142bad62f177222 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Wed, 3 Jun 2026 13:45:11 -0600 Subject: [PATCH 59/60] =?UTF-8?q?=E2=99=BF=EF=B8=8F=20Harden=20Swift=20nav?= =?UTF-8?q?igation=20state=20identifiers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Features/Packs/PacksListView.swift | 52 +++++++++------- .../Features/Trips/TripsListView.swift | 4 +- .../PackRat/Shared/EmptyStateView.swift | 6 +- .../Sources/PackRat/Shared/ErrorView.swift | 3 +- .../PackRat/Shared/UnavailableStateView.swift | 12 ++++ .../PackRatUITests/NavigationTests.swift | 59 +++++++++++-------- 6 files changed, 85 insertions(+), 51 deletions(-) diff --git a/apps/swift/Sources/PackRat/Features/Packs/PacksListView.swift b/apps/swift/Sources/PackRat/Features/Packs/PacksListView.swift index 709a0474d0..1327fd60b5 100644 --- a/apps/swift/Sources/PackRat/Features/Packs/PacksListView.swift +++ b/apps/swift/Sources/PackRat/Features/Packs/PacksListView.swift @@ -35,19 +35,22 @@ struct PacksListView: View { ProgressView("Loading…").frame(maxWidth: .infinity, maxHeight: .infinity) } else if displayedPacks.isEmpty && !viewModel.searchText.isEmpty { ContentUnavailableView.search(text: viewModel.searchText) + .accessibilityIdentifier("packs_search_empty_state") } else if displayedPacks.isEmpty && !isExplore { EmptyStateView( "No Packs Yet", subtitle: "Create your first pack to start tracking gear weight", systemImage: "backpack", actionLabel: "New Pack", + accessibilityIdentifier: "packs_empty_state", action: { showingCreateSheet = true } ) } else if displayedPacks.isEmpty && isExplore { EmptyStateView( "No Public Packs", subtitle: "No packs match your filter", - systemImage: "globe" + systemImage: "globe", + accessibilityIdentifier: "packs_public_empty_state" ) } else { packList @@ -66,13 +69,6 @@ struct PacksListView: View { ProgressView().controlSize(.small) } } - ToolbarItem(placement: .secondaryAction) { - Picker("View", selection: $isExplore) { - Label("My Packs", systemImage: "person.fill").tag(false) - Label("Explore", systemImage: "globe").tag(true) - } - .pickerStyle(.segmented) - } ToolbarItem(placement: .secondaryAction) { Button("Recent", systemImage: "clock") { showingRecentPacks = true @@ -108,23 +104,34 @@ struct PacksListView: View { // MARK: - Category Filter Bar private var categoryFilterBar: some View { - HStack { - Picker("Category", selection: $selectedCategory) { - Label("All", systemImage: "line.3.horizontal.decrease.circle") - .tag(nil as PackCategory?) - ForEach(PackCategory.allCases, id: \.self) { cat in - Label(cat.label, systemImage: cat.symbol) - .tag(Optional(cat)) - } + VStack(spacing: 8) { + Picker("View", selection: $isExplore) { + Label("My Packs", systemImage: "person.fill").tag(false) + .accessibilityIdentifier("packs_mode_my_packs") + Label("Explore", systemImage: "globe").tag(true) + .accessibilityIdentifier("packs_mode_explore") } - .pickerStyle(.menu) - .accessibilityIdentifier("packs_category_filter") + .pickerStyle(.segmented) + .accessibilityIdentifier("packs_mode_picker") + + HStack { + Picker("Category", selection: $selectedCategory) { + Label("All", systemImage: "line.3.horizontal.decrease.circle") + .tag(nil as PackCategory?) + ForEach(PackCategory.allCases, id: \.self) { cat in + Label(cat.label, systemImage: cat.symbol) + .tag(Optional(cat)) + } + } + .pickerStyle(.menu) + .accessibilityIdentifier("packs_category_filter") - Spacer() + Spacer() - Text(selectedCategory?.label ?? "All") - .font(.subheadline) - .foregroundStyle(.secondary) + Text(selectedCategory?.label ?? "All") + .font(.subheadline) + .foregroundStyle(.secondary) + } } .padding(.horizontal) .padding(.vertical, 8) @@ -166,6 +173,7 @@ struct PacksListView: View { } } } + .accessibilityIdentifier(isExplore ? "packs_public_list" : "packs_list") } // MARK: - Public Packs diff --git a/apps/swift/Sources/PackRat/Features/Trips/TripsListView.swift b/apps/swift/Sources/PackRat/Features/Trips/TripsListView.swift index ddb210607a..3094cc8747 100644 --- a/apps/swift/Sources/PackRat/Features/Trips/TripsListView.swift +++ b/apps/swift/Sources/PackRat/Features/Trips/TripsListView.swift @@ -20,21 +20,23 @@ struct TripsListView: View { ProgressView("Loading trips…").frame(maxWidth: .infinity, maxHeight: .infinity) } else if let error = viewModel.error, viewModel.trips.isEmpty { ErrorView(error, retry: { await viewModel.load(context: modelContext) }) + .accessibilityIdentifier("trips_error_state") } else if viewModel.trips.isEmpty { EmptyStateView( "No Trips Yet", subtitle: "Plan your first adventure", systemImage: "map", actionLabel: "Plan Trip", + accessibilityIdentifier: "trips_empty_state", action: { showingCreateSheet = true } ) - .accessibilityIdentifier("trips_empty_state") } else { tripList } } .navigationTitle("Trips") .searchable(text: $viewModel.searchText, prompt: "Search trips") + .accessibilityIdentifier("trips_screen") .toolbar { ToolbarItem(placement: .primaryAction) { Button("Plan Trip", systemImage: "plus") { showingCreateSheet = true } diff --git a/apps/swift/Sources/PackRat/Shared/EmptyStateView.swift b/apps/swift/Sources/PackRat/Shared/EmptyStateView.swift index 91c0b36a74..9b1592a4d0 100644 --- a/apps/swift/Sources/PackRat/Shared/EmptyStateView.swift +++ b/apps/swift/Sources/PackRat/Shared/EmptyStateView.swift @@ -6,12 +6,14 @@ struct EmptyStateView: View { let systemImage: String let action: (() -> Void)? let actionLabel: String + let accessibilityIdentifier: String? init( _ title: String, subtitle: String = "", systemImage: String = "tray", actionLabel: String = "Create New", + accessibilityIdentifier: String? = nil, action: (() -> Void)? = nil ) { self.title = title @@ -19,13 +21,15 @@ struct EmptyStateView: View { self.systemImage = systemImage self.action = action self.actionLabel = actionLabel + self.accessibilityIdentifier = accessibilityIdentifier } var body: some View { UnavailableStateView( title: title, subtitle: subtitle, - systemImage: systemImage + systemImage: systemImage, + accessibilityIdentifier: accessibilityIdentifier ) { if let action { Button(actionLabel, action: action) diff --git a/apps/swift/Sources/PackRat/Shared/ErrorView.swift b/apps/swift/Sources/PackRat/Shared/ErrorView.swift index e1402ce4ba..0779853f3d 100644 --- a/apps/swift/Sources/PackRat/Shared/ErrorView.swift +++ b/apps/swift/Sources/PackRat/Shared/ErrorView.swift @@ -139,7 +139,8 @@ private struct ErrorSurfaceView: View { UnavailableStateView( title: presentation.title, subtitle: presentation.description, - systemImage: presentation.systemImage + systemImage: presentation.systemImage, + accessibilityIdentifier: presentation.accessibilityIdentifier ) { if let retry, presentation.allowsRetry { AsyncButton(presentation.retryTitle, action: retry) diff --git a/apps/swift/Sources/PackRat/Shared/UnavailableStateView.swift b/apps/swift/Sources/PackRat/Shared/UnavailableStateView.swift index b9c015fb92..35aa775553 100644 --- a/apps/swift/Sources/PackRat/Shared/UnavailableStateView.swift +++ b/apps/swift/Sources/PackRat/Shared/UnavailableStateView.swift @@ -5,6 +5,7 @@ struct UnavailableStateView: View { let subtitle: String let systemImage: String let minHeight: CGFloat + let accessibilityIdentifier: String? let actions: Actions init( @@ -12,12 +13,14 @@ struct UnavailableStateView: View { subtitle: String = "", systemImage: String, minHeight: CGFloat = 360, + accessibilityIdentifier: String? = nil, @ViewBuilder actions: () -> Actions = { EmptyView() } ) { self.title = title self.subtitle = subtitle self.systemImage = systemImage self.minHeight = minHeight + self.accessibilityIdentifier = accessibilityIdentifier self.actions = actions() } @@ -36,5 +39,14 @@ struct UnavailableStateView: View { .frame(maxWidth: .infinity, minHeight: minHeight) .frame(maxHeight: .infinity) .padding(.horizontal) + .accessibilityElement(children: .contain) + .accessibilityIdentifier(accessibilityIdentifier ?? "\(title.accessibilityIdentifierFragment)_state") + } +} + +private extension String { + var accessibilityIdentifierFragment: String { + lowercased() + .filter { $0.isLetter || $0.isNumber } } } diff --git a/apps/swift/Tests/PackRatUITests/NavigationTests.swift b/apps/swift/Tests/PackRatUITests/NavigationTests.swift index 35351b5613..f5f3e99400 100644 --- a/apps/swift/Tests/PackRatUITests/NavigationTests.swift +++ b/apps/swift/Tests/PackRatUITests/NavigationTests.swift @@ -26,21 +26,21 @@ final class NavigationTests: AppUITestCase { func testPacksTabShowsListOrEmpty() { goToTab("Packs") - // Either the pack list or the empty-state is visible - let hasList = app.collectionViews.firstMatch.waitForExistence(timeout: 8) - let hasEmpty = app.staticTexts["No Packs Yet"].waitForExistence(timeout: 2) + let hasList = identified("packs_list").waitForExistence(timeout: 8) + let hasEmpty = identified("packs_empty_state").waitForExistence(timeout: 2) XCTAssertTrue(hasList || hasEmpty, "Packs tab must show list or empty state") } func testTripsTabShowsListOrEmpty() { goToTab("Trips") - let hasList = app.collectionViews["trips_list"].waitForExistence(timeout: 8) - || app.collectionViews.firstMatch.waitForExistence(timeout: 2) - let hasEmpty = app.otherElements["trips_empty_state"].waitForExistence(timeout: 2) - || app.staticTexts.matching( - NSPredicate(format: "label CONTAINS 'No Trips'") - ).firstMatch.waitForExistence(timeout: 2) - XCTAssertTrue(hasList || hasEmpty, "Trips tab must show list or empty state") + let hasList = identified("trips_list").waitForExistence(timeout: 8) + let hasEmpty = identified("trips_empty_state").waitForExistence(timeout: 2) + let hasError = identified("trips_error_state").waitForExistence(timeout: 2) + let hasPrimaryAction = app.buttons["trips_plan_trip_button"].waitForExistence(timeout: 2) + XCTAssertTrue( + hasList || hasEmpty || hasError || hasPrimaryAction, + "Trips tab must show list, empty state, error state, or primary trip action" + ) } func testWeatherTabShowsSearchField() { @@ -61,7 +61,6 @@ final class NavigationTests: AppUITestCase { func testPacksSearchable() { goToTab("Packs") - // The list has a search bar let searchField = app.searchFields.firstMatch XCTAssertTrue( searchField.waitForExistence(timeout: 8), @@ -70,12 +69,10 @@ final class NavigationTests: AppUITestCase { searchField.tap() searchField.typeText("nonexistent_pack_xyz") - // Either no results message or an empty list - let noResults = app.staticTexts.matching( - NSPredicate(format: "label CONTAINS 'nonexistent_pack_xyz' OR label CONTAINS 'No results'") - ).firstMatch - // Just verify we didn't crash — the exact message varies - _ = noResults.waitForExistence(timeout: 3) + XCTAssertTrue( + identified("packs_search_empty_state").waitForExistence(timeout: 5), + "Packs search must show the native search empty state for unmatched queries" + ) } func testPacksCategoryFilterBarVisible() { @@ -90,17 +87,27 @@ final class NavigationTests: AppUITestCase { func testPacksExploreModeToggle() { goToTab("Packs") - // The My Packs / Explore segmented picker lives in the secondary toolbar - let exploreButton = app.buttons["Explore"] - if exploreButton.waitForExistence(timeout: 5) { + let picker = app.segmentedControls["packs_mode_picker"] + let exploreButton = app.buttons["packs_mode_explore"] + XCTAssertTrue( + picker.waitForExistence(timeout: 5) || exploreButton.waitForExistence(timeout: 1), + "Packs mode picker must be visible" + ) + + if exploreButton.exists { exploreButton.tap() - // After switching, either public packs load or an empty state appears - let loaded = app.collectionViews.firstMatch.waitForExistence(timeout: 10) - let empty = app.staticTexts.matching( - NSPredicate(format: "label CONTAINS 'No Public Packs'") - ).firstMatch.waitForExistence(timeout: 3) - XCTAssertTrue(loaded || empty, "Explore mode must show packs or empty state") + } else { + picker.buttons["Explore"].tap() } + + let loaded = app.collectionViews["packs_public_list"].waitForExistence(timeout: 10) + || identified("packs_public_list").waitForExistence(timeout: 1) + let empty = identified("packs_public_empty_state").waitForExistence(timeout: 3) + XCTAssertTrue(loaded || empty, "Explore mode must show public packs or empty state") + } + + private func identified(_ identifier: String) -> XCUIElement { + app.descendants(matching: .any)[identifier] } } #endif From e56595a357aeb0b9418903494e024cb74f94dba6 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Tue, 16 Jun 2026 12:09:51 -0600 Subject: [PATCH 60/60] =?UTF-8?q?=E2=9C=85=20Stabilize=20catalog=20Maestro?= =?UTF-8?q?=20assertions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .maestro/flows/catalog/catalog-browse-flow.yaml | 4 ++-- .maestro/flows/catalog/catalog-search-flow.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.maestro/flows/catalog/catalog-browse-flow.yaml b/.maestro/flows/catalog/catalog-browse-flow.yaml index 0a4b811b5f..c2b920eab2 100644 --- a/.maestro/flows/catalog/catalog-browse-flow.yaml +++ b/.maestro/flows/catalog/catalog-browse-flow.yaml @@ -20,10 +20,10 @@ appId: ${APP_ID} text: "All" commands: - assertVisible: - text: ".*items.*" + id: "catalog:item-.*" - scrollUntilVisible: element: - text: "Showing.*items" + id: "catalog:item-.*" direction: DOWN timeout: 10000 speed: 20 diff --git a/.maestro/flows/catalog/catalog-search-flow.yaml b/.maestro/flows/catalog/catalog-search-flow.yaml index 733a9859bd..883a316417 100644 --- a/.maestro/flows/catalog/catalog-search-flow.yaml +++ b/.maestro/flows/catalog/catalog-search-flow.yaml @@ -33,7 +33,7 @@ appId: ${APP_ID} - assertVisible: text: "All" - assertVisible: - text: ".*items.*" + id: "catalog:item-.*" - tapOn: text: "Clothing" - waitForAnimationToEnd @@ -43,4 +43,4 @@ appId: ${APP_ID} text: "All" - waitForAnimationToEnd - assertVisible: - text: ".*items.*" + id: "catalog:item-.*"

k>g;7$PlNiV}_kbQM6y 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�{73d;y|!IUsO=wq8jD$+%0> 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