Jobs: render-parity fixture + goldens for the two-screen create flow #234
Labels
No labels
adr
android
area/calendar
area/design-system
area/i18n
area/jobs
area/offline
area/server
area/testing
bug
ci
duplicate
enhancement
help wanted
invalid
notifications
question
reliability
security
severity/low
severity/medium
tracking
web
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
eagraiclainne/app#234
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Follow-up to #180. The two-screen job creation flow (handoff §8,
web/src/components/NewJobSheet.tsx/ Android'sNewJobSheetContentinJobs.kt) shipped with no render-parity fixture and no gallery/Roborazzi goldens. The commit that built it said why:#180's coverage check re-examined that judgment rather than assuming it. It holds up:
render-*.jsonfamily (render-job.json,render-job-sheet.json,render-job-pickers.json,render-field-row.json) poses a case by handing the component a server-shaped object (a job, a sheet, a picker's linked rewards) and rendering it once.render-job-sheet.jsonalready reaches nested UI (⋯, the repeat sheet, the delete/tick dialogs) by clicking through from that posed state (OPEN_PATHS/openPath,conformance/README.md), but the object being posed is still a fully-formed one the server could have produced.NewJobSheet(web) andNewJobSheetContent(Android) hold the draft entirely in local state —useState/remember { mutableStateOf(...) }fortitle,ownerUid,date/time,description,repeat,pointsMode/pointsValue,rewardPick,subJobs, plusscreenandpicker— built up by typing and picker taps, with no prop or parameter that accepts a starting draft. Posing "screen two, worth filled in, two sub-jobs queued" means either simulating every keystroke that produces it, or adding an injection seam that does not exist for any other reason today.CreateRPC (client-minted UUIDv7, best-effort sub-job creates and reward link after) that navigates to the new job's detail sheet on success. Existing fixtures never cross a commit boundary —render-job-sheet.json's cases mockmutate/mutateGroupas inert specifically so nothing async has to be waited on. A create-flow fixture would need the same discipline (pose pre-commit render states only) stated explicitly, since it is the flow's whole point in a way it isn't for the sheet.None of that is a reason to leave the gap open indefinitely — it's a scope description for the fixture that's actually needed. Proposed shape:
conformance/render-job-create.json. Each case carries adraftobject (the fields above) and ascreen: 1 | 2, not a server entity — a genuinely different shape from every existingrender-*family, so it earns its own conventions section inconformance/README.mdrather than reusingrender-job-sheet.json's.initialDraftprop/parameter onNewJobSheet/NewJobSheetContent(or a thin wrapper used only by the test harness and the gallery page, the wayJobSheetCaseView/JobSheetCasewrap the real sheet today) — not a product affordance, and not reachable from the real create button.More, screen two with repeat/worth/description/sub-jobs populated, and the Worth picker's "Make a new one" state (it reusesJobPickers.tsx/JobPickers.kt, already fixture-covered generically byrender-job-pickers.json, so this case only needs to confirm it merges correctly inside the create flow's own chrome).conformance/README.md's existing rule ("adding a fixture family means wiring both sides") — web vitest, AndroidRenderConformanceTest, galleryscreens.spec.ts+ AndroidScreenshotTest(Roborazzi) — and add the family toweb/tests/fixtures.test.ts'sCONSUMEDlist, which currently fails the build on any unconsumed fixture file.Labeling
area/jobs,area/testing,enhancement.