Setup A (product-create-config)
Every product-create-config.spec.ts test that uses this setup starts from the same backstage work a real staff session would need before touching the catalog. Playwright stubs the online endpoint and forces navigator.onLine so the POS does not park itself behind an offline gate. The flow signs in with the seed user until the app is on the user home (closing a stray place shell if the client opened straight into a venue). If a cookie banner blocks the UI, it is dismissed. The run then opens the first place (or equivalent) and switches to the Products tab until the catalog chrome is there. Only after that shared runway does the spec care about product-specific steps: walk to catalog root (home, with retries), confirm the list toolbar is visible, clear blocking overlays, tap the new product entry (or the empty-state control), and stop when the sheet copy asks for the type of product. Individual scenarios on the hub add their own clicks and assertions on top of this baseline—they do not re-document the full bootstrap each time.
Implementation
| Spec | e2e/tests/product/product-create-config.spec.ts |
| Functions | bootstrapCatalog() · openCreateSelector() (and local helpers they call) |
Shared steps run before each test-specific assertion in that spec (unless a scenario narrative says otherwise).