QA
What to verify on Angular 18
Walk this list on a QA SSR build before merge. A miss here is an 18 regression unless this page says it is old behavior. Implementation diffs live in Angular 18 upgrade explained.
How to run it
Put nvm Node 20.19.6 first. Serve dist/TopFans/server/server.mjs after npm run prerender-all-qa, or the qa --prerender=false output. Do not use npm run build-dev. Do not use Docker. Do not treat ng lint or ng test as gates.
Hit Express URL parse first: trailing slash, unknown route, then ?key=. Product clicks come after that. Angular 17 is signed off. Do not reopen 17 bugs on this list.
PR shape
| Check | Pass when | On this branch |
|---|---|---|
| Source diff | Only create-plan radio lines, server.ts CSR shell, DOMPurify import, wallet ngx-mask IConfig drop, angular.json localize polyfill, plus packages. |
Prefetch files and environment.ts are still dirty. Restore them before commit. |
| Kept on purpose | PrimeNG 17.18.15. HttpClientModule still imported. No hydration. No provideHttpClient. Material still indigo-pink. |
Matches the tree |
prerender-existing script |
Dropped from package.json, or kept on purpose. |
Present. Not required for 18. |
SSR and marketing
| Check | Pass when | On this branch |
|---|---|---|
| Client shell | After prerender, both dist/TopFans/browser/index.html and index.csr.html exist. Live SSR uses the CSR file as the engine document. |
Smoked |
| Trailing slash | /login/ or a known public path with a trailing slash returns 301 to the same path without the slash. Query string is kept. |
Smoked on Express |
| Unknown route | A garbage path returns HTTP 404, not a 200 empty shell. | Smoked |
| Referral query | /creators?key= (or /creator?key=) is SSR-rendered, not the static prerender page that drops the key. |
Smoked |
/music |
Browser lands on /music-artists. |
Smoked |
| Login and forgot password | /auth/login and /auth/forgot-password render. Styles and form chrome are present. |
Smoked render. Submit success was not the gate. |
Logged-in product
| Check | Pass when | On this branch |
|---|---|---|
| Wallet bank-details URL | /wallet/add-bank-details redirects to /wallet/current-balance. Unauthenticated hits still stop on AuthGuard. |
Routing smoked. Logged-in wallet UI still needs a session. |
| Wallet phone / mask | Current-balance and payout fields that use ngx-mask still accept input. ngx-mask 18 dropped IConfig; provideNgxMask() stayed. |
Compile only. Type a value in a masked field. |
| Toasts | Success and error toasts still appear and dismiss. ngx-toastr 19 made the toast OnPush. | Not smoked after the bump |
| Overlays | Open and close a ngx-bootstrap modal, a Material bottom sheet (share / comments / tip), and an image overlay carousel. Content is current, not empty or from the previous open. Styles survive destroy. Stacked dialogs still work. | Unauthenticated overlay chrome smoked. Stacked logged-in sheets were not. |
| Phone inputs | ngx-intl-tel-input still 15. Country dropdown and number entry work on contact, advertise, personal info, or a dynamic mobile field. |
Kept on 15. Needs a human type-in. |
| Create Plan radios | Add New Plan. Free DMs chips still select. Unlimited maps to -1. |
Binding compile-fixed. Re-click on QA. |
| Create Plan button | Name + Plan Benefit + open 1 Month + Total Price of 1 or more enables Create Plan. Same fill with Total Price empty stays disabled. | Disable-when-empty is old behavior. Enable-when-priced still needs a QA pass. |
| Stripe checkout | A real payment or connect flow completes. ngx-stripe is 18.1.0. | Not run. Needs a logged-in session. |
| Audio player | A portfolio / music track plays. Player stayed on 17.1.0. | Compile only. Needs a logged-in session. |
| Video | A video.js post or welcome modal plays. Close and reopen does not leave a dead player. | Compile only. Needs a logged-in session. |
White-label
Generator copies TopFans build config, then appends the tenant theme. Prove one QA tenant, then restore generator artifacts. Do not commit them.
| Check | Pass when | On this branch |
|---|---|---|
| One QA tenant | qa --prerender=false build succeeds. SSR title and theme match the tenant. Login stays branded. |
doug-h smoked. Theme #8b5cf6. Artifacts restored after that smoke; prefetch files are dirty again from later prerender. |
| Cover vs creators | Tenant /creators behavior matches 17 (cover page stayed on cover for doug-h). |
Smoked once. Re-check if the generator is re-run for sign-off. |
Do not file as an 18 bug
- Create Plan disabled when 1 Month is selected but Total Price is empty or still collapsed. That is
checkFormDisablefrom 17. ng lintrunning out of memory. It did that on 17.- Missing
environment.dev.ts/npm run build-devfailing. - PrimeNG still on saga-blue. That stay is the upgrade decision.
- Prefetch-generated marketing files changing after
prerender-all-qa. Restore them. Do not merge them.
Still required for sign-off: logged-in wallet mask, a toast, stacked overlays, Create Plan with a filled Total Price, live Stripe, audio, and video. Everything else on this page was smoked once on 15 Sep 2026 and should be re-checked on the build that actually ships.