Test evidence
Proof of concept
QA Test Lab
Playwright tests in TypeScript covering end-to-end portfolio journeys, REST API behaviour, and responsive rendering. They run in GitHub Actions. You can start a run yourself, or read the saved results below.
I’m building hands-on experience with Playwright and TypeScript here.
Idle, showing saved results
generated 14 Sept 2026, 09:13 UTC
58
passed
0
failed
59
total tests
13.8s
duration
By suite
Results
Saved with the current build
API · REST sandbox
api.spec.ts
- GET /posts/1 returns 200 with a valid schema, passed desktop-chromium 97ms
- GET /posts returns the full collection, passed desktop-chromium 87ms
- GET /users/1 returns nested address + geo data, passed desktop-chromium 127ms
- CRUD lifecycle: create, update, delete, passed desktop-chromium 1.1s
- returns 404 for a non-existent resource, passed desktop-chromium 81ms
E2E · Portfolio
e2e.portfolio.spec.ts
- loads with the correct QA Engineer title and single H1, passed desktop-chromium 886ms
- declares a language and renders the hero pitch, passed desktop-chromium 851ms
- exposes a downloadable CV with a real PDF target, passed desktop-chromium 910ms
- renders the core sections, passed desktop-chromium 956ms
- keeps secondary portfolio work and earlier experience collapsed until requested, passed desktop-chromium 1.2s
- opens a video from the expanded portfolio without duplicate controls, passed desktop-chromium 877ms
- reveals the original project and video logos on hover or keyboard focus, passed desktop-chromium 1.8s
- has a working skip-to-content accessibility link, passed desktop-chromium 904ms
- uses the WhatsApp brand mark and keeps em dashes out of page copy, passed desktop-chromium 984ms
- runs the QA demo from the dedicated Test Lab page, passed desktop-chromium 759ms
- builds a richer quote estimate without leaving the page, passed desktop-chromium 1.4s
- loads with the correct QA Engineer title and single H1, passed mobile-chromium 941ms
- declares a language and renders the hero pitch, passed mobile-chromium 1.1s
- exposes a downloadable CV with a real PDF target, passed mobile-chromium 1.2s
- renders the core sections, passed mobile-chromium 1.1s
- keeps secondary portfolio work and earlier experience collapsed until requested, passed mobile-chromium 1.2s
- opens a video from the expanded portfolio without duplicate controls, passed mobile-chromium 1.0s
- reveals the original project and video logos on hover or keyboard focus, passed mobile-chromium 1.5s
- has a working skip-to-content accessibility link, passed mobile-chromium 726ms
- uses the WhatsApp brand mark and keeps em dashes out of page copy, passed mobile-chromium 850ms
- runs the QA demo from the dedicated Test Lab page, passed mobile-chromium 799ms
- builds a richer quote estimate without leaving the page, passed mobile-chromium 1.1s
- keeps homepage, blog, and Test Lab navigation consistent, passed desktop-chromium 962ms
- keeps homepage, blog, and Test Lab navigation consistent, passed mobile-chromium 731ms
- opens the quote builder from the services page, passed desktop-chromium 797ms
- opens the quote builder from the services page, passed mobile-chromium 644ms
- share options are reachable outside the article header and dismiss with Escape, passed desktop-chromium 769ms
- lists at least one post and navigates into it, passed desktop-chromium 757ms
- share options are reachable outside the article header and dismiss with Escape, passed mobile-chromium 897ms
- lists at least one post and navigates into it, passed mobile-chromium 605ms
- serves a styled 404 page, passed desktop-chromium 572ms
- serves a styled 404 page, passed mobile-chromium 646ms
- publishes canonical recruiter metadata and grounded Person schema, passed desktop-chromium 790ms
- points crawlers to the generated sitemap and keeps the 404 out of search, passed desktop-chromium 705ms
- publishes canonical recruiter metadata and grounded Person schema, passed mobile-chromium 776ms
- points crawlers to the generated sitemap and keeps the 404 out of search, passed mobile-chromium 622ms
Presentation · Responsive and motion
e2e.presentation.spec.ts
- every built page fits phone, tablet and desktop widths, passed desktop-chromium 7.0s
- experience precedes web builds and expanded work fits a narrow phone, passed desktop-chromium 780ms
- mobile menu closes after an anchor and with Escape, passed desktop-chromium 651ms
- floating navigation expands on scroll and ambient motion respects user preference, passed desktop-chromium 1.2s
- subpage navigation keeps the same sticky expansion contract, passed desktop-chromium 1.7s
- commercial mobile menus expose page navigation and close with Escape, passed desktop-chromium 851ms
- indexable core content remains visible without JavaScript, passed desktop-chromium 921ms
- booking language controls update content and survive a reload, passed desktop-chromium 746ms
- calculator inputs still update the results, passed desktop-chromium 572ms
- every built page fits phone, tablet and desktop widths, skipped mobile-chromium Skipped
- experience precedes web builds and expanded work fits a narrow phone, passed mobile-chromium 759ms
- mobile menu closes after an anchor and with Escape, passed mobile-chromium 859ms
- floating navigation expands on scroll and ambient motion respects user preference, passed mobile-chromium 1.3s
- subpage navigation keeps the same sticky expansion contract, passed mobile-chromium 1.8s
- commercial mobile menus expose page navigation and close with Escape, passed mobile-chromium 630ms
- indexable core content remains visible without JavaScript, passed mobile-chromium 900ms
- booking language controls update content and survive a reload, passed mobile-chromium 740ms
- calculator inputs still update the results, passed mobile-chromium 566ms
Tests defined in tests/e2e.portfolio.spec.ts, tests/e2e.presentation.spec.ts, and tests/api.spec.ts · orchestrated by .github/workflows/tests.yml