MOTIR-4038Done
Story-level E2E — the publish affordance and the public surface, both arms
Opened by Zhu Yue ·
A Playwright test exercising the story's verification recipe — the user-observable half. Two arms:
- Cloud arm (the default E2E build,
MOTIR_CLOUD=true): the publish affordance is present and functional — a project admin sets a project public in project settings and the go-public affordance reflects it. - Self-host arm (
MOTIR_CLOUDunset): the public surface is absent — the publish affordance is not rendered, and theapp/api/public/*routes answer 404. Where the E2E harness cannot run a secondMOTIR_CLOUD-unset server in the same leg, this arm's route-level assertions are discharged by the story-level vitest integration tier, and the E2E asserts the authed affordance's absence via a dedicated unset-config run.
Records + publishes a short acceptance video of the cloud-arm publish flow (paced for a human — this is the story's acceptance receipt), per the acceptance-video pattern.
Acceptance criteria
- Cloud arm: the publish affordance is present and a project can be made public; the go-public affordance reflects
accessLevel === 'public'. - Self-host arm: the publish affordance is not rendered; the
app/api/public/*routes 404. - An acceptance video of the cloud-arm flow is recorded and published to the story.
- E2E waits on authoritative signals (no fixed sleeps); empty/loading/error states exercised where the surface has them.
Context refs
app/(authed)/settings/project/members/_components/ProjectMembersSettings.tsx— the selectorapp/(authed)/_components/build-in-public/— the go-public affordancesapp/api/public/— the gated routes- the publish-gate card and the story-level vitest card
Discussion
No comments yet.
Adding to this discussion signs you in on app.motir.co and brings you back to this request.