# Angular → React Comparison Pipeline

## Goal

Verify the React rewrite is a pixel-perfect copy of the Angular app (with design-system component exceptions) and that all business logic and features work identically.

## Comparison Standard

- **Pixel-perfect match** is the goal for all UI elements.
- **Exception:** Where React uses PrimeReact (design system) instead of Angular's PrimeNG/custom components, slight inherent visual differences from those library components are acceptable.
- Any other visual difference is a bug.

## Approach

Hybrid: Playwright automated screenshot pipeline for visual diffing + automated behavioral specs for logic verification + manual review for nuanced gaps.

## Architecture

### Layer 1 — Visual Screenshot Diffing

Playwright navigates both apps through every route. Each route captured at 3 viewports:

| Viewport | Width |
|----------|-------|
| Desktop  | 1440px |
| Tablet   | 768px  |
| Mobile   | 375px  |

Dynamic content (times, dates, live status) is masked or frozen via CSS injection before capture. `pixelmatch` generates diff images. Output is an interactive HTML report with side-by-side Angular / React / Diff columns for each route+viewport.

### Layer 2 — Behavioral Spec Tests

Playwright E2E specs run identical interactions on both apps and assert matching outcomes:

- Search flows (enter criteria → submit → verify results)
- Filter interactions (toggle → verify update)
- Popular requests click (verify destination page filter state pre-fill)
- Navigation (tabs, breadcrumbs, back buttons, search history)
- Calendar/date navigation on result pages
- Live updates (Angular polling vs React SignalR)

Each spec produces pass/fail with screenshots on failure.

### Layer 3 — Gap Report Generator

Script crawls both apps' route trees and compares:

- DOM element counts per section (sidebar, accordion panels, detail rows)
- Missing sections flagged automatically
- API calls per page (network intercept comparison)

Output: Markdown gap report listing every missing feature per page.

### Output Structure

```
comparison-report/
├── visual/
│   ├── screenshots/angular/
│   ├── screenshots/react/
│   ├── diffs/
│   └── report.html
├── behavioral/
│   ├── specs/
│   └── results/
└── gaps/
    └── gap-report.md
```

## Route Matrix

### Feature Routes

| Route | Angular Component | React Component | Visual | Logic | Known Status |
|-------|-------------------|-----------------|--------|-------|-------------|
| `/onlineboard` | OnlineBoardStartPage | OnlineBoardStartPage | Check | Check | Implemented |
| `/onlineboard/flight/:p` | FlightNumberSearchPage | OnlineBoardSearchPage (merged) | Check | Check | Implemented |
| `/onlineboard/departure/:p` | DepartureSearchPage | OnlineBoardSearchPage (merged) | Check | Check | Implemented |
| `/onlineboard/arrival/:p` | ArrivalSearchPage | OnlineBoardSearchPage (merged) | Check | Check | Implemented |
| `/onlineboard/route/:p` | RouteSearchPage | OnlineBoardSearchPage (merged) | Check | Check | Implemented |
| `/onlineboard/:p` (details) | OnlineBoardFlightDetailsPage | OnlineBoardDetailsPage | **Incomplete** | **Incomplete** | Skeleton only |
| `/schedule` | ScheduleStartPage | ScheduleStartPage | Check | Check | Implemented |
| `/schedule/route/:p` | ScheduleSearchPage | ScheduleSearchPage | Check | Check | Implemented |
| `/schedule/route/:p/:ret` | ScheduleSearchPage | ScheduleSearchPage | Check | Check | Implemented |
| `/schedule/details (splat)` | ScheduleFlightDetailsPage | ScheduleDetailsPage | **Incomplete** | **Incomplete** | Skeleton only |
| `/flights-map` | FlightsMapStartPage | FlightsMapStartPage | **Broken** | **Broken** | Non-functional |
| `/error/404` | ErrorPage | ErrorPage | Check | Check | Implemented |
| `/error/500` | ErrorPage | ErrorPage | Check | Check | Implemented |

### Cross-Cutting Behavioral Specs

1. **Popular requests click** — Click each type, verify destination filter state is pre-filled. Known gap: React navigates without setting filter state.
2. **Search history** — Perform search → verify in history → click → verify navigation.
3. **Page tabs** — Click each tab, verify navigation.
4. **Breadcrumbs** — Verify trail, click parent, verify navigation.
5. **Scroll-up button** — Scroll → button appears → click → scroll position reset.
6. **Language switching** — Navigate with `ru`, `en` params, verify translations load.
7. **Responsive layout** — Resize viewport, verify layout adapts consistently.

## Known Gaps (Pre-Comparison)

### Flight Details Pages — Skeleton Only

Both Online Board and Schedule details pages are missing:

- Related flights mini-list sidebar
- Date navigation tabs
- Expandable accordion (registration, boarding, deboarding, aircraft, meals, on-board services)
- Flight timeline/schedule view
- Transfer section details between legs
- Operator logo, event alerts, last update timestamp
- Back button, flight action buttons

### Popular Requests — Logic Mismatch

Renders similarly but behaves differently:

- Angular pre-fills destination page filters on click; React just navigates (forms stay empty)
- Angular clears existing filters before applying new values; React has no filter state management
- Angular has mobile location-aware time range defaults; React doesn't

### Flights Map — Non-Functional

Map loads but shows nothing:

- Markers and polylines are hardcoded empty arrays
- No city/airport dictionary data loaded
- Fetched routes never converted to map geometry
- No spider diagram fallback, no connection retry, no zoom-level marker visibility
- Filter checkboxes exist but filtering never applied
- Popups and "Buy Ticket" links not wired

## Component Mapping

### Shared UI

| Angular Component(s) | React Equivalent | Notes |
|-----------------------|------------------|-------|
| PageLayoutComponent | PageLayout | Two-column layout wrapper |
| FlightsPageTabsComponent | PageTabs | Tab navigation |
| BreadcrumbsComponent | Breadcrumbs | Navigation trail |
| SearchHistoryComponent | SearchHistory | Recent searches accordion |
| FeedbackButtonComponent | FeedbackButton | Feedback form trigger |
| ScrollUpComponent | ScrollUpButton | Scroll-to-top |
| FlightItemComponent + 15 sub-components | FlightCard + StationDisplay, TimeGroup, DurationDisplay, FlightStatus | Consolidated |
| PopularRequestsComponent + items | PopularRequestsPanel + PopularRequestItem + RequestInfo | 1:1 structure |
| FlightsMapComponent + markers/polylines | MapCanvas (Leaflet wrapper) | All map logic in single component |
| CityAutocompleteComponent | PrimeReact AutoComplete (inline) | Design system swap |
| Calendar/DatePicker toolkit | PrimeReact Calendar (inline) | Design system swap |
| SeoMetaComponent | SeoHead | SEO metadata (OG, JSON-LD) |

## Test Data

- Both apps hit the same backend API.
- Fix a known flight number + date that returns stable results for deterministic comparisons.
- Parameterize dates so tests stay valid over time.

## Tech Stack

- **Playwright** — browser automation, screenshots, E2E specs
- **pixelmatch** — pixel-level image diffing
- **Node.js script** — report generation, gap analysis
- Output: static HTML report + Markdown gap report
