diff options
| author | soryu-co <bot@soryu.co> | 2026-04-24 18:13:01 +0000 |
|---|---|---|
| committer | soryu-co <bot@soryu.co> | 2026-04-24 18:13:01 +0000 |
| commit | 3ea85b0d8d3cb6dca522578cb29a676bbac6809f (patch) | |
| tree | a2625312d505b3d9d8717d887896eede7cbb00ab /makima/ios/Sources/Makima/App | |
| parent | 105730ceaa292b1e3589c23d5aad8f35ccf04b8e (diff) | |
| download | soryu-makima-ios-m2-auth.tar.gz soryu-makima-ios-m2-auth.zip | |
Makima iOS — Screenshots scheme + demo modemakima-ios-m2-auth
Adds an opt-in `Makima-Screenshots` scheme + `Screenshots` build config that
short-circuits auth with an in-process URLProtocol and seeds the app with
canned demo data. Lets us run the app past onboarding in UI tests or on a
fresh simulator without touching a real Makima server.
What lands
- ScreenshotMode: compile-time flag via -DSCREENSHOT_MODE (set in the new
Screenshots configuration in project.yml).
- AppState: when the flag is on, calls auth.seedScreenshotData() in init.
- AuthStore: adds seedSetClient/seedSetState helpers (internal, only useful
for screenshot + future preview builds) and a seedScreenshotData that
wires up a fake APIClient backed by DemoSession.
- DemoSession: URLSession wired to DemoURLProtocol, which answers
/api/v1/mesh/daemons, /contracts, /mesh/tasks, /directives,
/listen/sessions, /mesh/tasks/{id}, /mesh/tasks/{id}/output with
deterministic demo JSON. Host-scoped to makima.jp so production URL
remains an operational realm.
- Tests/MakimaUITests/ScreenshotTests.swift: five XCTest cases that drive
the app through Home, Contracts, Task detail, Directives, and Settings.
Each attaches an XCTAttachment screenshot with a stable name.
- project.yml: adds MakimaUITests target + Screenshots configuration +
Makima-Screenshots scheme.
Usage (on a Mac)
make xcgen
xcodebuild \\
-project Makima.xcodeproj \\
-scheme Makima-Screenshots \\
-configuration Screenshots \\
-destination 'platform=iOS Simulator,name=iPhone 16 Pro' \\
test
Screenshots appear as attachments inside the resulting .xcresult bundle;
open the bundle in Xcode > Report Navigator to browse them, or use
`xcrun xcresulttool get test-results attachments` to export to PNG.
Scope
- Normal Debug/Release builds are unaffected — SCREENSHOT_MODE is only
defined under the Screenshots configuration.
- DemoURLProtocol only matches host=makima.jp, so any real request made
during screenshot tests (to non-makima.jp hosts) still fails normally.
- No production code path gates on ScreenshotMode beyond the init-time
seed call; ensureWebSocket is stubbed to a fake online status so the
masthead pill shows LIVE during screenshots.
Not included in this commit: the matching GitHub Actions workflow
(.github/workflows/ios-ci.yml) — requires a workflow-scoped token to push
and will land as a follow-up. The Swift helper that extracts screenshots
from xcresult is also queued for that follow-up.
Diffstat (limited to 'makima/ios/Sources/Makima/App')
| -rw-r--r-- | makima/ios/Sources/Makima/App/AppState.swift | 11 | ||||
| -rw-r--r-- | makima/ios/Sources/Makima/App/ScreenshotMode.swift | 21 |
2 files changed, 29 insertions, 3 deletions
diff --git a/makima/ios/Sources/Makima/App/AppState.swift b/makima/ios/Sources/Makima/App/AppState.swift index 806d7d0..1cc6788 100644 --- a/makima/ios/Sources/Makima/App/AppState.swift +++ b/makima/ios/Sources/Makima/App/AppState.swift @@ -7,16 +7,21 @@ final class AppState { let auth: AuthStore var wsStatus: WebSocketStatus = .idle var webSocket: TaskWebSocket? - - /// Pending deep-link to open once the app has finished routing. var pendingDeepLink: DeepLink? init(auth: AuthStore = AuthStore()) { self.auth = auth + + if ScreenshotMode.isEnabled { + auth.seedScreenshotData() + } } - // Lazily create the websocket. Lives for the lifetime of the session. func ensureWebSocket() { + guard !ScreenshotMode.isEnabled else { + wsStatus = .online + return + } guard webSocket == nil, let client = auth.client else { return } let ws = TaskWebSocket(profile: client.profile, apiKey: client.apiKey) ws.onStatusChange = { [weak self] s in Task { @MainActor in self?.wsStatus = s } } diff --git a/makima/ios/Sources/Makima/App/ScreenshotMode.swift b/makima/ios/Sources/Makima/App/ScreenshotMode.swift new file mode 100644 index 0000000..a1062db --- /dev/null +++ b/makima/ios/Sources/Makima/App/ScreenshotMode.swift @@ -0,0 +1,21 @@ +import Foundation + +/// Enabled via `-DSCREENSHOT_MODE` in the CI build. Short-circuits auth with +/// a fake client and seeds the app with deterministic demo data so we can +/// grab reproducible screenshots without hitting a real Makima server. +enum ScreenshotMode { + static var isEnabled: Bool { + #if SCREENSHOT_MODE + return true + #else + return false + #endif + } + + /// Fake server profile used by the stub authenticated state. + static var profile: ServerProfile { + ServerProfile(label: "makima.jp", baseURLString: "https://makima.jp") + } + + static var apiKey: String { "mk_demo0000deadbeef0000cafe" } +} |
