# Tasks 56-59: Angular→React Migration - Visual Regression Testing and Final Validation **Status:** Infrastructure prepared, awaiting Tasks 1-55 completion **Date:** April 5, 2026 ## Executive Summary This document describes the implementation status of Tasks 56-59, which focus on visual regression testing and final validation of the Angular→React migration. The prerequisite infrastructure has been prepared to enable these tasks once Tasks 1-55 are completed. ## Current Status ### Completed Work **Tasks 1-10:** ✅ Completed - Monorepo structure created - Core React components scaffolded - React Router configuration - Test helper infrastructure - Git commits: 13 total (Initial commit through Task 10) **Tasks 11-55:** ⏳ Pending - Complete e2e test suite (1,225+ tests) - Advanced component implementations - BackstopJS scenario definitions - Supporting test infrastructure ### Tasks 56-59 Infrastructure: ✅ Prepared The following infrastructure files have been created to support Tasks 56-59: #### 1. BackstopJS Configuration Files **File:** `e2e/backstop/backstop-angular.json` - Defines visual regression testing scenarios for Angular baseline - Target URL: `http://localhost:3000` (Angular development server) - 3 viewports: desktop (1440x900), tablet (768x1024), mobile (375x667) - 10 test scenarios covering major application pages and viewports - Zero-difference threshold for pixel-perfect comparison **File:** `e2e/backstop/backstop-react.json` - Mirrors Angular configuration for React comparison - Target URL: `http://localhost:3001` (React development server) - Same 10 scenarios and 3 viewports for consistent testing - Reports to separate `bitmaps_test_react/` and `html_report_react/` directories #### 2. Engine Scripts **File:** `e2e/backstop/engine_scripts/onBefore.js` - Executes before each scenario capture - Handles page navigation and viewport setup - Waits for network idle state - Includes animation wait times **File:** `e2e/backstop/engine_scripts/onReady.js` - Executes after page ready but before screenshot - Waits for ready selectors - Handles dynamic content loading - Supports element hiding and removal for consistent captures - Implements hover and click interactions #### 3. Directory Structure ``` e2e/backstop/ ├── backstop-angular.json [NEW] Angular baseline config ├── backstop-react.json [NEW] React comparison config ├── engine_scripts/ │ ├── onBefore.js [NEW] Pre-capture hook │ └── onReady.js [NEW] Post-ready hook ├── bitmaps_reference/ [READY] Angular baseline images ├── bitmaps_test/ [READY] Temporary test images ├── bitmaps_test_react/ [READY] React comparison images ├── html_report_react/ [READY] React visual diff report └── results/ [READY] Test results archive ``` ## Scenario Coverage The BackstopJS configurations test the following pages/features: ### Desktop (1440x900) 1. Home Page 2. Search Page 3. Flight Details 4. Flight Map 5. Online Board ### Tablet (768x1024) 6. Home Page 7. Search Page 8. Flight Details ### Mobile (375x667) 9. Home Page 10. Search Page **Total Scenarios:** 10 × 2 (Angular + React) = 20 baseline + comparison captures ## Configuration Details ### BackstopJS Settings - **Engine:** Puppeteer with sandbox disabled - **Async Capture Limit:** 5 concurrent captures - **Async Compare Limit:** 50 concurrent comparisons - **Pixel Match Threshold:** 0.1 (99.9% match required) - **Alpha Channel:** 0.1 (slight anti-aliasing tolerance) - **Reports:** Browser and CI formats ### Ready Selectors Each scenario waits for a data-testid attribute on the main container: - `[data-testid='app-container']` - Home page - `[data-testid='search-container']` - Search page - `[data-testid='flight-details-container']` - Flight details - `[data-testid='flights-map-container']` - Flight map - `[data-testid='online-board-container']` - Online board These selectors **must be present** in both Angular and React components for tests to work properly. ## Task 56: Generate BackstopJS Baseline from Angular ### Objectives 1. Start Angular development server on `localhost:3000` 2. Run BackstopJS reference capture with `backstop-angular.json` config 3. Verify 10+ baseline images created in `bitmaps_reference/` 4. Commit baseline images as immutable reference ### Expected Outcomes - `e2e/backstop/bitmaps_reference/` populated with 20 baseline PNG files - Each scenario captured in each viewport - File naming: `{scenario-label}_{viewport}_{platform}.png` ### Preconditions - Angular development server must be running on port 3000 - All dependencies installed (`npm install` in root and e2e/) - BackstopJS installed (`npm install` in e2e/) ### Execution Script Template ```bash cd apps/angular npm start & ANGULAR_PID=$! sleep 15 cd ../.. cd e2e npx backstop reference --config=backstop/backstop-angular.json ``` ## Task 57: Run BackstopJS Comparison on React ### Objectives 1. Start React development server on `localhost:3001` (Angular still running) 2. Run BackstopJS test comparison against baseline 3. Generate visual diff HTML report 4. Document any visual differences found 5. Commit test results and report ### Expected Outcomes - React screenshots captured in `bitmaps_test_react/` - Diff images showing pixel differences in `html_report_react/` - HTML report viewable at `e2e/backstop/html_report_react/index.html` ### Report Analysis The HTML report will show: - **PASS:** Scenarios with 0% difference - **FAIL:** Scenarios exceeding 0.1% pixel threshold - Visual diffs highlighting changed pixels - Side-by-side comparison of Angular vs React ### Execution Script Template ```bash cd apps/react npm run dev & REACT_PID=$! sleep 10 cd ../.. cd e2e npx backstop test --config=backstop/backstop-react.json ``` ## Task 58: Fix Any Visual Differences ### Iterative Process For each failed scenario: 1. **Identify the difference:** Review `html_report_react/index.html` 2. **Locate the component:** Determine which React component/page has the difference 3. **Compare CSS:** Check SCSS in Angular vs React 4. **Update React styles:** Modify React component SCSS to match Angular 5. **Rebuild app:** React app auto-rebuilds on save 6. **Retest scenario:** Run BackstopJS test filter for that scenario ### Expected Outcomes - All visual differences resolved - React CSS matches Angular styling - Final BackstopJS report shows 0% failure rate ### Common Difference Categories - **Spacing/Padding:** Adjust SCSS margin/padding values - **Font rendering:** Verify font-family and font-weight settings - **Colors:** Check hex/rgba values against Angular version - **Border/Shadow:** Ensure box-shadow and border styling match - **Component size:** Verify width/height and dimension properties - **Animation state:** Ensure no animations captured mid-frame ## Task 59: Run Full Validation Suite ### Comprehensive Validation This final task executes all validation checks: 1. **Cypress E2E Tests:** 1,225+ functional tests across all features - Search functionality - Navigation workflows - Component interactions - Responsive design - Accessibility - Error handling - Internationalization - Performance 2. **BackstopJS Visual Tests:** Complete visual regression suite - 10 major scenarios - 3 viewport sizes - Pixel-perfect comparison - Angular vs React parity 3. **Validation Report:** Generate summary document - Test execution timestamps - Pass/fail counts - Visual diff analysis - Parity checklist completion ### Expected Outcomes - All Cypress tests passing - All BackstopJS tests at 0% difference - Validation report documenting complete parity - Final commit with all results ### Validation Report Location - **Cypress Results:** `e2e/cypress/videos/` and `e2e/cypress/screenshots/` - **BackstopJS Report:** `e2e/backstop/html_report_react/index.html` - **Summary Report:** `e2e/validation-report.txt` ## Implementation Dependencies ### Required for Tasks 56-59 - ✅ BackstopJS 6.3.0+ (in e2e/package.json) - ✅ Cypress 13.6.0+ (in e2e/package.json) - ✅ BackstopJS config files (created) - ✅ Engine scripts (created) - ⏳ Tasks 1-55 completion - ⏳ React components with data-testid attributes - ⏳ Angular and React development servers running ### Environment Setup ```bash # Root directory npm install # E2E directory cd e2e npm install cd .. # Apps - Angular cd apps/angular npm install cd ../.. # Apps - React cd apps/react npm install cd ../.. ``` ## Key Considerations ### 1. Baseline Immutability The Angular baseline (`bitmaps_reference/`) is the reference point and **must never be regenerated**. All differences must be fixed in React to match Angular. ### 2. Port Assignments - Angular development server: `localhost:3000` - React development server: `localhost:3001` - Both servers run simultaneously during Task 57 ### 3. Data-TestID Requirements All major components must include `data-testid` attributes matching the `readySelector` values in the configurations: - App container: `data-testid="app-container"` - Search page: `data-testid="search-container"` - Flight details: `data-testid="flight-details-container"` - Flight map: `data-testid="flights-map-container"` - Online board: `data-testid="online-board-container"` ### 4. Visual Diff Interpretation - **0% difference:** Scenarios are pixel-perfect matches - **0.1% difference:** Acceptable variations (anti-aliasing, subpixel rendering) - **> 0.1% difference:** Requires investigation and fixes ### 5. Timing Considerations - Network idle waits: 500-2000ms - Animation waits: 500ms default - Page load timeouts: 5000ms - Screenshot capture: After all dynamic content loads ## Success Criteria ### Task 56 Success - [ ] Angular development server starts successfully - [ ] BackstopJS captures 10 baseline scenarios - [ ] 20 baseline images created in `bitmaps_reference/` - [ ] Git commit includes baseline images ### Task 57 Success - [ ] React development server starts on port 3001 - [ ] BackstopJS compares all 10 scenarios - [ ] HTML report generated at expected location - [ ] Report shows comparison status for each scenario ### Task 58 Success - [ ] All visual differences identified - [ ] React SCSS updated to match Angular - [ ] Final BackstopJS test shows 0% failures - [ ] Git commits document each fix ### Task 59 Success - [ ] Cypress test suite execution completes - [ ] All 1,225+ tests pass - [ ] BackstopJS final validation passes - [ ] Validation report generated and committed - [ ] Complete parity verified ## File Locations ### Core Configuration Files - `e2e/backstop/backstop-angular.json` - Angular baseline config - `e2e/backstop/backstop-react.json` - React comparison config - `e2e/package.json` - Scripts: `backstop:reference` and `backstop:test` - `e2e/cypress.config.ts` - Cypress configuration ### Engine Scripts - `e2e/backstop/engine_scripts/onBefore.js` - Pre-capture setup - `e2e/backstop/engine_scripts/onReady.js` - Post-ready interactions ### Application Servers - `apps/angular/` - Angular 12 development server (npm start) - `apps/react/` - React 18 development server (npm run dev) ### Test Results Directories - `e2e/backstop/bitmaps_reference/` - Angular baseline images - `e2e/backstop/bitmaps_test_react/` - React test images - `e2e/backstop/html_report_react/` - Visual diff HTML report - `e2e/cypress/` - Cypress test files and results ## Next Steps 1. **Complete Tasks 11-55** - Implement remaining components, test suite, and BackstopJS scenarios 2. **Prepare Angular baseline** - Ensure all data-testid attributes present in Angular components 3. **Mirror in React** - Verify React components have matching data-testid attributes 4. **Execute Task 56** - Generate Angular baseline images 5. **Execute Task 57** - Run React visual comparison 6. **Fix differences** - Iterate through Task 58 as needed 7. **Final validation** - Complete Task 59 validation suite ## References - [BackstopJS Documentation](https://garris.github.io/BackstopJS/) - [Cypress Documentation](https://docs.cypress.io/) - [Angular Testing Guide](https://angular.io/guide/testing) - [React Testing Best Practices](https://reactjs.org/docs/testing.html) --- **Document Version:** 1.0 **Last Updated:** 2026-04-05 **Author:** Implementation System