mirror of
https://github.com/civitai/civitai.git
synced 2026-09-20 22:08:18 +08:00
d3ec4748dd
* test(preview): buzz / membership / download e2e specs Extends the preview smoke harness with the first tranche of flow coverage (revenue/access surfaces), run report-only against deployed previews as the minted fixture users: - preview-buzz.spec.ts: /purchase/buzz + /pricing render package/plan options and a checkout affordance for a gate-passing paid member (gold); no transact. - preview-membership.spec.ts: gold (paid) sees the current-member view; tester (free) is SSR-redirected to /pricing and sees a subscribe CTA. Keys on the deterministic getServerSideProps redirect, not copy. - preview-download.spec.ts: gold + tester reach a model detail page from the listing (no hardcoded id) and see a download affordance. (restricted is NOT used — it fails the gate; the in-app comparison is free vs paid, and the code has no guaranteed free/paid download difference outside early-access.) Also anchor the preview-config testMatch to the filename (/(^|\/)preview-.*\.spec\.ts$/) — the unanchored form matched a parent dir named like a worktree (civitai-preview-*) and wrongly pulled the non-preview specs (auction/generation/example) into the preview run. Selectors are first-draft (broad/resilient) and get validated by the next report-only preview run. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(preview): make download spec light + robust (was crashing the preview) The first draft browsed the heavy /models infinite-scroll listing and clicked the first card, for both gold AND tester across 4 workers. That load crashed the single-replica preview pod (exit 139) and cascaded fast failures into the rest of the suite (base smoke went red as collateral on PR #2467 run jpcgz). Rework: resolve a real model id from the public /api/v1/models API and navigate directly to /models/<id> — no listing, no fragile card selector — and assert as gold only (no free-vs-paid download difference exists outside early-access). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(preview): run smoke suite serially (workers:1) The expanded 19-test suite at workers:4 segfaulted the single-replica preview pod (exit 139) under concurrent heavy-page loads, cascading fast failures into unrelated tests (base smoke loads went red on PR #2467 run s97wq even after the download spec was lightened). The pod can't take concurrent load; run one page at a time. Suite is small + report-only, so serial (~2-3 min) is the right call. Reverses the earlier workers:4 — that suited a 12-test light suite, not this. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * ci: rebuild preview to validate heap fix (2Gi/1536) * test(preview): authed warm-up of heavy pages + 60s nav timeout Mop up the last cold-load flake (`tester loads /models`) now that the pod OOM is fixed. Two changes: - Warm /models + /images (not just /) in setup, AUTHENTICATED with the gold cookie — an anon GET would just hit the gate's /login redirect and never warm the real listing render path. - navigationTimeout 45s -> 60s, aligned with the per-test timeout, so a cold /models goto gets the full budget instead of dying at 45s. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Video: https://discord.com/channels/955572167662260295/1062092338698145812/1338591521401733192
# Playwright Testing
### Goal
E2E testing for the main app.
Catch potential issues when changing code, or evaluate edge cases.
### Anti-Goal
For this to be a frustrating pain-in-the-ass time vampire.
It's better to have 1 decent test than try to do 10 perfect ones and give up because it's too time consuming.
### What to Do
- Write tests for common user flows (fill a form, click a button, get a result)
- Handle what-if scenarios (errors, browsers, etc)
- A good rule of thumb is: if it's been reported as a bug, we should have a test in place for it (and things like it)
### What Not to Do
- Write "1==1" tests (dopamine hit, but pointless)
- Mandate coverage percentages (leads to annoyance and features not being done)
---
### How
Testing is intended to work on local development (docker) for consistency with users/data and easy tear down.
1) Run local services (`make init` or devcontainers)
2) Create a file in the `tests/` directory, or use an existing one. Doesn't really matter. Open to directory structure, so something like `tests/generator/gen-queue.spec.ts` would be reasonable.
3) Start writing tests.
(a) can be done by hand if you know what you're looking to do
(b) easier approach: `npm run test:gen -- --load-storage tests/auth/{user}.json --viewport-size 1920,1080 http://localhost:3000/{url}`
- This allows you to create tests by interacting with the page and picking locators
(c) we'll need better locators, especially for icons. add `data-testid=` to the places you need them (they'll be stripped from production)
(d) use the various authed users to test different scenarios (mod, full access, muted, etc)
(e) feel free to mock responses from any of the APIs, but in general it's best to only do this for external services
4) Run with either `npm run test` or `npm run test:ui` to do it interactively with screenshots
5) If you need to reset the db after each test, you can either:
(a) clean up the mutations as part of the test (delete an object you just made)
(b) `make boostrap-db` to reset the whole database back to normal
6) We'll eventually set up the github action to run this before a deploy
### Test Failures
There are 4 types of test failures:
1) A bad test (always fail)
- these might have bad selectors or inaccurate logic
- **solution**: fix them
2) A flaky test (sometimes fail)
- frustrating tests which seem to pass most of the time, but not always
- this is usually a result of race conditions, mismatched timing, or not properly awaiting events like animations
- **solution**: narrow down which part of the test fails, and catch the flaky issue
3) Intended code change
- we might have changed the verbiage on a button, which makes certain locators no longer work
- this is fine, although locators should try to be as agnostic as possible
- alternatively, we might have simply changed the business logic
- **solution**: in either case, simply update the test itself
4) Unintended code change
- you've changed something in the app, and a test breaks due to the introduction of a bug
- this is the major reason we have tests
- **solution**: leave the tests alone, they're doing their job. fix the code.