Unit and integration tests

Jest HTML Report

Generated Nov 7, 2026, 3:51:33 PM

102 Test suites
1102 Total tests
1102 Passed
0 Failed
100.00% Pass rate
943.57s Duration

Test Suites

src/utils/inBrowserTestRunner.test.js passed 51/51 passed 7.02s
Test Status Duration
createTestSuites structure exposes every suite and test with its translation keys passed 48ms
dom-structure suite root mounted fails when #root is missing passed 165ms
dom-structure suite root mounted fails when #root is empty passed 39ms
dom-structure suite root mounted reports the number of top-level nodes passed 18ms
dom-structure suite landmarks lists every missing landmark passed 49ms
dom-structure suite landmarks reports only the missing one for <header></header><main></main> passed 21ms
dom-structure suite landmarks reports only the missing one for <nav></nav><footer></footer> passed 22ms
dom-structure suite landmarks reports only the missing one for <div role="main"></div><div role="contentinfo"></div> passed 15ms
dom-structure suite landmarks passes when all are present passed 9ms
dom-structure suite safe links accepts noopener or noreferrer in any case passed 32ms
dom-structure suite safe links lists at most three insecure hrefs passed 21ms
dom-structure suite image alt accepts alt or aria-hidden passed 13ms
dom-structure suite image alt fails on images with neither alt nor aria-hidden="true" passed 8ms
a11y suite heading hierarchy requires an h1 passed 22ms
a11y suite heading hierarchy rejects empty or whitespace-only headings passed 18ms
a11y suite heading hierarchy quotes the first 30 trimmed characters of the h1 passed 10ms
a11y suite button labels accepts text, aria-label, aria-labelledby or title passed 26ms
a11y suite button labels treats whitespace-only labels as missing passed 28ms
a11y suite dialog roles requires aria-modal="true" passed 41ms
a11y suite dialog roles passes for modal dialogs passed 14ms
i18n suite initialized fails without a ready instance (null) passed 11ms
i18n suite initialized fails without a ready instance ({"isInitialized": false}) passed 8ms
i18n suite initialized reports the current language passed 1ms
i18n suite supported language accepts en passed 1ms
i18n suite supported language accepts pt-BR passed 9ms
i18n suite supported language accepts es passed 1ms
i18n suite supported language falls back to en without an instance passed 1ms
i18n suite supported language rejects other languages passed 10ms
i18n suite missing keys passes when every sample key resolves passed 5ms
i18n suite missing keys reports keys that echo back or are empty passed 7ms
i18n suite missing keys reports every key without an instance passed 6ms
network suite edge asset simulates a pass when fetch is unavailable passed 7ms
network suite edge asset HEAD-requests the favicon without caching and reports timing passed 11ms
network suite edge asset accepts a 304 response passed 1ms
network suite edge asset rejects failing HTTP statuses passed 7ms
network suite edge asset treats network errors as a completed request passed 1ms
network suite edge asset tolerates errors without a message passed 9ms
network suite secure context passes on localhost passed 6ms
performance suite navigation timing reports TTFB and DOM content loaded passed 7ms
performance suite navigation timing records a baseline without entries ([]) passed 7ms
performance suite navigation timing records a baseline without entries (undefined) passed 1ms
performance suite raf simulates a pass when requestAnimationFrame is unavailable passed 7ms
performance suite raf simulates a pass when no frame is delivered in time passed 17ms
performance suite raf passes at exactly the 200ms threshold passed 1ms
performance suite raf rounds the healthy frame tick passed 9ms
performance suite raf rejects frames slower than 200ms passed 13ms
executeTest returns a passed result with the run message and rounded duration passed 8ms
executeTest falls back to a default message and a minimum 1ms duration passed 1ms
executeTest returns a failed result with the error message passed 5ms
executeTest uses a default error and minimum duration when the error has no message passed 6ms
executeTest falls back to Date.now when performance is unavailable passed 1ms
tests/jest/certificates.test.js passed 52/52 passed 6.88s
Test Status Duration
Certificate Data Validation Certificate Count should have exactly 35 certificates passed 32ms
Certificate Data Validation Certificate Structure all certificates should have required fields passed 178ms
Certificate Data Validation Certificate Structure all certificate IDs should be unique and sequential passed 14ms
Certificate Data Validation Certificate Structure all titles should be non-empty strings passed 38ms
Certificate Data Validation Certificate Structure all categories should be non-empty strings passed 53ms
Certificate Data Validation File Paths all images should start with "images/" passed 27ms
Certificate Data Validation File Paths all thumbs should start with "images/thumbs/" passed 21ms
Certificate Data Validation File Paths image and thumb filenames should match passed 20ms
Certificate Data Validation File Paths all image files should exist passed 28ms
Certificate Data Validation File Paths all thumb files should exist passed 22ms
Certificate Data Validation LinkedIn URL Sources should have certificates from multiple sources passed 91ms
Certificate Data Validation LinkedIn URL Sources Udemy certificates should have correct URL format passed 9ms
Certificate Data Validation LinkedIn URL Sources LinkedIn CDN certificates should have correct URL format passed 1ms
Certificate Data Validation LinkedIn URL Sources Skilljar certificates should have correct URL format passed 1ms
Certificate Data Validation Certificate Title Uniqueness all certificate titles should be unique passed 13ms
Certificate Data Validation Category Distribution should have at least 3 different categories passed 1ms
Certificate Data Validation Category Distribution categories should be properly formatted (capitalized) passed 18ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #1 - Introduction to SQL passed 9ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #2 - Agentic AI for Developers passed 11ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #3 - Cybersecurity at Work (2020) passed 1ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #4 - Foundations of Building in Board passed 12ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #5 - Automated Tests with Cypress - Advanced passed 11ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #6 - Design Elements of Automated Tests passed 10ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #7 - Playwright UI + API (10h course) passed 8ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #8 - AWS for Developers: DynamoDB passed 1ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #9 - Learning Docker passed 8ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #10 - Best Practices in Test Automation with Cypress passed 7ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #11 - E2E Tests With Cypress passed 3ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #12 - Playwright Automation passed 7ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #13 - GraphQL Essential Training passed 8ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #14 - End-to-End JavaScript Testing with Cypress.io passed 1ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #15 - API Testing Foundations passed 14ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #16 - Gherkin Language - The Master Guide passed 9ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #17 - Learning Selenium passed 1ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #18 - Test Automation Foundations passed 1ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #19 - Working with Difficult People passed 8ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #20 - Automation Selenium WebDriver + Java passed 7ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #21 - Mobile Automation: Appium Cucumber Android & iOS + Jenkins passed 8ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #22 - Agile Management with Scrum passed 1ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #23 - Automation Test with Cypress - Basics passed 8ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #24 - Automation Test with Cypress - Intermediary passed 9ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #25 - Web Design for Beginners: Real World Coding in HTML & CSS passed 1ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #26 - Software Testing: Becoming an Expert passed 8ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #27 - Postman Introduction passed 7ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #28 - The Python Bibleā„¢ | Everything You Need to Program in Python passed 1ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #29 - GitHub Intensive Course passed 7ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #30 - Regular Expressions passed 8ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #31 - Python for Beginners (Python 3) passed 7ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #32 - Cypress - Modern Automation Testing from Scratch + Frameworks passed 5ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #33 - Swift 5 Programming For Beginners passed 1ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #34 - Certified ISTQB Agile Tester Foundation Level passed 11ms
Certificate Data Validation Individual Certificates (table-driven) Certificate #35 - GitHub Ultimate: Master Git and GitHub - Beginner to Expert passed 8ms
src/components/test-results/CiMetrics.test.jsx passed 18/18 passed 9.73s
Test Status Duration
CiMetrics layout renders three cards with icons and titles passed 321ms
CiMetrics layout shows spinners while loading passed 108ms
CiMetrics layout shows empty states without data passed 46ms
Jest card renders stats, computed rate and report link passed 687ms
Jest card lists suites with badges and toggles the list passed 345ms
Jest card prefers an explicit pass rate and falls back on missing counts passed 140ms
Jest card reports 100% for an empty run passed 108ms
Jest card rate 95 uses the success tone passed 94ms
Jest card rate 94.99 uses the warning tone passed 112ms
Jest card rate 80 uses the warning tone passed 93ms
Jest card rate 79.99 uses the error tone passed 80ms
E2E card counts steps across flows passed 229ms
E2E card renders flows with steps that expand individually passed 425ms
E2E card falls back to test counts when no flow has steps passed 132ms
E2E card defaults missing counts and flows to zero passed 101ms
E2E card uses passed counts when only failures are reported passed 88ms
Coverage card renders each metric with tone, fraction and bar passed 157ms
Coverage card scores just below 50% as errors passed 82ms
tests/jest/js-certificates-unit.test.js passed 52/52 passed 4.09s
Test Status Duration
certificates.js - Unit Tests File Structure and Exports file exists and is readable passed 9ms
certificates.js - Unit Tests File Structure and Exports contains certificate data array passed 1ms
certificates.js - Unit Tests File Structure and Exports contains CertificateModal class definition passed 1ms
certificates.js - Unit Tests File Structure and Exports contains getBasePath function passed 13ms
certificates.js - Unit Tests File Structure and Exports exports to window object passed 1ms
certificates.js - Unit Tests Certificate Data Validation has exactly 35 certificates passed 19ms
certificates.js - Unit Tests Certificate Data Validation all certificates have required properties passed 189ms
certificates.js - Unit Tests Certificate Data Validation all image paths use relative paths without ../ passed 65ms
certificates.js - Unit Tests Certificate Data Validation all thumb paths are in thumbs folder passed 24ms
certificates.js - Unit Tests Certificate Data Validation LinkedIn URLs use HTTPS protocol passed 26ms
certificates.js - Unit Tests Certificate Data Validation all categories are from valid list passed 22ms
certificates.js - Unit Tests Input Sanitization Logic escapeHtml properly handles special characters passed 1ms
certificates.js - Unit Tests Input Sanitization Logic validates inputs before processing passed 8ms
certificates.js - Unit Tests CertificateModal Class Methods has constructor method passed 1ms
certificates.js - Unit Tests CertificateModal Class Methods has all required methods passed 10ms
certificates.js - Unit Tests Navigation Logic uses modulo arithmetic for wrap-around passed 3ms
certificates.js - Unit Tests Navigation Logic handles both forward and backward navigation passed 3ms
certificates.js - Unit Tests Navigation Logic prevents negative index with + certificates.length passed 2ms
certificates.js - Unit Tests Error Handling checks if container exists passed 1ms
certificates.js - Unit Tests Error Handling logs error when container missing passed 0ms
certificates.js - Unit Tests Error Handling has early return on error passed 1ms
certificates.js - Unit Tests Error Handling warns when modal not initialized passed 5ms
certificates.js - Unit Tests Event Handling handles close button click passed 0ms
certificates.js - Unit Tests Event Handling handles navigation buttons passed 8ms
certificates.js - Unit Tests Event Handling implements keyboard navigation passed 1ms
certificates.js - Unit Tests Event Handling closes modal on background click passed 0ms
certificates.js - Unit Tests Accessibility includes ARIA labels for buttons passed 0ms
certificates.js - Unit Tests Accessibility implements lazy loading for images passed 0ms
certificates.js - Unit Tests Accessibility uses semantic button elements passed 5ms
certificates.js - Unit Tests UI State Management (Disabled Modal) clears active class for visibility passed 1ms
certificates.js - Unit Tests UI State Management (Disabled Modal) resets body scroll overflow passed 0ms
certificates.js - Unit Tests UI State Management (Disabled Modal) switches between grid and viewer display passed 7ms
certificates.js - Unit Tests Code Quality uses strict equality (===) passed 3ms
certificates.js - Unit Tests Code Quality uses const for immutable values passed 1ms
certificates.js - Unit Tests Code Quality uses template literals for HTML generation passed 2ms
certificates.js - Unit Tests Code Quality includes code documentation comments passed 0ms
certificates.js - Unit Tests Initialization waits for DOMContentLoaded passed 1ms
certificates.js - Unit Tests Initialization creates global window reference passed 7ms
certificates.js - Unit Tests Initialization provides fallback helper function passed 0ms
certificates.js - Unit Tests Initialization logs initialization messages passed 1ms
certificates.js - Unit Tests Functional Tests - getBasePath returns empty string for root path passed 32ms
certificates.js - Unit Tests Functional Tests - getBasePath returns ../ for /pages/ path passed 1ms
certificates.js - Unit Tests Functional Tests - getBasePath returns ../../ for nested /pages/folder/ path passed 12ms
certificates.js - Unit Tests Functional Tests - escapeHtml escapes HTML special characters passed 8ms
certificates.js - Unit Tests Functional Tests - escapeHtml handles empty string passed 0ms
certificates.js - Unit Tests Functional Tests - escapeHtml handles normal text without special chars passed 1ms
certificates.js - Unit Tests Image Path Handling uses basePath for image sources passed 7ms
certificates.js - Unit Tests Image Path Handling generates correct paths for thumbnails passed 0ms
certificates.js - Unit Tests Image Path Handling generates correct paths for full images passed 1ms
certificates.js - Unit Tests LinkedIn Integration includes LinkedIn verification links passed 15ms
certificates.js - Unit Tests LinkedIn Integration handles certificates with LinkedIn URLs passed 0ms
certificates.js - Unit Tests LinkedIn Integration LinkedIn links open in new tab passed 1ms
src/components/Navbar.test.jsx passed 27/27 passed 20.26s
Test Status Duration
Navbar Component marks the link for the current page as active passed 1.37s
Navbar Component renders brand logo and text passed 183ms
Navbar Component renders navigation links passed 363ms
Navbar Component renders social, theme toggle, and CTA links passed 209ms
Navbar Component toggles theme on click in navbar passed 551ms
Navbar Component switches language from the compact navbar selector passed 891ms
Navbar Component accepts onOpenCertificates callback prop passed 226ms
Navbar Component calls onOpenContact when Send me a message button is clicked passed 169ms
Navbar Component renders mobile menu toggle button passed 209ms
Navbar Component toggles mobile menu on click passed 716ms
Navbar Component closes mobile menu when a nav link is clicked passed 671ms
Navbar Component closes mobile menu when backdrop is clicked passed 744ms
Navbar Component closes mobile menu on Escape key passed 602ms
Navbar Component calculates and sets navigation height passed 225ms
Navbar Component applies correct styles to mobile menu and overlay when open passed 261ms
Navbar Component handles ResizeObserver when available passed 179ms
Navbar Component home link scroll-to-top scrolls to top when already on home and the page is scrolled down passed 264ms
Navbar Component home link scroll-to-top leaves navigation alone when the page is at the top passed 184ms
Navbar Component home link scroll-to-top navigates instead of scrolling when on another route passed 203ms
Navbar Component handles missing ResizeObserver gracefully passed 144ms
Navbar Component labels each language name in its own language passed 235ms
Navbar Component keeps keyboard focus on the language switcher after the app remounts in the new language passed 892ms
Navbar Component open mobile menu takes the page behind the menu out of the tab order until it closes passed 649ms
Navbar Component open mobile menu closes and releases the page when the viewport grows past the mobile layout passed 650ms
Navbar Component open mobile menu closing from the backdrop hands focus to the toggle passed 1.07s
Navbar Component open mobile menu Escape from a menu link closes the menu and returns focus to the toggle passed 679ms
Navbar Component open mobile menu keeps page scroll locked when the contact modal opens from the menu passed 760ms
src/components/Articles.filters.test.jsx passed 35/35 passed 21.55s
Test Status Duration
Articles stats and listing summarises articles, minutes, venues and tags passed 535ms
Articles stats and listing lists internal posts first and features only the first card passed 214ms
Articles stats and listing features the newest post, breaking same-day ties by schedule order passed 169ms
Articles stats and listing renders theme tabs with icons and counts passed 817ms
Articles stats and listing counts topics from untranslated tags when translated tags drop the keyword passed 358ms
Articles stats and listing does not count a tag that merely contains the letters "ai" passed 355ms
Articles stats and listing sorts tag pills by priority then alphabetically passed 159ms
Articles card mapping maps an internal post with defaults derived from its tags passed 148ms
Articles card mapping prefers markdown metadata and legacy fields when present passed 180ms
Articles card mapping falls back to Cypress defaults for a bare post passed 132ms
Articles card mapping maps external articles through translation keys passed 143ms
Articles card mapping uses localized post fields for the active language passed 987ms
Articles theme filters Home Assistant tab filters articles and syncs the URL passed 1.12s
Articles theme filters Cypress tab filters articles and syncs the URL passed 1.02s
Articles theme filters AI & LLM tab filters articles and syncs the URL passed 1.15s
Articles theme filters Architecture & Auth tab filters articles and syncs the URL passed 1.05s
Articles tag filters a tag pill filters, opens the disclosure and updates the URL passed 1.29s
Articles tag filters a home tag also selects the Home Assistant theme passed 676ms
Articles tag filters cypress tag matches tags containing cypress passed 287ms
Articles tag filters tags match ignoring whitespace passed 185ms
Articles tag filters a home tag in the URL selects the Home Assistant theme passed 256ms
Articles tag filters an explicit theme in the URL wins over a home tag passed 221ms
Articles tag filters an unknown theme in the URL is ignored passed 202ms
Articles tag filters toggling the disclosure keeps it open passed 126ms
Articles search query "zigbee" matches html, description, title, tags and theme passed 275ms
Articles search query "SMART" matches html, description, title, tags and theme passed 317ms
Articles search query "bare" matches html, description, title, tags and theme passed 330ms
Articles search query "auth0" matches html, description, title, tags and theme passed 243ms
Articles search query "ai" matches html, description, title, tags and theme passed 227ms
Articles search search is prefilled from the URL and cleared by the clear button passed 480ms
Articles search whitespace-only searches do not filter passed 182ms
Articles search no matches shows the empty state, which clears every filter passed 400ms
Articles search the empty state names the tag when there is no query passed 125ms
Articles deep links hydrates the prerendered page cleanly, then applies the URL filters passed 741ms
Articles deep links the theme label in the status line follows the language passed 204ms
tests/jest/js-certificates-modal.test.js passed 39/39 passed 15.49s
Test Status Duration
CertificateModal - Instance Behavior open() method (Disabled) does not add active class to container when modal is disabled passed 910ms
CertificateModal - Instance Behavior open() method (Disabled) does not set body overflow to hidden when modal is disabled passed 537ms
CertificateModal - Instance Behavior open() method (Disabled) does not call showGrid when modal is disabled passed 398ms
CertificateModal - Instance Behavior close() method removes active class from container passed 474ms
CertificateModal - Instance Behavior close() method restores body overflow passed 416ms
CertificateModal - Instance Behavior showGrid() method displays grid element passed 312ms
CertificateModal - Instance Behavior showGrid() method hides viewer element passed 287ms
CertificateModal - Instance Behavior openCertificate(index) method sets currentIndex to provided index passed 358ms
CertificateModal - Instance Behavior openCertificate(index) method hides grid and displays viewer passed 278ms
CertificateModal - Instance Behavior openCertificate(index) method calls updateViewer after setting index passed 313ms
CertificateModal - Instance Behavior navigate(direction) method increments index when direction is 1 passed 274ms
CertificateModal - Instance Behavior navigate(direction) method decrements index when direction is -1 passed 366ms
CertificateModal - Instance Behavior navigate(direction) method wraps forward at end (modulo logic) passed 357ms
CertificateModal - Instance Behavior navigate(direction) method wraps backward at start (modulo logic) passed 243ms
CertificateModal - Instance Behavior navigate(direction) method calls updateViewer after navigation passed 246ms
CertificateModal - Instance Behavior navigate(direction) method handles multiple navigations correctly passed 248ms
CertificateModal - Instance Behavior updateViewer() method updates image src with certificate image path passed 252ms
CertificateModal - Instance Behavior updateViewer() method updates image alt text with certificate title passed 235ms
CertificateModal - Instance Behavior updateViewer() method updates title element with certificate title passed 221ms
CertificateModal - Instance Behavior updateViewer() method updates category element with certificate category passed 232ms
CertificateModal - Instance Behavior updateViewer() method updates currentCert counter passed 234ms
CertificateModal - Instance Behavior updateViewer() method shows LinkedIn button when linkedinUrl exists passed 253ms
CertificateModal - Instance Behavior updateViewer() method hides LinkedIn button when linkedinUrl is missing passed 234ms
CertificateModal - Instance Behavior updateViewer() method updates viewFullBtn href with certificate image path passed 245ms
CertificateModal - Instance Behavior updateViewer() method applies basePath to image src and viewFullBtn passed 507ms
CertificateModal - Instance Behavior Event listener attachment attachEventListeners is called during init passed 469ms
CertificateModal - Instance Behavior Event listener attachment close button triggers close() passed 267ms
CertificateModal - Instance Behavior Event listener attachment next button navigates forward passed 273ms
CertificateModal - Instance Behavior Event listener attachment prev button navigates backward passed 226ms
CertificateModal - Instance Behavior Event listener attachment backToGrid button shows grid passed 228ms
CertificateModal - Instance Behavior Event listener attachment clicking modal background closes modal passed 245ms
CertificateModal - Instance Behavior Event listener attachment Escape key closes active modal passed 221ms
CertificateModal - Instance Behavior Event listener attachment navigate methods work when called directly passed 318ms
CertificateModal - Instance Behavior Event listener attachment showGrid method works when called directly passed 256ms
CertificateModal - Instance Behavior Event listener attachment keyboard events ignored when modal is not active passed 231ms
CertificateModal - Instance Behavior Render grid view grid items are created for certificates passed 279ms
CertificateModal - Instance Behavior Render grid view grid items are clickable to open certificate passed 272ms
CertificateModal - Instance Behavior Constructor edge cases returns early when modal container not found passed 351ms
CertificateModal - Instance Behavior Constructor edge cases initializes certificates array from module passed 281ms
src/App.test.jsx passed 16/16 passed 9.68s
Test Status Duration
App Component renders home route components passed 496ms
App Component renders the home page as hero, shipped, stack, then experience with nothing collapsible passed 130ms
App Component renders articles route passed 131ms
App Component renders side-projects route passed 235ms
App Component renders frameworks route passed 56ms
App Component renders test-results route passed 54ms
App Component renders a not-found page for unknown routes and keeps it out of the index passed 593ms
App Component writes the page head for /side-projects/ passed 120ms
App Component writes the page head for /blog passed 114ms
App Component opens and closes Certificates Modal via Navbar passed 163ms
App Component Background Gradient Effect body has gradient background applied passed 84ms
App Component Background Gradient Effect gradient contains blue-ish colors passed 111ms
App Component Background Gradient Effect background attachment is fixed for all routes passed 158ms
App Component Background Gradient Effect gradient persists across SPA navigation passed 157ms
App Component Background Gradient Effect App component has minimum height of 100vh passed 80ms
App Component Background Gradient Effect gradient effect is applied to all page routes passed 233ms
src/components/test-results/TrendHistory.test.jsx passed 14/14 passed 7.42s
Test Status Duration
TrendHistory renders nothing while loading and an empty state under two runs passed 253ms
TrendHistory shows the latest run, five sparklines and the unstable list passed 683ms
TrendHistory hovering a sparkline focuses that run in every tile passed 390ms
TrendHistory exposes the same data as a table passed 425ms
TrendHistory lets a narrow screen scroll the table inside a keyboard-focusable region passed 130ms
TrendHistory details draws exact sparkline paths, areas and markers passed 181ms
TrendHistory details pass-rate sparklines use a fixed 0-100 scale, so a steady 100% sits on the top edge passed 80ms
TrendHistory details tiles show the latest run with pass/fail tones passed 112ms
TrendHistory details hovering picks the nearest run and draws a cursor where data exists passed 316ms
TrendHistory details ignores hover on a sparkline without layout width passed 121ms
TrendHistory details lists unstable tests by failure count with their layer passed 125ms
TrendHistory details says when nothing failed and renders an empty sparkline without data passed 129ms
TrendHistory details table rows format each metric and date passed 109ms
TrendHistory details a non-array history shows the empty state passed 14ms
src/components/LiveTestRunner.test.jsx passed 19/19 passed 31.41s
Test Status Duration
LiveTestRunner Component renders in initial idle state with run button and test stats passed 934ms
LiveTestRunner Component shows dashes instead of green zeros before the first run passed 137ms
LiveTestRunner Component executes all tests when run button is clicked passed 6.38s
LiveTestRunner Component filters tests by status pills passed 270ms
LiveTestRunner Component suite list is hidden until revealed passed 682ms
LiveTestRunner Component suites start collapsed and toggle on click passed 446ms
LiveTestRunner Component offers collapse all after a run, then expand all again passed 4.79s
LiveTestRunner Component running the suite expands every suite passed 441ms
LiveTestRunner Component passes WAI-ARIA dialog compliance when CookieConsent banner is active in the DOM passed 97ms
LiveTestRunner with deterministic results idle state shows placeholders, empty progress and the run affordance passed 268ms
LiveTestRunner with deterministic results revealed suites list idle tests with translated names and zero counts passed 649ms
LiveTestRunner with deterministic results a mixed run reports failures everywhere passed 1.65s
LiveTestRunner with deterministic results details panels show output and assertion errors passed 1.39s
LiveTestRunner with deterministic results filters hide non-matching tests and empty suites passed 1.35s
LiveTestRunner with deterministic results passed filter before any run hides every suite but all keeps them passed 213ms
LiveTestRunner with deterministic results an all-green run shows the verified badge and success progress passed 1.50s
LiveTestRunner with deterministic results collapse all toggles the ghost button state passed 1.47s
LiveTestRunner with deterministic results shows the running state while a test is in flight passed 1.98s
LiveTestRunner with deterministic results unmounting mid-run stops executing further tests passed 266ms
src/components/Contact.test.jsx passed 11/11 passed 10.45s
Test Status Duration
Contact Component renders contact form with correct access key passed 1.53s
Contact Component renders contact banner and section structure with expected styling and classes passed 144ms
Contact Component handles successful submission passed 621ms
Contact Component prevents submission if too fast (bot check) passed 363ms
Contact Component handles API error (success: false) passed 609ms
Contact Component handles network error passed 428ms
Contact Component prevents submission if honeypot is filled (bot check) passed 387ms
Contact Component logs error when Web3Forms key is not configured passed 130ms
Contact Component blocks submission until the captcha is solved passed 459ms
Contact Component blocks submission when the captcha token expires passed 629ms
Contact Component sends the captcha token and resets the captcha after submitting passed 968ms
tests/jest/security-improvements.test.js passed 31/31 passed 3.62s
Test Status Duration
Code Documentation and Security Enhancements Certificate Gallery - JSDoc Documentation Quality has file-level JSDoc documentation passed 22ms
Code Documentation and Security Enhancements Certificate Gallery - JSDoc Documentation Quality defines Certificate typedef passed 1ms
Code Documentation and Security Enhancements Certificate Gallery - JSDoc Documentation Quality getBasePath has JSDoc with examples passed 9ms
Code Documentation and Security Enhancements Certificate Gallery - JSDoc Documentation Quality escapeHtml has JSDoc with security note passed 61ms
Code Documentation and Security Enhancements Certificate Gallery - JSDoc Documentation Quality certificates array has JSDoc passed 1ms
Code Documentation and Security Enhancements Certificate Gallery - JSDoc Documentation Quality CertificateModal class has JSDoc passed 12ms
Code Documentation and Security Enhancements Certificate Gallery - JSDoc Documentation Quality constructor has parameter documentation passed 1ms
Code Documentation and Security Enhancements Certificate Gallery - JSDoc Documentation Quality all major methods have JSDoc passed 12ms
Code Documentation and Security Enhancements Certificate Gallery - JSDoc Documentation Quality key public methods marked with @public passed 1ms
Code Documentation and Security Enhancements Certificate Gallery - JSDoc Documentation Quality methods have clear visibility documentation passed 8ms
Code Documentation and Security Enhancements Certificate Gallery - JSDoc Documentation Quality methods with parameters have @param documentation passed 1ms
Code Documentation and Security Enhancements Certificate Gallery - JSDoc Documentation Quality methods have @returns documentation passed 13ms
Code Documentation and Security Enhancements Certificate Gallery - JSDoc Documentation Quality complex methods have @example sections passed 1ms
Code Documentation and Security Enhancements XSS Attack Prevention and Input Sanitization escapeHtml function is defined passed 11ms
Code Documentation and Security Enhancements XSS Attack Prevention and Input Sanitization uses createElement for safe escaping passed 1ms
Code Documentation and Security Enhancements XSS Attack Prevention and Input Sanitization escapeHtml is used in generateCertificateGrid passed 11ms
Code Documentation and Security Enhancements XSS Attack Prevention and Input Sanitization alt attributes use escapeHtml passed 1ms
Code Documentation and Security Enhancements XSS Attack Prevention and Input Sanitization updateViewer uses textContent for XSS safety passed 11ms
Code Documentation and Security Enhancements XSS Attack Prevention and Input Sanitization does not use innerHTML for user content passed 1ms
Code Documentation and Security Enhancements Image Performance Optimization - Lazy Loading thumbnail images have loading="lazy" attribute passed 11ms
Code Documentation and Security Enhancements Image Performance Optimization - Lazy Loading images have decoding="async" for performance passed 1ms
Code Documentation and Security Enhancements Image Performance Optimization - Lazy Loading grid images have both lazy loading and async decoding passed 0ms
Code Documentation and Security Enhancements Image Performance Optimization - Lazy Loading main viewer image has lazy loading passed 15ms
Code Documentation and Security Enhancements Image Performance Optimization - Lazy Loading main viewer image has async decoding passed 1ms
Code Documentation and Security Enhancements Image Performance Optimization - Lazy Loading all img tags use performance attributes passed 12ms
Code Documentation and Security Enhancements Code Quality Standards and Best Practices consistent JSDoc formatting passed 24ms
Code Documentation and Security Enhancements Code Quality Standards and Best Practices no TODO or FIXME comments passed 1ms
Code Documentation and Security Enhancements Code Quality Standards and Best Practices security comments are present passed 0ms
Code Documentation and Security Enhancements Code Quality Standards and Best Practices performance comments are present passed 0ms
Code Documentation and Security Enhancements Overall Documentation Coverage and Completeness all JavaScript files have JSDoc passed 0ms
Code Documentation and Security Enhancements Overall Documentation Coverage and Completeness documentation is comprehensive passed 35ms
src/components/Articles.test.jsx passed 22/22 passed 29.87s
Test Status Duration
Articles Component displays Articles banner and themes passed 3.73s
Articles Component displays article cards including in-depth markdown and external articles passed 1.48s
Articles Component filters by Home Assistant theme passed 1.59s
Articles Component filters by Cypress theme passed 1.99s
Articles Component filters by search input, including the text of each post body passed 1.62s
Articles Component renders translated follow card copy passed 697ms
Articles Component Hasura GraphQL Medium article link should be correct passed 1.01s
Articles Component Auth0 LinkedIn article link should be correct passed 904ms
Articles Component Cyprompt AI Dev.to article link should be correct passed 1.03s
Articles Component Cyprompt article card should have correct tags passed 906ms
Articles Component Cyprompt article shows its cover art without the icon plate on top passed 1.04s
Articles Component Global Hooks login article link should be correct passed 957ms
Articles Component Global Hooks article card should have correct tags passed 811ms
Articles Component Cypress 16 migration article should render with the correct link and metadata passed 985ms
Articles Component Home Assistant article links to internal blog reader and secondary dev.to link passed 1.20s
Articles Component Restored Cypress session article links to internal blog reader and secondary dev.to link passed 956ms
Articles Component No request ever occurred article links to internal blog reader passed 909ms
Articles Component the Latest eyebrow sits on the newest post, ties going to the earliest scheduled passed 495ms
Articles Component card titles are level-2 headings under the page title passed 929ms
Articles Component home hero counts the same articles the page header and grid show passed 616ms
Articles Component tags explain what clicking them does passed 557ms
Articles Component the follow band sits inside a grid column so it shares the cards gutter passed 888ms
src/components/SideProjects.test.jsx passed 28/28 passed 39.46s
Test Status Duration
SideProjects (tabbed project showcases) renders one tab per project with Cypress Neo Reporter selected by default passed 1.92s
SideProjects (tabbed project showcases) shows only the Cypress Neo Reporter showcase by default passed 1.02s
SideProjects (tabbed project showcases) switches to the LoopBeat showcase when its tab is clicked passed 1.43s
SideProjects (tabbed project showcases) switches to the QA Forge showcase when its tab is clicked passed 1.38s
SideProjects (tabbed project showcases) switches to the HELLGATE showcase when its tab is clicked passed 1.29s
SideProjects (tabbed project showcases) switches to the NoRastro showcase when its tab is clicked passed 1.10s
SideProjects (tabbed project showcases) updates the URL hash when switching projects passed 2.39s
SideProjects (tabbed project showcases) opens directly on the project named in the URL hash passed 681ms
SideProjects (tabbed project showcases) opens directly on LoopBeat from its URL hash passed 642ms
SideProjects (tabbed project showcases) opens directly on NoRastro from its URL hash passed 677ms
SideProjects (tabbed project showcases) hydrates prerendered markup cleanly and then opens the project named in the URL hash passed 1.37s
SideProjects (tabbed project showcases) moves between projects with arrow keys passed 2.95s
SideProjects (tabbed project showcases) renders all 6 Cypress Neo Reporter architecture pillars passed 883ms
SideProjects (tabbed project showcases) renders all 6 LoopBeat architecture pillars passed 1.19s
SideProjects (tabbed project showcases) renders all 6 QA Forge tool pillars passed 1.36s
SideProjects (tabbed project showcases) renders all 6 HELLGATE architecture pillars passed 1.20s
SideProjects (tabbed project showcases) renders all 6 NoRastro architecture pillars passed 1.19s
SideProjects (tabbed project showcases) mentions the key services and details of each project passed 2.49s
SideProjects (tabbed project showcases) renders the npm package and GitHub links opening securely in a new tab passed 397ms
SideProjects (tabbed project showcases) renders the 4 Cypress Neo Reporter screenshots in the gallery passed 520ms
SideProjects (tabbed project showcases) renders the LoopBeat live app link opening securely in a new tab passed 618ms
SideProjects (tabbed project showcases) renders the QA Forge live app link opening securely in a new tab passed 764ms
SideProjects (tabbed project showcases) renders the HELLGATE live app link opening securely in a new tab passed 853ms
SideProjects (tabbed project showcases) renders the NoRastro live app link opening securely in a new tab passed 826ms
SideProjects (tabbed project showcases) renders the 4 NoRastro screenshots in the gallery passed 1.14s
SideProjects (tabbed project showcases) renders 2 screenshots that fall back to a placeholder on load error passed 753ms
SideProjects (tabbed project showcases) opens the screenshot gallery when a screenshot is clicked passed 887ms
SideProjects (tabbed project showcases) hero preview falls back to a placeholder when the image is missing passed 280ms
src/components/sideprojects/SideProjects.data.test.js passed 36/36 passed 4.77s
Test Status Duration
preview srcSet Cypress Neo Reporter lists files that exist at the width each candidate declares passed 35ms
preview srcSet LoopBeat lists files that exist at the width each candidate declares passed 14ms
preview srcSet QA Forge lists files that exist at the width each candidate declares passed 18ms
preview srcSet HELLGATE lists files that exist at the width each candidate declares passed 15ms
preview srcSet NoRastro lists files that exist at the width each candidate declares passed 7ms
sideProjectsList lists all showcased projects in order passed 1ms
sideProjectsList Cypress Neo Reporter exposes the fields the showcase needs passed 67ms
sideProjectsList LoopBeat exposes the fields the showcase needs passed 21ms
sideProjectsList QA Forge exposes the fields the showcase needs passed 24ms
sideProjectsList HELLGATE exposes the fields the showcase needs passed 43ms
sideProjectsList NoRastro exposes the fields the showcase needs passed 21ms
neoReporterStructure exposes core identity fields passed 9ms
neoReporterStructure links the npm package first and the GitHub repo second passed 0ms
neoReporterStructure covers the expected architecture pillars passed 1ms
neoReporterStructure describes the install-to-gate pipeline passed 10ms
neoReporterStructure lists report screenshots under public/images/neoreporter passed 1ms
loopBeatStructure exposes core identity fields passed 15ms
loopBeatStructure has a primary external link passed 1ms
loopBeatStructure covers the expected architecture pillars passed 16ms
loopBeatStructure describes the full storage pipeline passed 0ms
loopBeatStructure lists app screenshots under public/images/loopbeat passed 0ms
qaForgeStructure exposes core identity fields passed 0ms
qaForgeStructure has a primary external link to the live app passed 1ms
qaForgeStructure covers the expected tool pillars passed 12ms
qaForgeStructure describes the full URL-to-suite pipeline passed 1ms
qaForgeStructure lists app screenshots under public/images/qaforge passed 13ms
hellGateStructure exposes core identity fields passed 1ms
hellGateStructure has a primary external link to the live app passed 9ms
hellGateStructure covers the expected architecture pillars passed 0ms
hellGateStructure describes the full click-to-play pipeline passed 1ms
hellGateStructure lists app screenshots under public/images/hellgate passed 13ms
rastroStructure exposes core identity fields passed 0ms
rastroStructure has a primary external link to the live app passed 0ms
rastroStructure covers the expected architecture pillars passed 13ms
rastroStructure describes the full sign-in-to-request pipeline passed 0ms
rastroStructure lists app screenshots under public/images/rastro passed 13ms
src/components/blog/Blog.test.jsx passed 13/13 passed 13.12s
Test Status Duration
Blog Components BlogIndex renders blog header and articles passed 868ms
Blog Components BlogIndex filters articles by search input passed 781ms
Blog Components BlogIndex shows locale month and reading time on cards passed 422ms
Blog Components BlogIndex filters articles by tag button passed 1.12s
Blog Components BlogIndex renders brand badges on post cards passed 333ms
Blog Components BlogPost renders single blog post with content and TOC passed 1.69s
Blog Components BlogPost renders Home Assistant blog post with cover image and content passed 375ms
Blog Components BlogPost renders Not Found state for invalid slug or unpublished draft passed 91ms
Blog Components BlogPost loads the post body on demand and keeps copy buttons and headings across re-renders passed 793ms
Blog Components BlogPost points a translated post at its own canonical and restores the head on unmount passed 507ms
Blog Components blogIcons returns Home Assistant brand metadata for homeassistant posts passed 10ms
Blog Components blogIcons returns Cypress brand metadata for cypress posts passed 8ms
Blog Components blogIcons returns tag icons for known tags and null for unknown tags passed 1ms
src/components/Shipped.test.jsx passed 9/9 passed 7.50s
Test Status Duration
Shipped stages five real project screenshots with their live URL, first one active passed 462ms
Shipped offers each screenshot in narrower widths, every frame lazy so none is preloaded passed 225ms
Shipped each step carries the project facts and a deep link to its page passed 1.62s
Shipped switches the staged frame to QA Forge (step 2) when scrolled into view passed 366ms
Shipped switches the staged frame to HELLGATE (step 3) when scrolled into view passed 267ms
Shipped switches the staged frame to NoRastro (step 4) when scrolled into view passed 184ms
Shipped renders placeholder gracefully when an image fails to load passed 343ms
Shipped switches active project when a step pill button is clicked passed 267ms
Shipped a step pill scrolls its step into view, without smooth scrolling under reduced motion passed 346ms
src/components/CookieConsent.test.jsx passed 14/14 passed 5.82s
Test Status Duration
CookieConsent Component renders banner when no cookie is present passed 484ms
CookieConsent Component does not render banner when cookie is already set passed 24ms
CookieConsent Component sets cookie and initializes GA on accept passed 171ms
CookieConsent Component sets cookie and does not initialize GA on decline passed 108ms
CookieConsent Component checks if running in production environment passed 58ms
CookieConsent Component tracks consent acceptance event with gtag passed 95ms
CookieConsent Component does not reinitialize analytics if gtag already exists passed 89ms
CookieConsent Component marks the page while the banner is visible so the report FAB can move up passed 34ms
CookieConsent Component clears banner offset styles after accepting cookies passed 136ms
CookieConsent Component clears banner offset styles after declining cookies passed 88ms
CookieConsent Component reopens the banner on request after a previous accepted choice passed 63ms
CookieConsent Component reopens the banner on request after a previous declined choice passed 58ms
CookieConsent Component withdrawing consent after accepting disables GA and deletes its cookies passed 88ms
CookieConsent Component accepting again after a withdrawal re-enables GA passed 84ms
src/components/Hero.test.jsx passed 16/16 passed 8.17s
Test Status Duration
Hero Component Profile Section displays profile image with correct attributes passed 300ms
Hero Component Profile Section displays correct name passed 414ms
Hero Component Profile Section displays professional title passed 171ms
Hero Component Profile Section displays location passed 102ms
Hero Component Hero pitch and CTAs renders the portrait without an overlaid stat badge passed 178ms
Hero Component Hero pitch and CTAs renders primary homepage CTAs passed 265ms
Hero Component Hero pitch and CTAs renders proof stats by the numbers passed 195ms
Hero Component Hero pitch and CTAs calls onOpenContact when send message is clicked passed 208ms
Hero Component Hero pitch and CTAs keeps the hero to two columns: claim and portrait passed 162ms
Hero Component CI run log shows the last run as green with real readouts passed 373ms
Hero Component CI run log turns red and counts failures across suites passed 320ms
Hero Component CI run log renders live badge and mutation score row when mutation data is present passed 319ms
Hero portrait follows the document theme uses the white-backdrop headshot when <html data-theme="light"> passed 94ms
Hero portrait follows the document theme swaps the headshot live when the theme toggles passed 193ms
Hero role typewriter types the role out over time by default passed 167ms
Hero role typewriter shows the first role whole and still under prefers-reduced-motion passed 86ms
tests/jest/js-certificates-functional.test.js passed 25/25 passed 5.24s
Test Status Duration
certificates.js - Module Exports getBasePath function exports getBasePath function passed 66ms
certificates.js - Module Exports getBasePath function returns empty string for root path passed 26ms
certificates.js - Module Exports getBasePath function returns ../../ for /pages/something/ path (matches deep regex) passed 40ms
certificates.js - Module Exports getBasePath function returns ../../ for nested /pages/folder/ path passed 19ms
certificates.js - Module Exports getBasePath function returns ../ for /pages/ root listing passed 33ms
certificates.js - Module Exports getBasePath function handles root path with index.html passed 32ms
certificates.js - Module Exports escapeHtml function exports escapeHtml function passed 22ms
certificates.js - Module Exports escapeHtml function escapes < and > characters passed 19ms
certificates.js - Module Exports escapeHtml function escapes complete script tag passed 28ms
certificates.js - Module Exports escapeHtml function escapes ampersands passed 31ms
certificates.js - Module Exports escapeHtml function escapes quotes via textContent semantics passed 18ms
certificates.js - Module Exports escapeHtml function handles empty string passed 25ms
certificates.js - Module Exports escapeHtml function handles regular text without special chars passed 18ms
certificates.js - Module Exports escapeHtml function handles multiple special characters passed 47ms
certificates.js - Module Exports certificates data exports certificates array passed 18ms
certificates.js - Module Exports certificates data has exactly 35 certificates passed 23ms
certificates.js - Module Exports certificates data all certificates have required properties passed 215ms
certificates.js - Module Exports certificates data certificate IDs are sequential from 1 to 35 passed 41ms
certificates.js - Module Exports certificates data all image paths start with images/ passed 46ms
certificates.js - Module Exports certificates data all certificates have valid categories passed 33ms
certificates.js - Module Exports certificates data LinkedURL URLs use HTTPS when present passed 38ms
certificates.js - Module Exports CertificateModal class exports CertificateModal class passed 17ms
certificates.js - Module Exports CertificateModal class can instantiate CertificateModal passed 13ms
certificates.js - Module Exports CertificateModal class CertificateModal has expected methods passed 17ms
certificates.js - Module Exports CertificateModal class CertificateModal initializes currentIndex to 0 passed 13ms
tests/jest/csp-validation.test.js passed 13/13 passed 4.19s
Test Status Duration
CSP Hash Generation should generate csp-hashes.json during build passed 12ms
CSP Hash Generation should generate correct SHA-256 hash for JSON-LD script passed 16ms
CSP Hash Generation should inject CSP hash into _headers file passed 4ms
CSP Hash Generation allows every inline script on every built page through a script-src hash passed 233ms
CSP Hash Generation should NOT contain unsafe-inline in script-src passed 1ms
CSP Hash Generation should contain required CSP directives passed 2ms
CSP Hash Generation should allow required external script sources passed 15ms
CSP Hash Generation should allow hCaptcha for the contact form passed 7ms
CSP Hash Generation should keep fonts and styles first-party passed 1ms
CSP Hash Generation should temporarily allow unsafe-inline for styles passed 13ms
CSP Implementation Files should have gtag-init.js in dist/js/ passed 13ms
CSP Implementation Files should have vite-plugin-csp-hash.js at root passed 1ms
CSP Implementation Files should have generate-csp-headers.js script passed 6ms
src/components/ErrorBoundary.test.jsx passed 10/10 passed 6.50s
Test Status Duration
ErrorBoundary Component renders children when there is no error passed 227ms
ErrorBoundary Component renders error UI for standard unexpected Error with message and technical details passed 768ms
ErrorBoundary Component renders specific guidance message when an asset load error occurs passed 596ms
ErrorBoundary Component handles Error without message and non-Error objects correctly passed 145ms
ErrorBoundary Component handles reload page button click passed 139ms
ErrorBoundary Component links back to the English home from an unprefixed page passed 107ms
ErrorBoundary Component speaks pt and keeps the language prefix on the home link passed 189ms
ErrorBoundary Component speaks es and keeps the language prefix on the home link passed 156ms
ErrorBoundary Component displays componentStack in development mode passed 56ms
ErrorBoundary Component crash screen takes its colours from the theme stylesheet instead of inline literals passed 101ms
src/components/ContactModal.test.jsx passed 13/13 passed 4.75s
Test Status Duration
ContactModal Component returns null when isOpen is false passed 181ms
ContactModal Component renders modal dialog when isOpen is true passed 606ms
ContactModal Component locks body overflow to hidden when opened and releases it on unmount passed 70ms
ContactModal Component locks body overflow when isOpen toggles to true, releases it when toggles to false passed 72ms
ContactModal Component calls onClose when Escape key is pressed passed 58ms
ContactModal Component does not call onClose when other keys are pressed passed 37ms
ContactModal Component removes keydown listener when unmounted passed 36ms
ContactModal Component calls onClose when close button is clicked passed 121ms
ContactModal Component calls onClose when clicking backdrop directly passed 21ms
ContactModal Component does not call onClose when clicking modal content passed 36ms
ContactModal Component focus return returns focus to the opener after Escape passed 182ms
ContactModal Component focus return returns focus to the opener after the close button passed 126ms
ContactModal Component focus return returns focus to the opener after a backdrop click passed 127ms
src/components/blog/blogIcons.test.jsx passed 9/9 passed 7.15s
Test Status Duration
blogIcons utility getPostBrand returns Cypress brand when tags, slug, title include cypress or cypressDevTo is true passed 42ms
blogIcons utility getPostBrand returns Home Assistant brand when tags, slug, or title match passed 18ms
blogIcons utility getPostBrand returns TypeScript brand when tags or slug match passed 15ms
blogIcons utility getPostBrand returns Claude brand when tags or slug match passed 12ms
blogIcons utility getPostBrand returns Automation brand when tags include automation passed 10ms
blogIcons utility getPostBrand falls back to QA & Testing brand for unknown topics or empty objects passed 1ms
blogIcons utility getPostBrand paints every brand from a colour defined in tokens.css passed 49ms
blogIcons utility getTagIcon returns corresponding icon component for known tag names passed 32ms
blogIcons utility getTagIcon returns null for unrecognized tags or falsy values passed 1ms
src/components/sideprojects/ScreenshotGallery.test.jsx passed 8/8 passed 8.14s
Test Status Duration
ScreenshotGallery renders screenshots as zoomable buttons passed 925ms
ScreenshotGallery opens a zoomed gallery dialog portalled to document.body when a screenshot is clicked passed 432ms
ScreenshotGallery navigates between screenshots in the gallery passed 534ms
ScreenshotGallery supports arrow-key navigation inside the gallery passed 276ms
ScreenshotGallery closes the gallery with Escape, close button, and backdrop click passed 529ms
ScreenshotGallery returns focus to the screenshot that opened the gallery when it closes passed 373ms
ScreenshotGallery locks page scroll while the gallery is open passed 139ms
ScreenshotGallery falls back to a placeholder and removes the zoom button when an image fails passed 121ms
src/components/hooks/useTheme.test.jsx passed 12/12 passed 5.45s
Test Status Duration
useTheme hook defaults to dark theme when no saved preference exists passed 167ms
useTheme hook respects saved light theme from localStorage passed 41ms
useTheme hook follows OS prefers-color-scheme: light when nothing is stored passed 21ms
useTheme hook stays dark when the OS states no preference passed 22ms
useTheme hook a stored choice outranks the OS preference passed 20ms
useTheme hook toggles theme and updates localStorage and DOM passed 55ms
useTheme hook setTheme updates directly to light or dark passed 22ms
useTheme hook applyThemeToDocument updates meta theme-color tag if present passed 11ms
useDocumentTheme reads the theme stamped on <html> passed 49ms
useDocumentTheme falls back to dark when nothing is stamped or stored passed 11ms
useDocumentTheme re-renders when applyThemeToDocument flips the attribute passed 139ms
useDocumentTheme stops observing after unmount passed 17ms
src/components/Frameworks.test.jsx passed 42/42 passed 55.36s
Test Status Duration
Frameworks Component renders main title and description passed 1.76s
Frameworks Component lists the npm package among the test harnesses on what I ship passed 874ms
Frameworks Component Shared saucedemo.com target card renders saucedemo.com badge passed 1.16s
Frameworks Component Shared saucedemo.com target card saucedemo.com badge links to the site passed 1.88s
Frameworks Component Shared saucedemo.com target card renders Testing label passed 926ms
Frameworks Component Shared saucedemo.com target card shipped target badges keep the full host readable when the pill truncates it passed 1.98s
Frameworks Component renders correct number of framework cards renders 9 framework cards and 12 total GitHub links across all sections passed 1.38s
Frameworks Component renders correct number of framework cards renders 11 live report links for repos that publish HTML reports passed 1.27s
Frameworks Component renders correct number of framework cards selenium JUnit card omits live report CTA passed 740ms
Frameworks Component Playwright Section renders card title and subtitle passed 786ms
Frameworks Component Playwright Section renders stat badges passed 784ms
Frameworks Component Playwright Section renders all 6 highlights passed 1.06s
Frameworks Component Playwright Section renders View on GitHub CTA link with correct href passed 1.26s
Frameworks Component Cypress TypeScript Section renders card title and subtitle passed 994ms
Frameworks Component Cypress TypeScript Section renders stat badges passed 1.10s
Frameworks Component Cypress TypeScript Section renders all 6 highlights passed 1.28s
Frameworks Component Cypress TypeScript Section renders CTA link with correct href passed 1.46s
Frameworks Component Cypress BDD Section renders card title and subtitle passed 848ms
Frameworks Component Cypress BDD Section renders stat badges passed 748ms
Frameworks Component Cypress BDD Section renders all 6 highlights passed 1.18s
Frameworks Component Cypress BDD Section renders CTA link with correct href passed 1.24s
Frameworks Component Selenium JUnit Section renders card title and subtitle passed 580ms
Frameworks Component Selenium JUnit Section renders stat badges passed 556ms
Frameworks Component Selenium JUnit Section renders all 6 highlights passed 1.02s
Frameworks Component Selenium JUnit Section renders CTA link with correct href passed 1.38s
Frameworks Component Selenium TestNG Section renders card title and subtitle passed 811ms
Frameworks Component Selenium TestNG Section renders stat badges passed 573ms
Frameworks Component Selenium TestNG Section renders all 6 highlights passed 1.32s
Frameworks Component Selenium TestNG Section renders CTA link with correct href passed 1.23s
Frameworks Component API & Performance Testing Section renders section header and description passed 726ms
Frameworks Component API & Performance Testing Section renders shared endpoints card with label passed 731ms
Frameworks Component API & Performance Testing Section renders endpoint badges as links with correct hrefs passed 1.95s
Frameworks Component API & Performance Testing Section renders k6 card title, subtitle, stats, and highlights passed 1.68s
Frameworks Component API & Performance Testing Section renders Supertest card title, subtitle, stats, and highlights passed 1.53s
Frameworks Component API & Performance Testing Section renders Postman card title, subtitle, stats, and highlights passed 1.58s
Frameworks Component API & Performance Testing Section renders View on GitHub links for all 3 API repos with correct hrefs passed 1.38s
Frameworks Component API & Performance Testing Section all API CTA links open in new tab passed 1.33s
Frameworks Component AI & LLM Testing Section renders section header and AI LLM cards passed 711ms
Frameworks Component AI & LLM Testing Section renders correct GitHub repository and Live Report links for AI LLM examples passed 1.28s
Frameworks Component Contract Testing Section renders section header and Contract Testing cards passed 1.14s
Frameworks Component Contract Testing Section renders correct GitHub repository and Live Report links for Contract Testing examples passed 1.59s
Frameworks Component Legacy E2E Testing Examples Section renders Legacy E2E section header and moved Selenium cards passed 952ms
src/components/frameworks/AdvancedTesting.test.jsx passed 19/19 passed 9.43s
Test Status Duration
AdvancedTesting Shared endpoints card renders "Endpoints Tested" label passed 608ms
AdvancedTesting Shared endpoints card renders 3 endpoint badges as links passed 1.01s
AdvancedTesting API cards grid renders 3 API cards passed 233ms
AdvancedTesting k6 card renders title and subtitle passed 281ms
AdvancedTesting k6 card renders stats passed 273ms
AdvancedTesting k6 card renders 4 feature tiles passed 224ms
AdvancedTesting k6 card renders GitHub link passed 270ms
AdvancedTesting Jest + Supertest card renders title and subtitle passed 181ms
AdvancedTesting Jest + Supertest card renders stats passed 208ms
AdvancedTesting Jest + Supertest card renders 4 feature tiles passed 161ms
AdvancedTesting Jest + Supertest card renders GitHub link passed 263ms
AdvancedTesting Postman / Newman card renders title and subtitle passed 161ms
AdvancedTesting Postman / Newman card renders stats passed 179ms
AdvancedTesting Postman / Newman card renders 4 feature tiles passed 175ms
AdvancedTesting Postman / Newman card renders GitHub link passed 218ms
AdvancedTesting All CTA links all 3 API links open in new tab securely passed 273ms
AdvancedTesting All CTA links all CTA links have primary hover class passed 225ms
AdvancedTesting All CTA links renders live report links for all API repos passed 201ms
AdvancedTesting Theme CSS variables no card inlines its own accent, so every card reads as one palette passed 132ms
src/components/frameworks/FrameworkCard.test.jsx passed 17/17 passed 5.99s
Test Status Duration
FrameworkCard renders card title and subtitle from i18n passed 292ms
FrameworkCard renders the themed icon for playwright passed 116ms
FrameworkCard renders only the first 3 stats passed 107ms
FrameworkCard renders only the first 6 highlights passed 120ms
FrameworkCard renders CTA link with correct attributes passed 292ms
FrameworkCard renders secondary live report CTA when provided passed 226ms
FrameworkCard does not render live report CTA when secondaryCta is omitted passed 184ms
FrameworkCard renders feature icons from framework metadata passed 73ms
FrameworkCard leaves the accent to the stylesheet instead of inlining a per-card hue passed 63ms
FrameworkCard themes uses cypress theme for cypress id passed 69ms
FrameworkCard themes gives the Cucumber BDD card its own icon passed 81ms
FrameworkCard themes uses selenium theme for selenium id passed 87ms
FrameworkCard themes falls back to playwright theme for unknown id passed 130ms
FrameworkCard icons renders the CTA icon inside the View on GitHub link passed 105ms
FrameworkCard icons renders the secondary CTA icon inside the Live Report link passed 102ms
FrameworkCard icons renders every feature icon from metadata passed 120ms
FrameworkCard icons renders all icons as decorative material icons passed 57ms
tests/jest/gtag-init.test.js passed 13/13 passed 4.62s
Test Status Duration
gtag-init.js - Google Analytics Initialization File Loading and Structure file exists and can be loaded passed 26ms
gtag-init.js - Google Analytics Initialization File Loading and Structure contains CSP compliance comment passed 10ms
gtag-init.js - Google Analytics Initialization DataLayer Initialization initializes window.dataLayer as empty array when undefined passed 26ms
gtag-init.js - Google Analytics Initialization DataLayer Initialization preserves existing dataLayer if already defined passed 19ms
gtag-init.js - Google Analytics Initialization gtag Function creates window.gtag function passed 11ms
gtag-init.js - Google Analytics Initialization gtag Function gtag pushes arguments to dataLayer passed 58ms
gtag-init.js - Google Analytics Initialization gtag Function gtag handles multiple calls passed 29ms
gtag-init.js - Google Analytics Initialization gtag Function gtag preserves all arguments passed to it passed 13ms
gtag-init.js - Google Analytics Initialization Integration with Google Analytics follows Google Analytics initialization pattern passed 15ms
gtag-init.js - Google Analytics Initialization Integration with Google Analytics supports event tracking passed 13ms
gtag-init.js - Google Analytics Initialization Integration with Google Analytics supports custom parameters passed 17ms
gtag-init.js - Google Analytics Initialization CSP Compliance does not use eval or Function constructor passed 1ms
gtag-init.js - Google Analytics Initialization CSP Compliance does not contain inline event handlers passed 12ms
src/components/hooks/useFocusTrap.test.jsx passed 8/8 passed 5.51s
Test Status Duration
useFocusTrap should focus the first element when active without scrolling passed 330ms
useFocusTrap should not focus the first element when inactive passed 37ms
useFocusTrap should trap focus inside the container passed 58ms
useFocusTrap should trap focus when shift-tabbing from first element passed 33ms
useFocusTrap returns focus to the element that had it once the trap is released passed 104ms
useFocusTrap returns focus to the trigger when the trapped dialog unmounts passed 45ms
useFocusTrap does not try to focus a trigger that has left the document passed 66ms
useFocusTrap should do nothing if no focusable elements found passed 22ms
src/components/articles/ArticleCard.test.jsx passed 6/6 passed 6.81s
Test Status Duration
ArticleCard Component renders standard article card with metadata, tags, and dev icon passed 1.18s
ArticleCard Component renders featured card with cover image and eager loading passed 80ms
ArticleCard Component renders with linkedin icon and custom linkKey passed 55ms
ArticleCard Component handles clicking tags when onTagClick is undefined without errors passed 135ms
ArticleCard Component handles empty or non-array tags gracefully passed 44ms
ArticleCard Component renders internal markdown article links when isMarkdown is true passed 69ms
src/components/Footer.test.jsx passed 8/8 passed 7.03s
Test Status Duration
Footer Component renders footer content passed 544ms
Footer Component renders social links with correct hrefs passed 595ms
Footer Component renders in-site navigation to every top-level route passed 420ms
Footer Component renders social links with correct hrefs passed 162ms
Footer Component back-to-top button scrolls the window to the top passed 225ms
Footer Component cookie settings button reopens the consent banner after a choice was made passed 266ms
Footer Component cookie settings moves focus into the banner and back to the button after a choice passed 336ms
Footer Component back-to-top jumps without smooth scrolling under prefers-reduced-motion passed 163ms
src/components/TestResults.test.jsx passed 13/13 passed 39.51s
Test Status Duration
TestResults page renders the page claim and the eight numbered sections passed 3.71s
TestResults page shows the mutation score readout and empty states for the new sections passed 4.14s
TestResults page shows the failing count on the status plate and the run metadata passed 2.98s
TestResults page reports all green when nothing failed passed 2.28s
TestResults page displays Jest metrics and expands the suite list passed 2.52s
TestResults page displays E2E metrics computed from steps and expands flows into steps passed 3.13s
TestResults page displays coverage metrics passed 2.24s
TestResults page links every report to its static HTML page passed 2.91s
TestResults page renders four highlighted code samples labelled with their file paths passed 1.70s
TestResults page falls back to the bundled E2E snapshot when the Gist fetch fails passed 2.02s
TestResults page shows the empty states when neither Gist nor snapshot has data passed 2.44s
TestResults page loads test-data.js when the snapshot is not preloaded passed 2.12s
TestResults page reports a load failure when test-data.js cannot be fetched passed 1.71s
src/components/sideprojects/ProjectShowcase.test.jsx passed 6/6 passed 8.24s
Test Status Duration
ProjectShowcase Component renders loopBeat project showcase with hero metadata, title, links, and sections passed 1.25s
ProjectShowcase Component renders gameplay section when project has gameplayGifs passed 338ms
ProjectShowcase Component renders browser mock preview and handles image load failure with placeholder passed 281ms
ProjectShowcase Component renders without gameplay section and without preview when omitted passed 275ms
ProjectShowcase Component scrolls smoothly to the quality architecture section when the hero button is clicked passed 350ms
ProjectShowcase Component jumps to the quality section without smooth scrolling under prefers-reduced-motion passed 542ms
src/components/frameworks/Frameworks.data.test.js passed 61/61 passed 6.04s
Test Status Duration
Frameworks.data exports an array of 9 frameworks passed 40ms
Frameworks.data llmEval has required fields passed 118ms
Frameworks.data promptfoo has required fields passed 15ms
Frameworks.data playwright has required fields passed 22ms
Frameworks.data cypressTs has required fields passed 14ms
Frameworks.data cypressBdd has required fields passed 14ms
Frameworks.data openapi has required fields passed 20ms
Frameworks.data pact has required fields passed 19ms
Frameworks.data seleniumJunit has required fields passed 16ms
Frameworks.data seleniumTestng has required fields passed 32ms
Frameworks.data llmEval has exactly 6 feature icons passed 134ms
Frameworks.data promptfoo has exactly 6 feature icons passed 22ms
Frameworks.data playwright has exactly 6 feature icons passed 3ms
Frameworks.data cypressTs has exactly 6 feature icons passed 13ms
Frameworks.data cypressBdd has exactly 6 feature icons passed 4ms
Frameworks.data openapi has exactly 6 feature icons passed 14ms
Frameworks.data pact has exactly 6 feature icons passed 13ms
Frameworks.data seleniumJunit has exactly 6 feature icons passed 4ms
Frameworks.data seleniumTestng has exactly 6 feature icons passed 10ms
Frameworks.data llmEval has a valid CTA with href and icon passed 1ms
Frameworks.data promptfoo has a valid CTA with href and icon passed 6ms
Frameworks.data playwright has a valid CTA with href and icon passed 0ms
Frameworks.data cypressTs has a valid CTA with href and icon passed 1ms
Frameworks.data cypressBdd has a valid CTA with href and icon passed 17ms
Frameworks.data openapi has a valid CTA with href and icon passed 1ms
Frameworks.data pact has a valid CTA with href and icon passed 0ms
Frameworks.data seleniumJunit has a valid CTA with href and icon passed 0ms
Frameworks.data seleniumTestng has a valid CTA with href and icon passed 0ms
Frameworks.data framework IDs match recognized frameworks passed 16ms
Frameworks.data contains AI LLM entries passed 20ms
Frameworks.data contains Contract Testing entries passed 1ms
Frameworks.data contains Legacy E2E entries passed 14ms
Frameworks.data all CTA hrefs are unique passed 3ms
Frameworks.data eight frameworks expose a live report link passed 1ms
Frameworks.data icons llmEval uses the shared code icon for the View on GitHub CTA passed 15ms
Frameworks.data icons promptfoo uses the shared code icon for the View on GitHub CTA passed 0ms
Frameworks.data icons playwright uses the shared code icon for the View on GitHub CTA passed 0ms
Frameworks.data icons cypressTs uses the shared code icon for the View on GitHub CTA passed 15ms
Frameworks.data icons cypressBdd uses the shared code icon for the View on GitHub CTA passed 1ms
Frameworks.data icons openapi uses the shared code icon for the View on GitHub CTA passed 10ms
Frameworks.data icons pact uses the shared code icon for the View on GitHub CTA passed 5ms
Frameworks.data icons seleniumJunit uses the shared code icon for the View on GitHub CTA passed 0ms
Frameworks.data icons seleniumTestng uses the shared code icon for the View on GitHub CTA passed 1ms
Frameworks.data icons llmEval uses the shared assessment icon for the Live Report CTA passed 17ms
Frameworks.data icons promptfoo uses the shared assessment icon for the Live Report CTA passed 0ms
Frameworks.data icons playwright uses the shared assessment icon for the Live Report CTA passed 1ms
Frameworks.data icons cypressTs uses the shared assessment icon for the Live Report CTA passed 10ms
Frameworks.data icons cypressBdd uses the shared assessment icon for the Live Report CTA passed 0ms
Frameworks.data icons openapi uses the shared assessment icon for the Live Report CTA passed 1ms
Frameworks.data icons pact uses the shared assessment icon for the Live Report CTA passed 13ms
Frameworks.data icons seleniumTestng uses the shared assessment icon for the Live Report CTA passed 0ms
Frameworks.data icons every CTA icon across all frameworks is identical passed 0ms
Frameworks.data icons llmEval feature icons are lowercase material icon ligatures passed 9ms
Frameworks.data icons promptfoo feature icons are lowercase material icon ligatures passed 5ms
Frameworks.data icons playwright feature icons are lowercase material icon ligatures passed 1ms
Frameworks.data icons cypressTs feature icons are lowercase material icon ligatures passed 9ms
Frameworks.data icons cypressBdd feature icons are lowercase material icon ligatures passed 7ms
Frameworks.data icons openapi feature icons are lowercase material icon ligatures passed 1ms
Frameworks.data icons pact feature icons are lowercase material icon ligatures passed 3ms
Frameworks.data icons seleniumJunit feature icons are lowercase material icon ligatures passed 4ms
Frameworks.data icons seleniumTestng feature icons are lowercase material icon ligatures passed 3ms
tests/jest/a11y-summary.test.js passed 4/4 passed 5.44s
Test Status Duration
a11y summary collectRoutes lists prerendered pages and skips report pages and blog post copies passed 92ms
a11y summary collectRoutes lists flat prerendered pages by their slashless URL passed 31ms
a11y summary summarizeA11yScans totals elements by impact and ranks rules by severity passed 14ms
a11y summary summarizeA11yScans reports a clean run as zero passed 21ms
src/components/test-results/CoverageMap.test.jsx passed 4/4 passed 7.71s
Test Status Duration
CoverageMap renders nothing while loading and an empty state without data passed 272ms
CoverageMap shows totals and one row per module with layer marks passed 1.20s
CoverageMap filters modules by layer passed 1.18s
CoverageMap hides the mutation column when no mutation data exists passed 173ms
src/components/test-results/A11yScan.test.jsx passed 5/5 passed 6.99s
Test Status Duration
A11yScan renders nothing while loading and an empty state without data passed 215ms
A11yScan shows the issue total, scope, impact breakdown and engine passed 343ms
A11yScan lists the worst pages with their colour scheme passed 496ms
A11yScan links every failing rule to its axe documentation in a safe new tab passed 345ms
A11yScan reports a clean scan without a rules table passed 67ms
src/components/test-results/SectionRail.test.jsx passed 4/4 passed 5.63s
Test Status Duration
SectionRail Component renders navigation rail with sections list and initial active state on first section passed 679ms
SectionRail Component sets up IntersectionObserver with correct rootMargin and observes matching DOM nodes passed 192ms
SectionRail Component handles missing IntersectionObserver gracefully passed 50ms
SectionRail Component handles empty sections gracefully without crashing passed 45ms
src/StaticAssets.test.js passed 12/12 passed 4.98s
Test Status Duration
Static Assets & Configuration index.html Favicons has apple-touch-icon passed 28ms
Static Assets & Configuration index.html Favicons has 32x32 PNG favicon passed 12ms
Static Assets & Configuration index.html Favicons has 16x16 PNG favicon passed 1ms
Static Assets & Configuration index.html Favicons has webmanifest passed 17ms
Static Assets & Configuration Performance Optimizations loads no third-party font or icon CSS passed 12ms
Static Assets & Configuration Performance Optimizations preloads the self-hosted display and icon fonts passed 12ms
Static Assets & Configuration Performance Optimizations does not include CSP meta tag (CSP is enforced via HTTP headers) passed 1ms
Static Assets & Configuration SEO Meta Tags has meta description passed 9ms
Static Assets & Configuration SEO Meta Tags has canonical link passed 1ms
Static Assets & Configuration SEO Meta Tags has Open Graph tags passed 1ms
Static Assets & Configuration SEO Meta Tags has Twitter card tags passed 9ms
Static Assets & Configuration CSS Variables defines core theme colors passed 40ms
src/components/test-results/useCountUp.test.js passed 6/6 passed 4.42s
Test Status Duration
useCountUp hook (test-results/useCountUp) returns null when target is null or undefined passed 159ms
useCountUp hook (test-results/useCountUp) returns target directly without animating when active is false passed 30ms
useCountUp hook (test-results/useCountUp) animates progress from 0 to 1 scaling target linearly with eased progress passed 87ms
useCountUp hook (test-results/useCountUp) returns target directly when user prefers reduced motion passed 11ms
useCountUp hook (test-results/useCountUp) returns target directly when requestAnimationFrame is missing passed 23ms
useCountUp hook (test-results/useCountUp) cancels animation frame on unmount passed 31ms
tests/jest/blog-generator.test.js passed 10/10 passed 50.68s
Test Status Duration
Blog Generator & Prerender Pipeline slugify converts title to kebab-case slug passed 14ms
Blog Generator & Prerender Pipeline slugify folds accented letters instead of dropping them passed 1ms
Blog Generator & Prerender Pipeline parseFrontmatter parses YAML frontmatter blocks correctly passed 18ms
Blog Generator & Prerender Pipeline parseFrontmatter handles files without frontmatter gracefully passed 2ms
Blog Generator & Prerender Pipeline parsePostContent renders a fence without a known language as an escaped plain code block passed 17ms
Blog Generator & Prerender Pipeline generateBlogData scans content/blog/*.md, outputs blogPosts.json and updates sitemap.xml passed 1.64s
Blog Generator & Prerender Pipeline generateBlogData lists only canonical URLs in the sitemap, with every translated post and its alternates passed 672ms
Blog Generator & Prerender Pipeline generateBlogData ships post metadata to the client and keeps each body in its own file passed 499ms
Blog Generator & Prerender Pipeline generateBlogData wraps every table in a keyboard-scrollable region named by its section heading passed 486ms
Blog Generator & Prerender Pipeline prerender generates dist/blog.html and dist/blog/:slug.html pages when dist exists passed 43.87s
src/components/Experience.test.jsx passed 8/8 passed 8.77s
Test Status Duration
Experience Component displays compact section header passed 1.24s
Experience Component draws one rail with five year chapters, Board current and first passed 438ms
Experience Component every chapter carries a logo plate, a real metric and its tools passed 488ms
Experience Component counts the metric up once the chapter is in view passed 280ms
Experience Component renders key engineering achievement bullets for every chapter without tool chip clutter passed 247ms
Experience Component displays Electronic Arts as the earliest role passed 324ms
Experience Component links each company to its site in a new tab, exactly once passed 386ms
Experience Component does not render case study buttons passed 257ms
src/components/hooks/useCountUp.test.js passed 6/6 passed 5.94s
Test Status Duration
useCountUp hook (hooks/useCountUp) animates value from 0 to target using cubic easing and completes at 1100ms passed 119ms
useCountUp hook (hooks/useCountUp) defaults active to true and animates passed 13ms
useCountUp hook (hooks/useCountUp) does not animate when active is false passed 25ms
useCountUp hook (hooks/useCountUp) does not animate when user prefers reduced motion passed 18ms
useCountUp hook (hooks/useCountUp) does not animate when requestAnimationFrame is not supported passed 34ms
useCountUp hook (hooks/useCountUp) cancels animation frame on unmount passed 22ms
tests/jest/certificates-min.test.js passed 7/7 passed 5.18s
Test Status Duration
certificates.min.js - Minified Version File Verification minified file exists passed 27ms
certificates.min.js - Minified Version File Verification minified file is smaller than source file passed 23ms
certificates.min.js - Minified Version File Verification contains expected minified patterns passed 14ms
certificates.min.js - Minified Version File Verification contains certificate data passed 1ms
certificates.min.js - Minified Version File Verification contains key functions from source passed 12ms
certificates.min.js - Minified Version Content Integrity does not contain syntax errors passed 14ms
certificates.min.js - Minified Version Content Integrity file is not empty passed 1ms
src/components/Stack.test.jsx passed 4/4 passed 9.33s
Test Status Duration
Stack draws every logo from one cached sprite, in the category tone passed 1.23s
Stack lists the production stack by category, every tool with a glyph passed 1.62s
Stack does not repeat the employer timeline: no company names as group titles passed 850ms
Stack carries the LinkedIn competencies: IoT hardware, reporters and CI/CD passed 638ms
tests/jest/test-history.test.js passed 5/5 passed 5.26s
Test Status Duration
test history buildHistoryEntry keeps only the compact per-run facts passed 16ms
test history buildHistoryEntry tolerates missing reports passed 9ms
test history appendRun replaces a run for the same commit and caps the window passed 10ms
test history syncHistory only reads when push is off, appends and writes when on passed 16ms
test history syncHistory keeps the previous history when the write fails passed 9ms
src/components/test-results/Ring.test.jsx passed 8/8 passed 5.32s
Test Status Duration
Ring component renders with default muted tone and clamped value passed 264ms
Ring component renders with custom tone passed 47ms
Ring component clamps values below 0 to 0 passed 27ms
Ring component clamps values above 100 to 100 passed 52ms
Ring component handles zero correctly passed 27ms
Ring component handles null, undefined, NaN, and non-numeric values as 0 passed 92ms
Ring component handles string number values correctly passed 21ms
Ring component renders track and fill circles with correct geometry and attributes passed 42ms
tests/jest/mutation-summary.test.js passed 3/3 passed 5.51s
Test Status Duration
mutation summary countMutants follows the Stryker score definition passed 34ms
mutation summary summarizeMutationReport orders files by score and lists survivors passed 13ms
mutation summary summarizeMutationReport survives an empty report passed 5ms
tests/jest/coverage-map.test.js passed 5/5 passed 4.53s
Test Status Duration
coverage map e2eSelectorTokens keeps CSS selectors and drops prose, comments and file names passed 26ms
coverage map e2eVisitedRoutes reads goto targets and pathname assertions passed 7ms
coverage map routeIndex maps route components to every path they serve passed 7ms
coverage map importedModules resolves relative imports of a real test file passed 6ms
coverage map buildCoverageMap classifies the real repository passed 131ms
src/components/frameworks/ComingSoonHero.test.jsx passed 3/3 passed 6.87s
Test Status Duration
ComingSoonHero Component renders heading and technologies list passed 1.34s
ComingSoonHero Component renders decorative animated elements passed 48ms
ComingSoonHero Component renders the gradient backdrop and decorative layers passed 65ms
src/components/frameworks/FrameworkHero.test.jsx passed 3/3 passed 6.06s
Test Status Duration
FrameworkHero Component renders framework title, subtitle, and dynamic id class passed 1.17s
FrameworkHero Component renders decorative background and animated shapes passed 73ms
FrameworkHero Component renders the decorative layers with their animations passed 64ms
tests/jest/report-io.test.js passed 3/3 passed 4.67s
Test Status Duration
report-io E2E resolution ensureE2EReportOnDisk copies a discovered summary into the canonical path passed 55ms
report-io E2E resolution readE2EReport returns null when no summary exists in an empty tree passed 9ms
report-io E2E resolution resolveE2EBaseUrl maps CI preview hosts to the public site URL passed 18ms
src/i18n/detection.test.js passed 8/8 passed 6.28s
Test Status Duration
i18n language detection falls back to English when nothing is set passed 181ms
i18n language detection uses the navigator language when supported passed 247ms
i18n language detection maps a regional code onto its base language passed 224ms
i18n language detection a saved localStorage choice wins over the navigator language passed 196ms
i18n language switching changeLanguage persists the choice to localStorage passed 144ms
i18n language switching changeLanguage syncs <html lang> to the base language passed 190ms
i18n language switching <html lang> is set on init from the detected language passed 186ms
i18n language switching falls back to English content for an unsupported language passed 163ms
src/App.scroll.test.jsx passed 5/5 passed 17.47s
Test Status Duration
App Scroll Integration App scrolls to element defined in location.state.scrollTo on mount passed 1.98s
App Scroll Integration App does NOT scroll if location.state.scrollTo is missing passed 1.47s
App Scroll Integration App does NOT scroll to top when navigating home with scrollTo state passed 2.05s
App Scroll Integration scrolls to top when navigating to a subpage through the navbar passed 2.19s
App Scroll Integration jumps to the location.state target without smooth scrolling under reduced motion passed 1.15s
src/components/blog/BlogPost.hydration.test.jsx passed 1/1 passed 12.52s
Test Status Duration
BlogPost hydration keeps the prerendered body on screen without a mismatch while the body loads passed 4.16s
src/App.links.test.jsx passed 7/7 passed 21.91s
Test Status Duration
App Integration Tests - Links & Navigation Navigation Bar renders brand logo with correct text passed 2.52s
App Integration Tests - Links & Navigation Navigation Bar renders main navigation links passed 1.66s
App Integration Tests - Links & Navigation External Links Security all external links have rel="noopener noreferrer" and target="_blank" passed 1.69s
App Integration Tests - Links & Navigation Critical Links Presence contains LinkedIn link passed 1.77s
App Integration Tests - Links & Navigation Critical Links Presence contains Calendly link passed 1.46s
App Integration Tests - Links & Navigation Critical Links Presence contains Medium/Articles links passed 3.48s
App Integration Tests - Links & Navigation Internal Navigation internal anchor links start with # passed 1.67s
tests/jest/generate-html-reports.test.js passed 5/5 passed 5.51s
Test Status Duration
generate-html-reports coverage helpers normalizeCoveragePath strips absolute project paths passed 15ms
generate-html-reports coverage helpers getCoverageReport prefers raw coverage with file entries passed 6ms
generate-html-reports coverage helpers getCoverageReport falls back to dashboard coverageFiles when raw files are missing passed 1ms
generate-html-reports coverage helpers collectCoverageFiles normalizes paths and sorts worst-first passed 29ms
generate-html-reports coverage helpers isCoverageLikelyIncomplete detects partial instrumentation runs passed 12ms
tests/jest/css-variables.test.js passed 3/3 passed 4.16s
Test Status Duration
CSS Variables & Theming should define core theme colors passed 53ms
CSS Variables & Theming should use consistent gradient variables passed 3ms
CSS Variables & Theming should consistency usage of z-index passed 13ms
src/components/test-results/MutationScore.test.jsx passed 3/3 passed 5.39s
Test Status Duration
MutationScore renders nothing while loading and an empty state without data passed 274ms
MutationScore shows the score, the breakdown and the run link passed 742ms
MutationScore lists lowest-scoring files and surviving mutants passed 136ms
tests/jest/gist.test.js passed 4/4 passed 4.71s
Test Status Duration
gist helpers readGistJson uses the raw URL without a token passed 20ms
gist helpers readGistJson reads file content through the API with a token passed 11ms
gist helpers readGistJson returns null on HTTP errors and network failures passed 16ms
gist helpers writeGistJson refuses without a token and PATCHes with one passed 19ms
src/components/NotFound.test.jsx passed 4/4 passed 6.66s
Test Status Duration
NotFound explains the miss and offers a way back to the main sections passed 843ms
NotFound marks the page noindex while shown and restores the head when it leaves passed 108ms
NotFound accepts a more specific title and message passed 151ms
NotFound is translated passed 222ms
tests/jest/icon-font-subset.test.js passed 3/3 passed 5.73s
Test Status Duration
Material Icons subset every icon name reachable from src/ ships in the subset passed 171ms
Material Icons subset the font URL carries the hash of the shipped font in every reference passed 1ms
Material Icons subset the served font stays a subset, not the full family passed 1ms
tests/jest/env-utils.test.js passed 13/13 passed 4.53s
Test Status Duration
env utilities getEnv returns VITE_WEB3FORMS_KEY from the test environment passed 18ms
env utilities getEnv returns VITE_GIST_USERNAME from the test environment passed 9ms
env utilities getEnv returns VITE_GIST_ID from the test environment passed 9ms
env utilities getEnv returns DEV from the test environment passed 1ms
env utilities getEnv returns PROD from the test environment passed 14ms
env utilities getEnv returns MODE from the test environment passed 9ms
env utilities getEnv returns undefined for unknown keys passed 16ms
env utilities getEnv is case-sensitive for keys passed 1ms
env utilities isDev returns true when DEV is true passed 13ms
env utilities isDev returns false when DEV is false or missing passed 10ms
env utilities isProd returns true when PROD is true passed 2ms
env utilities isProd returns false when PROD is false passed 21ms
env utilities isProd defaults to true when PROD is missing passed 1ms
src/components/HomeSectionHeader.test.jsx passed 3/3 passed 6.32s
Test Status Duration
HomeSectionHeader Component renders title, headingId, and rule with minimal props passed 589ms
HomeSectionHeader Component renders icon, subtitle, and badge when provided passed 147ms
HomeSectionHeader Component returns valid JSX when called as a function passed 16ms
src/components/subpages.i18n.test.jsx passed 21/21 passed 20.93s
Test Status Duration
Sub-page i18n Experience page renders translated copy in en passed 729ms
Sub-page i18n Experience page renders translated copy in pt passed 443ms
Sub-page i18n Experience page renders translated copy in es passed 347ms
Sub-page i18n Shipped page renders translated copy in en passed 310ms
Sub-page i18n Shipped page renders translated copy in pt passed 309ms
Sub-page i18n Shipped page renders translated copy in es passed 303ms
Sub-page i18n Stack page renders translated copy in en passed 649ms
Sub-page i18n Stack page renders translated copy in pt passed 645ms
Sub-page i18n Stack page renders translated copy in es passed 685ms
Sub-page i18n Articles page renders translated copy in en passed 1.18s
Sub-page i18n Articles page renders translated copy in pt passed 786ms
Sub-page i18n Articles page renders translated copy in es passed 633ms
Sub-page i18n Frameworks page renders translated copy in en passed 507ms
Sub-page i18n Frameworks page renders translated copy in pt passed 569ms
Sub-page i18n Frameworks page renders translated copy in es passed 613ms
Sub-page i18n SideProjects page renders translated copy in en passed 272ms
Sub-page i18n SideProjects page renders translated copy in pt passed 289ms
Sub-page i18n SideProjects page renders translated copy in es passed 360ms
Sub-page i18n TestResults page renders translated copy in en passed 1.64s
Sub-page i18n TestResults page renders translated copy in pt passed 1.54s
Sub-page i18n TestResults page renders translated copy in es passed 1.60s
src/components/test-results/historyStats.test.js passed 3/3 passed 5.00s
Test Status Duration
historyStats buildSeries derives rates, seconds and failure indices passed 33ms
historyStats unstableTests counts failures per name across the window passed 12ms
historyStats handles empty and invalid input passed 1ms
src/components/LiveTestRunner.i18n.test.jsx passed 1/1 passed 9.48s
Test Status Duration
LiveTestRunner in Portuguese announces the finished run once and voices each result in Portuguese passed 3.81s
tests/jest/mutation-shard.test.js passed 5/5 passed 4.78s
Test Status Duration
splitShards assigns every file to exactly one shard passed 24ms
splitShards balances shards by size passed 8ms
splitShards is deterministic regardless of input order passed 1ms
mutateFiles applies stryker include and exclude patterns passed 255ms
mergeReports unions files and testFiles, keeps metadata from the first shard passed 5ms
tests/jest/generate-test-data.test.js passed 4/4 passed 5.67s
Test Status Duration
generate-test-data coverage helpers normalizeCoveragePath returns project-relative paths passed 20ms
generate-test-data coverage helpers generateCoverageData splits totals and per-file metrics passed 23ms
generate-test-data coverage helpers generateCoverageData returns empty shape when report is missing passed 1ms
generate-test-data coverage helpers committed test-data.js fallback has zero failing Jest tests passed 51ms
src/components/hooks/useFetch.test.jsx passed 3/3 passed 4.71s
Test Status Duration
useFetch should return data when fetch is successful passed 222ms
useFetch should return error when fetch fails passed 84ms
useFetch should return error when fetch throws an exception passed 92ms
src/components/test-results/CodeSample.test.jsx passed 3/3 passed 6.30s
Test Status Duration
CodeSample Component renders code with default javascript syntax highlighting passed 314ms
CodeSample Component renders with custom specified language passed 92ms
CodeSample Component falls back to javascript grammar when unknown language is provided passed 68ms
src/components/Loading.test.jsx passed 2/2 passed 5.16s
Test Status Duration
Loading Component renders loading status message with accessibility attributes passed 591ms
Loading Component returns valid JSX when called directly passed 13ms
src/i18n/routing.test.js passed 4/4 passed 3.69s
Test Status Duration
language routing helpers reads the language prefix from a path passed 32ms
language routing helpers maps a language onto a router basename passed 72ms
language routing helpers strips the prefix and keeps the rest of the path passed 10ms
language routing helpers localizes a path for a language, replacing any existing prefix passed 7ms
tests/jest/main-chunk-reload.test.js passed 4/4 passed 8.74s
Test Status Duration
main.jsx handleChunkError reloads location on first asset load error passed 32ms
main.jsx handleChunkError prevents infinite reloads on consecutive errors within cooldown window passed 20ms
main.jsx handleChunkError does not reload for standard non-chunk runtime errors passed 16ms
main.jsx handleChunkError handles event object with nested error.message passed 1ms
src/components/CookieConsent.domain.test.jsx passed 1/1 passed 6.17s
Test Status Duration
withdrawing consent deletes GA cookies on the site domain and the current host passed 762ms
tests/jest/entrance-motion-lcp.test.js passed 4/4 passed 4.95s
Test Status Duration
Entrance motion keeps the largest paint visible home claim rows animate in without starting transparent passed 36ms
Entrance motion keeps the largest paint visible home portrait animate in without starting transparent passed 1ms
Entrance motion keeps the largest paint visible subpage title animate in without starting transparent passed 1ms
Entrance motion keeps the largest paint visible subpage intro animate in without starting transparent passed 1ms
src/components/hooks/useInView.test.jsx passed 2/2 passed 6.68s
Test Status Duration
useInView falls back to visible when IntersectionObserver is missing passed 146ms
useInView starts pending once observed and flips to in on intersection, then disconnects passed 54ms
src/components/blog/blogDate.test.js passed 4/4 passed 4.21s
Test Status Duration
formatPostMonth formats dates in default english locale when lang is not passed passed 16ms
formatPostMonth formats dates with month boundaries correctly passed 9ms
formatPostMonth capitalizes the first letter and preserves the remainder of the formatted string passed 11ms
formatPostMonth formats dates in spanish and portuguese locales passed 84ms
src/components/test-results/runStatus.test.js passed 7/7 passed 4.79s
Test Status Duration
passRate prefers a provided passRate passed 25ms
passRate derives the rate from passed and total counts passed 13ms
passRate returns null without data or tests passed 1ms
runStatus reports loading before data arrives passed 7ms
runStatus reports unknown when neither suite has data passed 1ms
runStatus sums failures across unit and e2e suites passed 7ms
runStatus reports green when nothing failed passed 1ms
src/components/FooterNavigation.test.jsx passed 3/3 passed 7.56s
Test Status Duration
Footer Navigation Logic calls onOpenContact when clicking "Send Message" passed 836ms
Footer Navigation Logic makes "Send Message" the only primary call to action passed 149ms
Footer Navigation Logic does not throw when "Send Message" clicked without onOpenContact passed 294ms
src/components/Security.test.jsx passed 2/2 passed 6.85s
Test Status Duration
Security and Performance Checks CertificatesModal renders safely without throwing when disabled/sunsetted passed 177ms
Security and Performance Checks Footer external links have rel="noopener noreferrer" passed 751ms
src/components/Reveal.test.jsx passed 2/2 passed 6.55s
Test Status Duration
Reveal shows everything at once when IntersectionObserver is missing passed 135ms
Reveal moves from pending to in once the node intersects passed 61ms
src/components/CrossPage.test.jsx passed 9/9 passed 19.71s
Test Status Duration
Cross-Page Consistency Home Page renders Navbar with brand logo passed 2.25s
Cross-Page Consistency Home Page renders Footer passed 1.65s
Cross-Page Consistency Home Page renders main navigation links passed 1.32s
Cross-Page Consistency Frameworks Page renders Navbar with brand logo passed 1.21s
Cross-Page Consistency Frameworks Page renders Footer passed 1.29s
Cross-Page Consistency Frameworks Page renders main navigation links passed 1.21s
Cross-Page Consistency SideProjects Page renders Navbar with brand logo passed 867ms
Cross-Page Consistency SideProjects Page renders Footer passed 643ms
Cross-Page Consistency SideProjects Page renders main navigation links passed 804ms
src/i18n/i18n.test.js passed 5/5 passed 4.07s
Test Status Duration
i18n locale key parity pt has exactly the same keys as en passed 47ms
i18n locale key parity es has exactly the same keys as en passed 37ms
i18n locale key parity en has no empty translation values passed 85ms
i18n locale key parity pt has no empty translation values passed 26ms
i18n locale key parity es has no empty translation values passed 18ms
src/data/certificates.test.js passed 4/4 passed 7.01s
Test Status Duration
Certificate Data Validation should have exactly 35 certificates passed 20ms
Certificate Data Validation all certificates should have required fields passed 389ms
Certificate Data Validation all certificates should have valid image paths passed 45ms
Certificate Data Validation all certificates should have valid LinkedIn URLs passed 25ms
tests/jest/exclude-readmes.test.js passed 1/1 passed 5.80s
Test Status Duration
excludeReadmesPlugin removes README.md files copied from public/ and keeps every other file passed 56ms
src/components/frameworks/Frameworks.i18n.test.jsx passed 3/3 passed 9.79s
Test Status Duration
Frameworks i18n renders translated page copy in pt passed 1.70s
Frameworks i18n renders translated page copy in es passed 923ms
Frameworks i18n renders translated API section labels in Portuguese passed 1.88s
tests/jest/navbar-responsive-css.test.js passed 1/1 passed 6.28s
Test Status Duration
Navbar responsive CSS scoping style.css does not apply small-breakpoint nav rules to nav.main-nav passed 18ms
src/utils/motion.test.js passed 3/3 passed 6.52s
Test Status Duration
motion preferences scrolls smoothly when the user has not asked for reduced motion passed 25ms
motion preferences jumps instead of scrolling smoothly under prefers-reduced-motion passed 27ms
motion preferences falls back to smooth scrolling where matchMedia is unavailable passed 19ms
src/components/CertificatesModal.test.jsx passed 3/3 passed 4.82s
Test Status Duration
CertificatesModal Component (Disabled) returns null and does not render when isOpen is false passed 186ms
CertificatesModal Component (Disabled) returns null and does not render when isOpen is true (modal disabled) passed 28ms
CertificatesModal Component (Disabled) returns literal null when called as a function passed 14ms
src/components/Footer.i18n.test.jsx passed 3/3 passed 7.32s
Test Status Duration
Footer i18n renders Spanish connect copy when language is es passed 854ms
Footer i18n renders the pt cookie settings label passed 267ms
Footer i18n renders the es cookie settings label passed 165ms
src/components/PageHeader.test.jsx passed 2/2 passed 6.70s
Test Status Duration
PageHeader renders icon, heading, subtitle and children passed 501ms
PageHeader omits icon and subtitle when not provided passed 39ms
src/i18n/usedKeys.test.js passed 1/1 passed 6.51s
Test Status Duration
i18n keys used in source every literal t() key exists in en.json passed 39ms
src/components/hooks/useKeyPress.test.jsx passed 3/3 passed 5.84s
Test Status Duration
useKeyPress should call action when matching key is pressed passed 118ms
useKeyPress should not call action when different key is pressed passed 16ms
useKeyPress should cleanup event listener on unmount passed 20ms
src/components/Booking.test.jsx passed 1/1 passed 5.81s
Test Status Duration
Booking Functionality Footer Booking Button renders booking button with correct attributes passed 956ms
src/utils/scrollLock.test.js passed 3/3 passed 4.58s
Test Status Duration
scrollLock locks body scroll and releases it again passed 17ms
scrollLock keeps the page locked until every holder has released it passed 8ms
scrollLock an unmatched release does not leave a later lock unbalanced passed 18ms
tests/jest/blog-image-weight.test.js passed 31/31 passed 5.82s
Test Status Duration
Blog images posts reference images passed 36ms
Blog images /images/articles/ag-grid-virtualization-traps/cover-v2.webp stays under 100 KB passed 1ms
Blog images /images/articles/claude-code-skill-your-team-reuses/cover-v2.webp stays under 100 KB passed 7ms
Blog images /images/articles/flaky-test-postmortem/cover.webp stays under 100 KB passed 6ms
Blog images /images/articles/flaky-test-postmortem/timeline.webp stays under 100 KB passed 1ms
Blog images /images/articles/home-assistant/cover-part-2.webp stays under 100 KB passed 9ms
Blog images /images/articles/home-assistant/cover-part-3.webp stays under 100 KB passed 1ms
Blog images /images/articles/home-assistant/cover.webp stays under 100 KB passed 1ms
Blog images /images/articles/home-assistant/ha-access-tab.webp stays under 100 KB passed 7ms
Blog images /images/articles/home-assistant/ha-alarm-section.webp stays under 100 KB passed 10ms
Blog images /images/articles/home-assistant/ha-arriving-notification.webp stays under 100 KB passed 0ms
Blog images /images/articles/home-assistant/ha-car-panel-garage.webp stays under 100 KB passed 1ms
Blog images /images/articles/home-assistant/ha-car-tab.webp stays under 100 KB passed 8ms
Blog images /images/articles/home-assistant/ha-climate-floor.webp stays under 100 KB passed 1ms
Blog images /images/articles/home-assistant/ha-clothesline-awning.webp stays under 100 KB passed 7ms
Blog images /images/articles/home-assistant/ha-co2-chart.webp stays under 100 KB passed 3ms
Blog images /images/articles/home-assistant/ha-dishwasher.webp stays under 100 KB passed 1ms
Blog images /images/articles/home-assistant/ha-floor-how-it-works.webp stays under 100 KB passed 2ms
Blog images /images/articles/home-assistant/ha-home-tab.webp stays under 100 KB passed 1ms
Blog images /images/articles/home-assistant/ha-how-to-read.webp stays under 100 KB passed 1ms
Blog images /images/articles/home-assistant/ha-lights-section.webp stays under 100 KB passed 1ms
Blog images /images/articles/home-assistant/ha-sensors-tab.webp stays under 100 KB passed 3ms
Blog images /images/articles/home-assistant/ha-tv-music.webp stays under 100 KB passed 1ms
Blog images /images/articles/home-assistant/ha-walking-timings.webp stays under 100 KB passed 1ms
Blog images /images/articles/no-request-ever-occurred/cover-v2.webp stays under 100 KB passed 5ms
Blog images /images/articles/overlays-that-ignore-your-clicks/cover-v2.webp stays under 100 KB passed 4ms
Blog images /images/articles/reading-a-four-hour-suite/cover-v2.webp stays under 100 KB passed 1ms
Blog images /images/articles/restored-cypress-session-was-lying/cover.webp stays under 100 KB passed 13ms
Blog images /images/articles/typescript-circular-dependencies-test-repo/cover-v2.webp stays under 100 KB passed 3ms
Blog images /images/avatar-160-light.webp stays under 100 KB passed 2ms
Blog images /images/avatar-160.webp stays under 100 KB passed 1ms
src/utils/inBrowserTestRunner.insecure.test.js passed 2/2 passed 4.76s
Test Status Duration
net-secure-context on a remote http host fails when the context is not secure passed 64ms
net-secure-context on a remote http host passes when the browser reports a secure context passed 9ms
src/components/hooks/useModal.test.jsx passed 3/3 passed 5.52s
Test Status Duration
useModal should initialize with isOpen as false passed 79ms
useModal should set isOpen to true when openModal is called passed 27ms
useModal should set isOpen to false when closeModal is called passed 14ms
src/components/hooks/index.test.js passed 4/4 passed 3.76s
Test Status Duration
hooks index should export useKeyPress passed 10ms
hooks index should export useFetch passed 1ms
hooks index should export useModal passed 1ms
hooks index should export useTheme passed 1ms