From e6d3fa1c7e9e2a02b4961e6f58ae908149688a1e Mon Sep 17 00:00:00 2001 From: Chad Norwood Date: Tue, 14 Oct 2025 14:38:15 -0700 Subject: [PATCH 01/35] using AI to help identify map improvements --- CHANGELOG.md | 10 +- docs/ARCHITECTURE.md | 205 +++++++++++++++++-- docs/ai-proposal.1.mmd | 54 +++++ docs/ai-proposal.2.mmd | 51 +++++ docs/ai-proposal.3.mmd | 115 +++++++++++ docs/ai-proposal.4.mmd | 56 ++++++ docs/ai-proposal.current.png | Bin 0 -> 75091 bytes docs/ai-proposal.md | 292 ++++++++++++++++++++++++++++ docs/ai-proposal.md-1.svg | 1 + docs/ai-proposal.md-2.svg | 1 + docs/ai-proposal.md-3.svg | 1 + docs/ai-proposal.md-4.svg | 1 + docs/ai-proposal.new.png | Bin 0 -> 77639 bytes docs/maps-functions-current.mmd | 109 +++++++++++ docs/maps-functions-current.mmd.png | Bin 0 -> 213686 bytes docs/maps-functions-current.png | Bin 0 -> 81758 bytes docs/temp.mmd | 116 +++++++++++ 17 files changed, 990 insertions(+), 22 deletions(-) create mode 100644 docs/ai-proposal.1.mmd create mode 100644 docs/ai-proposal.2.mmd create mode 100644 docs/ai-proposal.3.mmd create mode 100644 docs/ai-proposal.4.mmd create mode 100644 docs/ai-proposal.current.png create mode 100644 docs/ai-proposal.md create mode 100644 docs/ai-proposal.md-1.svg create mode 100644 docs/ai-proposal.md-2.svg create mode 100644 docs/ai-proposal.md-3.svg create mode 100644 docs/ai-proposal.md-4.svg create mode 100644 docs/ai-proposal.new.png create mode 100644 docs/maps-functions-current.mmd create mode 100644 docs/maps-functions-current.mmd.png create mode 100644 docs/maps-functions-current.png create mode 100644 docs/temp.mmd diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ffc91b..d3e94f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ All notable changes to Calendar Map Filter (CMF) will be documented in this file The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +- Updated ARCHITECTURE.md with more on updating maps + ## [0.4.5] - 2025-10-14 - added example animated gif to usage.md for weekend filter @@ -33,16 +35,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.4.1] - 2025-10-9 - Updated Documentation - added ARCHITECTURE.md and function-call-graph files, updated others. -- Fixed counts in Event Sources popover +- Fixed counts in Event Sources popover ## [0.4.0] - 2025-10-8 ### Changed - **Major Framework Upgrade** - Upgraded to Next.js 15 and React 19 - - All dependencies updated for React 19 compatibility - - See [ADR: Upgrade to Next.js 15 and React 19](docs/adr/2025-10-08-upgrade-nextjs-15-react-19.md) for details -- **Unit Tests** - coverage improved + - All dependencies updated for React 19 compatibility + - See [ADR: Upgrade to Next.js 15 and React 19](docs/adr/2025-10-08-upgrade-nextjs-15-react-19.md) for details +- **Unit Tests** - coverage improved ### Technical diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 20621a4..e11406d 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -11,20 +11,26 @@ 1. [TL;DR](#1-tldr) 2. [Components Overview](#2-components-overview) 3. [Typical Flow](#3-typical-flow) - - [Happy Path: User Loads Events](#happy-path-user-loads-events) - - [User Interaction: Filtering Events By Date](#user-interaction-filtering-events-by-date) - - [Error Handling](#error-handling) - - [Idempotency](#idempotency) + +- [Happy Path: User Loads Events](#happy-path-user-loads-events) +- [User Interaction: Filtering Events By Date](#user-interaction-filtering-events-by-date) +- [Error Handling](#error-handling) +- [Idempotency](#idempotency) + 4. [Design Principles](#4-design-principles) 5. [Decisions & Rationale](#5-decisions--rationale) - - [Key Architectural Decisions](#key-architectural-decisions) - - [Technology Choices](#technology-choices) + +- [Key Architectural Decisions](#key-architectural-decisions) +- [Technology Choices](#technology-choices) + 6. [Data Flow & State Management](#6-data-flow--state-management) - - [Application State Machine (8 States)](#application-state-machine-8-states) - - [Core Data Structures](#core-data-structures) - - [Data Flow Through System](#data-flow-through-system) - - [Filtering Architecture: Two-Stage Model](#filtering-architecture-two-stage-model) - - [Function Call Graph](#function-call-graph) + +- [Application State Machine (8 States)](#application-state-machine-8-states) +- [Core Data Structures](#core-data-structures) +- [Data Flow Through System](#data-flow-through-system) +- [Filtering Architecture: Two-Stage Model](#filtering-architecture-two-stage-model) +- [Function Call Graph](#function-call-graph) + 7. [Security & Data](#7-security--data) 8. [Sizing & Limits](#8-sizing--limits) 9. [Risks / TODOs / Open Questions](#9-risks--todos--open-questions) @@ -285,17 +291,180 @@ useAppController (smart hook) ### Function Call Graph -The following png may help you understand all the core functions. -You can also view [force-directed graph layout with D3.js](https://chadn.github.io/cmf/function-call-graph.html) +The following png may help you understand all the core functions. +You can also view [force-directed graph layout with D3.js](https://chadn.github.io/cmf/function-call-graph.html) which is currently focused on identifying problematic names, more at [Code Review: Naming Analysis](code-review-naming.md)
- Function Call Graph
+### Function Call Graph Map Related + +``` +User Interaction Flow (Pan/Zoom) + +User pans/zoom map +→ handleViewportChange (Map onMove) + ├─→ updateMapWidthHeight() + │ └─→ onWidthHeightChange() [if dimensions changed] + ├─→ onViewportChange(viewport) + │ └─→ setViewport() [in useMap hook] + │ └─→ updates mapState.viewport + └─→ debouncedUpdateBounds() [500ms delay] + └─→ getMapBounds() + └─→ roundMapBounds() + └─→ onBoundsChange(bounds, true) + └─→ Filter events in page.tsx + └─→ Re-render with new markers + +User clicks event in EventList +→ onEventSelect(eventId) [EventList.tsx:257] + └─→ handleEventSelect(eventId) [useAppController.ts:366] + ├─→ setSelectedEventIdUrl(eventId) [updates URL] + ├─→ Find event in cmfEvents.allEvents + │ + ├─→ IF RESOLVED LOCATION: + │ ├─→ genMarkerId(event) [generate lat,lng hash] + │ ├─→ setSelectedMarkerId(markerId) + │ │ └─→ Updates mapState.selectedMarkerId + │ │ └─→ Marker highlights on map + │ │ └─→ MapPopup displays + │ └─→ setViewport(lat, lng, zoom: 14) + │ └─→ Map pans/zooms to event location + │ + └─→ IF UNRESOLVED LOCATION: + ├─→ setSelectedMarkerId('unresolved') + ├─→ Find 'unresolved' marker in markers array + └─→ setViewport(unresolved marker location, zoom: 14) + └─→ Map pans to unresolved marker + +Map onLoad event +→ handleMapLoad + └─→ setTimeout(10ms) + ├─→ updateMapWidthHeight() + │ └─→ onWidthHeightChange() + └─→ getMapBounds() + └─→ onBoundsChange(initialBounds, false) + └─→ Initial event filtering +``` + +mmdc -i maps-functions-current.mmd -o maps-functions-current.mmd.png -w 1600 -H 1600 + +```mermaid +flowchart TD + %% Entry Points (User Actions & Map Events) + UserPan["👤 User pans/zooms map"] + MapLoad["🗺️ Map onLoad event"] + UserClickEvent["👤 User clicks event in EventList"] + + %% ========== MAP INTERACTION FLOWS ========== + + %% Main Flow Functions + UserPan -->|triggers| handleViewportChange + MapLoad -->|triggers| handleMapLoad + + %% handleViewportChange flow + handleViewportChange["handleViewportChange
(Map onMove callback)
MapContainer.tsx:128"] + handleViewportChange -->|1. Get new dimensions| updateMapWidthHeight + handleViewportChange -->|2. Update viewport state| onViewportChange + handleViewportChange -->|3. Debounced bounds update| debouncedUpdateBounds + + %% updateMapWidthHeight details + updateMapWidthHeight["updateMapWidthHeight
(Get map dimensions)
MapContainer.tsx:67"] + updateMapWidthHeight -->|if dimensions changed| onWidthHeightChange + updateMapWidthHeight -.->|reads| mapRef["mapRef.current
(MapLibre instance)"] + onWidthHeightChange["onWidthHeightChange
(Notify parent - page.tsx)
Prop callback"] + + %% debouncedUpdateBounds flow + debouncedUpdateBounds["debouncedUpdateBounds
(Debounced: 500ms)
MapContainer.tsx:121"] + debouncedUpdateBounds -->|after delay| getMapBounds + getMapBounds["getMapBounds
(Read current bounds)
MapContainer.tsx:97"] + getMapBounds -.->|reads| mapRef + getMapBounds -->|returns MapBounds| roundMapBounds["roundMapBounds()
(Utility function)"] + roundMapBounds -->|rounded bounds| onBoundsChange + + %% onViewportChange flow + onViewportChange["onViewportChange
(Notify parent - page.tsx)
Prop callback"] + onViewportChange -->|calls| setViewport["setViewport
(useMap hook)
useMap.ts:189"] + setViewport -->|updates| mapState["mapState.viewport
(React state)"] + + %% onBoundsChange flow + onBoundsChange["onBoundsChange
(Notify parent - page.tsx)
Prop callback
MapContainer.tsx:27"] + onBoundsChange -->|triggers| handleBoundsChangeForFilters["handleBoundsChangeForFilters
(useAppController.ts:198)"] + handleBoundsChangeForFilters -->|updates| currentBoundsState["setCurrentBounds()
(React state)"] + currentBoundsState -->|triggers filter| filterByBounds["Filter events by bounds
(useEventsManager)"] + filterByBounds -->|updates| visibleEvents["visibleEvents
(Filtered event list)"] + visibleEvents -.->|re-render| MapContainerRerender["MapContainer re-renders
with new markers"] + + %% handleMapLoad flow + handleMapLoad["handleMapLoad
(Map initialization)
MapContainer.tsx:146"] + handleMapLoad -->|setTimeout 10ms| updateMapWidthHeight2["updateMapWidthHeight()"] + handleMapLoad -->|setTimeout 10ms| getMapBounds2["getMapBounds()"] + updateMapWidthHeight2 -->|if changed| onWidthHeightChange2["onWidthHeightChange()"] + getMapBounds2 -->|initial bounds| onBoundsChange2["onBoundsChange(bounds, false)"] + onBoundsChange2 -.->|false = not user interaction| handleBoundsChangeForFilters + + %% ========== EVENT SELECTION FLOW ========== + + UserClickEvent -->|onClick| onEventSelectProp["onEventSelect(eventId)
(EventList.tsx:257)
Prop callback"] + onEventSelectProp -->|calls| handleEventSelect["handleEventSelect
(useAppController.ts:366)"] + + handleEventSelect -->|1. Update URL| setSelectedEventIdUrl["setSelectedEventIdUrl(eventId)
(URL query state)"] + handleEventSelect -->|2. Find event| findEvent["Find event in cmfEvents.allEvents"] + + findEvent -->|if resolved location| resolvedFlow["Resolved Location Flow"] + findEvent -->|if unresolved| unresolvedFlow["Unresolved Location Flow"] + + %% Resolved location flow + resolvedFlow -->|3a. Generate marker ID| genMarkerId["genMarkerId(event)
(lat,lng hash)"] + genMarkerId -->|4a. Select marker| setSelectedMarkerIdCall["setSelectedMarkerId(markerId)
(useMap.ts:303)"] + setSelectedMarkerIdCall -->|updates| markerState["mapState.selectedMarkerId
(React state)"] + markerState -.->|highlights| MarkerHighlight["Marker highlights on map"] + + resolvedFlow -->|5a. Calculate offset| calculateOffset["Calculate lat offset
based on zoom"] + calculateOffset -->|6a. Pan & zoom to event| setViewportCall["setViewport()
(zoom: 14, pan to event)"] + setViewportCall -->|updates viewport| mapState + mapState -.->|triggers| MapContainerRerender + + %% Unresolved location flow + unresolvedFlow -->|3b. Select unresolved marker| setUnresolvedMarker["setSelectedMarkerId('unresolved')"] + unresolvedFlow -->|4b. Find unresolved marker| findUnresolvedMarker["Find 'unresolved' marker
in markers array"] + findUnresolvedMarker -->|5b. Pan to unresolved| setViewportUnresolved["setViewport()
(zoom: 14, pan to unresolved)"] + setViewportUnresolved -->|updates viewport| mapState + + %% Map updates trigger popup + MarkerHighlight -.->|when marker selected| showPopup["MapPopup displays
(MapContainer.tsx:326)"] + showPopup -->|shows event details| PopupContent["Event details, links,
event list in popup"] + + %% Styling + classDef entryPoint fill:#e1f5ff,stroke:#0288d1,stroke-width:3px + classDef mainFunc fill:#fff3e0,stroke:#f57c00,stroke-width:2px + classDef callback fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px + classDef state fill:#e8f5e9,stroke:#388e3c,stroke-width:2px + classDef utility fill:#fce4ec,stroke:#c2185b,stroke-width:1px + classDef eventFlow fill:#fff9c4,stroke:#f57f17,stroke-width:2px + + class UserPan,MapLoad,UserClickEvent entryPoint + class handleViewportChange,handleMapLoad,updateMapWidthHeight,debouncedUpdateBounds,getMapBounds mainFunc + class onViewportChange,onBoundsChange,onWidthHeightChange,setViewport,onEventSelectProp callback + class mapState,visibleEvents,mapRef,markerState,currentBoundsState state + class roundMapBounds,calculateOffset,genMarkerId utility + class handleEventSelect,resolvedFlow,unresolvedFlow,setSelectedEventIdUrl,findEvent eventFlow + + %% Add legend + subgraph Legend + EP["🟦 Entry Point
(User action)"] + MF["🟧 Main Function
(MapContainer)"] + CB["🟪 Callback
(Props to parent)"] + ST["🟩 State
(React/Map state)"] + EF["🟨 Event Selection
(Event click flow)"] + end +``` + --- ## 7. Security & Data @@ -346,7 +515,7 @@ which is currently focused on identifying problematic names, more at [Code Revie **Browser Constraints:** - Map markers: Tested with 100+ markers (multiple events at same marker) -- Event list: Scrolling and jumping (clicking marker) tested with 3,000+ events +- Event list: Scrolling and jumping (clicking marker) tested with 3,000+ events - Memory: Events stored in memory (allEvents + visibleEvents arrays) --- @@ -418,4 +587,4 @@ which is currently focused on identifying problematic names, more at [Code Revie - New event sources (unless changes event source pattern) - Performance optimizations (unless architectural approach changes) -That's all. You can also [view other docs](../docs/) +That's all. You can also [view other docs](../docs/) diff --git a/docs/ai-proposal.1.mmd b/docs/ai-proposal.1.mmd new file mode 100644 index 0000000..a519f42 --- /dev/null +++ b/docs/ai-proposal.1.mmd @@ -0,0 +1,54 @@ +--- +title: "1. CURRENT ARCHITECTURE: Complex Callback Chains & Circular Dependencies" +--- +flowchart TD + subgraph Current["❌ CURRENT ARCHITECTURE (PROBLEMS)"] + direction TB + + subgraph PageTsx["page.tsx (Parent)"] + AppController["useAppController
• Owns all state
• 550 lines"] + + AppController -->|"creates 5+ callbacks"| Callbacks + + Callbacks["Callback Props:
• onViewportChange
• onBoundsChange
• onWidthHeightChange
• onMarkerSelect
• onEventSelect"] + end + + subgraph MapContainerComp["MapContainer (Child)"] + MapEvents["Map Events:
• onMove → handleViewportChange
• onLoad → handleMapLoad"] + + MapEvents -->|"calls 3 props"| CallbacksFromMap["Calls back to parent:
1. onViewportChange
2. onWidthHeightChange
3. onBoundsChange (debounced)"] + end + + subgraph UseMapHook["useMap Hook"] + MapState["mapState:
• viewport
• bounds
• markers
• selectedMarkerId"] + + SetViewport["setViewport()
from parent"] + + SetViewport -->|"updates"| MapState + MapState -->|"passed down"| MapContainerComp + end + + Callbacks -->|"props"| MapContainerComp + CallbacksFromMap -->|"triggers"| AppController + AppController -->|"calls setViewport"| SetViewport + + %% Show circular dependency + AppController -.->|"⚠️ CIRCULAR"| MapState + MapState -.->|"⚠️ CIRCULAR"| AppController + + Problem1["PROBLEM 1: Callback Hell
3-4 level deep callback chains
Hard to trace data flow"] + Problem2["PROBLEM 2: Debounce Complexity
500ms delay → race conditions
viewport ≠ bounds temporarily"] + Problem3["PROBLEM 3: Circular Dependencies
useMap depends on parent callbacks
parent depends on useMap state"] + Problem4["PROBLEM 4: Multiple Responsibilities
MapContainer does: events, dimensions,
viewport, bounds management"] + + MapContainerComp -.->|"causes"| Problem1 + CallbacksFromMap -.->|"causes"| Problem2 + UseMapHook -.->|"causes"| Problem3 + MapEvents -.->|"causes"| Problem4 + end + + classDef problem fill:#ffcccc,stroke:#cc0000,stroke-width:2px + classDef current fill:#fff3cd,stroke:#856404,stroke-width:2px + + class Problem1,Problem2,Problem3,Problem4 problem + class Current current diff --git a/docs/ai-proposal.2.mmd b/docs/ai-proposal.2.mmd new file mode 100644 index 0000000..e4ca7f6 --- /dev/null +++ b/docs/ai-proposal.2.mmd @@ -0,0 +1,51 @@ +--- +title: "2. PROPOSED ARCHITECTURE: Single Responsibility, Clear Data Flow" +--- +flowchart TD + subgraph Proposed["✅ PROPOSED ARCHITECTURE (SIMPLIFIED)"] + direction TB + + subgraph PageTsxNew["page.tsx (Orchestrator)"] + AppControllerNew["useAppController
• Business logic only
• No map state"] + + MapHook["useMapState Hook
• viewport, bounds, markers
• selectedMarkerId
• All derived from events"] + + AppControllerNew -->|"events + filters"| MapHook + end + + subgraph MapContainerNew["MapContainer (Pure View)"] + MapGL["react-map-gl/MapLibre
ONLY renders map"] + + MapGL -->|"onMove"| ViewportOnly["Update viewport ONLY
(no callbacks to parent)"] + end + + subgraph SyncLayer["Sync Layer (New)"] + MapSync["useMapSync Hook
Derives bounds from viewport
Syncs viewport ↔ events
NO debounce needed"] + + MapSync -->|"reads"| MapHook + MapSync -->|"updates"| MapHook + end + + MapHook -->|"viewport, markers"| MapContainerNew + ViewportOnly -->|"viewport change"| MapHook + MapHook -.->|"auto-derives bounds"| MapSync + MapSync -->|"bounds"| AppControllerNew + + Benefit1["✓ Single Responsibility
Each component does ONE thing"] + Benefit2["✓ No Callbacks
Child → Parent via hook state only"] + Benefit3["✓ No Debounce
Bounds derived synchronously"] + Benefit4["✓ Clear Data Flow
events → useMapState → view
viewport → useMapSync → bounds"] + Benefit5["✓ Testable
Each hook independently testable"] + + MapContainerNew -.->|"achieves"| Benefit1 + MapHook -.->|"achieves"| Benefit2 + SyncLayer -.->|"achieves"| Benefit3 + MapSync -.->|"achieves"| Benefit4 + PageTsxNew -.->|"achieves"| Benefit5 + end + + classDef benefit fill:#ccffcc,stroke:#00cc00,stroke-width:2px + classDef proposed fill:#e7f3ff,stroke:#0066cc,stroke-width:2px + + class Benefit1,Benefit2,Benefit3,Benefit4,Benefit5 benefit + class Proposed proposed diff --git a/docs/ai-proposal.3.mmd b/docs/ai-proposal.3.mmd new file mode 100644 index 0000000..581e1be --- /dev/null +++ b/docs/ai-proposal.3.mmd @@ -0,0 +1,115 @@ + +--- +title: "3. DETAILED COMPARISON: Current vs Proposed Function Calls" +--- +flowchart LR + subgraph CurrentFlow["❌ CURRENT: User Pans Map"] + direction TB + + C1["User pans map"] + C2["MapLibre onMove"] + C3["handleViewportChange"] + C4a["updateMapWidthHeight()
(check dimensions)"] + C4b["onViewportChange(vp)
(callback to parent)"] + C4c["debouncedUpdateBounds()
(500ms delay)"] + C5["setViewport()
(in useMap)"] + C6["getMapBounds()
(after 500ms)"] + C7["onBoundsChange()
(callback to parent)"] + C8["handleBoundsChangeForFilters
(in useAppController)"] + C9["filtrEvtMgr.filterByBounds()"] + C10["Re-render map + list"] + + C1 --> C2 --> C3 + C3 --> C4a + C3 --> C4b + C3 --> C4c + C4b --> C5 + C5 --> C10 + C4c -.->|"ASYNC DELAY"| C6 + C6 --> C7 + C7 --> C8 + C8 --> C9 + C9 --> C10 + + CProblems["PROBLEMS:
• 10 function calls
• 3 callbacks to parent
• Race condition (viewport updates before bounds)
• Hard to debug timing issues"] + + C10 -.-> CProblems + end + + subgraph ProposedFlow["✅ PROPOSED: User Pans Map"] + direction TB + + P1["User pans map"] + P2["MapLibre onMove"] + P3["setViewport()
(update local state)"] + P4["useMapSync detects
viewport change"] + P5["calculateBounds()
(synchronous derive)"] + P6["setBounds()
(update local state)"] + P7["useEffect triggers
filter update"] + P8["Re-render map + list"] + + P1 --> P2 --> P3 + P3 --> P4 + P4 --> P5 + P5 --> P6 + P6 --> P7 + P7 --> P8 + + PBenefits["BENEFITS:
• 7 function calls (30% fewer)
• 0 callbacks to parent
• Synchronous (no race conditions)
• Easy to debug (linear flow)"] + + P8 -.-> PBenefits + end + + subgraph EventClickCurrent["❌ CURRENT: Event Click"] + direction TB + + E1["Click event in list"] + E2["onEventSelect(id)
(callback prop)"] + E3["handleEventSelect()
(in useAppController)"] + E4["setSelectedEventIdUrl"] + E5["Find event"] + E6["genMarkerId()"] + E7["setSelectedMarkerId()
(callback to useMap)"] + E8["setViewport()
(callback to useMap)"] + E9["Re-render"] + + E1 --> E2 --> E3 + E3 --> E4 + E3 --> E5 + E5 --> E6 + E6 --> E7 + E6 --> E8 + E7 --> E9 + E8 --> E9 + + ECProblems["PROBLEMS:
• 2 separate callbacks
• Duplicated in handleMarkerClick
• Logic split across files"] + + E9 -.-> ECProblems + end + + subgraph EventClickProposed["✅ PROPOSED: Event Click"] + direction TB + + EP1["Click event in list"] + EP2["setSelectedEventId(id)
(hook state only)"] + EP3["useMapSync detects
selection change"] + EP4["Auto-calculates:
• markerId
• viewport for event"] + EP5["Updates map state"] + EP6["Re-render"] + + EP1 --> EP2 + EP2 --> EP3 + EP3 --> EP4 + EP4 --> EP5 + EP5 --> EP6 + + EPBenefits["BENEFITS:
• 0 callbacks
• Single location for logic
• Auto-syncs map to selection"] + + EP6 -.-> EPBenefits + end + + classDef problem fill:#ffcccc,stroke:#cc0000,stroke-width:2px + classDef benefit fill:#ccffcc,stroke:#00cc00,stroke-width:2px + + class CProblems,ECProblems problem + class PBenefits,EPBenefits benefit diff --git a/docs/ai-proposal.4.mmd b/docs/ai-proposal.4.mmd new file mode 100644 index 0000000..493d225 --- /dev/null +++ b/docs/ai-proposal.4.mmd @@ -0,0 +1,56 @@ +--- +title: "4. KEY ARCHITECTURAL CHANGES" +--- +flowchart LR + subgraph Changes["CHANGES TO IMPLEMENT"] + direction TB + + Change1["1. CREATE: useMapState Hook
Owns: viewport, bounds, markers, selectedMarkerId
Replaces: mapState in useMap"] + + Change2["2. CREATE: useMapSync Hook
Derives bounds from viewport (sync)
Syncs viewport when event selected
Replaces: debouncedUpdateBounds, handleEventSelect viewport logic"] + + Change3["3. SIMPLIFY: MapContainer
Remove: all callbacks to parent
Remove: updateMapWidthHeight, getMapBounds
Keep: only rendering logic"] + + Change4["4. SIMPLIFY: useMap → useMapMarkers
Focus: marker generation only
Remove: viewport, bounds management"] + + Change5["5. SIMPLIFY: useAppController
Remove: map-specific callbacks
Keep: business logic, event fetching, filters"] + + Change1 --> Change2 + Change2 --> Change3 + Change3 --> Change4 + Change4 --> Change5 + + subgraph Benefits["BENEFITS"] + B1["✓ Eliminate callback hell
(5+ callbacks → 0 callbacks)"] + B2["✓ Remove debounce complexity
(sync bounds calculation)"] + B3["✓ Break circular dependencies
(unidirectional data flow)"] + B4["✓ Single responsibility
(each hook/component = 1 job)"] + B5["✓ Easier testing
(hooks testable independently)"] + end + + Change5 --> Benefits + end + + subgraph Migration["MIGRATION STRATEGY"] + direction TB + + M1["Phase 1: Create useMapState
Extract viewport/bounds from useMap
NO behavior change yet"] + + M2["Phase 2: Create useMapSync
Implement sync bounds calculation
Test alongside debounced version"] + + M3["Phase 3: Update MapContainer
Remove callbacks one at a time
Verify each step"] + + M4["Phase 4: Simplify useAppController
Remove map callbacks
Update event selection logic"] + + M5["Phase 5: Cleanup
Remove old code paths
Update tests"] + + M1 --> M2 --> M3 --> M4 --> M5 + + M5 -.->|"RESULT"| Result["RESULT:
• ~100 lines removed
• 0 callbacks
• Simpler mental model
• Easier debugging"] + end + + classDef change fill:#fff3cd,stroke:#856404,stroke-width:2px + classDef benefit fill:#ccffcc,stroke:#00cc00,stroke-width:2px + + class Change1,Change2,Change3,Change4,Change5,M1,M2,M3,M4,M5 change + class B1,B2,B3,B4,B5,Result benefit diff --git a/docs/ai-proposal.current.png b/docs/ai-proposal.current.png new file mode 100644 index 0000000000000000000000000000000000000000..bf251110f21b408dcd0ab1fb73af19c4ccfe1610 GIT binary patch literal 75091 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%0AxDu?Ms%nA(5m?D^ zXc98=_1ctVO5W-e!^1jZ`Nc0Rk3w(QE!`o)zv8(8hFctqdXjcLOUEr;Fj2sQEQtO) z(idY>q_4$t`@btUqfg_P$Kqa=SUSBb8|%cwj-Z3-C6#&ZYn5jgwwtwca~Yeb+umv2 z|1jG7lX3JFzbF1Q<9wpIN%I+t=5qtRR703d2y4q5--kZ$>Hdm}hF8(vz`082ARAzw zHmZ03Aj@LEFkEGH(sbdV#V)Q%uHnV#ms2+(m&1bCqmB-D-rv~Mb^n(O;F>de++jLt z8=J-$s8lxYbt30Hd6Z)quRU5|nx7w>n4ki!xqJ7Bvs#`NJ@LerC4A!9 zEgtZtR(brp>T!sGcH5?M$kU1GLnjF|oiu-AerN#VF!99;;_Zqjo=kxpf~U(31S~`5 z|1JhnPhLkd^Sc^(dwXkWP&Bf6)g`4Z_x2Wi`h-_9bXTrlOiT>bu8}(gWzy_HilC+e zeZlVA4e7fI^?IM@_@az~LrG28`uq2+>yXLq1P(TJ6-miv0tghIQigPNbiAMw#l06K zG5C|rU!N>C&79i`2HO@y>*Nz$yNZx#G3fpEvsx#=UXR-M7k0medC}2;vMy&;pY!R3 zet_liY|uiNqCdBg&IHI@&70=+P~p}wb*gQBN(zm5R=V8Ay#7_IIN;@ltAUJidjHY%dv9Ph0)7}o!t65R_qDK)V{CL3 zEWAHHDT_|^q0bF3nSQ)(`>CU@vWs2ehvguD1J{(t)@#IyXLxw{wW@0NqU-#Z;lQ9E z5>)iX*pyK8*RRe?J;@NKPM8S1nHl|sE#R=U)vq9|tfZu+t1HaIla^*+p?9Cx2Fc1A z`axSu%VABe|DLK=t>=jp1_{ay3^@N*buShk3m+BK>wUc8v{?f)0h9|(1m}O>ice?? zQkD1EicEWnkVxi-hOV_JrR%kRJ$FPV|24$bGqL=U_Y=BvGia_#=+tfumT^fnCFEdZ z`(~q6=S9_C_|S7NY$DNyi=ysqeRYn>QvoFZfc)U#>qp1 zM&g}O@^{vlbdSI<@3!eDt#$HFRRUWZmL6BRC5fMtW%06*p6*gsk@E|NFnE*Pe=<{C zGQXTHOdxFyay}f@x3A#p-kP~`vEi;^Lf6pN#IGEvblIsg}*b9(b&c6M5 zaM>f>o{n&2m6jF5&^GjZm*pFrx+WDie{qj7?;B~Df*Sw)tet0S%&|> z@SlO|x}y4~;}XMzh>uJZ6cf&W9^!|Df0S9ROo})jyaIvY$=`?x;A#w~$%QtD0wbYv zHE*nVxwoT3HbLI~WZn66mb7l?cUsQD;>l9zyQGWX%^yK_xvwAge z>h!?-;y7Ekrg@$M)}*@FrH!zS-#^_|fN5%clxO((w_SA(^DindqBJ*@`o9TmlphJ7 z&mF)B$}~Ce!)1ldPf7MIAp}GxHm)^^hv@A@4ftQS-tG!II&f>kzI<7I8?0kjpBk~B zCcovH6n^_*mF||X3{oRpdJK!P^AVmLZW!&X@y1?VU8l0puk`bOp~6;qHlKu3g;-)4 zOkG~G^f~7tXEpwN~nNBq$BZ+%YAcrSW!w_BJ|x zEWtmJrBRPE_Sc7|P`Q5LI6Y=4#eCEW28;M#`|(>~!+#I`MxP z&aL{Mo=&TC$9r{XIOL)2poQb>*Y@FOK#Q8*BziciU}gJuZ^`G-nUCfr^)!U)xvs8$ zLP>y18$(EVx<5Sir|+$-wIk>or2ZSO-1)s47kg*Qd1@U_hjxjDCm-co{ttt$Y01g; zE}SeSn<~ovGhcPROzeJarp4I=J){q$C`peRTdzEvZ673>1npSZjp2VA6WfFNI)-e~ z=UX3im-d_Q+g8t?9ZY??QQ^E9GEpUb$M0R)q+2(j-#?DyGHSifUwN1btqLD?UOYzz zA_Jc(yk){mMq*lToyAm!rF(o-h%zqWc|AMXX0g6=9XrK*!M7%}$DZM+?5{XltJ-A{ ztSTuU4jtpa_YY6^;C)ul2HJ9Sp+;d^xu#}6wDB}1CU&jn*M%(})z&`P&qz-8d3d&@ zQZ(XrxK&$X$qOn4=b7o}s_VHYFof)T)k*pAs(P{6kzwfB8@nIglhw^&jW?$1vTMES zkN3Y)!?5iajBxtLN``eXdCBOnyY_H4e`D&R?ffih zV6ZbkCkGz~8@i2jFZL8JN)4Khxa7LyhFu0txD}iZ#b!n5i?)!s_lU^sU zMO$T9&**{t!O7{~9z{CXsO!03ao^_f&1LR{-cGTwTpSwW$-@gO-GyJ&Q?91%xn+~<+vNZvl3&Pi-FrwOfvz6!!Z>0)THHr1+x!VML`NN3sq*OuC!PdCF1FP+HKVtU9UR0H1i%7} z!MeChD80PBLnTw5HAX~4yh~diSnI;Z`dr9Gk*kueOj<}Ndg^8C<`y+NNjKT|y{^s_ zjw|#}w9$rE^Ko$eV#^stNT4HKvWfTYN_M}DHj5{eJV7GQhswOZO@`lp;Pfl*P0h*1 zs_*C9tfxERYGM--EMc;GsFJsCM-1oY*34P9s_r)yg#}lUbk4)GTF}#~%Us^7b`2Iv zdd%K>e0*K_;)t0^B|hme&MZ)fH{}iHU{jt1_tT1lBs%_d?;R$CmFUlEzIVAvr$I@c z$xG>TJY~_NBL(Ymm!pU0TkRkVt8!*P6Zs*dMiDLpyZ8C5%fxYgy@F~)uG$+fnf6|| z&sk+>E;b=Dd3u%SxF`}S{lqF8nN|CEbT$)Y1iSBw_B2yW6?c;}|2H3kGL6KOk*3~H8E zgZOJ`^M%&~a`L`a{BXMeYxCN_=1-JZj!`*}pKdkQ$(;HbbEreG{b#`8@Nj$R7xl9T zye-=)DYOA~0cqPs@fjf@wF9VkMJ{i|Zkfnr7A~C_1@IOrEc@yp9}njWPgp=bjwJv1 znTXmRei0D~M5c=an9Y9A4@D@Z_CgFY{iNZcvyYttCyQunp7xlr`e^08?N@Cl$Jy9m z7lmBT8}AXY zp{AxbyYD978a0p|U(pm;x$UbBBPYQ6!~LKQH0Y~JiQOH4i=*>M1qK3ZW4INx(f3kqsytz2rCll$Pbar)VKMC`-Am*Eamo);v+lKHjA?!KR)H%2?$ zfU<=t@KhLbTUD($6I}@p9|)GGmpa*~tAD8+o_nL~wtR1;=xu&ot@=bu zQGBS5FV@y>fc&-E`mddY&2ggwwTOdl4H^O*ba0>^CP9o<2S5 zHQUR|uGK`NcaK+Dn>20jih`J0{kwNW0PMT1ewl9{wi?-)ZEgKrdEh=(bp$@fV=4KD zq*TIo%?efJFJ=gdqDHJL=A)`8C`hsr)Jzmh|L$HtKBlDn`nI1wA)!Xn@b?70EZ5OP zbvKqlH$8_w1$PeV@O0C9Mfv4O-K!8af50F`2qm`rp9BHF3em*&327mk{B5+uckyU) zGOw`E0z{VZaKPkmjFs7gH^{G8cnBL>;Ihgr`T~t!uJsgvLB25eVj|JCU#{%PEpFMx0IB0@;tlh zxLMRKG&wnGP@uNDvH&{xV=I$Etmi8!q33TJ{o7~fcx|drp(wKn>fxFNvmPbH?cnNF zHOD@G>R#Br`5|RwV^BV?T4qU)mT!BDdHn)HN`N~A)FLqNi`L{cHE~Sy>2a)(n zv-yviG-EB~3$_qyD?l^!^UoOa<`aZ0kCz{wZQ5_U^LMu%V+#*M&Y-j@@c40ETH1_^ZY9t)1P{iEWukJF5XPI6 zRD!G-j+Na4o9_5TfVM$fLk)T#@tD3SZQ^&Y)WtB z+H;{f_+f2rF9+pbhu`E>w4$U0-*VVSt;{B6YP0I>U!0qJ)g0}F%`jf> zHdVkcD4Hrdl}?z+CWp(+*!}HEh9<~Zi|kAWGn~h=y=G5HR8x@_6oH}GSn-x*{_Jtg zup;5ayh%v=dNK1;$3p}iCNjpx)|Qt2Kc6R!SOp9(51ADQyf-X})}Wo%oH`Z}Ys63q z2z?A4uy8CyJsvu|bM2HwMk8?eaAV!kMX>g0*AkR~V>H8!VH8v2Cc!J!uW9M&27yoS za`NfFlnW$cy$yu}PC&nnpjnDk{+7VZ85(DfaOB5h}u=Z35jW*)Bf9tkA{8buXz66$Bl_KZO-kqIy@$sM3 zkM{cU0;EEduq9D-ncA80mmMoTp-#Fj1pI*sK@zLosf&V*O&Y3waFAXw>2Ha0AO;UV zcx69!qACNd&1l0z(5(6>QPBvK0W*arIg)HPy-c^0}l zJL3a_yqqI96IyQ4yn({bqZXAC1^M&SW-n#F0;z$sc~e*ApLQ z!b7p|=l9g4sMjhnOk0kj30{sO`aTx*m*A%j*StqU9?v+(i1vRkC}0Wj3wjim(K2`c z{;nC9fo_uF#`y1*m2f%+Yer+ZewhJj=1~dtsZ&?582p;#pDa{{Q%O95%G~Py?RR#2 zW|}rO3^d~T!%Getq91Et#++L*A_6~!RLU}(B|ei13Ve$UlvhyTq;RaLAb&itE7(G# zA8S;IYB6|Q2-Kz*9R9SWYeqN1I2vYf8`;2QuRE=7EoD$|Emx?Qt`P+<_$JcybJ6hf zuM900ONA7VT18#rn#M&jq^x-g$Ggs%c>i-q{sxI-yu5qX|J}MeH9kJ_hfgYhSR*&> z(H(&5-X(@Plw%$=v( zEhmFc^lmjnRy-M@U*t?*+i;61-6oEVS|}^o2T_*WS9M=SX7`)JZNa4hhvAs7@a9GI z<)N13qKGiANH?YCG1!4Xj3R2x<((olXe zdJx8VEOW%+3+eXEZ4VAaz6{S944j|$3#b@%Sg>Aciuc8j zCWFEeK(E;!e^9>QU}f%1>U%-m3kUb|&5CkSDBGu)aXkq<4WqRl90Xa47MYhjDZLqz zv@83S#_bD*s49o$@yzzmbka^0f;jK<>byT1lLul#9#{)+R!hLyVbd(vT1M1TK$>9?#a%RSOk3jeY&O?gtOFtIN+PoSnIOy2$VEs^v1|s-Rf9 zILRDHb;{penv4PL$CkYcD2D4-MbL;FH$DVQPHb(FLFXh=KE0}#t1jKN$AEqLvb1N( zW_H~t9r-eW{daqNd?e^vUS2k}ZG0>?N0@4JSy4z~i10Eqdxb`bOvlBBbSLTB@0q!K zd6Bdi3U=STI@P1dha}JeC`s1QQoY;93i|kuLAty#oPbfH3jGdfGz-o5>S{X< zA)FV?m#(|B5FUcLP93ttk#v03|qipl?R!r~T+ke_&@_uanwqJuvw)s@8AsFrAvV%YC zDkXV|DokmqF;7D@3%`rx59g_|3va*TPcX@{y!AW~E?)$yJ-YJ>)(iC+JKr?(I^l0H zihwY^A8P+oH78r|u9pZnKR{hx?38diQ{xfySOawiUS6^6K|9Lqu6~rRP$;32R=hLG z*APiVFujGd+lR6Yp6>1n>gx6N?>k*x)!)Bw^!>cISDctw4`(!g*tUSIL?gI2V|ba1 zNtK20npge1?(qg?&Z5jb1}sLK|26F7{`E-|SZpVm1m3QKUhhSKhQ<~b{2-K-5O-uf zN-B}L`W|pKyqG@FRRzi({lsU zP)sXzV|TYhOiai>m6;^CafX?x}Af)2bbM>l&TZS5M$Pk%;zcnKgSg2X6_*U>e zaoT{#gJ6sj7aLaebq5Xi3a3F*VYtI>g=+-9cy89VQ=geTxj0tP2#NfDO6v_PEyc6u zA?@ra?qcV?5zan1`Au}1v2A$=CZ?(LBVuj|{%M)NHY=Z|&S{~;A%US+zk}20mXKzv z_s6CP4?nb*i#gC^YBOfnr& z40i)vYObV+2uzc4$L$#!>IA0oMXf)iWMu6etDWmP^$%Pa+Sqfr-BM`CVk=>u*iBkI zhN1|jzEzF1a~!0<+Uh)ZY4ltBro?yko=J^p${^UD7YE=$0|H=pu+JlQ`a)ZFtIv* z@9e|aZ<)6ORX6tegL9BJW%)UD2WIxe4Hfsg(4ivv#%dbVt|HU7b~z<{bSsK=2+LE0 zOIDU|??9wbGT7uxn4t2CH_+g%(ChyK;_7b_H})__vr31HzgY3Rj>RZ#Z9x*;^e8O) zr+vswK|D&+UQ@xQbb_6$xe%|rh)NrKcjb54I^Uo2ZiwkB=lM;OdkBo03L+ zk-M(Fobk+d*OgqAX}%$LE)88xx8lqqefi9>IbO12!4`{>N9`Q+ej_+FrIm%B4b}aR zimTgqn(T3D_Dkp=D~Pb;33nzv`T6R9Y#b9KUn5;R$1U+I@$HwU+YpSLpUc^m2$A85 z)z-Gc0|I`DFja(c54(nX)WNybjVP9^XG7y(;tWH@4Z!ey*F5$4h9RtxM_dJ5Y8c2FL2|S1pBGFu&ecVAX@yI0 zdgtjYJh5r<#Ns|3Z|JnV^AAjsOK>cqw+U6q@3*6Tyd@~7>Dqmsw;J_1AMm{`T7Tv#=2jya*hZVOG25^f>P%&$r8qIrXI&Pj?!SF>)wP1W z3$0*M`2}MZV*E*xs*w%TI=otfX|+|Wi%v7wj8)ghF_PiDE7A7*#T*|GWq?KpPRmyG z&mtc^7c;Y*a^y+GvzCQ{$YQF^!DTM~Tt2p?oNQ)ui;Y-KT_K(YW2@pEq+rXAU|d2> zbD@Lv>oA@C0*y}=^fZpoKJybG>h4CFa1)7g^yljSc!rBb7h7L9s%-DiNEBdJqE?H` zmTSNspl_DM+Im}yjV#JIX7Nw*T~!_V_nBQ?@u9+!-81)YVyE1g7q< zQ+YbY#iSwgg)@dN;nNt#6cLE^$^1*B@hO6Tn9M_rvcMZzgd)cEg|7`W<6?dMj3NS; zMzGs?|BkU~+WsCtE{#U;pUDy7y4urqI0x!#{S&Kf)Q7DlCcgvxoyFg zLRl4+SZcdnir+0g$6D|rGLR`jM`edU|SK8VNsf32Wa8Ef^cU!RgHums26;EN8 zUf|=Q2tp&+m$)%M$ND-@?OT+VC1es|b$b}&?GmBw54{vCzloA=E0cGZ-lxElEh0}~ zOP$4wzz{-`3CHknpfr&LGD+C1$5JxhrbcIO_xep5%9cC$RXg_m1e7+}xhyso%cZF? z@9KYyt+GC8<#+gdSlCq35?l3KW>?E53Av*Y{F9AKPMO>(=%@Wr1v#dbu`pb}%#5pH zyizH|`1V^)@vyJPPe~#W65Ge`!s#*<>dKt=?&I_OAz8kbVNl*v^+Tya7Vd5zcHZ`h zCF4qzTaeLTz(gzJF?On-ZO~~BLe!bR; zF0oYTKRw+^F`yMq{pto!xT7 zAKw|MSn))Nq%%KhH6Ul`w7{4L8ZRmGH59D<{Km;S;Z~k0hBzvn^DN~8XY(Mmt{hoa z)S}OG-{bt7e0s9k%XO=y1am|6(!4ZC;s=JKexQiG-#K>vc72@hsY3iMr-KW1cICf_ z&S~9s$`=2|Fe9lq7zmqi53~FtfpLOFL>WJwzWvrpG3=f%c-CC3Uf(BP@Ru~`vX>TVV_ zs~BN&skxZT0gQ31JKRW(Cr-Z}BKB z4|YfpW?hAdq$_+GDS~fa%_^>UP((}PDYm)3QC~y#6mxnzqRMQ zLuHYf#{w#!JTZH|iZwOw?H5(nM;$Z1i!W`yQKFO6X0hg2LZ~w!X4EujcfxbNk1-cw zUa2A!5pCU_9X~Y3A9$Pi56gcy&!JC&`GSJsN`EW~SPJ8~uGI$NH|JHnq2u+1&a`bel0ofK1! zM!1N6{IB96)(d~QQw2i0)L`CQHwnzRTwdN0DzoEjD70cD!ysRx5lO6i1!PrKHvqsm zKB3}IPznFri&hm8>3W<*X=Rl&RkZj*M8t`WEJPdws7-FJHY}5$Qa)D&Y+kVj4T&;e z2#qgUup9a>K2A-O0r15C2kC&^6&-oCo~`>$$P7AA5ki>y=!9tOE!vPPore$(T3BNpLpCU z#0)}%Hf`6h(gaJsSewRQq)?Aa=_P9~v?&_~3jTynl<_@@Z5I!xs*=>yl)}RD%uFD_ zbguuCcyu>=&|^*QWM_UC=J*bW)7uO1yIJ#aHnOpNg^wP4c$J_9C7@5DSOcFXaKdKZ zb<%)c9o1~+@CtFHi0ojKMIzRh$x%#9OKWS)tgJgH*pNsDh-3Ru(?p`$@x+Qy?Qi0# zx1K&FN6aHxJ6{%2Fq=GsD!f=WC;wu;&U4(%Y({Ah-FwEazMseA_kIPhU?(H339uI5 z0cKKwim*_)TvpA4*GeVis5!PZ-o>6q7;xf+Bcn|Ja%*h)x=| zX2$N9Ue6oK`*{9z(*Imeb@GMDKJg{kh<@xQ<%$a~P>a+z|_|F+`6y_%G0W2_!E z_ve4|>iax7M(QS=u}uNCzbq2Oa5HmIFUK=_Khn}RGNeQqlfRqo!or%9?)7b3G=xU) z+Fwsun4W0^Z%Uo*d%r~aawYb(ll#6~=QW&$Vx=HM*BUQ06pMu03&ZJ-&XS9{lr=S- z_4VZyy1%I~^>IOYR!LiX=lmoIrQX-m*Joa)N$&4d<$3+OdQHupxK4hKS&kSyFYljv zJu>0H-o%d%Mb4?!=vZ=)V|p`?w*azP-G|YOc6@LuyBAdvM3)Fc8l>8|-S&dr<|P;u zlSZy&%H8a283}YWZ+`3?Uu@cd>+jueT~S>1AKw_Z*Wpl$!r3p4J)qlY&?3P4iGamP zhey9K8sGHN$mR|fkj+lL8I!hx4X4kDL$q8S&-9Z=#=Lf(R%G|)FvA2PcZWt^kJ3G<6%cpNuc zY{~*LKWrwH5*JnSZDjE#ZOVv5DJZgVX<+jMss>E2li|#JKwTCc$RG<`*b~r*S5b*N z{-(H+L%wtJeq>}B_zp?ou<>8u0OD5nFBhtP0yG)n_kwQa;6{#$y{6`H{L^{RW=s&S zJD#qO0{qmD4=PbmVT+9uu&`{Gl+?m`ABD+yPE8ivOebxku7WlKxW}QAgVVZR4+xn3 z>;L>k^%EEUKeULWseOG#_4h+q8hhUTH0Qbs1wHFo*V^xNp>uy$R)}&{WMw!x@#Ov& z&@qB{=F&{8suWJD;6FPcPYQ^RKu4=@W`4f+RPC9n&JlOXA6^OcX7#R(r>C}thQ?d$ z)y;<*h2Lo^*y*%U44J_-S}dW17AxzHfcf3P@eh`)=_dUsX{eID+>;ztVV@0ly{+{J z%x2_S$jd=(EG-Q#|AzT*ohCQ0iLO*W%vHhjYhZ{-TzpzI()tGWSSLS;uxZ&rI(%*W zkc+|x16hc%I?1&VedK$Q^ufSD1Et~VF)I=@qD#OwjCyM^p^S}vw7D6=I`d`Il>?{@ z%sSTstf|DSZ((ii%4 znN;AToZ)kV|4GYmDxc43>nq=Brq*=i=fLX{`RCF(x8{T~N@XNF9j9u_fRD zLgoq!t@sn7(lR?_-jlN3VQM2h8)9t3=&UF8NnWdN7+J-$6qxuI=uKp zqZ70ZVY!BMlp%dw^V^4geH|9u5+R0z6_`(WaS%tD^D{AN6PC-csLSE1S2?lM{4!u? zXwJ;T6PQU7k8SE|LOnJ36E0zXSAf5OI|U+N|e5G_3P_4Oqr zDu!2;A6|8?dIpM8Hf3j9A1CIH%3g3pFyzbPU`KSIGu zNcX1|PjQLk*C-N7q46xC-PC^bM`31cWO*4#L9gmE42F#;KnVdLr+hkqZwBnKoj4!F zTD!Y#Y&Ur>v3;1+2Zg7wumT{$@KHhykT7sg%|E%*?Q_uvG(?x@o?SH)6Z zKBQjnaI4X}*Q~gx$i6Fn^uxo+y^?&-K@%DGqj^$NW4?%|@kWlD0ohd2yVVi?96gi^wb%cm?rdk`nVDzBI@6) z-6Zgik@fcO(biT1!VOy-98e<;^394xmdmaHx4&U>a5IBJ0C}GTxH;VIUKIbn)*>Rl zE3A@sCkcnnm4m`FIPyDYR$9LbQ8fK%{OYpdBzQJ8RjjW+ zd-pQ{(=*J=DmY1Ud z-aS1|9TKKGqu%3v8LE)G zah;gnkITy{BGaU(jNVlcp(MwvtgnZn)s~CL`g#pR#0)SP3JXtP&`F|wjbl1w1zO&~ z;|y3d-D6tF9#(qKh>AazX1%0{DS}_52p0dyRS@?3!$X_8*+BCwD!Z4kNf3KHw%T($ zgE75=lZwcOT`lK>=YYBw7_LJRs@Lolp-YX=zo(5dRn95jeoszvR)c)a^bfQJ_x z>{?jVKQ>wkuj3}pd!D!v3vOeRQE~L2ANuq(MjPW#UMWI_`b8yq5?kiHD-fglW7wp_ zDR23SC2#$SmO}rXYjKZaj$3p(`6OARlmA*XfLT{aA!>eRhCMdz#tkXaWVV(!Q09VS zi&P4`$aIN@oV+|vx4nh-a#mKjc@T`agaPCupV{UYOg#2_&ySA-Z+?2_Zqb?i?_VM? z>BB;-5_H?CA6_H8rNH@)$~oPYTcHyHWr=(9pyvp3g5@UMx&J8x=oeQYEn;6w?H?m0Q%ii@XxwV`A> zIBY1w3mlB6`v2%;ao&e4R)B{n;wvpG3Z0XWw_06yjEwxNiE55$Iq~rE@kz#D#*6TQ zrG{k^K4LEua#^(+9^}?5QWx6vfo*;F^RdmFDo=BBP~I1uKYV{f6Qb1G=O9yv#TL<# zNX{Vo0@49X%SCm{a{I-4Gp?v|Psl;p3& zuTg&T^kxL+^E-{~-ev{8wVc6H_m71C+hg-HM+0gfu$X)Q!(YJqgndba!1~Ge|NrBh zmTWW-*0$$z3)HNx8Uo`1tE&dGw%tjmv0%_0@Y2*&2KH3qGXZ(Bt*>>0;op1UuTV>L zCJrHiLK;7|PVvBr46nJqz83VP9z$=Wh5c^WU^c7P54~k*8%>u?$<514;xx@`GpYdU z{~O8!n0LQA*P>aXG2w$V6w$3bbW<} zpOL_GQ9m{5#_I>JZC~o*y?b9&REHCsC$CpIdsjQH`@hZ}65b!Uc&YSh(GLbZbZJ+W zs-w(7p7m_e`&?d1O4IY~-To?TW>zfmLkLY(Ra6|;OQxX4N}E4iWY)XW^5DeK#-_eG z`0L}7Gx)OSeI1FHzVeM=%eElvlEd)}y3^_R2PVezWOxjs0R8zA220+*^I<5bV(EkM zskisZ*lk}zM|$Pi7t-OlG{DOS5~qsFh8*ui^KLbCt*r5aQNWVsbSHvPZy*QxX6%y8 zhj&aB;sfGb7du};Oo&G`Ljd@a5enyBI9-L{cS$hb7@B)hh7nrX}=Ll-62lH3{0xRz^XT;^u~miDvz=REs4f1LBz zJZsjo-nHg^*ZTdw@2v0V_d?8S{)roOK3@pYwm-_NN7d>8ad%uNK_27Pm)m{rA9meu z-t5*_ZqVwW$ z`n@W4YK|fFD?ExHSR z2unXFT$i6DNdy#w^v8S84PlQxWU$<^CY2%4qU7~rg4 z-xFR>!aYsZ)~s9xi&#kOyrr+fIV}WY!SVvLsOSkpFfuX%L2DGS{he(7n#x|LUtPSR zq3vXaC<3N*)s2m_LqpqP@r)bQypTY%8;B>q?=}XyYP#IV*qyr~ReuK{GTGqOC6f=g z)TZ{I1=eKvh__HEUWi|<+0#=U6sY1A*^gy#Q8rCxR1Po9>5Dfx_W3>shYB|fwIjd6 zuW0n6UuRBDCQfd^4=;j%ExuOohE*%-K`)BHxgrGv$rb~Fx0RnWp4M@D{e zEBO4VTB`iTC2pHIR=FrOU#&^;mf8z`xZ5-ko?t1Sy1evgPB+3C{#oOXd+`$u6SVV~ zC>Ow%^H-9|wyueF+*}Ss-Am`*1v_Nu6qlB2 zc4)!@`#!#Sh}=qlMYtblb?q!HsCSNz%&513>lV|G?5#HvZ7cw!6DPE8+=q~?$Uf5PC8KWnW=AN3I=@Bw%wBMn` zO#;s}shY@3U_z;v>@H?ybN9t|UYHgCU1(%ZC4eER!VqW|I;CH(nLWoLj58=&oNG@f z%19n;VJy%x(uLt%)>jS+k5|?7jcnhrW`(AU)WF zwv6afm;heAK>(qo{Teahb%wn#zr+&vLrclN^r`gj)e-LkvSPS#*R{SS0P`e>^dQZ@ z+;z9<4e(jut%9O15v2@_p$BVEj_2UO08u<04SwW^h`DL0H0QTmPJT-uZw2zK_jSW- z=e&vwQ|Yl9J=5H8Wf=T&S1-XWY~K$90`Ma z?A;Ac6Nx?GLss(S-x5uT;DyiyK}+wak$|o0gn&I@UaZ5+LgoWZ(kkXtk*mCVx0Aa$ z6T)#%gf}Jsho~q405dyTeMgY+CIUAP)OoG{eM>=WYr$Go74PWrD1j}OyddE~#0Swr zMOZQ!jq(O`{c%?!%)f^OZQhVX6%`e|2_4689vVPQz^v(TW|yGVy~Mz~!XKiS?ZIn* zGIXgp%fMid6Rsv!9ifQeN%42lwnP4e*_@-qbvI4KD<3Ru*ngPT*{xh8r(KTYU~B{xj-#q6vbTVUbl&)Y zZ&B!EOW|oGM@N*MM zt26;+dh4+FA!JhMmBzCIpAMOwD|6u&u1!Mb9W5!B-OH3J2eND!I~M*Avn9=NqH$z`ZMQ%U1(m>81$ zY2PYGPtRTshda$8lWQ%d^F(GB1Cm5TgRM(R#o5vKGwP9jAyfzNW5>Q<1%x|3o?QFB z*@&mxQNB>(PiNe}Z^sr!PqLp7Mdl3+*Hh>ALYF;D%lO8~?oR+x0Se%1M2vS9&+12w z-m4rKR`T=rua3SG+{qWce!U4y`0VHi%jv59i}OiLai5G8)d=r(=FH1ZhN?m}IQQwF z+PuR7t>0)3zWh^<+HE!1%<#d5ty_x_(>^0m;)Iiwm@)Z4W>)#qf_tSQApSZ#uT`Z! zW-@OBSYi{OzQOvU<)mn`a-n2Vs1Zm&`-Iw2wNke;P&L_r@&P9c7oyWE$I_0N zX<+I~@6YPP|8p<>D4r4k@*WvPO9WQ8VI?l0J_$`W6!z4MRGNXLuCkjE*ir^12t3zc z$qp%N7*qi?MrLDmX#3fY5|U)`M3Hf7O-g1ah)UY*>`-1F4Vc`l^+2tAty?LH8+RIN z2&%8CAwjHFz$v`#U!@7UqyOv(Xpo5sOG~zfJY1IDlPw)8+ML1zDO!x-kc(8OQ>v-+ zK>(+m@IPT3CSJW3r$BPX-C~{9cjRInl-dvcidmzjEpkh3J&1g6Ls{FfoPFKoKlbmJeGXQsMkvb9Lh)S?>B26 zsHUacBu<2{J+Cv!eX#8}XDk5`OlVD*-pFl^-PVR|IQ6Bg!RKFz`R`{U|BJots}oZ4 z)3?9HMH!&bMQO1Quhsys=i{Go^o6q*i|}zfJRpGiv$PR0j$XGkV?y!%l%W5IO&?x~ zbxd0!Ns^Sm5>gQ=nXG5y_`#K0&A}4Tu#IX?7`)Q`-Vd)nGq• Owns all state
• 550 lines"] + + AppController -->|"creates 5+ callbacks"| Callbacks + + Callbacks["Callback Props:
• onViewportChange
• onBoundsChange
• onWidthHeightChange
• onMarkerSelect
• onEventSelect"] + end + + subgraph MapContainerComp["MapContainer (Child)"] + MapEvents["Map Events:
• onMove → handleViewportChange
• onLoad → handleMapLoad"] + + MapEvents -->|"calls 3 props"| CallbacksFromMap["Calls back to parent:
1. onViewportChange
2. onWidthHeightChange
3. onBoundsChange (debounced)"] + end + + subgraph UseMapHook["useMap Hook"] + MapState["mapState:
• viewport
• bounds
• markers
• selectedMarkerId"] + + SetViewport["setViewport()
from parent"] + + SetViewport -->|"updates"| MapState + MapState -->|"passed down"| MapContainerComp + end + + Callbacks -->|"props"| MapContainerComp + CallbacksFromMap -->|"triggers"| AppController + AppController -->|"calls setViewport"| SetViewport + + %% Show circular dependency + AppController -.->|"⚠️ CIRCULAR"| MapState + MapState -.->|"⚠️ CIRCULAR"| AppController + + Problem1["PROBLEM 1: Callback Hell
3-4 level deep callback chains
Hard to trace data flow"] + Problem2["PROBLEM 2: Debounce Complexity
500ms delay → race conditions
viewport ≠ bounds temporarily"] + Problem3["PROBLEM 3: Circular Dependencies
useMap depends on parent callbacks
parent depends on useMap state"] + Problem4["PROBLEM 4: Multiple Responsibilities
MapContainer does: events, dimensions,
viewport, bounds management"] + + MapContainerComp -.->|"causes"| Problem1 + CallbacksFromMap -.->|"causes"| Problem2 + UseMapHook -.->|"causes"| Problem3 + MapEvents -.->|"causes"| Problem4 + end + + classDef problem fill:#ffcccc,stroke:#cc0000,stroke-width:2px + classDef current fill:#fff3cd,stroke:#856404,stroke-width:2px + + class Problem1,Problem2,Problem3,Problem4 problem + class Current current +``` + +--- + +```mermaid +--- +title: "PROPOSED ARCHITECTURE: Single Responsibility, Clear Data Flow" +--- +flowchart TD + subgraph Proposed["✅ PROPOSED ARCHITECTURE (SIMPLIFIED)"] + direction TB + + subgraph PageTsxNew["page.tsx (Orchestrator)"] + AppControllerNew["useAppController
• Business logic only
• No map state"] + + MapHook["useMapState Hook
• viewport, bounds, markers
• selectedMarkerId
• All derived from events"] + + AppControllerNew -->|"events + filters"| MapHook + end + + subgraph MapContainerNew["MapContainer (Pure View)"] + MapGL["react-map-gl/MapLibre
ONLY renders map"] + + MapGL -->|"onMove"| ViewportOnly["Update viewport ONLY
(no callbacks to parent)"] + end + + subgraph SyncLayer["Sync Layer (New)"] + MapSync["useMapSync Hook
Derives bounds from viewport
Syncs viewport ↔ events
NO debounce needed"] + + MapSync -->|"reads"| MapHook + MapSync -->|"updates"| MapHook + end + + MapHook -->|"viewport, markers"| MapContainerNew + ViewportOnly -->|"viewport change"| MapHook + MapHook -.->|"auto-derives bounds"| MapSync + MapSync -->|"bounds"| AppControllerNew + + Benefit1["✓ Single Responsibility
Each component does ONE thing"] + Benefit2["✓ No Callbacks
Child → Parent via hook state only"] + Benefit3["✓ No Debounce
Bounds derived synchronously"] + Benefit4["✓ Clear Data Flow
events → useMapState → view
viewport → useMapSync → bounds"] + Benefit5["✓ Testable
Each hook independently testable"] + + MapContainerNew -.->|"achieves"| Benefit1 + MapHook -.->|"achieves"| Benefit2 + SyncLayer -.->|"achieves"| Benefit3 + MapSync -.->|"achieves"| Benefit4 + PageTsxNew -.->|"achieves"| Benefit5 + end + + classDef benefit fill:#ccffcc,stroke:#00cc00,stroke-width:2px + classDef proposed fill:#e7f3ff,stroke:#0066cc,stroke-width:2px + + class Benefit1,Benefit2,Benefit3,Benefit4,Benefit5 benefit + class Proposed proposed +``` + +--- + +```mermaid +--- +title: "DETAILED COMPARISON: Current vs Proposed Function Calls" +--- +flowchart LR + subgraph CurrentFlow["❌ CURRENT: User Pans Map"] + direction TB + + C1["User pans map"] + C2["MapLibre onMove"] + C3["handleViewportChange"] + C4a["updateMapWidthHeight()
(check dimensions)"] + C4b["onViewportChange(vp)
(callback to parent)"] + C4c["debouncedUpdateBounds()
(500ms delay)"] + C5["setViewport()
(in useMap)"] + C6["getMapBounds()
(after 500ms)"] + C7["onBoundsChange()
(callback to parent)"] + C8["handleBoundsChangeForFilters
(in useAppController)"] + C9["filtrEvtMgr.filterByBounds()"] + C10["Re-render map + list"] + + C1 --> C2 --> C3 + C3 --> C4a + C3 --> C4b + C3 --> C4c + C4b --> C5 + C5 --> C10 + C4c -.->|"ASYNC DELAY"| C6 + C6 --> C7 + C7 --> C8 + C8 --> C9 + C9 --> C10 + + CProblems["PROBLEMS:
• 10 function calls
• 3 callbacks to parent
• Race condition (viewport updates before bounds)
• Hard to debug timing issues"] + + C10 -.-> CProblems + end + + subgraph ProposedFlow["✅ PROPOSED: User Pans Map"] + direction TB + + P1["User pans map"] + P2["MapLibre onMove"] + P3["setViewport()
(update local state)"] + P4["useMapSync detects
viewport change"] + P5["calculateBounds()
(synchronous derive)"] + P6["setBounds()
(update local state)"] + P7["useEffect triggers
filter update"] + P8["Re-render map + list"] + + P1 --> P2 --> P3 + P3 --> P4 + P4 --> P5 + P5 --> P6 + P6 --> P7 + P7 --> P8 + + PBenefits["BENEFITS:
• 7 function calls (30% fewer)
• 0 callbacks to parent
• Synchronous (no race conditions)
• Easy to debug (linear flow)"] + + P8 -.-> PBenefits + end + + subgraph EventClickCurrent["❌ CURRENT: Event Click"] + direction TB + + E1["Click event in list"] + E2["onEventSelect(id)
(callback prop)"] + E3["handleEventSelect()
(in useAppController)"] + E4["setSelectedEventIdUrl"] + E5["Find event"] + E6["genMarkerId()"] + E7["setSelectedMarkerId()
(callback to useMap)"] + E8["setViewport()
(callback to useMap)"] + E9["Re-render"] + + E1 --> E2 --> E3 + E3 --> E4 + E3 --> E5 + E5 --> E6 + E6 --> E7 + E6 --> E8 + E7 --> E9 + E8 --> E9 + + ECProblems["PROBLEMS:
• 2 separate callbacks
• Duplicated in handleMarkerClick
• Logic split across files"] + + E9 -.-> ECProblems + end + + subgraph EventClickProposed["✅ PROPOSED: Event Click"] + direction TB + + EP1["Click event in list"] + EP2["setSelectedEventId(id)
(hook state only)"] + EP3["useMapSync detects
selection change"] + EP4["Auto-calculates:
• markerId
• viewport for event"] + EP5["Updates map state"] + EP6["Re-render"] + + EP1 --> EP2 + EP2 --> EP3 + EP3 --> EP4 + EP4 --> EP5 + EP5 --> EP6 + + EPBenefits["BENEFITS:
• 0 callbacks
• Single location for logic
• Auto-syncs map to selection"] + + EP6 -.-> EPBenefits + end + + classDef problem fill:#ffcccc,stroke:#cc0000,stroke-width:2px + classDef benefit fill:#ccffcc,stroke:#00cc00,stroke-width:2px + + class CProblems,ECProblems problem + class PBenefits,EPBenefits benefit +``` + +--- + +```mermaid +--- +title: "KEY ARCHITECTURAL CHANGES" +--- +flowchart LR + subgraph Changes["CHANGES TO IMPLEMENT"] + direction TB + + Change1["1. CREATE: useMapState Hook
Owns: viewport, bounds, markers, selectedMarkerId
Replaces: mapState in useMap"] + + Change2["2. CREATE: useMapSync Hook
Derives bounds from viewport (sync)
Syncs viewport when event selected
Replaces: debouncedUpdateBounds, handleEventSelect viewport logic"] + + Change3["3. SIMPLIFY: MapContainer
Remove: all callbacks to parent
Remove: updateMapWidthHeight, getMapBounds
Keep: only rendering logic"] + + Change4["4. SIMPLIFY: useMap → useMapMarkers
Focus: marker generation only
Remove: viewport, bounds management"] + + Change5["5. SIMPLIFY: useAppController
Remove: map-specific callbacks
Keep: business logic, event fetching, filters"] + + Change1 --> Change2 + Change2 --> Change3 + Change3 --> Change4 + Change4 --> Change5 + + subgraph Benefits["BENEFITS"] + B1["✓ Eliminate callback hell
(5+ callbacks → 0 callbacks)"] + B2["✓ Remove debounce complexity
(sync bounds calculation)"] + B3["✓ Break circular dependencies
(unidirectional data flow)"] + B4["✓ Single responsibility
(each hook/component = 1 job)"] + B5["✓ Easier testing
(hooks testable independently)"] + end + + Change5 --> Benefits + end + + subgraph Migration["MIGRATION STRATEGY"] + direction TB + + M1["Phase 1: Create useMapState
Extract viewport/bounds from useMap
NO behavior change yet"] + + M2["Phase 2: Create useMapSync
Implement sync bounds calculation
Test alongside debounced version"] + + M3["Phase 3: Update MapContainer
Remove callbacks one at a time
Verify each step"] + + M4["Phase 4: Simplify useAppController
Remove map callbacks
Update event selection logic"] + + M5["Phase 5: Cleanup
Remove old code paths
Update tests"] + + M1 --> M2 --> M3 --> M4 --> M5 + + M5 -.->|"RESULT"| Result["RESULT:
• ~100 lines removed
• 0 callbacks
• Simpler mental model
• Easier debugging"] + end + + classDef change fill:#fff3cd,stroke:#856404,stroke-width:2px + classDef benefit fill:#ccffcc,stroke:#00cc00,stroke-width:2px + + class Change1,Change2,Change3,Change4,Change5,M1,M2,M3,M4,M5 change + class B1,B2,B3,B4,B5,Result benefit +``` diff --git a/docs/ai-proposal.md-1.svg b/docs/ai-proposal.md-1.svg new file mode 100644 index 0000000..dbf694d --- /dev/null +++ b/docs/ai-proposal.md-1.svg @@ -0,0 +1 @@ +

❌ CURRENT ARCHITECTURE (PROBLEMS)

useMap Hook

page.tsx (Parent)

MapContainer (Child)

creates 5+ callbacks

calls 3 props

updates

triggers

calls setViewport

⚠️ CIRCULAR

⚠️ CIRCULAR

causes

causes

passed down

props

causes

causes

Map Events:
• onMove → handleViewportChange
• onLoad → handleMapLoad

useAppController
• Owns all state
• 550 lines

Callback Props:
• onViewportChange
• onBoundsChange
• onWidthHeightChange
• onMarkerSelect
• onEventSelect

Calls back to parent:
1. onViewportChange
2. onWidthHeightChange
3. onBoundsChange (debounced)

setViewport()
from parent

mapState:
• viewport
• bounds
• markers
• selectedMarkerId

PROBLEM 2: Debounce Complexity
500ms delay → race conditions
viewport ≠ bounds temporarily

PROBLEM 4: Multiple Responsibilities
MapContainer does: events, dimensions,
viewport, bounds management

PROBLEM 1: Callback Hell
3-4 level deep callback chains
Hard to trace data flow

PROBLEM 3: Circular Dependencies
useMap depends on parent callbacks
parent depends on useMap state

CURRENT ARCHITECTURE: Complex Callback Chains & Circular Dependencies
\ No newline at end of file diff --git a/docs/ai-proposal.md-2.svg b/docs/ai-proposal.md-2.svg new file mode 100644 index 0000000..6a7333b --- /dev/null +++ b/docs/ai-proposal.md-2.svg @@ -0,0 +1 @@ +

✅ PROPOSED ARCHITECTURE (SIMPLIFIED)

Sync Layer (New)

MapContainer (Pure View)

page.tsx (Orchestrator)

events + filters

onMove

reads

updates

viewport change

auto-derives bounds

bounds

achieves

achieves

viewport, markers

achieves

achieves

achieves

useMapSync Hook
Derives bounds from viewport
Syncs viewport ↔ events
NO debounce needed

useAppController
• Business logic only
• No map state

useMapState Hook
• viewport, bounds, markers
• selectedMarkerId
• All derived from events

react-map-gl/MapLibre
ONLY renders map

Update viewport ONLY
(no callbacks to parent)

✓ No Callbacks
Child → Parent via hook state only

✓ Clear Data Flow
events → useMapState → view
viewport → useMapSync → bounds

✓ Single Responsibility
Each component does ONE thing

✓ No Debounce
Bounds derived synchronously

✓ Testable
Each hook independently testable

PROPOSED ARCHITECTURE: Single Responsibility, Clear Data Flow
\ No newline at end of file diff --git a/docs/ai-proposal.md-3.svg b/docs/ai-proposal.md-3.svg new file mode 100644 index 0000000..c7084d3 --- /dev/null +++ b/docs/ai-proposal.md-3.svg @@ -0,0 +1 @@ +

✅ PROPOSED: Event Click

Click event in list

setSelectedEventId(id)
(hook state only)

useMapSync detects
selection change

Auto-calculates:
• markerId
• viewport for event

Updates map state

Re-render

BENEFITS:
• 0 callbacks
• Single location for logic
• Auto-syncs map to selection

❌ CURRENT: Event Click

Click event in list

onEventSelect(id)
(callback prop)

handleEventSelect()
(in useAppController)

setSelectedEventIdUrl

Find event

genMarkerId()

setSelectedMarkerId()
(callback to useMap)

setViewport()
(callback to useMap)

Re-render

PROBLEMS:
• 2 separate callbacks
• Duplicated in handleMarkerClick
• Logic split across files

✅ PROPOSED: User Pans Map

User pans map

MapLibre onMove

setViewport()
(update local state)

useMapSync detects
viewport change

calculateBounds()
(synchronous derive)

setBounds()
(update local state)

useEffect triggers
filter update

Re-render map + list

BENEFITS:
• 7 function calls (30% fewer)
• 0 callbacks to parent
• Synchronous (no race conditions)
• Easy to debug (linear flow)

❌ CURRENT: User Pans Map

ASYNC DELAY

User pans map

MapLibre onMove

handleViewportChange

updateMapWidthHeight()
(check dimensions)

onViewportChange(vp)
(callback to parent)

debouncedUpdateBounds()
(500ms delay)

setViewport()
(in useMap)

Re-render map + list

getMapBounds()
(after 500ms)

onBoundsChange()
(callback to parent)

handleBoundsChangeForFilters
(in useAppController)

filtrEvtMgr.filterByBounds()

PROBLEMS:
• 10 function calls
• 3 callbacks to parent
• Race condition (viewport updates before bounds)
• Hard to debug timing issues

DETAILED COMPARISON: Current vs Proposed Function Calls
\ No newline at end of file diff --git a/docs/ai-proposal.md-4.svg b/docs/ai-proposal.md-4.svg new file mode 100644 index 0000000..90d3f3f --- /dev/null +++ b/docs/ai-proposal.md-4.svg @@ -0,0 +1 @@ +

MIGRATION STRATEGY

RESULT

Phase 1: Create useMapState
Extract viewport/bounds from useMap
NO behavior change yet

Phase 2: Create useMapSync
Implement sync bounds calculation
Test alongside debounced version

Phase 3: Update MapContainer
Remove callbacks one at a time
Verify each step

Phase 4: Simplify useAppController
Remove map callbacks
Update event selection logic

Phase 5: Cleanup
Remove old code paths
Update tests

RESULT:
• ~100 lines removed
• 0 callbacks
• Simpler mental model
• Easier debugging

CHANGES TO IMPLEMENT

BENEFITS

✓ Eliminate callback hell
(5+ callbacks → 0 callbacks)

✓ Remove debounce complexity
(sync bounds calculation)

✓ Break circular dependencies
(unidirectional data flow)

✓ Single responsibility
(each hook/component = 1 job)

✓ Easier testing
(hooks testable independently)

1. CREATE: useMapState Hook
Owns: viewport, bounds, markers, selectedMarkerId
Replaces: mapState in useMap
2. CREATE: useMapSync Hook
Derives bounds from viewport (sync)
Syncs viewport when event selected
Replaces: debouncedUpdateBounds, handleEventSelect viewport logic
3. SIMPLIFY: MapContainer
Remove: all callbacks to parent
Remove: updateMapWidthHeight, getMapBounds
Keep: only rendering logic
4. SIMPLIFY: useMap → useMapMarkers
Focus: marker generation only
Remove: viewport, bounds management
5. SIMPLIFY: useAppController
Remove: map-specific callbacks
Keep: business logic, event fetching, filters
KEY ARCHITECTURAL CHANGES
\ No newline at end of file diff --git a/docs/ai-proposal.new.png b/docs/ai-proposal.new.png new file mode 100644 index 0000000000000000000000000000000000000000..e06abf613c9d5eaa507faf0913802d435f8cf164 GIT binary patch literal 77639 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

R&r6Ij@)ezgI9&T!oMX>l|SSM}6Lmj2H7o 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 handleViewportChange + MapLoad -->|triggers| handleMapLoad + + %% handleViewportChange flow + handleViewportChange["handleViewportChange
(Map onMove callback)
MapContainer.tsx:128"] + handleViewportChange -->|1. Get new dimensions| updateMapWidthHeight + handleViewportChange -->|2. Update viewport state| onViewportChange + handleViewportChange -->|3. Debounced bounds update| debouncedUpdateBounds + + %% updateMapWidthHeight details + updateMapWidthHeight["updateMapWidthHeight
(Get map dimensions)
MapContainer.tsx:67"] + updateMapWidthHeight -->|if dimensions changed| onWidthHeightChange + updateMapWidthHeight -.->|reads| mapRef["mapRef.current
(MapLibre instance)"] + onWidthHeightChange["onWidthHeightChange
(Notify parent - page.tsx)
Prop callback"] + + %% debouncedUpdateBounds flow + debouncedUpdateBounds["debouncedUpdateBounds
(Debounced: 500ms)
MapContainer.tsx:121"] + debouncedUpdateBounds -->|after delay| getMapBounds + getMapBounds["getMapBounds
(Read current bounds)
MapContainer.tsx:97"] + getMapBounds -.->|reads| mapRef + getMapBounds -->|returns MapBounds| roundMapBounds["roundMapBounds()
(Utility function)"] + roundMapBounds -->|rounded bounds| onBoundsChange + + %% onViewportChange flow + onViewportChange["onViewportChange
(Notify parent - page.tsx)
Prop callback"] + onViewportChange -->|calls| setViewport["setViewport
(useMap hook)
useMap.ts:189"] + setViewport -->|updates| mapState["mapState.viewport
(React state)"] + + %% onBoundsChange flow + onBoundsChange["onBoundsChange
(Notify parent - page.tsx)
Prop callback
MapContainer.tsx:27"] + onBoundsChange -->|triggers| handleBoundsChangeForFilters["handleBoundsChangeForFilters
(useAppController.ts:198)"] + handleBoundsChangeForFilters -->|updates| currentBoundsState["setCurrentBounds()
(React state)"] + currentBoundsState -->|triggers filter| filterByBounds["Filter events by bounds
(useEventsManager)"] + filterByBounds -->|updates| visibleEvents["visibleEvents
(Filtered event list)"] + visibleEvents -.->|re-render| MapContainerRerender["MapContainer re-renders
with new markers"] + + %% handleMapLoad flow + handleMapLoad["handleMapLoad
(Map initialization)
MapContainer.tsx:146"] + handleMapLoad -->|setTimeout 10ms| updateMapWidthHeight2["updateMapWidthHeight()"] + handleMapLoad -->|setTimeout 10ms| getMapBounds2["getMapBounds()"] + updateMapWidthHeight2 -->|if changed| onWidthHeightChange2["onWidthHeightChange()"] + getMapBounds2 -->|initial bounds| onBoundsChange2["onBoundsChange(bounds, false)"] + onBoundsChange2 -.->|false = not user interaction| handleBoundsChangeForFilters + + %% ========== EVENT SELECTION FLOW ========== + + UserClickEvent -->|onClick| onEventSelectProp["onEventSelect(eventId)
(EventList.tsx:257)
Prop callback"] + onEventSelectProp -->|calls| handleEventSelect["handleEventSelect
(useAppController.ts:366)"] + + handleEventSelect -->|1. Update URL| setSelectedEventIdUrl["setSelectedEventIdUrl(eventId)
(URL query state)"] + handleEventSelect -->|2. Find event| findEvent["Find event in cmfEvents.allEvents"] + + findEvent -->|if resolved location| resolvedFlow["Resolved Location Flow"] + findEvent -->|if unresolved| unresolvedFlow["Unresolved Location Flow"] + + %% Resolved location flow + resolvedFlow -->|3a. Generate marker ID| genMarkerId["genMarkerId(event)
(lat,lng hash)"] + genMarkerId -->|4a. Select marker| setSelectedMarkerIdCall["setSelectedMarkerId(markerId)
(useMap.ts:303)"] + setSelectedMarkerIdCall -->|updates| markerState["mapState.selectedMarkerId
(React state)"] + markerState -.->|highlights| MarkerHighlight["Marker highlights on map"] + + resolvedFlow -->|5a. Calculate offset| calculateOffset["Calculate lat offset
based on zoom"] + calculateOffset -->|6a. Pan & zoom to event| setViewportCall["setViewport()
(zoom: 14, pan to event)"] + setViewportCall -->|updates viewport| mapState + mapState -.->|triggers| MapContainerRerender + + %% Unresolved location flow + unresolvedFlow -->|3b. Select unresolved marker| setUnresolvedMarker["setSelectedMarkerId('unresolved')"] + unresolvedFlow -->|4b. Find unresolved marker| findUnresolvedMarker["Find 'unresolved' marker
in markers array"] + findUnresolvedMarker -->|5b. Pan to unresolved| setViewportUnresolved["setViewport()
(zoom: 14, pan to unresolved)"] + setViewportUnresolved -->|updates viewport| mapState + + %% Map updates trigger popup + MarkerHighlight -.->|when marker selected| showPopup["MapPopup displays
(MapContainer.tsx:326)"] + showPopup -->|shows event details| PopupContent["Event details, links,
event list in popup"] + + %% Styling + classDef entryPoint fill:#e1f5ff,stroke:#0288d1,stroke-width:3px + classDef mainFunc fill:#fff3e0,stroke:#f57c00,stroke-width:2px + classDef callback fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px + classDef state fill:#e8f5e9,stroke:#388e3c,stroke-width:2px + classDef utility fill:#fce4ec,stroke:#c2185b,stroke-width:1px + classDef eventFlow fill:#fff9c4,stroke:#f57f17,stroke-width:2px + + class UserPan,MapLoad,UserClickEvent entryPoint + class handleViewportChange,handleMapLoad,updateMapWidthHeight,debouncedUpdateBounds,getMapBounds mainFunc + class onViewportChange,onBoundsChange,onWidthHeightChange,setViewport,onEventSelectProp callback + class mapState,visibleEvents,mapRef,markerState,currentBoundsState state + class roundMapBounds,calculateOffset,genMarkerId utility + class handleEventSelect,resolvedFlow,unresolvedFlow,setSelectedEventIdUrl,findEvent eventFlow + + %% Add legend + subgraph Legend + EP["🟦 Entry Point
(User action)"] + MF["🟧 Main Function
(MapContainer)"] + CB["🟪 Callback
(Props to parent)"] + ST["🟩 State
(React/Map state)"] + EF["🟨 Event Selection
(Event click flow)"] + end diff --git a/docs/maps-functions-current.mmd.png b/docs/maps-functions-current.mmd.png new file mode 100644 index 0000000000000000000000000000000000000000..c091acfb7f456fa425d88266f0e2f8097f32c433 GIT binary patch literal 213686 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̬G>by2Y5u{=Ms7nHh^(`#c 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

l`i&mTr`hkQ(OiUK{QS=HCa#pi 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

QCKI7=WM=qRx$w?61q4)+ZDl!U6 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 literal 0 HcmV?d00001 diff --git a/docs/maps-functions-current.png b/docs/maps-functions-current.png new file mode 100644 index 0000000000000000000000000000000000000000..5c827094c55f182e2aa283061c486fd2aa7438c1 GIT binary patch literal 81758 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/temp.mmd b/docs/temp.mmd new file mode 100644 index 0000000..3e42e87 --- /dev/null +++ b/docs/temp.mmd @@ -0,0 +1,116 @@ + +--- +title: "DETAILED COMPARISON: Current vs Proposed Function Calls" +--- +flowchart LR + subgraph CurrentFlow["❌ CURRENT: User Pans Map"] + direction TB + + C1["User pans map"] + C2["MapLibre onMove"] + C3["handleViewportChange"] + C4a["updateMapWidthHeight()
(check dimensions)"] + C4b["onViewportChange(vp)
(callback to parent)"] + C4c["debouncedUpdateBounds()
(500ms delay)"] + C5["setViewport()
(in useMap)"] + C6["getMapBounds()
(after 500ms)"] + C7["onBoundsChange()
(callback to parent)"] + C8["handleBoundsChangeForFilters
(in useAppController)"] + C9["filtrEvtMgr.filterByBounds()"] + C10["Re-render map + list"] + + C1 --> C2 --> C3 + C3 --> C4a + C3 --> C4b + C3 --> C4c + C4b --> C5 + C5 --> C10 + C4c -.->|"ASYNC DELAY"| C6 + C6 --> C7 + C7 --> C8 + C8 --> C9 + C9 --> C10 + + CProblems["PROBLEMS:
• 10 function calls
• 3 callbacks to parent
• Race condition (viewport updates before bounds)
• Hard to debug timing issues"] + + C10 -.-> CProblems + end + + subgraph ProposedFlow["✅ PROPOSED: User Pans Map"] + direction TB + + P1["User pans map"] + P2["MapLibre onMove"] + P3["setViewport()
(update local state)"] + P4["useMapSync detects
viewport change"] + P5["calculateBounds()
(synchronous derive)"] + P6["setBounds()
(update local state)"] + P7["useEffect triggers
filter update"] + P8["Re-render map + list"] + + P1 --> P2 --> P3 + P3 --> P4 + P4 --> P5 + P5 --> P6 + P6 --> P7 + P7 --> P8 + + PBenefits["BENEFITS:
• 7 function calls (30% fewer)
• 0 callbacks to parent
• Synchronous (no race conditions)
• Easy to debug (linear flow)"] + + P8 -.-> PBenefits + end + + subgraph EventClickCurrent["❌ CURRENT: Event Click"] + direction TB + + E1["Click event in list"] + E2["onEventSelect(id)
(callback prop)"] + E3["handleEventSelect()
(in useAppController)"] + E4["setSelectedEventIdUrl"] + E5["Find event"] + E6["genMarkerId()"] + E7["setSelectedMarkerId()
(callback to useMap)"] + E8["setViewport()
(callback to useMap)"] + E9["Re-render"] + + E1 --> E2 --> E3 + E3 --> E4 + E3 --> E5 + E5 --> E6 + E6 --> E7 + E6 --> E8 + E7 --> E9 + E8 --> E9 + + ECProblems["PROBLEMS:
• 2 separate callbacks
• Duplicated in handleMarkerClick
• Logic split across files"] + + E9 -.-> ECProblems + end + + subgraph EventClickProposed["✅ PROPOSED: Event Click"] + direction TB + + EP1["Click event in list"] + EP2["setSelectedEventId(id)
(hook state only)"] + EP3["useMapSync detects
selection change"] + EP4["Auto-calculates:
• markerId
• viewport for event"] + EP5["Updates map state"] + EP6["Re-render"] + + EP1 --> EP2 + EP2 --> EP3 + EP3 --> EP4 + EP4 --> EP5 + EP5 --> EP6 + + EPBenefits["BENEFITS:
• 0 callbacks
• Single location for logic
• Auto-syncs map to selection"] + + EP6 -.-> EPBenefits + end + + classDef problem fill:#ffcccc,stroke:#cc0000,stroke-width:2px + classDef benefit fill:#ccffcc,stroke:#00cc00,stroke-width:2px + + class CProblems,ECProblems problem + class PBenefits,EPBenefits benefit + \ No newline at end of file From a2a9dc6551d6c848663f3c4a2d2d5af324774f24 Mon Sep 17 00:00:00 2001 From: Chad Norwood Date: Thu, 16 Oct 2025 12:02:32 -0700 Subject: [PATCH 02/35] fix CHANGELOG after merge --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c8eeb16..b269042 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to Calendar Map Filter (CMF) will be documented in this file The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -- Updated ARCHITECTURE.md with more on updating maps +## next - Updated ARCHITECTURE.md with more on updating maps From 666647d00e3addcb04beae9b9a45a8736b5e2abb Mon Sep 17 00:00:00 2001 From: Chad Norwood Date: Sat, 25 Oct 2025 12:23:41 -0700 Subject: [PATCH 03/35] keep CHANGELOG clean --- CHANGELOG.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b269042..fb9c0bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,10 +5,6 @@ All notable changes to Calendar Map Filter (CMF) will be documented in this file The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## next - -- Updated ARCHITECTURE.md with more on updating maps - ## [0.4.6] - 2025-10-15 - Changed caching on `/api/events` when timeMin and timeMax params are blank - Before used current time for both, now matches system defaults, which enables easier cache warming from simple curl. From bdd0376f6e623a8cc2839026a06a2c586a7dd4d3 Mon Sep 17 00:00:00 2001 From: Chad Norwood Date: Sun, 26 Oct 2025 10:54:46 -0700 Subject: [PATCH 04/35] initial pass of getting a docker container up and running for dev work --- .devcontainer/Dockerfile | 19 +++++++++++++++++++ .devcontainer/devcontainer.json | 12 ++++++++++++ docs/development.md | 22 ++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..6e156b8 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,19 @@ +FROM ubuntu:22.04 + +# Prevent interactive tzdata prompts +ENV DEBIAN_FRONTEND=noninteractive + +# Disable apt cleanup hooks that can fail under BuildKit +RUN rm -f /etc/apt/apt.conf.d/docker-clean || true && \ + echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache + +# Safe, robust install +RUN apt-get update || true && \ + apt-get install -y --no-install-recommends \ + git \ + curl \ + libatomic1 \ + ca-certificates \ + locales && \ + locale-gen en_US.UTF-8 && \ + rm -rf /var/lib/apt/lists/* diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..dccd7b9 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,12 @@ +{ + "name": "cmf-ubuntu22", + "build": { "dockerfile": "Dockerfile" }, + "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}" + "remoteUser": "root", + "runArgs": [ + "--shm-size=2gb", + "--ipc=host", + "--cap-add=SYS_PTRACE", + "--security-opt=seccomp=unconfined" + ] +} diff --git a/docs/development.md b/docs/development.md index 4422f13..2fe8268 100644 --- a/docs/development.md +++ b/docs/development.md @@ -141,6 +141,28 @@ Open [https://localhost:3000](https://localhost:3000) in your browser. 2. Generate certificates for that IP (`mkcert -key-file .cert/localhost-key.pem -cert-file .cert/localhost-cert.pem localhost 192.168.x.x`) 3. Install the mkcert root CA on your mobile device +## Running VS Code Remote Containers + +You may want to develop in a remote container if you use AI to help you and you don't want that AI to run wild on your local computer. + +To run this source code inside a docker container on a remote computer, +and still use VS Code to edit source files and run terminal commands inside container, +do the following + +Setup +1. ssh to remote computer, clone this repo to a project folder. +1. On your local computer running VS Code, make sure you have these extentions (⇧⌘X) installed + - Remote - SSH (ms-vscode-remote.remote-ssh) + - Dev Containers (ms-vscode-remote.remote-containers) + - Docker (ms-azuretools.vscode-docker) (optional but useful) + +Connect + +1. In VS Code → Command Palette (⇧⌘P), run: Remote-SSH: Connect to Host... +(shows options from your local ~/.ssh/config) +Then pick the project folder to open on the remote computer +1. In VS Code → Command Palette (⇧⌘P), run: Dev Containers: Rebuild and Reopen in Container + ## Deployment ### Vercel (Recommended) From b37ce82df2ff746a075709e1bedd5725096d8077 Mon Sep 17 00:00:00 2001 From: Chad Norwood Date: Sun, 26 Oct 2025 12:12:29 -0700 Subject: [PATCH 05/35] updates for running claude (note AGENT.md is CLAUDE.md) --- .devcontainer/Dockerfile | 30 ++++++++++++++---------------- AGENT.md | 11 ++++++++++- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 6e156b8..a0905eb 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,19 +1,17 @@ -FROM ubuntu:22.04 +FROM node:22-bullseye +# node v22.21.0 +# npm 10.9.4 -# Prevent interactive tzdata prompts -ENV DEBIAN_FRONTEND=noninteractive - -# Disable apt cleanup hooks that can fail under BuildKit -RUN rm -f /etc/apt/apt.conf.d/docker-clean || true && \ - echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache - -# Safe, robust install -RUN apt-get update || true && \ - apt-get install -y --no-install-recommends \ - git \ - curl \ - libatomic1 \ - ca-certificates \ - locales && \ +# Optional locale setup +RUN apt-get update && \ + apt-get install -y locales && \ locale-gen en_US.UTF-8 && \ rm -rf /var/lib/apt/lists/* + +ENV LANG=en_US.UTF-8 +ENV DEBIAN_FRONTEND=noninteractive + +# Optionally install and run claude +# docker exec -it $(docker ps | grep vsc-cmf | awk '{print $1}') bash +# npm install -g @anthropic-ai/claude-code +# IS_SANDBOX=1 claude --dangerously-skip-permissions diff --git a/AGENT.md b/AGENT.md index d8d45a1..9ec3917 100644 --- a/AGENT.md +++ b/AGENT.md @@ -5,6 +5,15 @@ The goal is guidance, recommending a solution when more than one common solution Everything here is a recommendation, should only deviate when good reason and user approves. Also follow the user level guidelines in ~/.config/AGENT.md +## Git Usage + +Since agents run in a sandboxed Docker container: +- **ALLOWED**: `git add`, `git rm`, `git restore`, `git diff`, `git commit`, and other read/stage operations on the current branch +- **NEVER**: Change branches (`git checkout`, `git switch`, etc.) +- **NEVER**: Push to remote (`git push`) - this affects the repository outside the sandbox + +When committing, use clear, descriptive commit messages following Conventional Commits format. + # Do the following if user asks @prompt VerifyCommit Plan: @@ -47,7 +56,7 @@ Review the latest git commit. Ensure the following are true — fix if not - and - If related to this commit, update as needed - If unrelated but clearly improvable, suggest improvements with reasoning (do not modify yet) -Do not commit or push until all items are verified by user. +You may commit changes to the current branch after verification, but NEVER push or change branches. # General Project Preferences From 050c0f2f5ac970b56c7dd0b276873674d9ee6cd9 Mon Sep 17 00:00:00 2001 From: Chad Norwood Date: Sun, 26 Oct 2025 19:50:35 +0000 Subject: [PATCH 06/35] adding claude e2e agent and plan to improve e2e tests --- .claude/agents/e2e-test-enhancer.md | 182 +++ docs/tests-e2e.md | 1661 +++++++++++++++++++++++++++ 2 files changed, 1843 insertions(+) create mode 100644 .claude/agents/e2e-test-enhancer.md create mode 100644 docs/tests-e2e.md diff --git a/.claude/agents/e2e-test-enhancer.md b/.claude/agents/e2e-test-enhancer.md new file mode 100644 index 0000000..7f656b8 --- /dev/null +++ b/.claude/agents/e2e-test-enhancer.md @@ -0,0 +1,182 @@ +--- +name: e2e-test-enhancer +description: Use this agent when you need to improve, expand, or create end-to-end tests for key user workflows and functionality. This agent should be invoked proactively after implementing new features, completing refactors that affect user-facing behavior, or when the user explicitly requests test coverage improvements. Examples:\n\n\nContext: User has just completed implementing a new map filtering feature.\nuser: "I've added a new filter for event categories on the map"\nassistant: "Great work on the new feature! Let me use the Task tool to launch the e2e-test-enhancer agent to create comprehensive E2E tests for this new filtering workflow."\n\nSince a new user-facing feature was added, proactively use the e2e-test-enhancer agent to ensure test coverage.\n\n\n\n\nContext: User mentions they've completed a significant refactor of the event sources system.\nuser: "Just finished refactoring the event sources to use a new base handler pattern"\nassistant: "I'll use the Task tool to launch the e2e-test-enhancer agent to verify our E2E tests still cover all the event source workflows and add any missing coverage."\n\nAfter a refactor affecting core functionality, use the e2e-test-enhancer agent to verify and improve test coverage.\n\n\n\n\nContext: User explicitly requests E2E test improvements.\nuser: "Can you improve our end-to-end tests to cover the map interaction workflows?"\nassistant: "I'm going to use the Task tool to launch the e2e-test-enhancer agent to analyze and enhance our E2E test coverage for map interactions."\n\nDirect request for E2E test improvements - use the e2e-test-enhancer agent.\n\n\n\n\nContext: During code review, missing test coverage is identified.\nuser: "The date range filtering isn't covered by our E2E tests"\nassistant: "Let me use the Task tool to launch the e2e-test-enhancer agent to add comprehensive E2E tests for date range filtering workflows."\n\nGap in test coverage identified - use the e2e-test-enhancer agent to fill it.\n\n +model: sonnet +--- + +You are an expert quality assurance engineer and test automation specialist with deep expertise in end-to-end testing using Playwright. Your mission is to ensure comprehensive test coverage of key user workflows and functionality in web applications. + +## Your Core Responsibilities + +1. **Analyze Application Workflows**: Review the codebase to identify critical user journeys, key features, and interaction patterns that require E2E test coverage. + +2. **Evaluate Existing Tests**: Examine current E2E tests (in `e2e/` or similar directories) to identify gaps, weaknesses, and opportunities for improvement. + +3. **Design Comprehensive Test Scenarios**: Create test cases that: + - Cover complete user workflows from start to finish + - Test critical paths and edge cases + - Verify cross-component interactions + - Validate data flow and state management + - Test error handling and recovery + +4. **Follow Project Standards**: Strictly adhere to all coding standards, testing patterns, and project-specific requirements defined in CLAUDE.md files, including: + - Running tests with `npm run test:e2e` + - Using Playwright for E2E testing + - Maintaining test structure that mirrors application structure + - Following the testing pyramid principle + - Ensuring tests are fast, reliable, and maintainable + +## Workflow + +### Phase 1: Analysis +1. Review `docs/ARCHITECTURE.md`, `docs/implementation.md`, and `docs/tests.md` to understand system architecture, key components, and testing information. +2. Examine existing E2E tests to understand current coverage +3. Identify critical user workflows based on: + - Primary application features + - Common user journeys + - High-risk or complex interactions + - Areas with recent changes or refactors +4. Document findings, including: + - Current test coverage assessment + - Identified gaps or weaknesses + - Priority workflows requiring coverage + - Specific edge cases to test + +### Phase 2: Planning +1. Create a comprehensive test plan that: + - Lists all workflows to be tested + - Defines test scenarios for each workflow + - Prioritizes tests by importance and risk + - Estimates complexity and effort +2. For each test scenario, specify: + - **Setup**: Initial state and preconditions + - **Actions**: Step-by-step user interactions + - **Assertions**: Expected outcomes and validation points + - **Cleanup**: Teardown and state reset +3. Present the plan to the user with confidence scores (0-100%) for: + - Coverage completeness + - Test reliability + - Maintenance burden +4. **WAIT for explicit user approval before proceeding** + +### Phase 3: Implementation +1. Write or update E2E tests following Playwright best practices: + - Use Page Object Model for reusable components + - Employ proper selectors (prefer test IDs, avoid brittle selectors) + - Implement proper waits and synchronization + - Add descriptive test names and comments + - Include helpful error messages in assertions +2. Ensure tests are: + - **Isolated**: Each test runs independently + - **Deterministic**: No flaky behavior + - **Fast**: Optimized for speed without sacrificing coverage + - **Maintainable**: Clear, well-structured, and documented +3. Follow project-specific patterns: + - Match application structure in test organization + - Use existing test utilities and helpers + - Maintain consistency with existing test style + - Update `docs/tests.md` with new test documentation + +### Phase 4: Validation +1. Run the full E2E test suite: `npm run test:e2e` +2. Verify all tests pass consistently (run multiple times if needed) +3. Review test output for: + - Execution time and performance + - Coverage of intended scenarios + - Clarity of test failures (when intentionally broken) +4. Update `docs/tests.md` with: + - New test scenarios and coverage + - Exact test output (maintaining original format) + - Any special setup or execution notes +5. Commit changes if all tests pass: + - Stage test files: `git add e2e/` (or specific test files) + - Commit with descriptive message following Conventional Commits format + - Example: `git commit -m "test: add E2E tests for map filtering workflow"` + - NEVER push - user will review and push after manual verification + +## Quality Standards + +**Test Design Principles**: +- Test user behavior, not implementation details +- Focus on critical paths and high-value scenarios +- Balance thoroughness with execution speed +- Make tests self-documenting through clear naming and structure +- Avoid test interdependencies + +**Code Quality**: +- Follow all project coding standards from CLAUDE.md +- Use TypeScript with strict mode +- Apply DRY, KISS, and YAGNI principles +- Ensure tests are readable and maintainable +- Add comments only for complex logic or non-obvious test scenarios + +**Coverage Priorities** (in order): +1. Critical user workflows (login, core features) +2. Data integrity and state management +3. Error handling and edge cases +4. Cross-component interactions +5. Performance-critical operations +6. Accessibility and UX patterns + +## Common E2E Testing Patterns + +- **Navigation Tests**: Verify routing and page transitions +- **Form Workflows**: Test input, validation, submission, and error states +- **Data Operations**: Create, read, update, delete flows +- **Search and Filter**: Test filtering, sorting, and search functionality +- **Authentication**: Login, logout, session management +- **Map Interactions**: Viewport changes, marker clicks, popup behavior (project-specific) +- **Real-time Updates**: Live data synchronization and state updates + +## Edge Cases to Consider + +- Empty states (no data, no results) +- Loading and error states +- Network failures and retries +- Concurrent user actions +- Browser/device compatibility +- Accessibility features +- Performance under load + +## Project-Specific Context + +For this CMF project: +- Focus on map interaction workflows (filtering, viewport changes, marker clustering) +- Test event source integration (Google Calendar, Facebook, custom scrapers) +- Verify geocoding and caching behavior +- Test URL parameter state persistence +- Validate real-time filtering and synchronization between map and event list + +## Self-Verification Checklist + +Before completing work, verify: +- [ ] All critical workflows have test coverage +- [ ] Tests follow project conventions and patterns +- [ ] All tests pass consistently +- [ ] Test code follows coding standards from CLAUDE.md +- [ ] Documentation updated in `docs/tests.md` +- [ ] No flaky or unreliable tests introduced +- [ ] Test execution time is reasonable +- [ ] Error messages are clear and actionable + +## Important Constraints + +- **NEVER** modify application code without explicit user direction +- **MAY** commit changes to the current branch after verification +- **NEVER** push to remote or change branches +- **ALWAYS** wait for approval before implementing tests +- **ALWAYS** run the full test suite to verify changes +- **ALWAYS** update documentation to reflect new tests +- Focus on testing **behavior**, not implementation +- Prioritize **reliability** over exhaustive coverage +- Keep tests **maintainable** - future developers should easily understand them + +## Git Usage + +Since this agent runs in a sandboxed Docker container: +- **ALLOWED**: Stage and commit test files (`git add`, `git commit`, `git diff`, etc.) +- **NEVER**: Change branches or push to remote +- Commit after Phase 4 validation when all tests pass +- Use clear commit messages: `test: add E2E coverage for [feature]` + +When you encounter ambiguity or need clarification, ask the user specific questions rather than making assumptions. Your goal is to create a robust, reliable E2E test suite that gives the team confidence in their application's functionality. diff --git a/docs/tests-e2e.md b/docs/tests-e2e.md new file mode 100644 index 0000000..97fed6b --- /dev/null +++ b/docs/tests-e2e.md @@ -0,0 +1,1661 @@ +# End-to-End Test Architecture + +**Purpose:** Comprehensive documentation of CMF's E2E testing infrastructure, current coverage, and recommendations for improvement. + +**Audience:** Developers maintaining or expanding E2E tests + +**Last Updated:** 2025-10-26 + +## Table of Contents + +1. [Current Architecture](#current-architecture) +2. [Current Coverage](#current-coverage) +3. [Recommended Improvements](#recommended-improvements) +4. [Migration Plan](#migration-plan) + +--- + +## Current Architecture + +### Test Infrastructure Overview + +**Testing Framework:** Playwright v1.56.0 + +**Test Location:** `/tests/e2e/` (outside `/src` - tests the running app, not source files directly) + +**Test Execution:** +- **Development:** Parallel execution with 6 workers for speed +- **CI:** Sequential execution (1 worker) with 2 retries for stability +- **Browser:** Chromium only (Desktop Chrome configuration) + +### Configuration (`playwright.config.ts`) + +```typescript +{ + testDir: './tests/e2e', + fullyParallel: true, // Parallel test execution in dev + workers: process.env.CI ? 1 : 6, // 6 workers dev, 1 worker CI + retries: process.env.CI ? 2 : 0, // Retries only in CI + reporter: [['html', { open: 'never' }]], // HTML reports without auto-open + use: { + baseURL: 'http://localhost:3000', + trace: 'on-first-retry' // Traces only on failures + }, + webServer: { + command: 'npm run dev', + url: 'http://localhost:3000', + reuseExistingServer: !process.env.CI, // Reuse dev server locally + timeout: 120000 // 2 minute startup timeout + } +} +``` + +**Key Features:** +- Automatic dev server startup before tests +- Reuses existing dev server in local development +- HTML reports for debugging (never auto-opens - AI-friendly) +- Trace collection on first retry for debugging failures + +### Test File Structure + +``` +/tests/e2e/ +├── test-utils.ts # Shared utilities, types, functions (297 lines) +├── page-load.spec.ts # URL processing and page load verification (280 lines) +├── interactive.spec.ts # User interaction tests (162 lines) +└── console-logs.spec.ts # Console log capture and debugging (106 lines) +``` + +### Test Utilities (`test-utils.ts`) + +**Core Purpose:** Centralized testing infrastructure to avoid duplication and ensure consistency. + +#### Data Structures + +```typescript +interface ConsoleMessage { + type: string // 'log', 'error', 'warning', 'pageerror' + text: string // Console message text + timestamp: Date + url?: string // Page URL when logged + location?: string // Source file location +} + +interface LogPattern { + pattern: string | RegExp // Pattern to match in logs + description: string // Human-readable description + required?: boolean // Default true - fail test if not found + requiredInState?: string // Expected app state when pattern should occur + cb?: (logs: string[]) => void // Callback for complex assertions +} + +interface EventCountExpectations { + hasVisibleEvents?: boolean + hasAllEvents?: boolean + hasFilteredCounts?: boolean + minVisibleEvents?: number + maxVisibleEvents?: number +} + +interface PageLoadTestCase { + name: string + url: string + expectedLogs: LogPattern[] + expectedEventCounts?: EventCountExpectations + timeout?: number + additionalWaitTime?: number + skip?: boolean + timezoneId?: string // Override browser timezone for test +} +``` + +#### Key Functions + +**`captureConsoleLogs(page, url, options)`** +- Captures all console messages (log, error, warning, pageerror) +- Waits for logs to stabilize (3s default silence after last log) +- Supports waiting for specific log before completing +- Returns array of `ConsoleMessage` objects + +**`verifyLogPatterns(logs, expectedLogs, testName)`** +- Validates that expected log patterns appear in captured logs +- Supports state-aware pattern matching (checks app state transitions) +- Supports callbacks for complex assertions (e.g., date range calculations) +- Fails test if required patterns not found + +**`extractCounts(logEntry)`** +- Parses event count logs: `State: user-interactive, Events: allEvents:118 visibleEvents:20 {"byMap":98,"bySearch":0,"byDate":0,"byLocationFilter":0}` +- Returns structured count data for assertions +- Used extensively in interactive tests + +**`printConsoleLogs(logs, title)`** +- Pretty-prints console logs with timestamps and formatting +- Useful for debugging test failures + +**`reportErrors(logs, testName)`** +- Filters and reports error logs +- Returns error count for test assertions + +#### Default Configuration + +```typescript +const DEFAULT_CAPTURE_OPTIONS: CaptureLogsOptions = { + timeout: 20000, // 20s page load timeout + waitForNetworkIdle: true, // Wait for network idle + includeErrors: true, + includeWarnings: true, + additionalWaitTime: 5000, // Wait 5s after last log + maxWaitForLogs: 45000 // Max 45s total wait for logs +} +``` + +### Test Categories + +#### 1. Page Load Tests (`page-load.spec.ts`) + +**Purpose:** Systematic verification of URL parameter processing and application state transitions. + +**Approach:** Load URL → Capture console logs → Verify expected patterns → Check event counts + +**Test Cases:** + +1. **Quick Filter Weekend** (`/?es=sf&qf=weekend`) + - Verifies weekend date calculation + - Checks timezone-aware date conversion (LA timezone) + - Validates date range is >2 days, <3 days + - Ensures visible events > 0 + +2. **Custom Date Range** (`/?es=sf&fsd=2025-10-30&fed=2025-11-2`) + - Tests explicit date filter processing + - Validates NYC timezone conversion + - Checks event filtering by date range + +3. **Search Filter** (`/?es=sf&sq=berkeley`) + - Verifies search term application + - Validates event count reduction + - Ensures search filtering math is correct + +4. **LLZ Coordinates with Events** (`/?es=sf&llz=37.77484,-122.41388,12`) + - Tests viewport setting from coordinates + - Validates visible events exist within bounds + - Checks map bounds filtering + +5. **LLZ Coordinates without Events** (`/?es=19hz:ORE&llz=16.32341,-86.54243,12`) + - Tests viewport with no events in bounds + - Verifies zero visible events + - Validates all events filtered by map + +6. **Selected Event** (`/?es=sf&se=oapv4pivkccdkqo0iujsk7hkt0`) + - Tests selected event ID processing + - Verifies marker selection and popup + +**Timezone Support:** +- Tests can specify `timezoneId` to override browser timezone +- Critical for testing date calculations in different timezones +- Examples: `America/Los_Angeles`, `America/New_York` + +**State-Aware Pattern Matching:** +- Patterns can specify `requiredInState: 'applying-url-filters'` +- Ensures logs occur during correct app state +- Tracks state transitions via `[APP_STATE] changing: X to Y` logs + +**Complex Assertions via Callbacks:** +```typescript +{ + pattern: '[FLTR_EVTS_MGR] setFilter: dateRange: ', + cb: (logs) => { + // Extract dates from log, validate range is >2 days, <3 days + const matches = logs[logs.length - 1].match(/(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z)/) + expect(matches).toHaveLength(3) + const startEpoch = new Date(matches[1]).getTime() + const endEpoch = new Date(matches[2]).getTime() + expect(endEpoch - startEpoch).toBeGreaterThan(2 * 24 * 60 * 60 * 1000) + expect(endEpoch - startEpoch).toBeLessThan(3 * 24 * 60 * 60 * 1000) + } +} +``` + +**Environment Variable Support:** +- `TEST_URL` - Test custom URL without modifying code +- `TEST_NAME` - Run only tests matching name substring +- `TEST_TIMEZONE` - Override browser timezone for custom URL tests + +#### 2. Interactive Tests (`interactive.spec.ts`) + +**Purpose:** Test user interactions with the application in `user-interactive` state. + +**Approach:** Load page → Wait for interactive state → Perform user actions → Verify UI updates + +**Current Tests:** + +1. **Date Filter Clearing - Chip Interaction** + - Load page with weekend filter (`/?es=sf&qf=weekend`) + - Wait for `user-interactive` state + - Verify date filter chip is visible + - Click chip to clear filter + - Verify chip is removed + - Verify "X of Y Visible" button shows all events + - Confirm no other filter chips remain + +2. **Date Filter Clearing - Event List Updates** + - Load page with weekend filter + - Count initial events in event list (tbody tr elements) + - Clear date filter chip + - Count final events in event list + - Verify more events visible after clearing + - Verify event list count matches visible button count + +**Testing Strategy:** +- Focus on DOM state changes, not console logs +- Wait for state stabilization before assertions +- Verify multiple UI elements update in sync +- Test both filter application and removal + +**Key Patterns:** +```typescript +// Wait for user-interactive state +const logs = await captureConsoleLogs(page, testUrl, { + ...DEFAULT_CAPTURE_OPTIONS, + waitForSpecificLog: 'State: user-interactive', + additionalWaitTime: 2000 +}) + +// Verify element visibility +const dateFilterChip = page.locator('button[data-testid="date-filter-chip"]') +await expect(dateFilterChip).toBeVisible() + +// Perform interaction +await dateFilterChip.click() +await page.waitForTimeout(1000) // Allow state update + +// Verify result +await expect(dateFilterChip).toHaveCount(0) +``` + +#### 3. Console Log Debugging (`console-logs.spec.ts`) + +**Purpose:** Quick debugging tool for capturing and analyzing console logs from any URL. + +**Approach:** Flexible log capture without strict assertions - always passes, just captures data. + +**Tests:** + +1. **Timezone Test** - Verifies Playwright can override browser timezone +2. **Custom URL Test** - Captures logs from `TEST_URL` environment variable +3. **Pattern Matching** (skipped) - Example of filtering logs by pattern + +**Usage:** +```bash +# Capture logs from any URL +TEST_URL="/?es=sf&qf=weekend" npm run test:e2e:console + +# Redirect to file for AI analysis +(TEST_URL="/?es=sf" npm run test:e2e:console) &> dev-perf-browser-logs.txt +``` + +**Output:** +- Pretty-printed console logs with timestamps +- Log type summary (log, error, warning counts) +- Error report with potential issues +- Always passes - debugging tool, not validation + +### Available Commands + +```bash +# Run all E2E tests +npm run test:e2e + +# Run console log debugging (visible browser) +npm run test:e2e:console +TEST_URL="/?es=sf&qf=weekend" npm run test:e2e:console + +# Run page load tests (visible browser) +npm run test:e2e:pageload +TEST_NAME="Quick Filter" npm run test:e2e:pageload + +# Run interactive tests (visible browser) +npm run test:e2e:interactive + +# View HTML test report (after running tests) +npm run test:report # Alias for: npx playwright show-report +``` + +### Test Execution Flow + +**Page Load Tests:** +1. Playwright starts dev server (`npm run dev`) +2. Test navigates to URL with `captureConsoleLogs()` +3. Console listener captures all logs until stabilized +4. `verifyLogPatterns()` checks expected patterns +5. `reportErrors()` checks for error logs +6. Test reports pass/fail + +**Interactive Tests:** +1. Playwright starts dev server +2. Test navigates to URL and waits for `user-interactive` state +3. Test performs user actions (clicks, typing, etc.) +4. Test verifies DOM state changes +5. Test checks synchronization between UI elements +6. Test reports pass/fail + +### Debugging Failed Tests + +**When tests fail:** + +1. Check console output for captured logs +2. Look for specific patterns that weren't found +3. Review app state transitions in logs +4. Use `TEST_URL` to test individual URLs +5. Add `console.log` statements in app code if needed +6. View HTML report: `npm run test:report` +7. Check trace files in `/test-results/` (on retry failures) + +**Common Failure Modes:** +- Log pattern not found (app behavior changed) +- Timeout waiting for logs (app too slow or stuck) +- State-specific pattern in wrong state (state machine issue) +- Event count mismatch (filtering logic bug) +- Element not found (UI structure changed) + +### Playwright Configuration Details + +**Reporter Configuration:** +- HTML reporter with `open: 'never'` - AI-friendly (doesn't open browser) +- Reports saved to `playwright-report/` +- View with `npx playwright show-report` + +**Trace Configuration:** +- `trace: 'on-first-retry'` - Only capture traces on failures +- Traces saved to `test-results/` +- View with `npx playwright show-trace ` + +**Retry Strategy:** +- No retries in development (fail fast) +- 2 retries in CI (handle flakiness) +- `forbidOnly: !!process.env.CI` - Prevent accidental test.only in CI + +**Parallel Execution:** +- `fullyParallel: true` - Tests run in parallel +- 6 workers in dev (fast iteration) +- 1 worker in CI (avoid resource contention) + +--- + +## Current Coverage + +### What's Tested Today + +#### URL Parameter Processing (Comprehensive) + +**Date Filters:** +- ✅ Quick filters (`qf=weekend`, `qf=today`, `qf=next7days`) +- ✅ Explicit date ranges (`fsd=YYYY-MM-DD&fed=YYYY-MM-DD`) +- ✅ Timezone-aware date conversions (LA, NYC timezones tested) +- ✅ Date range calculations and validations + +**Search Filters:** +- ✅ Search query application (`sq=berkeley`) +- ✅ Event count reduction from search +- ✅ Filter math validation (visibleEvents + bySearch = allEvents) + +**Map Viewport:** +- ✅ LLZ coordinate processing (`llz=lat,lng,zoom`) +- ✅ Viewport setting from coordinates +- ✅ Map bounds filtering with events +- ✅ Map bounds filtering without events + +**Selected Events:** +- ✅ Selected event ID processing (`se=eventId`) +- ✅ Marker selection and highlighting + +**Event Sources:** +- ✅ Event source parsing (`es=source:id`) +- ✅ Multiple event sources (not explicitly tested but supported) + +#### User Interactions (Limited) + +**Filter Manipulation:** +- ✅ Date filter chip clearing +- ✅ Event list updates after filter changes +- ✅ Visible button count synchronization +- ⚠️ Map filter chip clearing (not tested) +- ⚠️ Search filter chip clearing (not tested) + +**UI Synchronization:** +- ✅ Filter chips and event counts in sync +- ✅ Event list and visible button count match +- ⚠️ Map markers and event list sync (not tested) + +#### Application State Machine + +**State Transitions:** +- ✅ State-aware log pattern matching +- ✅ Transitions from `starting-app` → `user-interactive` +- ✅ State-specific behavior validation +- ⚠️ Error state transitions (not tested) + +#### Browser Console Output + +**Log Capture:** +- ✅ Console.log messages +- ✅ Console.error messages +- ✅ Console.warning messages +- ✅ Page error messages + +**Debug Information:** +- ✅ Event counts and filtering stats +- ✅ State transition logs +- ✅ URL processing logs + +### Coverage Gaps + +#### Critical User Workflows (Not Tested) + +1. **Event Selection from List** + - Click event in EventList + - Verify map pans to event location + - Verify marker highlights + - Verify popup appears + - Verify event list scrolls to event (already selected) + +2. **Event Selection from Map** + - Click marker on map + - Verify popup appears with event details + - Verify event list scrolls to first event at that marker + - Verify event list highlights selected event + +3. **Filter Combinations** + - Apply date + search + map filters together + - Verify filter chips show correct counts + - Verify event list shows intersection of filters + - Clear filters in different orders + +4. **Map Interactions** + - Pan map → verify "Filtered by Map" chip appears + - Zoom map → verify event counts update + - Click "Filtered by Map" chip → verify map resets + - Click "X of Y Visible" button → verify map zooms to visible events + +5. **Search Functionality** + - Type search query → verify event list filters in real-time + - Clear search → verify all events return + - Search with no results → verify empty state + - Search + date filter combination + +6. **Date Slider Interactions** + - Drag date slider → verify event list updates + - Verify dropdown labels update + - Verify calendar selection updates + - Verify URL parameter updates + - Verify quick filter buttons deselect + +7. **Calendar Picker** + - Open calendar picker + - Select date range + - Verify event list updates + - Verify slider updates + - Verify dropdown labels update + +8. **Quick Filter Buttons** + - Click "Today" → verify correct date range + - Click "Next 7 Days" → verify correct date range + - Click "This Weekend" → verify correct date range + - Verify previous selections cleared + +9. **Sidebar Header Actions** + - Click CMF header → verify popup opens + - Verify timezone displayed + - Click "View Usage Doc" → verify link works + - Click "Enter New Source" → verify redirect to home + - Click "Share - Copy URL" → verify URL copied + +10. **Event Source Header Actions** + - Click event source header → verify popup opens + - Verify event count per source + - Click "View Source" → verify external link + - Click "Show Only These" → verify reload with single source + +#### Edge Cases (Not Tested) + +1. **No Events State** + - Load event source with no events + - Verify empty state message + - Verify no map markers + +2. **Unresolved Locations** + - Filter to unresolved events (`sq=unresolved`) + - Verify "unresolved" marker appears + - Click unresolved marker → verify popup with event list + +3. **Invalid URL Parameters** + - Invalid event source (`es=invalid`) + - Invalid selected event (`se=invalid`) + - Invalid date range (`fsd=invalid`) + - Invalid LLZ coordinates (`llz=invalid`) + +4. **Error States** + - API error loading events + - Geocoding failure + - Network timeout + - Map rendering error + +5. **Performance Under Load** + - Large event counts (1000+ events) + - Rapid filter changes + - Quick map panning/zooming + - Multiple event sources + +6. **Browser Compatibility** + - Only Chromium tested (no Firefox, Safari, Edge) + - No mobile viewport testing + +7. **Responsive Layout** + - Desktop vs mobile layouts + - Panel resizing + - Horizontal vs vertical panel split + +#### API and Data Flow (Not Tested) + +1. **Event Fetching** + - `/api/events` endpoint response + - Event source handler integration + - Geocoding API calls + - Redis cache hits/misses + +2. **Caching Behavior** + - Event data caching + - Geocoding cache behavior + - Cache invalidation + +3. **Real-time Updates** + - SWR revalidation + - Event data freshness + - Cache expiration + +### Test Metrics + +**Total E2E Tests:** 10 (as of 2025-10-26) +- Page load tests: 6 +- Interactive tests: 2 +- Console debugging: 2 (1 active, 1 skipped) + +**Test Execution Time:** +- Full suite: ~30 seconds (parallel, 6 workers) +- Page load only: ~18 seconds +- CI execution: Longer (sequential, 1 worker + retries) + +**Test Files:** 3 +- `page-load.spec.ts` - 280 lines, 6 tests +- `interactive.spec.ts` - 162 lines, 2 tests +- `console-logs.spec.ts` - 106 lines, 2 tests + +**Shared Utilities:** 1 +- `test-utils.ts` - 297 lines, 16+ utility functions + +--- + +## Recommended Improvements + +### Priority 1: Short Execution Time + +**Goal:** Optimize test speed while maintaining comprehensive coverage. + +#### Recommendations + +**1.1 Combine Related Test Cases (HIGH VALUE)** + +**Current Problem:** Each test loads a fresh page, even when testing similar workflows. + +**Solution:** Group related assertions into single test cases. + +**Example - Before (2 separate tests, 2 page loads):** +```typescript +test('Date filter clearing - chip interaction', async ({ page }) => { + // Load page, verify chip clears +}) + +test('Date filter clearing - event list updates', async ({ page }) => { + // Load page again, verify event list updates +}) +``` + +**Example - After (1 test, 1 page load):** +```typescript +test('Date filter clearing - complete workflow', async ({ page }) => { + // 1. Load page with weekend filter + // 2. Verify chip is visible + // 3. Verify initial event counts + // 4. Click chip to clear + // 5. Verify chip removed + // 6. Verify event counts updated + // 7. Verify event list updated +}) +``` + +**Impact:** +- Reduce page loads by 50%+ for related tests +- Faster execution (no page load overhead) +- More realistic user workflows (users don't reload between actions) + +**Confidence:** 95% - Will significantly improve speed without sacrificing coverage. + +--- + +**1.2 Optimize Wait Times (MEDIUM VALUE)** + +**Current Problem:** Fixed wait times (`waitForTimeout(1000)`) slow down tests unnecessarily. + +**Solution:** Use Playwright's built-in waiting mechanisms. + +**Example - Before (fixed delays):** +```typescript +await dateFilterChip.click() +await page.waitForTimeout(1000) // Wait for state update +await expect(dateFilterChip).toHaveCount(0) +``` + +**Example - After (smart waiting):** +```typescript +await dateFilterChip.click() +// Playwright automatically waits for element to disappear (up to timeout) +await expect(dateFilterChip).toHaveCount(0) +``` + +**Additional Optimizations:** +```typescript +// Use page.waitForLoadState() instead of waitForTimeout() +await page.waitForLoadState('networkidle') + +// Use page.waitForResponse() for API calls +await page.waitForResponse(resp => resp.url().includes('/api/events')) + +// Use locator.waitFor() for specific conditions +await dateFilterChip.waitFor({ state: 'hidden' }) +``` + +**Impact:** +- Tests finish as soon as conditions met (no over-waiting) +- More reliable (waits for actual state, not arbitrary time) +- Faster in fast environments, not slower in slow environments + +**Confidence:** 90% - Standard best practice, proven effective. + +--- + +**1.3 Reduce Log Capture Overhead (MEDIUM VALUE)** + +**Current Problem:** `captureConsoleLogs()` waits up to 45 seconds for logs to stabilize. + +**Solution:** Use more targeted log capture strategies. + +**Example - Targeted Capture:** +```typescript +// Instead of capturing all logs until stabilization +const logs = await captureConsoleLogs(page, url, { + maxWaitForLogs: 45000, + additionalWaitTime: 5000 +}) + +// Use specific log as completion signal +const logs = await captureConsoleLogs(page, url, { + waitForSpecificLog: 'State: user-interactive', + additionalWaitTime: 1000 // Shorter wait after target log +}) +``` + +**Alternative - Skip Log Capture for UI Tests:** +```typescript +// Interactive tests don't need full log capture +// Just wait for specific state, then test UI +await page.goto(url) +await page.waitForLoadState('networkidle') + +// Or use a specific marker element +await page.locator('[data-testid="app-ready"]').waitFor() +``` + +**Impact:** +- Reduce test time by 3-5 seconds per test +- Still capture logs when needed for debugging +- Faster feedback during development + +**Confidence:** 85% - Some tests genuinely need full logs, others don't. + +--- + +**1.4 Optimize Parallel Execution (LOW VALUE, EASY WIN)** + +**Current Problem:** 6 workers in dev, but only 10 total tests - some workers idle. + +**Solution:** Match worker count to test count, or keep as-is (no harm in extra workers). + +**Recommendation:** Keep current configuration (6 workers) for future growth. As tests increase, parallel execution will provide more value. + +**Impact:** Minimal now, but prevents slowdown as test count grows. + +**Confidence:** 100% - No downside to current configuration. + +--- + +### Priority 2: Easy and Rapid Iteration During Development + +**Goal:** Make debugging tests quick and pleasant for developers. + +#### Recommendations + +**2.1 Enhanced Debug Utilities (HIGH VALUE)** + +**Current Problem:** Test failures require opening HTML report or reading stdout. + +**Solution:** Add developer-friendly debug helpers. + +**Example - Screenshot on Failure:** +```typescript +// Add to test-utils.ts +export async function debugScreenshot(page: Page, name: string) { + if (process.env.DEBUG) { + await page.screenshot({ + path: `test-results/${name}-${Date.now()}.png`, + fullPage: true + }) + } +} + +// Use in tests +test('Date filter clearing', async ({ page }) => { + await debugScreenshot(page, 'before-click') + await dateFilterChip.click() + await debugScreenshot(page, 'after-click') +}) +``` + +**Example - DOM State Logging:** +```typescript +// Add to test-utils.ts +export async function logElementState(page: Page, selector: string) { + const elements = await page.locator(selector).all() + console.log(`${selector}: Found ${elements.length} elements`) + for (const el of elements) { + console.log(` - visible: ${await el.isVisible()}`) + console.log(` - text: ${await el.textContent()}`) + } +} + +// Use in tests +await logElementState(page, 'button[aria-label*="filter"]') +``` + +**Example - Event Count Debugging:** +```typescript +// Add to test-utils.ts +export async function logAppState(page: Page) { + const eventCounts = await page.evaluate(() => { + return { + allEvents: window.cmfEvents?.allEvents?.length || 0, + visibleEvents: window.cmfEvents?.visibleEvents?.length || 0, + hiddenCounts: window.cmfEvents?.hiddenCounts || {} + } + }) + console.log('App State:', JSON.stringify(eventCounts, null, 2)) +} +``` + +**Impact:** +- Faster debugging (see exactly what's wrong) +- Less context switching (stay in terminal) +- Screenshots provide visual confirmation + +**Confidence:** 95% - Standard debugging practice, universally helpful. + +--- + +**2.2 Focused Test Running (HIGH VALUE)** + +**Current Problem:** Running full suite when iterating on single test is slow. + +**Solution:** Use Playwright's built-in test filtering (already supported, just document better). + +**Example - Run Single Test:** +```bash +# Run only tests with "date filter" in name +npm run test:e2e -- -g "date filter" + +# Run only interactive tests +npm run test:e2e -- tests/e2e/interactive.spec.ts + +# Run in debug mode with browser open +npm run test:e2e -- --debug tests/e2e/interactive.spec.ts +``` + +**Additional - Test Tagging:** +```typescript +// Tag tests with categories +test('Date filter clearing @smoke @filters', async ({ page }) => { + // Test implementation +}) + +// Run only smoke tests +npm run test:e2e -- --grep @smoke + +// Run all except slow tests +npm run test:e2e -- --grep-invert @slow +``` + +**Impact:** +- Run only what you're working on (5-10x faster iteration) +- Debug mode shows browser for visual debugging +- Tags enable smart test selection + +**Confidence:** 100% - Built-in Playwright feature, zero implementation cost. + +--- + +**2.3 Better Error Messages (MEDIUM VALUE)** + +**Current Problem:** Playwright's default error messages can be cryptic. + +**Solution:** Add custom error messages to assertions. + +**Example - Before:** +```typescript +await expect(dateFilterChip).toHaveCount(0) +// Error: expect(locator).toHaveCount(expected) +// Expected: 0 +// Received: 1 +``` + +**Example - After:** +```typescript +await expect(dateFilterChip).toHaveCount(0, { + message: 'Date filter chip should be removed after clicking to clear filter' +}) +// Error: Date filter chip should be removed after clicking to clear filter +// Expected: 0 +// Received: 1 +``` + +**Example - Complex Assertions:** +```typescript +// Before +expect(finalShown).toBe(finalTotal) + +// After +expect(finalShown).toBe(finalTotal, { + message: `After clearing date filter, all events should be visible. ` + + `Expected ${finalTotal} visible, got ${finalShown}. ` + + `Hidden counts: ${JSON.stringify(hiddenCounts)}` +}) +``` + +**Impact:** +- Instantly understand what failed and why +- Reduce debugging time by 50%+ +- Better collaboration (errors explain themselves) + +**Confidence:** 90% - Small effort, big readability improvement. + +--- + +**2.4 Interactive Debug Mode (LOW VALUE, NICE TO HAVE)** + +**Current Problem:** When test fails, you have to re-run to inspect. + +**Solution:** Use Playwright's UI mode for interactive debugging. + +**Example - Enable UI Mode:** +```bash +# Add to package.json scripts +"test:e2e:ui": "playwright test --ui" + +# Run with UI mode +npm run test:e2e:ui +``` + +**Features:** +- Time-travel debugging (step forward/backward) +- DOM inspection at any point +- Network tab to see API calls +- Console logs integrated +- Watch mode (auto-rerun on changes) + +**Impact:** +- Significantly faster debugging for complex failures +- Visual confirmation of what's happening +- No need to add temporary console.logs + +**Confidence:** 80% - Very powerful, but requires learning UI mode workflow. + +--- + +### Priority 3: Emulating Production as Much as Possible + +**Goal:** Ensure tests catch production issues, not just dev issues. + +#### Recommendations + +**3.1 Use Real Event Sources (HIGH VALUE)** + +**Current Problem:** All tests use `es=sf` (San Francisco events) - assumes data exists and is stable. + +**Risk:** Production event sources may: +- Return no events (cache expired, API down) +- Return different event counts +- Have geocoding failures +- Have timezone issues + +**Solution:** Test with multiple event sources, including edge cases. + +**Example - Test Suite with Varied Sources:** +```typescript +const eventSourceTests = [ + { + name: 'Google Calendar with many events', + source: 'gc:calendar@example.com', + expectedMinEvents: 50 + }, + { + name: 'Facebook events (few events)', + source: 'fb:12345', + expectedMinEvents: 1, + expectedMaxEvents: 10 + }, + { + name: '19hz events (unresolved locations)', + source: '19hz:ORE', + expectedUnresolvedEvents: true + } +] +``` + +**Alternative - Test Source:** +```typescript +// Create dedicated test event source +// See: src/lib/api/eventSources/testSource.ts +const testEvents = [ + { location: 'San Francisco', ... }, // Resolved + { location: 'Invalid Location', ... }, // Unresolved + { location: 'Berkeley', ... }, // Resolved +] + +// Tests use: es=test:stable +// Provides consistent, controlled test data +``` + +**Impact:** +- Catch production-specific issues (API failures, data variance) +- More confidence in releases +- Test against real geocoding and timezone issues + +**Confidence:** 90% - Critical for production parity, but requires test data management. + +**Trade-off:** +- ✅ More realistic +- ❌ Tests may fail due to external data changes (need test event source) +- ❌ Slower (real API calls vs cached data) + +--- + +**3.2 Test with Production-like Environment Variables (MEDIUM VALUE)** + +**Current Problem:** Tests use dev environment (.env.local) - may differ from production. + +**Solution:** Add test environment configuration that mirrors production. + +**Example - Test Environment Config:** +```typescript +// playwright.config.ts +export default defineConfig({ + use: { + baseURL: process.env.TEST_ENV === 'prod-like' + ? 'http://localhost:3000' // With prod env vars + : 'http://localhost:3000', // With dev env vars + } +}) +``` + +**Example - Environment-specific Tests:** +```typescript +test('Geocoding uses production cache', async ({ page }) => { + // Verify Upstash Redis cache is used (not filesystem) + // Check cache headers in API responses +}) + +test('Analytics tracking works', async ({ page }) => { + // Verify Umami tracking calls are made + // Check network requests include tracking data +}) +``` + +**Impact:** +- Catch environment-specific issues before production +- Verify API keys and external services work +- Test caching behavior matches production + +**Confidence:** 75% - Valuable, but may require test API keys and services. + +**Trade-off:** +- ✅ Catches config issues +- ❌ Requires separate test API keys +- ❌ May incur API costs (geocoding, etc.) + +--- + +**3.3 Test Real API Responses (LOW VALUE)** + +**Current Problem:** Tests assume API responses are well-formed and complete. + +**Solution:** Add tests that verify API response structure. + +**Example - API Response Validation:** +```typescript +test('API returns valid event data structure', async ({ page }) => { + // Intercept API response + const response = await page.waitForResponse( + resp => resp.url().includes('/api/events?id=sf') + ) + + const data = await response.json() + + // Verify structure + expect(data).toHaveProperty('events') + expect(data).toHaveProperty('source') + expect(data.events).toBeInstanceOf(Array) + + // Verify first event has required fields + const event = data.events[0] + expect(event).toHaveProperty('id') + expect(event).toHaveProperty('name') + expect(event).toHaveProperty('start') + expect(event).toHaveProperty('end') + expect(event).toHaveProperty('resolved_location') +}) +``` + +**Impact:** +- Catch API contract changes +- Verify geocoding success rates +- Detect data quality issues + +**Confidence:** 70% - Useful, but overlaps with unit tests and API tests. + +**Trade-off:** +- ✅ Validates end-to-end data flow +- ❌ Brittle (breaks when API changes intentionally) +- ❌ Overlaps with backend testing + +**Recommendation:** Add 1-2 tests to validate critical API contracts, but don't overdo it. + +--- + +### Priority 4: Not Overengineering + +**Goal:** Keep tests simple, maintainable, and focused. + +#### Recommendations + +**4.1 Avoid Premature Abstraction (HIGH VALUE)** + +**Current Status:** Good - test-utils.ts provides shared utilities without over-abstracting. + +**Example of GOOD abstraction (keep this):** +```typescript +// Shared utility used by multiple tests +export async function captureConsoleLogs(page, url, options) { + // Implementation +} + +// Used in multiple test files +const logs = await captureConsoleLogs(page, url, DEFAULT_CAPTURE_OPTIONS) +``` + +**Example of BAD abstraction (avoid this):** +```typescript +// Over-abstracted test builder +export function buildPageLoadTest(config: TestConfig) { + return async ({ page }) => { + await loadPage(page, config.url) + await waitForState(page, config.state) + await verifyElements(page, config.elements) + await verifyLogs(page, config.logs) + await takeScreenshot(page, config.name) + } +} + +// Hard to understand what this test does +test('Weekend filter', buildPageLoadTest({ + url: '/?es=sf&qf=weekend', + state: 'user-interactive', + elements: ['date-chip'], + logs: ['weekend'], + name: 'weekend' +})) +``` + +**Guideline:** Abstract when you have 3+ identical patterns, not before. + +**Impact:** +- Tests remain readable (you can see what they do) +- Easy to modify individual tests +- New contributors can understand tests quickly + +**Confidence:** 95% - Proven best practice in testing. + +--- + +**4.2 Keep Test Data Inline (MEDIUM VALUE)** + +**Current Status:** Good - test cases defined in test files, not external fixtures. + +**Example of GOOD pattern (keep this):** +```typescript +const pageLoadTests: PageLoadTestCase[] = [ + { + name: 'Quick Filter Weekend', + url: '/?es=sf&qf=weekend', + expectedLogs: [ + { + pattern: 'Processing quick date filter: weekend', + description: 'Weekend filter processing' + } + ] + } +] +``` + +**Example of BAD pattern (avoid this):** +```typescript +// External fixture file: fixtures/page-load-tests.json +{ + "tests": [ + { + "name": "Quick Filter Weekend", + "url": "/?es=sf&qf=weekend", + "expectedLogs": [...] + } + ] +} + +// Test file - harder to understand and modify +const tests = loadFixture('page-load-tests.json') +``` + +**Guideline:** Keep test data in TypeScript files for: +- Type safety +- Easy refactoring +- Clear context +- IDE support + +**Exception:** Large datasets (100+ test cases) can be in JSON/CSV, but keep test logic in TypeScript. + +**Impact:** +- Tests are self-documenting +- Refactoring is easier (TypeScript finds all references) +- No context switching between files + +**Confidence:** 90% - Standard testing practice. + +--- + +**4.3 One Assertion Per Logical Concept (LOW VALUE)** + +**Current Status:** Mixed - some tests have multiple assertions, which is fine. + +**Example of GOOD multi-assertion (keep this):** +```typescript +test('Date filter clearing updates UI', async ({ page }) => { + // Related assertions that validate one concept: "UI updates correctly" + await expect(dateFilterChip).toHaveCount(0) + await expect(visibleButton).toContainText('118 of 118 Visible') + await expect(eventRows).toHaveCount(118) +}) +``` + +**Example of BAD multi-concept test (avoid this):** +```typescript +test('Application works', async ({ page }) => { + // Unrelated assertions - hard to debug when it fails + await expect(dateFilterChip).toBeVisible() // Concept 1: Filter applied + await mapMarker.click() // Concept 2: Map interaction + await expect(popup).toBeVisible() // Concept 2: Popup appears + await searchInput.fill('berkeley') // Concept 3: Search + await expect(eventRows).toHaveCount(5) // Concept 3: Search results +}) +``` + +**Guideline:** Multiple assertions OK if they validate the same user action or workflow. + +**Impact:** +- Balanced between "one giant test" and "too many tiny tests" +- Test failures are still debuggable +- Tests represent real user workflows + +**Confidence:** 85% - Subjective, but this balance works well. + +--- + +### Priority 5: Not Sacrificing Quality or Coverage + +**Goal:** Maintain comprehensive coverage while implementing optimizations. + +#### Recommendations + +**5.1 Maintain Coverage Metrics (HIGH VALUE)** + +**Current Problem:** No tracking of what workflows are covered vs. not covered. + +**Solution:** Document and track coverage explicitly. + +**Example - Coverage Checklist:** +```markdown +## E2E Test Coverage + +### URL Processing +- [x] qf=weekend (6 assertions) +- [x] fsd/fed date range (4 assertions) +- [x] sq=search (3 assertions) +- [x] llz=coordinates (5 assertions) +- [x] se=eventId (2 assertions) +- [ ] es=source1,source2 (multiple sources) +- [ ] Invalid URL parameters + +### User Interactions +- [x] Clear date filter chip (2 tests) +- [ ] Clear search filter chip +- [ ] Clear map filter chip +- [ ] Select event from list +- [ ] Select event from map +- [ ] Pan/zoom map +- [ ] Drag date slider +- [ ] Click quick filter button +``` + +**Implementation:** Add coverage tracker to tests-e2e.md (this document). + +**Impact:** +- Know exactly what's tested and what's not +- Prioritize new tests based on gaps +- Prevent coverage regression + +**Confidence:** 100% - Essential for maintaining quality. + +--- + +**5.2 Add Smoke Tests for Critical Paths (HIGH VALUE)** + +**Current Problem:** No lightweight "does basic functionality work?" tests. + +**Solution:** Create fast smoke test suite that runs on every commit. + +**Example - Smoke Test Suite:** +```typescript +// tests/e2e/smoke.spec.ts +test.describe('Smoke Tests', () => { + test('App loads with event source', async ({ page }) => { + await page.goto('/?es=sf') + await expect(page.locator('text=Visible')).toBeVisible() + await expect(page.locator('.maplibregl-canvas')).toBeVisible() + }) + + test('Search filters events', async ({ page }) => { + await page.goto('/?es=sf') + await page.fill('[placeholder*="Search"]', 'berkeley') + await expect(page.locator('text=Filtered by Search')).toBeVisible() + }) + + test('Date filter works', async ({ page }) => { + await page.goto('/?es=sf&qf=weekend') + await expect(page.locator('text=Filtered by Date')).toBeVisible() + }) +}) +``` + +**Benefits:** +- Fast (<10 seconds for all smoke tests) +- Run on every commit (pre-push hook) +- Catch breaking changes immediately + +**Implementation:** +```bash +# Add to package.json +"test:e2e:smoke": "playwright test tests/e2e/smoke.spec.ts" + +# Add to pre-push hook +#!/bin/sh +npm run test:e2e:smoke +``` + +**Impact:** +- Immediate feedback on breaking changes +- Confidence to refactor without breaking core functionality +- Fast enough to run continuously + +**Confidence:** 95% - Standard practice for fast feedback. + +--- + +**5.3 Add Visual Regression Tests (MEDIUM VALUE, FUTURE)** + +**Current Problem:** No validation that UI looks correct, only that elements exist. + +**Solution:** Add Playwright's visual comparison testing. + +**Example - Visual Regression Test:** +```typescript +test('Map page renders correctly', async ({ page }) => { + await page.goto('/?es=sf') + + // Wait for map to load + await page.waitForSelector('.maplibregl-canvas') + + // Take screenshot and compare to baseline + await expect(page).toHaveScreenshot('map-page.png', { + maxDiffPixels: 100 // Allow minor rendering differences + }) +}) +``` + +**Benefits:** +- Catch UI regressions (layout, styling, etc.) +- Verify responsive layouts +- Detect unintended visual changes + +**Challenges:** +- Flaky (fonts, map tiles, timing) +- Requires baseline management +- Large image files + +**Recommendation:** Start small (1-2 critical views), evaluate flakiness before expanding. + +**Impact:** +- Catch visual regressions automatically +- Reduce manual QA time +- More confidence in UI changes + +**Confidence:** 60% - Powerful but requires careful tuning to avoid flakiness. + +**Trade-off:** +- ✅ Catches visual bugs +- ❌ Can be flaky (map tiles, fonts, timing) +- ❌ Requires baseline management +- ❌ Slower (screenshot comparison) + +**Recommendation:** Defer until after implementing other higher-priority improvements. + +--- + +**5.4 Ensure Test Reliability (HIGH VALUE)** + +**Current Problem:** Some tests may be flaky (not observed yet, but risk exists). + +**Solution:** Follow best practices to prevent flakiness. + +**Example - Reliable Patterns:** +```typescript +// GOOD: Wait for specific condition +await expect(page.locator('text=Visible')).toBeVisible() + +// BAD: Fixed timeout +await page.waitForTimeout(1000) + +// GOOD: Wait for network idle +await page.waitForLoadState('networkidle') + +// BAD: Assume page loaded +await page.goto(url) + +// GOOD: Wait for element before interacting +await page.locator('button').waitFor() +await page.locator('button').click() + +// BAD: Immediate interaction +await page.locator('button').click() + +// GOOD: Use test IDs for stable selectors +await page.locator('[data-testid="date-filter-chip"]') + +// RISKY: CSS selectors may change +await page.locator('div.flex.items-center > button:nth-child(2)') +``` + +**Anti-flakiness Checklist:** +- ✅ Use `await expect()` instead of `waitForTimeout()` +- ✅ Wait for elements before interacting +- ✅ Use stable selectors (test IDs, ARIA labels) +- ✅ Avoid race conditions (wait for network idle) +- ✅ Clean up state between tests +- ✅ Don't depend on external data that changes +- ✅ Use retries only in CI, not in dev (fail fast locally) + +**Impact:** +- Tests pass consistently +- No "flaky test" reputation +- Confidence in test results + +**Confidence:** 95% - Critical for test suite health. + +--- + +## Migration Plan + +**If significant changes are recommended (which they are):** + +### Phase 1: Quick Wins (Week 1-2) + +**Goal:** Improve developer experience without breaking existing tests. + +1. **Add Debug Utilities** + - Add `debugScreenshot()`, `logElementState()`, `logAppState()` to test-utils.ts + - Document usage in README + - Confidence: 95% | Effort: Low | Value: High + +2. **Improve Error Messages** + - Add custom messages to all assertions + - Update test-utils.ts assertion helpers + - Confidence: 90% | Effort: Low | Value: High + +3. **Document Test Filtering** + - Add examples to README for running focused tests + - Add test tags for smoke/filters/map/etc. + - Confidence: 100% | Effort: Low | Value: Medium + +4. **Add Coverage Tracking** + - Create coverage checklist in this document + - Update after each new test + - Confidence: 100% | Effort: Low | Value: High + +**Outcome:** Better debugging, faster iteration, no test changes required. + +--- + +### Phase 2: Optimize Existing Tests (Week 3-4) + +**Goal:** Improve test speed and reliability. + +1. **Combine Interactive Tests** + - Merge date filter clearing tests into single workflow test + - Add map filter and search filter clearing to same test + - Confidence: 95% | Effort: Medium | Value: High + +2. **Optimize Wait Times** + - Replace `waitForTimeout()` with smart waiting + - Use `waitForLoadState()` and element waits + - Reduce log capture wait times where possible + - Confidence: 90% | Effort: Medium | Value: Medium + +3. **Ensure Test Reliability** + - Audit all selectors (prefer test IDs) + - Add `waitFor()` before all interactions + - Remove unnecessary timeouts + - Confidence: 95% | Effort: Medium | Value: High + +**Outcome:** Tests run 30-50% faster, more reliable, still comprehensive. + +--- + +### Phase 3: Expand Coverage (Week 5-8) + +**Goal:** Close critical coverage gaps. + +1. **Add Smoke Tests** + - Create smoke.spec.ts with 5-10 fast tests + - Add to pre-push hook + - Confidence: 95% | Effort: Low | Value: High + +2. **Add Event Selection Tests** + - Click event in list → verify map pans and marker highlights + - Click marker → verify popup and event list scroll + - Confidence: 90% | Effort: Medium | Value: High + +3. **Add Filter Combination Tests** + - Date + search + map filters together + - Clear filters in different orders + - Verify filter chip counts are correct + - Confidence: 85% | Effort: Medium | Value: High + +4. **Add Map Interaction Tests** + - Pan map → verify "Filtered by Map" chip + - Click "X of Y Visible" → verify map zooms + - Click filter chips → verify map resets + - Confidence: 85% | Effort: Medium | Value: High + +5. **Add Edge Case Tests** + - No events state + - Invalid URL parameters + - Unresolved locations + - Confidence: 80% | Effort: Low | Value: Medium + +**Outcome:** 30-40 total E2E tests covering all critical workflows. + +--- + +### Phase 4: Production Parity (Week 9-10, Optional) + +**Goal:** Ensure tests catch production-specific issues. + +1. **Create Test Event Source** + - Stable test data that doesn't change + - Mix of resolved/unresolved locations + - Various date ranges and timezones + - Confidence: 85% | Effort: Medium | Value: Medium + +2. **Add API Response Tests** + - Verify API contract (2-3 tests) + - Test geocoding success rates + - Validate event data structure + - Confidence: 75% | Effort: Low | Value: Low + +3. **Test with Production-like Config** + - Add test environment variables + - Verify caching behavior + - Test analytics tracking + - Confidence: 70% | Effort: High | Value: Medium + +**Outcome:** Higher confidence that tests catch production issues. + +--- + +### Phase 5: Advanced Features (Future, Optional) + +**Goal:** Add advanced testing capabilities. + +1. **Visual Regression Tests** + - Start with 1-2 critical views + - Evaluate flakiness + - Expand if successful + - Confidence: 60% | Effort: High | Value: Medium + +2. **Performance Tests** + - Test with 1000+ events + - Measure filter performance + - Verify no memory leaks + - Confidence: 70% | Effort: High | Value: Low + +3. **Multi-browser Testing** + - Add Firefox and Safari projects + - Test mobile viewports + - Confidence: 80% | Effort: Low | Value: Low + +**Outcome:** Comprehensive test suite with advanced capabilities. + +--- + +### Rollout Strategy + +**Incremental Approach:** + +1. **Implement in feature branch** - Don't break existing tests +2. **Run both old and new tests in parallel** - Verify new tests catch same issues +3. **Gradually replace old tests** - Once confidence is high +4. **Monitor for flakiness** - Adjust as needed +5. **Document changes** - Update README and this document + +**Success Criteria:** + +- ✅ Test execution time <60 seconds for full suite +- ✅ All critical workflows have E2E coverage +- ✅ <5% flakiness rate (tests pass >95% of time) +- ✅ Developers prefer E2E tests over manual testing +- ✅ Coverage tracked and maintained + +**Rollback Plan:** + +- Keep old tests until new tests prove stable (2-4 weeks) +- If flakiness increases, revert and reassess +- Document lessons learned + +--- + +## Summary + +### Current State Strengths + +✅ **Well-structured utilities** - test-utils.ts provides excellent shared functionality + +✅ **Comprehensive URL testing** - All major URL parameters tested thoroughly + +✅ **State-aware testing** - Validates correct app state transitions + +✅ **Good documentation** - README explains test structure and usage + +✅ **Fast parallel execution** - 30 seconds for full suite (6 workers) + +### Current State Weaknesses + +⚠️ **Limited interaction testing** - Only 2 interactive tests (date filter clearing) + +⚠️ **No smoke tests** - No fast "does it work?" test suite + +⚠️ **Coverage gaps** - Missing event selection, map interactions, filter combinations + +⚠️ **No visual testing** - Only functional testing, no UI regression detection + +⚠️ **Fixed wait times** - Some unnecessary delays slow tests down + +### Top 5 Priorities (In Order) + +1. **Add smoke tests** - Fast feedback on every commit + - Effort: Low | Value: High | Confidence: 95% + +2. **Expand interaction coverage** - Test event selection, map interactions, filter combinations + - Effort: Medium | Value: High | Confidence: 90% + +3. **Optimize wait times** - Replace fixed delays with smart waiting + - Effort: Medium | Value: Medium | Confidence: 90% + +4. **Add debug utilities** - Screenshots, DOM logging, app state inspection + - Effort: Low | Value: High | Confidence: 95% + +5. **Improve error messages** - Custom messages for all assertions + - Effort: Low | Value: High | Confidence: 90% + +### Expected Outcomes After Improvements + +- **Test execution time:** 30s → ~40-50s (more tests, but optimized) +- **Test count:** 10 → 35-40 tests +- **Coverage:** ~30% workflows → 85% workflows +- **Developer satisfaction:** Higher (better debugging, faster iteration) +- **Confidence in releases:** Higher (fewer production bugs) + +--- + +**Questions or feedback?** Open an issue or contact the maintainers. From 995e2ad935120de4c66cfac235c1bf8b3e50a0bf Mon Sep 17 00:00:00 2001 From: Chad Norwood Date: Mon, 27 Oct 2025 22:04:29 +0000 Subject: [PATCH 07/35] docs: restructure E2E test documentation for better clarity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Split comprehensive E2E documentation into focused documents: - tests-e2e-architecture.md: Core principles and patterns (~300 lines) - tests-e2e-examples.md: Detailed code examples (~800 lines) - tests-e2e-migration.md: Phased implementation plan (~400 lines) - tests-e2e.md: Overview and quick reference (now ~340 lines) Key improvements: - Performance-conscious selector strategy (semantic > CSS > data-testid) - Clear guidance on testing Selected Event workflows (3 triggers, 3 cues, Exception) - Filter chip testing patterns (map, date, search) - Console log usage for state validation - Mobile testing guidance (iPhone 16) - Refactor-proof test patterns for ai-proposal.md changes Rationale: Original 1600+ line document was difficult to navigate for both humans and AI agents. Split structure makes it easier to find relevant information and understand best practices. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- docs/tests-e2e-architecture.md | 622 ++++++++++++ docs/tests-e2e-examples.md | 917 +++++++++++++++++ docs/tests-e2e-migration.md | 687 +++++++++++++ docs/tests-e2e.md | 1737 ++++---------------------------- 4 files changed, 2434 insertions(+), 1529 deletions(-) create mode 100644 docs/tests-e2e-architecture.md create mode 100644 docs/tests-e2e-examples.md create mode 100644 docs/tests-e2e-migration.md diff --git a/docs/tests-e2e-architecture.md b/docs/tests-e2e-architecture.md new file mode 100644 index 0000000..0452df6 --- /dev/null +++ b/docs/tests-e2e-architecture.md @@ -0,0 +1,622 @@ +# E2E Test Architecture + +**Purpose:** Principles and patterns for writing E2E tests that are clear, maintainable, and resilient to refactoring. + +**Audience:** AI agents and developers writing or maintaining E2E tests + +**Last Updated:** 2025-10-27 + +--- + +## Table of Contents + +1. [Core Principles](#core-principles) +2. [Test Organization](#test-organization) +3. [What to Test Where](#what-to-test-where) +4. [Selector Strategy](#selector-strategy) +5. [Console Log Usage](#console-log-usage) +6. [Test Data Strategy](#test-data-strategy) +7. [Mobile Testing](#mobile-testing) +8. [Surviving Refactors](#surviving-refactors) + +--- + +## Core Principles + +### 1. Test User Behavior, Not Implementation + +**❌ BAD - Tests implementation details:** +```typescript +test('FilterEventsManager.setDateRange called', async ({ page }) => { + // Testing internal function calls - breaks during refactors + const spy = page.evaluate(() => window.FilterEventsManager.setDateRange) + expect(spy).toHaveBeenCalled() +}) +``` + +**✅ GOOD - Tests user-visible behavior:** +```typescript +test('Weekend filter shows only weekend events', async ({ page }) => { + await page.goto('/?es=test:stable&qf=weekend') + + // Verify what user sees + await expect(page.getByRole('button', { name: /filtered by date/i })).toBeVisible() + + // Verify events are actually on weekend + const eventDates = await page.getByRole('cell', { name: /\d{4}-\d{2}-\d{2}/ }).allTextContents() + for (const dateStr of eventDates) { + const date = new Date(dateStr) + expect([5, 6, 0]).toContain(date.getDay()) // Fri, Sat, Sun + } +}) +``` + +**Why:** Implementation can change (ai-proposal.md refactor) but user behavior shouldn't. + +--- + +### 2. Use Console Logs for State Validation + +Console logs are **CRITICAL** for testing app state transitions - they're the ONLY way to verify internal state in E2E tests. + +**Use console logs for:** +- ✅ State machine transitions (`starting-app` → `applying-url-filters` → `user-interactive`) +- ✅ Filter application order and timing +- ✅ Internal behavior that affects correctness (timezone conversions, date calculations) +- ✅ Verifying business logic executed correctly + +**Use DOM assertions for:** +- ✅ User-visible behavior (chips appear, events filtered, map updates) + +**Example - Combined approach:** +```typescript +test('Weekend filter applies correctly', async ({ page }) => { + const logs = await captureConsoleLogs(page, '/?es=test:stable&qf=weekend') + + // ✅ Verify state transitions (console logs) + verifyLogPatterns(logs, [ + { + pattern: 'Processing quick date filter: weekend', + requiredInState: 'applying-url-filters', + description: 'Weekend filter processed during URL parsing' + }, + { + pattern: /setFilter: dateRange:/, + requiredInState: 'applying-url-filters', + description: 'Date range set before user interaction' + }, + { + pattern: 'State: user-interactive', + description: 'App ready for user interaction' + } + ]) + + // ✅ Verify user-visible behavior (DOM) + await expect(page.getByRole('button', { name: /filtered by date/i })).toBeVisible() +}) +``` + +--- + +### 3. E2E Tests USE Real Functions, Don't Reimplement Logic + +**❌ BAD - Reimplementing weekend logic:** +```typescript +test('Weekend filter calculates correctly', async ({ page }) => { + // Reimplementing business logic in test + const today = new Date() + const dayOfWeek = today.getDay() + let daysToFriday = dayOfWeek < 5 ? 5 - dayOfWeek : 0 + const friday = new Date(today.getTime() + daysToFriday * 86400000) + // ... 10 more lines of date math +}) +``` + +**✅ GOOD - Using actual function:** +```typescript +import { calculateQuickFilterRange } from '@/lib/utils/quickFilters' + +test('Weekend filter applies correctly', async ({ page }) => { + const logs = await captureConsoleLogs(page, '/?es=test:stable&qf=weekend') + + verifyLogPatterns(logs, [ + { + pattern: /setFilter: dateRange:.*start.*end/, + cb: (logs) => { + // Extract what the app actually did + const match = logs[0].match(/start: "([^"]+)", end: "([^"]+)"/) + const actualStart = new Date(match[1]) + const actualEnd = new Date(match[2]) + + // Verify it's a reasonable weekend range using real function + const daysDiff = (actualEnd - actualStart) / (1000 * 60 * 60 * 24) + expect(daysDiff).toBeGreaterThanOrEqual(2) // Fri to Sun minimum + expect(actualStart.getDay()).toBe(5) // Friday + expect(actualEnd.getDay()).toBe(0) // Sunday + } + } + ]) +}) +``` + +**Why:** +- Single source of truth for business logic +- If function logic changes, unit tests fail (appropriate place to catch it) +- E2E tests validate integration, not reimplemented logic + +--- + +### 4. Tests Must Survive Refactors + +The codebase is early-stage and **big refactors are planned** (see `docs/ai-proposal.md`). Tests must work before AND after refactoring. + +**Refactor-proof patterns:** +- ✅ Test user-visible behavior (button text, event counts) +- ✅ Use semantic selectors (getByRole, getByText) +- ✅ Validate state transitions via console logs (state machine won't change) +- ✅ Test workflows, not component implementation + +**Brittle patterns to avoid:** +- ❌ Testing specific callback chains (these will be removed) +- ❌ Testing component internal state (components will be restructured) +- ❌ Relying on CSS class names (may change during refactor) +- ❌ Testing implementation details (debounce timing, etc.) + +--- + +## Test Organization + +### File Structure + +``` +tests/e2e/ +├── test-utils.ts # Shared utilities (captureConsoleLogs, etc.) +├── smoke.spec.ts # 3 critical workflows (<20s) +├── user-workflows.spec.ts # All interactive tests +├── edge-cases.spec.ts # Error states, invalid inputs +└── console-logs.spec.ts # Debug helper +``` + +### Which File For What Test? + +**smoke.spec.ts** - Top 3 user workflows from analytics +- Load app with events +- View today's events (top workflow) +- View selected event from shared URL (top workflow) +- **Goal:** Fast feedback (<20s), run before every commit +- **Tag:** `@smoke` + +**user-workflows.spec.ts** - All user interactions +- Selected event (3 triggers, 3 visual cues, Exception behavior) +- Filter chips (create and remove: map, date, search) +- Search functionality +- Date selector (slider, calendar, quick filters) +- Map interactions (pan, zoom) +- **Goal:** Comprehensive coverage of user actions +- **Tag:** `@workflow` + +**edge-cases.spec.ts** - Error and boundary conditions +- No events state +- Invalid URL parameters +- Unresolved locations +- API errors (if testable) +- **Goal:** Medium priority edge cases +- **Tag:** `@edge` + +**console-logs.spec.ts** - Debug utility +- Capture logs from any URL +- Always passes (not a validation test) +- **Goal:** Fast debugging during development + +--- + +## What to Test Where + +| What | Where | Example | +|------|-------|---------| +| **Pure logic** | Unit tests | `calculateWeekendRange()` with various inputs | +| **State transitions** | E2E (console logs) | App moves from `applying-url-filters` → `user-interactive` | +| **User-visible behavior** | E2E (DOM) | Filter chip appears, event list updates | +| **Integration** | E2E (logs + DOM) | URL param → filter applied → state transitions → UI updates | +| **Timezone bugs** | E2E (logs + DOM) | Date conversion happens correctly, displayed properly | +| **Component updates** | E2E (interactive) | Click filter chip → state updates → UI syncs | +| **Selected Event behavior** | E2E (interactive) | Click event → map pans → popup appears → Exception applies | + +### Unit Tests vs E2E Tests + +**Unit tests** (`src/**/__tests__/*.test.ts`) +- Test pure functions in isolation +- Example: `calculateWeekendRange(todayValue, totalDays, getDateFromDays)` +- Fast (<1ms per test), no browser needed +- Already comprehensive ✅ + +**E2E tests** (`tests/e2e/*.spec.ts`) +- Test user workflows and integration +- USE unit-tested functions, don't reimplement +- Verify state transitions via console logs +- Test user-visible behavior via DOM + +--- + +## Selector Strategy + +**With 1,000-3,000 events, every attribute matters.** Follow this strict priority: + +### Priority 1: Semantic Selectors (Preferred) + +```typescript +// ✅ Buttons +page.getByRole('button', { name: /filtered by date/i }) +page.getByRole('button', { name: /visible/i }) + +// ✅ Table rows +page.getByRole('row', { name: /today event/i }) + +// ✅ Form inputs +page.getByLabel('Search events') +page.getByPlaceholder('Search...') + +// ✅ Text content +page.getByText(/filtered by map/i) +page.getByText('118 of 118 Visible') +``` + +**Why:** +- Built into HTML, zero performance overhead +- Accessibility-friendly +- Works before and after refactors + +### Priority 2: Stable CSS Selectors + +```typescript +// ✅ Library-provided classes (MapLibre) +page.locator('.maplibregl-popup') +page.locator('.maplibregl-canvas') + +// ✅ Existing ARIA attributes +page.locator('button[aria-label*="filter"]') + +// ✅ Stable custom classes (if they exist and won't change) +page.locator('.event-list-table') // Example from EventList.tsx:243 +``` + +**Why:** +- No DOM changes needed +- Works with existing structure +- Library classes won't change + +### Priority 3: data-testid (Last Resort - Use Sparingly!) + +**ONLY add to critical elements lacking semantic selectors:** + +```typescript +// ✅ Hidden state indicator (1 element, critical) +

+ +// Test usage: +const state = await page.locator('[data-app-state]').getAttribute('data-app-state') +expect(state).toBe('user-interactive') +``` + +**NEVER add to repeated elements:** +```typescript +// ❌ NEVER DO THIS - Performance impact with 3,000 events! + + +// ✅ DO THIS - Use semantic HTML + // Already has role +``` + +### Real Examples + +**Event List:** +```typescript +// ✅ Get event by name +const eventRow = page.getByRole('row', { name: /today event/i }) + +// ✅ Get all event rows +const eventRows = page.getByRole('row') +const count = await eventRows.count() + +// ✅ Get event table +const eventTable = page.locator('.event-list-table') // Stable class +``` + +**Filter Chips:** +```typescript +// ✅ Get by role and name +const dateChip = page.getByRole('button', { name: /filtered by date/i }) +const searchChip = page.getByRole('button', { name: /filtered by search/i }) +const mapChip = page.getByRole('button', { name: /filtered by map/i }) +``` + +**Marker Popup:** +```typescript +// ✅ Use MapLibre standard class +const popup = page.locator('.maplibregl-popup') +await expect(popup).toBeVisible() + +// ✅ Get popup content +const popupContent = popup.locator('.maplibregl-popup-content') +``` + +--- + +## Console Log Usage + +### When to Use Console Logs + +**✅ Use for state validation:** +```typescript +verifyLogPatterns(logs, [ + { + pattern: 'Processing quick date filter: weekend', + requiredInState: 'applying-url-filters' + }, + { + pattern: 'State: user-interactive' + } +]) +``` + +**✅ Use for internal behavior verification:** +```typescript +verifyLogPatterns(logs, [ + { + pattern: /setFilter: dateRange:/, + cb: (logs) => { + // Verify correct dates were calculated + const match = logs[0].match(/start: "([^"]+)", end: "([^"]+)"/) + // ... validate using real functions + } + } +]) +``` + +### When to Avoid Console Logs + +**❌ Don't rely on logs that might change:** +```typescript +// ❌ This debug log might be removed during refactor +pattern: 'DEBUG: handleViewportChange called' + +// ✅ Use state machine logs instead (won't change) +pattern: 'State: user-interactive' +``` + +### Best Practices + +1. **Use `requiredInState`** - Validates logs occur during correct app state +2. **Use callbacks for complex validation** - Extract data from logs and verify with real functions +3. **Focus on state transitions** - State machine is stable, won't change during refactor +4. **Don't test debug logs** - Only test logs that are part of core behavior + +--- + +## Test Data Strategy + +### testSource.ts - Controlled Test Data + +**Always use `test:stable` or `test:comprehensive` for E2E tests:** + +```typescript +// ✅ Stable test data +await page.goto('/?es=test:stable') + +// ❌ External data that can change +await page.goto('/?es=sf') // Only for manual testing +``` + +### Event Sets + +**`test:stable`** - Small set (5-10 events) for smoke tests +- Dynamic dates (always "today", "weekend", etc.) +- Known locations (SF, Oakland, Berkeley) +- One unresolved location +- Fast to load and process + +**`test:comprehensive`** - Large set (50-100 events) for full coverage +- Mix of dates (past, present, future) +- Various locations (spread out geographically) +- Multiple unresolved locations +- Edge cases (timezone boundaries, etc.) + +**`test:timezone`** - Static dates for timezone edge case testing +- Fixed UTC times (e.g., midnight UTC) +- Events in different timezones +- Timezone conversion edge cases + +### Dynamic vs Static Dates + +**Dynamic dates** (for smoke tests): +```typescript +{ + id: 'event-today', + start: () => getTodayAt(14, 0, 'America/Los_Angeles'), // Always "today" + // ... +} +``` +✅ Tests always work regardless of when run +❌ More complex + +**Static dates** (for timezone tests): +```typescript +{ + id: 'event-utc-midnight', + start: '2025-11-01T00:00:00Z', // Fixed date + // ... +} +``` +✅ Simple, predictable +❌ Tests might fail in different date ranges + +**Hybrid approach** (recommended): +- Smoke tests use dynamic dates +- Timezone edge case tests use static dates +- Comprehensive tests use mix + +--- + +## Mobile Testing + +### Device Configuration + +**Primary mobile device: iPhone 16** (most popular) + +```typescript +// playwright.config.ts +export default defineConfig({ + projects: [ + { + name: 'desktop-chrome', + use: { ...devices['Desktop Chrome'] } + }, + { + name: 'mobile-iphone16', + use: { + ...devices['iPhone 16'], + // Or manually if not in Playwright yet: + viewport: { width: 393, height: 852 }, + deviceScaleFactor: 3, + isMobile: true, + hasTouch: true + } + } + ] +}) +``` + +### Execution Strategy + +```bash +# Smoke tests - desktop only (fast feedback) +npm run test:e2e:smoke + +# Full tests - both desktop and mobile +npm run test:e2e:full + +# Mobile only +npm run test:e2e:mobile +``` + +### Mobile-Specific Testing + +**Test mobile-specific interactions:** +```typescript +test('Mobile: tap event to select @mobile', async ({ page }) => { + // Use tap instead of click + const eventRow = page.getByRole('row').first() + await eventRow.tap() // Mobile tap + + await expect(page.locator('.maplibregl-popup')).toBeVisible() +}) +``` + +**Test mobile layout:** +```typescript +test('Mobile: vertical layout works @mobile', async ({ page }) => { + await page.goto('/?es=test:stable') + + // Verify both map and list visible (stacked vertically) + await expect(page.getByRole('table')).toBeVisible() + await expect(page.locator('canvas.maplibregl-canvas')).toBeVisible() +}) +``` + +--- + +## Surviving Refactors + +### ai-proposal.md Context + +The codebase will undergo significant refactoring: +- Remove callback chains (5+ callbacks → 0 callbacks) +- Remove debounce complexity (sync bounds calculation) +- Simplify components (single responsibility) +- New hooks (useMapState, useMapSync) + +**Tests must work before AND after this refactor.** + +### What Will Change + +- ❌ Callback implementation (removed) +- ❌ Debounce timing (removed) +- ❌ Component internal structure +- ❌ Hook implementations + +### What Won't Change + +- ✅ User-visible behavior (buttons, chips, events) +- ✅ State machine transitions +- ✅ URL parameters and processing +- ✅ Filter logic (what gets filtered) +- ✅ Selected Event behavior and Exception +- ✅ Business logic functions (calculateWeekendRange, etc.) + +### Write Refactor-Proof Tests + +**Focus on what won't change:** + +```typescript +test('Pan map creates map filter chip', async ({ page }) => { + await page.goto('/?es=test:stable') + + // Get initial bounds (doesn't matter how - will work after refactor) + const initialCount = await page.getByRole('row').count() + + // Pan map (user action - won't change) + await page.locator('canvas.maplibregl-canvas').click({ position: { x: 100, y: 100 } }) + await page.mouse.move(200, 200) + + // Verify result (user-visible - won't change) + await expect(page.getByRole('button', { name: /filtered by map/i })).toBeVisible() + + const newCount = await page.getByRole('row').count() + expect(newCount).toBeLessThan(initialCount) +}) +``` + +**Avoid testing internals:** + +```typescript +// ❌ DON'T TEST THIS - Will break during refactor +test('debouncedUpdateBounds called after pan', async ({ page }) => { + // This tests implementation, not behavior +}) + +// ❌ DON'T TEST THIS - Callback chains are being removed +test('onBoundsChange callback fires', async ({ page }) => { + // Callbacks are being removed per ai-proposal.md +}) +``` + +--- + +## Summary + +**Core principles:** +1. Test user behavior, not implementation +2. Use console logs for state validation +3. E2E tests USE real functions +4. Tests must survive refactors + +**Selector priority:** +1. Semantic selectors (getByRole, getByText) +2. Stable CSS selectors (library classes) +3. data-testid (only when absolutely necessary) + +**Test organization:** +- `smoke.spec.ts` - 3 critical workflows (<20s) +- `user-workflows.spec.ts` - All interactions +- `edge-cases.spec.ts` - Error states + +**Key practices:** +- Always use `test:stable` event source +- Focus on user-visible behavior +- Validate state transitions via console logs +- Use semantic selectors (performance-conscious) +- Test on desktop + iPhone 16 + +--- + +**Next:** See [tests-e2e-examples.md](tests-e2e-examples.md) for code examples and [tests-e2e-migration.md](tests-e2e-migration.md) for implementation plan. diff --git a/docs/tests-e2e-examples.md b/docs/tests-e2e-examples.md new file mode 100644 index 0000000..4a3ade5 --- /dev/null +++ b/docs/tests-e2e-examples.md @@ -0,0 +1,917 @@ +# E2E Test Examples + +**Purpose:** Detailed code examples and patterns for writing E2E tests + +**Audience:** Developers and AI agents implementing E2E tests + +**Last Updated:** 2025-10-27 + +--- + +## Table of Contents + +1. [Selected Event Tests](#selected-event-tests) +2. [Filter Chip Tests](#filter-chip-tests) +3. [State Validation Tests](#state-validation-tests) +4. [Using Real Functions](#using-real-functions) +5. [Smoke Test Examples](#smoke-test-examples) +6. [Mobile Test Examples](#mobile-test-examples) +7. [Edge Case Examples](#edge-case-examples) +8. [Anti-Patterns](#anti-patterns) + +--- + +## Selected Event Tests + +Based on **usage.md section 4**: Selected Event has 3 triggers, 3 visual cues, and Exception behavior. + +### Trigger 1: Click Map Marker + +```typescript +// tests/e2e/user-workflows.spec.ts +import { test, expect } from '@playwright/test' +import { captureConsoleLogs, verifyLogPatterns, DEFAULT_CAPTURE_OPTIONS } from './test-utils' + +test('Click map marker selects event (map does not change)', async ({ page }) => { + await page.goto('/?es=test:stable') + + // Wait for app to be interactive + const logs = await captureConsoleLogs(page, '/?es=test:stable', { + ...DEFAULT_CAPTURE_OPTIONS, + waitForSpecificLog: 'State: user-interactive', + additionalWaitTime: 2000 + }) + + // Get initial map viewport to verify it doesn't change + const initialViewport = await page.evaluate(() => { + const map = window.mapRef?.current + return { + center: map?.getCenter(), + zoom: map?.getZoom() + } + }) + + // Click a map marker + const marker = page.locator('svg.maplibregl-marker').first() + await marker.click() + + // VISUAL CUE 1: Marker popup visible + const popup = page.locator('.maplibregl-popup') + await expect(popup).toBeVisible() + + // VISUAL CUE 2: Event row highlighted (green background) + // Get event ID from popup to find corresponding row + const eventName = await popup.locator('.maplibregl-popup-content').textContent() + const eventRow = page.getByRole('row', { name: new RegExp(eventName.trim(), 'i') }) + await expect(eventRow).toHaveCSS('background-color', /.*/) // Has background color set + + // VISUAL CUE 3: URL updated with se parameter + await page.waitForTimeout(500) // Give URL time to update + expect(page.url()).toMatch(/se=[^&]+/) + + // Verify map did NOT change (key difference from other triggers) + const finalViewport = await page.evaluate(() => { + const map = window.mapRef?.current + return { + center: map?.getCenter(), + zoom: map?.getZoom() + } + }) + expect(finalViewport.center.lng).toBeCloseTo(initialViewport.center.lng, 4) + expect(finalViewport.center.lat).toBeCloseTo(initialViewport.center.lat, 4) + expect(finalViewport.zoom).toBe(initialViewport.zoom) +}) +``` + +### Trigger 2: Click Event Row + +```typescript +test('Click event row selects event (map centers and zooms)', async ({ page }) => { + await page.goto('/?es=test:stable') + + // Wait for interactive state + await page.waitForLoadState('networkidle') + + // Get initial event list count + const initialEventCount = await page.getByRole('row').count() + + // Click an event row (use semantic selector) + const eventRow = page.getByRole('row', { name: /today event/i }) + await eventRow.click() + + // VISUAL CUE 1: Marker popup visible + const popup = page.locator('.maplibregl-popup') + await expect(popup).toBeVisible() + + // VISUAL CUE 2: Event row highlighted + await expect(eventRow).toHaveClass(/selected|highlighted|bg-green/) + + // VISUAL CUE 3: URL updated with se parameter + expect(page.url()).toContain('se=event-today') + + // Verify map DID change (panned/zoomed to event) + const mapChanged = await page.evaluate(() => { + // Map should have centered on event + return window.mapRef?.current?.getZoom() > 10 // Zoomed in + }) + expect(mapChanged).toBe(true) + + // SELECTED EVENTS EXCEPTION: Event list is FROZEN + // Even though map changed, event list should NOT update + const finalEventCount = await page.getByRole('row').count() + expect(finalEventCount).toBe(initialEventCount) // Count unchanged + + // Verify visible button shows same count (frozen) + const visibleButton = page.getByRole('button', { name: /visible/i }) + const buttonText = await visibleButton.textContent() + expect(buttonText).toMatch(/\d+ of \d+ visible/i) +}) +``` + +### Trigger 3: Load with se Parameter + +```typescript +test('Load with se parameter selects event', async ({ page }) => { + // Load URL with se parameter + const logs = await captureConsoleLogs(page, '/?es=test:stable&se=event-today-sf') + + // Verify state transitions include selected event processing + verifyLogPatterns(logs, [ + { + pattern: 'Processing selected event parameter: event-today-sf', + requiredInState: 'applying-url-filters', + description: 'Selected event parsed from URL' + }, + { + pattern: 'State: user-interactive', + description: 'App ready' + } + ]) + + // VISUAL CUE 1: Marker popup visible + const popup = page.locator('.maplibregl-popup') + await expect(popup).toBeVisible() + + // VISUAL CUE 2: Event row highlighted + const eventRow = page.getByRole('row', { name: /today event/i }) + await expect(eventRow).toHaveClass(/selected|highlighted|bg-green/) + + // VISUAL CUE 3: URL still has se parameter + expect(page.url()).toContain('se=event-today-sf') + + // Verify map centered on event (same as clicking event row) + const mapCentered = await page.evaluate(() => { + return window.mapRef?.current?.getZoom() > 10 + }) + expect(mapCentered).toBe(true) +}) +``` + +### Selected Events Exception Behavior + +```typescript +test('Selected event freezes event list and filters', async ({ page }) => { + await page.goto('/?es=test:stable') + await page.waitForLoadState('networkidle') + + // Get initial state + const initialEventCount = await page.getByRole('row').count() + const initialVisibleText = await page.getByRole('button', { name: /visible/i }).textContent() + + // Select an event by clicking row + const eventRow = page.getByRole('row', { name: /weekend event/i }) + await eventRow.click() + + // Wait for selection to complete + await expect(page.locator('.maplibregl-popup')).toBeVisible() + + // Map likely changed (zoomed in), but event list should be FROZEN + const frozenEventCount = await page.getByRole('row').count() + const frozenVisibleText = await page.getByRole('button', { name: /visible/i }).textContent() + + expect(frozenEventCount).toBe(initialEventCount) // FROZEN + expect(frozenVisibleText).toBe(initialVisibleText) // FROZEN + + // Map chip should NOT update (frozen) + const mapChip = page.getByRole('button', { name: /filtered by map/i }) + await expect(mapChip).toHaveCount(0) // No new chip + + // Close popup to deselect and UNFREEZE + const closeButton = page.locator('.maplibregl-popup-close-button') + await closeButton.click() + + // Wait for popup to close + await expect(page.locator('.maplibregl-popup')).toHaveCount(0) + + // Event list should now UNFREEZE and update + await page.waitForTimeout(500) // Give time for unfreeze + const unfrozenEventCount = await page.getByRole('row').count() + + // Map chip may now appear if map bounds changed + // (unless all events still fit in viewport) +}) +``` + +--- + +## Filter Chip Tests + +Based on **usage.md section 10**: Three filter types (map, date, search) with chips. + +### Map Filter Chip + +```typescript +test('Pan map creates map filter chip', async ({ page }) => { + await page.goto('/?es=test:stable') + await page.waitForLoadState('networkidle') + + // Verify no map chip initially + const mapChip = page.getByRole('button', { name: /filtered by map/i }) + await expect(mapChip).toHaveCount(0) + + // Get initial event count + const initialCount = await page.getByRole('row').count() + + // Pan map to move some events out of bounds + const canvas = page.locator('canvas.maplibregl-canvas') + await canvas.click({ position: { x: 200, y: 200 } }) + + // Drag to pan + await page.mouse.down() + await page.mouse.move(400, 400) + await page.mouse.up() + + // Wait for filter to apply + await page.waitForTimeout(1000) + + // Verify map filter chip appears + await expect(mapChip).toBeVisible() + + // Verify event list filtered + const filteredCount = await page.getByRole('row').count() + expect(filteredCount).toBeLessThan(initialCount) + + // Verify visible button updated + const visibleButton = page.getByRole('button', { name: /visible/i }) + const buttonText = await visibleButton.textContent() + expect(buttonText).toContain(`${filteredCount} of`) + + // Verify chip count matches filtered out count + const chipText = await mapChip.textContent() + const filteredOutCount = initialCount - filteredCount + expect(chipText).toContain(filteredOutCount.toString()) +}) + +test('Click map chip removes map filter', async ({ page }) => { + // Setup: create map filter by panning + await page.goto('/?es=test:stable') + await page.waitForLoadState('networkidle') + + // Pan to create filter + const canvas = page.locator('canvas.maplibregl-canvas') + await canvas.click({ position: { x: 200, y: 200 } }) + await page.mouse.down() + await page.mouse.move(400, 400) + await page.mouse.up() + await page.waitForTimeout(1000) + + // Verify chip exists + const mapChip = page.getByRole('button', { name: /filtered by map/i }) + await expect(mapChip).toBeVisible() + + const countWithFilter = await page.getByRole('row').count() + + // Click chip to remove filter + await mapChip.click() + + // Verify chip removed + await expect(mapChip).toHaveCount(0) + + // Verify all events visible again + const countWithoutFilter = await page.getByRole('row').count() + expect(countWithoutFilter).toBeGreaterThan(countWithFilter) + + // Verify visible button shows all events + const visibleButton = page.getByRole('button', { name: /visible/i }) + const buttonText = await visibleButton.textContent() + expect(buttonText).toMatch(/(\d+) of \1 visible/i) // X of X (same number) +}) +``` + +### Date Filter Chip + +```typescript +test('Apply weekend filter creates date chip', async ({ page }) => { + const logs = await captureConsoleLogs(page, '/?es=test:stable&qf=weekend') + + // Verify state transitions + verifyLogPatterns(logs, [ + { + pattern: 'Processing quick date filter: weekend', + requiredInState: 'applying-url-filters' + }, + { + pattern: /setFilter: dateRange:/, + requiredInState: 'applying-url-filters' + } + ]) + + // Verify date filter chip visible + const dateChip = page.getByRole('button', { name: /filtered by date/i }) + await expect(dateChip).toBeVisible() + + // Verify events are actually weekend events + const eventDates = await page.locator('tbody tr td').nth(1).allTextContents() // Date column + for (const dateStr of eventDates) { + const date = new Date(dateStr) + expect([5, 6, 0]).toContain(date.getDay()) // Fri, Sat, Sun + } + + // Verify chip count + const chipText = await dateChip.textContent() + expect(chipText).toMatch(/\d+ filtered by date/i) +}) + +test('Click date chip removes date filter', async ({ page }) => { + await page.goto('/?es=test:stable&qf=weekend') + await page.waitForLoadState('networkidle') + + // Get count with filter + const countWithFilter = await page.getByRole('row').count() + + // Click chip to clear + const dateChip = page.getByRole('button', { name: /filtered by date/i }) + await dateChip.click() + + // Verify chip removed + await expect(dateChip).toHaveCount(0) + + // Verify more events visible + const countWithoutFilter = await page.getByRole('row').count() + expect(countWithoutFilter).toBeGreaterThan(countWithFilter) + + // Verify visible button shows all events + const visibleText = await page.getByRole('button', { name: /visible/i }).textContent() + expect(visibleText).toMatch(/(\d+) of \1 visible/i) +}) +``` + +### Search Filter Chip + +```typescript +test('Type search creates search filter chip', async ({ page }) => { + await page.goto('/?es=test:stable') + await page.waitForLoadState('networkidle') + + // Get initial count + const initialCount = await page.getByRole('row').count() + + // Type in search box (use semantic selector) + const searchInput = page.getByLabel(/search/i) + await searchInput.fill('oakland') + + // Wait for filter to apply + await page.waitForTimeout(500) + + // Verify search filter chip appears + const searchChip = page.getByRole('button', { name: /filtered by search/i }) + await expect(searchChip).toBeVisible() + + // Verify events filtered + const filteredCount = await page.getByRole('row').count() + expect(filteredCount).toBeLessThan(initialCount) + + // Verify all visible events contain search term + const eventNames = await page.locator('tbody tr td').first().allTextContents() + for (const name of eventNames) { + expect(name.toLowerCase()).toContain('oakland') + } +}) + +test('Clear search removes search filter chip', async ({ page }) => { + await page.goto('/?es=test:stable&sq=oakland') + await page.waitForLoadState('networkidle') + + // Verify chip exists + const searchChip = page.getByRole('button', { name: /filtered by search/i }) + await expect(searchChip).toBeVisible() + + // Clear search box + const searchInput = page.getByLabel(/search/i) + await searchInput.clear() + + // Verify chip removed + await page.waitForTimeout(500) + await expect(searchChip).toHaveCount(0) + + // Verify all events visible + const visibleText = await page.getByRole('button', { name: /visible/i }).textContent() + expect(visibleText).toMatch(/(\d+) of \1 visible/i) +}) +``` + +--- + +## State Validation Tests + +Using console logs with `requiredInState` to validate app state transitions. + +### URL Parameter Processing + +```typescript +test('Weekend filter processes during applying-url-filters state', async ({ page }) => { + const logs = await captureConsoleLogs(page, '/?es=test:stable&qf=weekend') + + verifyLogPatterns(logs, [ + { + pattern: '[APP_STATE] changing: starting-app to fetching-data', + description: 'App starts' + }, + { + pattern: '[APP_STATE] changing: fetching-data to applying-url-filters', + description: 'Data fetched, ready to apply URL filters' + }, + { + pattern: 'Processing quick date filter: weekend', + requiredInState: 'applying-url-filters', + description: 'Weekend filter MUST process during applying-url-filters state' + }, + { + pattern: /setFilter: dateRange:.*start.*end/, + requiredInState: 'applying-url-filters', + description: 'Date range set during URL processing', + cb: (logs) => { + // Verify dates are reasonable weekend range + const match = logs[0].match(/start: "([^"]+)", end: "([^"]+)"/) + expect(match).toBeTruthy() + + const start = new Date(match[1]) + const end = new Date(match[2]) + + // Weekend: Friday to Sunday (2-3 days) + const daysDiff = (end - start) / (1000 * 60 * 60 * 24) + expect(daysDiff).toBeGreaterThanOrEqual(2) + expect(daysDiff).toBeLessThanOrEqual(3) + + expect(start.getDay()).toBe(5) // Friday + expect(end.getDay()).toBe(0) // Sunday + } + }, + { + pattern: '[APP_STATE] changing: applying-url-filters to user-interactive', + description: 'URL filters applied, app ready' + } + ]) +}) +``` + +### Multiple URL Parameters + +```typescript +test('Multiple URL parameters process in correct order', async ({ page }) => { + const logs = await captureConsoleLogs(page, '/?es=test:stable&qf=weekend&sq=oakland&llz=37.8044,-122.2712,12') + + verifyLogPatterns(logs, [ + { + pattern: 'Processing quick date filter: weekend', + requiredInState: 'applying-url-filters' + }, + { + pattern: 'Processing search query: oakland', + requiredInState: 'applying-url-filters' + }, + { + pattern: /Processing llz.*37.8044.*-122.2712.*12/, + requiredInState: 'applying-url-filters' + }, + { + pattern: 'State: user-interactive' + } + ]) + + // Verify all filters applied + await expect(page.getByRole('button', { name: /filtered by date/i })).toBeVisible() + await expect(page.getByRole('button', { name: /filtered by search/i })).toBeVisible() + + // Verify map centered on coordinates + const mapCenter = await page.evaluate(() => { + const map = window.mapRef?.current + return map?.getCenter() + }) + expect(mapCenter.lat).toBeCloseTo(37.8044, 2) + expect(mapCenter.lng).toBeCloseTo(-122.2712, 2) +}) +``` + +--- + +## Using Real Functions + +Import and use actual business logic functions instead of reimplementing. + +### Weekend Filter with Real Function + +```typescript +import { calculateQuickFilterRange } from '@/lib/utils/quickFilters' + +test('Weekend filter uses calculateWeekendRange correctly', async ({ page }) => { + const logs = await captureConsoleLogs(page, '/?es=test:stable&qf=weekend') + + verifyLogPatterns(logs, [ + { + pattern: /setFilter: dateRange:.*start.*end/, + cb: (logs) => { + // Extract actual dates from app logs + const logEntry = logs[0] + const match = logEntry.match(/start: "([^"]+)", end: "([^"]+)"/) + const actualStart = new Date(match[1]) + const actualEnd = new Date(match[2]) + + // Use real function to verify (don't reimplement logic) + // Note: We'd need to extract todayValue/totalDays from app context + // For now, verify basic properties that weekend range must have + + // Weekend must be Friday to Sunday + expect(actualStart.getDay()).toBe(5) // Friday + expect(actualEnd.getDay()).toBe(0) // Sunday + + // Weekend must be 2-3 days + const daysDiff = (actualEnd - actualStart) / (1000 * 60 * 60 * 24) + expect(daysDiff).toBeGreaterThanOrEqual(2) + expect(daysDiff).toBeLessThanOrEqual(3) + } + } + ]) +}) +``` + +### Date Calculation Validation + +```typescript +import { getDateFromUrlDateString } from '@/lib/utils/date' + +test('Custom date range processes correctly', async ({ page }) => { + const fsd = '2025-10-30' + const fed = '2025-11-02' + + const logs = await captureConsoleLogs(page, `/?es=test:stable&fsd=${fsd}&fed=${fed}`) + + verifyLogPatterns(logs, [ + { + pattern: /Processing filter dates: fsd.*fed/, + requiredInState: 'applying-url-filters' + }, + { + pattern: /setFilter: dateRange/, + cb: (logs) => { + const match = logs[0].match(/start: "([^"]+)", end: "([^"]+)"/) + const actualStart = new Date(match[1]) + const actualEnd = new Date(match[2]) + + // Use real function to parse expected dates + const expectedStart = getDateFromUrlDateString(fsd) + const expectedEnd = getDateFromUrlDateString(fed) + + // Compare (allowing for timezone differences) + expect(actualStart.toDateString()).toBe(expectedStart.toDateString()) + expect(actualEnd.toDateString()).toBe(expectedEnd.toDateString()) + } + } + ]) +}) +``` + +--- + +## Smoke Test Examples + +Fast tests (<20s total) for critical workflows. + +```typescript +// tests/e2e/smoke.spec.ts +import { test, expect } from '@playwright/test' + +test.describe('Smoke Tests @smoke', () => { + test('Load app with events', async ({ page }) => { + await page.goto('/?es=test:stable') + + // Fast verification: map and list visible + await expect(page.locator('canvas.maplibregl-canvas')).toBeVisible() + await expect(page.getByRole('table')).toBeVisible() + + // Verify events loaded + const eventCount = await page.getByRole('row').count() + expect(eventCount).toBeGreaterThan(0) + + // Verify visible button shows counts + const visibleButton = page.getByRole('button', { name: /visible/i }) + await expect(visibleButton).toBeVisible() + const buttonText = await visibleButton.textContent() + expect(buttonText).toMatch(/\d+ of \d+ visible/i) + }) + + test('View today\'s events', async ({ page }) => { + await page.goto('/?es=test:stable&qf=today') + + // Verify date filter chip + await expect(page.getByRole('button', { name: /filtered by date/i })).toBeVisible() + + // Verify at least one event (test data includes today event) + const eventCount = await page.getByRole('row').count() + expect(eventCount).toBeGreaterThan(0) + + // Quick check: events are today (first event should be) + const firstEventDate = await page.locator('tbody tr').first().locator('td').nth(1).textContent() + const today = new Date().toISOString().split('T')[0] + expect(firstEventDate).toContain(today) + }) + + test('View selected event from shared URL', async ({ page }) => { + await page.goto('/?es=test:stable&se=event-today-sf') + + // Verify all 3 visual cues (fast checks) + await expect(page.locator('.maplibregl-popup')).toBeVisible() // 1. Popup + expect(page.url()).toContain('se=event-today-sf') // 2. URL + + // 3. Row highlighted (find it by event name) + const eventRow = page.getByRole('row', { name: /today event/i }) + await expect(eventRow).toHaveCSS('background-color', /.*/) + }) +}) +``` + +--- + +## Mobile Test Examples + +Testing on iPhone 16 viewport. + +```typescript +// tests/e2e/user-workflows.spec.ts +test('Mobile: tap event to select @mobile', async ({ page }) => { + // Configure mobile viewport + await page.setViewportSize({ width: 393, height: 852 }) + + await page.goto('/?es=test:stable') + await page.waitForLoadState('networkidle') + + // Use tap instead of click for mobile + const eventRow = page.getByRole('row', { name: /today event/i }) + await eventRow.tap() + + // Verify selection (same as desktop) + await expect(page.locator('.maplibregl-popup')).toBeVisible() + await expect(eventRow).toHaveClass(/selected|highlighted/) + expect(page.url()).toContain('se=event-today') +}) + +test('Mobile: vertical layout works @mobile', async ({ page }) => { + await page.setViewportSize({ width: 393, height: 852 }) + + await page.goto('/?es=test:stable') + + // Verify both map and list visible (stacked vertically on mobile) + const eventTable = page.getByRole('table') + const mapCanvas = page.locator('canvas.maplibregl-canvas') + + await expect(eventTable).toBeVisible() + await expect(mapCanvas).toBeVisible() + + // On mobile, list should be above map (or vice versa) + const tableBox = await eventTable.boundingBox() + const mapBox = await mapCanvas.boundingBox() + + // One should be above the other (Y coordinates different) + expect(Math.abs(tableBox.y - mapBox.y)).toBeGreaterThan(100) +}) + +test('Mobile: filter chips accessible @mobile', async ({ page }) => { + await page.setViewportSize({ width: 393, height: 852 }) + + await page.goto('/?es=test:stable&qf=weekend&sq=oakland') + + // Verify chips visible and tappable on mobile + const dateChip = page.getByRole('button', { name: /filtered by date/i }) + const searchChip = page.getByRole('button', { name: /filtered by search/i }) + + await expect(dateChip).toBeVisible() + await expect(searchChip).toBeVisible() + + // Tap to remove + await dateChip.tap() + await expect(dateChip).toHaveCount(0) +}) +``` + +--- + +## Edge Case Examples + +Error states and boundary conditions. + +### No Events State + +```typescript +test('Handle no events gracefully', async ({ page }) => { + // Use event source that returns no events (or filter to zero) + await page.goto('/?es=test:stable&sq=xyznonexistent') + + // Verify map still visible + await expect(page.locator('canvas.maplibregl-canvas')).toBeVisible() + + // Verify empty state message or zero count + const eventCount = await page.getByRole('row').count() + expect(eventCount).toBe(0) + + // Verify visible button shows 0 + const visibleButton = page.getByRole('button', { name: /visible/i }) + const buttonText = await visibleButton.textContent() + expect(buttonText).toMatch(/0 of \d+ visible/i) +}) +``` + +### Invalid URL Parameters + +```typescript +test('Handle invalid event source', async ({ page }) => { + await page.goto('/?es=invalid-source-xyz') + + // Should show error or redirect to home + // (Exact behavior depends on implementation) + const hasError = await page.getByText(/error|invalid/i).isVisible().catch(() => false) + const isHome = page.url().endsWith('/') + + expect(hasError || isHome).toBe(true) +}) + +test('Handle invalid selected event ID', async ({ page }) => { + await page.goto('/?es=test:stable&se=nonexistent-event-id') + + // Should load app normally but no selection + await expect(page.locator('canvas.maplibregl-canvas')).toBeVisible() + + // No popup should appear + await expect(page.locator('.maplibregl-popup')).toHaveCount(0) + + // se parameter may be removed from URL + // (Or remain but ignored) +}) + +test('Handle invalid date parameters', async ({ page }) => { + await page.goto('/?es=test:stable&fsd=invalid-date&fed=also-invalid') + + // Should load app with default date range (no filter) + await expect(page.locator('canvas.maplibregl-canvas')).toBeVisible() + + // No date filter chip should appear + const dateChip = page.getByRole('button', { name: /filtered by date/i }) + await expect(dateChip).toHaveCount(0) +}) +``` + +### Unresolved Locations + +```typescript +test('Show unresolved locations with special search', async ({ page }) => { + await page.goto('/?es=test:stable&sq=unresolved') + + // Verify search chip appears + await expect(page.getByRole('button', { name: /filtered by search/i })).toBeVisible() + + // Verify only unresolved events shown + const eventRows = await page.getByRole('row').count() + expect(eventRows).toBeGreaterThan(0) + + // Verify events have "unresolved" in location + const locations = await page.locator('tbody tr td').nth(3).allTextContents() // Location column + for (const location of locations) { + expect(location.toLowerCase()).toContain('unresolved') + } +}) +``` + +--- + +## Anti-Patterns + +Examples of what NOT to do. + +### ❌ DON'T: Add data-testid to Repeated Elements + +```typescript +// ❌ BAD - Performance impact with 3,000 events + + {event.name} + {event.date} + + +// ✅ GOOD - Use semantic HTML + + {event.name} + {event.date} + + +// Test with semantic selectors +const eventRow = page.getByRole('row', { name: /event name/i }) +``` + +### ❌ DON'T: Reimplement Business Logic + +```typescript +// ❌ BAD - Reimplementing weekend calculation +test('Weekend filter', async ({ page }) => { + const today = new Date() + const dayOfWeek = today.getDay() + let daysToFriday = 0 + if (dayOfWeek === 0) daysToFriday = 5 + else if (dayOfWeek < 5) daysToFriday = 5 - dayOfWeek + // ... 15 more lines of date math +}) + +// ✅ GOOD - Use real function or verify properties +import { calculateQuickFilterRange } from '@/lib/utils/quickFilters' + +test('Weekend filter', async ({ page }) => { + // Verify weekend properties (Friday to Sunday) + const logs = await captureConsoleLogs(page, '/?es=test:stable&qf=weekend') + verifyLogPatterns(logs, [{ + pattern: /setFilter: dateRange/, + cb: (logs) => { + const match = logs[0].match(/start: "([^"]+)", end: "([^"]+)"/) + expect(new Date(match[1]).getDay()).toBe(5) // Friday + expect(new Date(match[2]).getDay()).toBe(0) // Sunday + } + }]) +}) +``` + +### ❌ DON'T: Test Implementation Details + +```typescript +// ❌ BAD - Testing callback chains (will be removed) +test('onBoundsChange callback fires', async ({ page }) => { + // Testing implementation that will change per ai-proposal.md + const callbackSpy = await page.evaluate(() => { + return window.onBoundsChangeCallback + }) + expect(callbackSpy).toHaveBeenCalled() +}) + +// ✅ GOOD - Test behavior +test('Pan map filters events', async ({ page }) => { + // Test what user sees + await page.goto('/?es=test:stable') + // ... pan map ... + await expect(page.getByRole('button', { name: /filtered by map/i })).toBeVisible() +}) +``` + +### ❌ DON'T: Use waitForTimeout Without Reason + +```typescript +// ❌ BAD - Arbitrary timeout +await page.waitForTimeout(5000) // Why 5 seconds? + +// ✅ GOOD - Wait for specific condition +await expect(page.getByRole('button', { name: /filtered/i })).toBeVisible() + +// ✅ GOOD - Wait for network idle +await page.waitForLoadState('networkidle') + +// ✅ GOOD - Wait for state +const logs = await captureConsoleLogs(page, url, { + waitForSpecificLog: 'State: user-interactive' +}) +``` + +### ❌ DON'T: Use External Test Data + +```typescript +// ❌ BAD - External data can change +await page.goto('/?es=sf') // Real SF events change over time + +// ✅ GOOD - Controlled test data +await page.goto('/?es=test:stable') // Predictable, stable data +``` + +--- + +## Summary + +**Key patterns:** +- Selected Event: 3 triggers, 3 cues, Exception behavior +- Filter Chips: Create and remove for map, date, search +- State Validation: Use console logs with requiredInState +- Real Functions: Import and use, don't reimplement +- Semantic Selectors: getByRole, getByText (performance-conscious) + +**Avoid:** +- data-testid on repeated elements +- Reimplementing business logic +- Testing implementation details +- Arbitrary timeouts +- External test data + +--- + +**Next:** See [tests-e2e-migration.md](tests-e2e-migration.md) for implementation plan. diff --git a/docs/tests-e2e-migration.md b/docs/tests-e2e-migration.md new file mode 100644 index 0000000..192881f --- /dev/null +++ b/docs/tests-e2e-migration.md @@ -0,0 +1,687 @@ +# E2E Test Migration Plan + +**Purpose:** Phased implementation plan for E2E test improvements + +**Audience:** Developers and AI agents implementing the E2E test suite + +**Last Updated:** 2025-10-27 + +--- + +## Table of Contents + +1. [Overview](#overview) +2. [Phase 0: Foundation](#phase-0-foundation-week-1) +3. [Phase 1: Core Workflows](#phase-1-core-workflows-week-2-3) +4. [Phase 2: Comprehensive Coverage](#phase-2-comprehensive-coverage-week-4-5) +5. [Success Criteria](#success-criteria) +6. [Rollback Plan](#rollback-plan) + +--- + +## Overview + +### Goals + +1. **Test critical user workflows** based on actual usage (Selected Event, filters) +2. **Fast smoke tests** (<20s) for commit-time feedback +3. **Mobile coverage** (50% of users on iPhone 16) +4. **Refactor-proof tests** that survive ai-proposal.md changes +5. **Performance-conscious** (no data-testid on 3,000 events) + +### Current State + +**Existing tests (10 total):** +- ✅ URL parameter processing (comprehensive) +- ✅ Page load verification +- ✅ Date filter clearing (2 tests) +- ❌ Missing: Selected Event (3 triggers, Exception) +- ❌ Missing: Filter chips (map, search) +- ❌ Missing: Mobile testing + +**Strengths:** +- Good test utilities (test-utils.ts) +- State-aware pattern (requiredInState) +- Console log capture working well + +**Gaps:** +- No smoke tests for fast feedback +- Missing critical workflows (Selected Event) +- Desktop Chromium only (50% of users on mobile) + +--- + +## Phase 0: Foundation (Week 1) + +**Goal:** Establish infrastructure for all future tests + +### Task 0.1: Expand testSource.ts + +**File:** `src/lib/api/eventSources/testSource.ts` + +**Add dynamic event data for stable tests:** + +```typescript +import { addDays, startOfDay, setHours, nextSaturday } from 'date-fns' + +// Helper functions +function getTodayAt(hour: number, minute: number, timezone = 'America/Los_Angeles') { + const now = new Date() + const date = setHours(startOfDay(now), hour) + date.setMinutes(minute) + return date.toISOString() +} + +function getTomorrowAt(hour: number, minute: number, timezone = 'America/Los_Angeles') { + const tomorrow = addDays(new Date(), 1) + const date = setHours(startOfDay(tomorrow), hour) + date.setMinutes(minute) + return date.toISOString() +} + +function getNextWeekendFriday(hour: number, minute: number, timezone = 'America/Los_Angeles') { + const now = new Date() + const dayOfWeek = now.getDay() + let daysToFriday = 0 + + if (dayOfWeek === 0) daysToFriday = 5 // Sunday + else if (dayOfWeek < 5) daysToFriday = 5 - dayOfWeek // Mon-Thu + else if (dayOfWeek === 5) daysToFriday = 7 // Friday (next week) + else daysToFriday = 6 // Saturday + + const friday = addDays(now, daysToFriday) + const date = setHours(startOfDay(friday), hour) + date.setMinutes(minute) + return date.toISOString() +} + +// Test event sets +export const TEST_EVENTS = { + // Dynamic dates for smoke tests + stable: [ + { + id: 'event-today-sf', + name: 'Today Event SF', + description: 'Event happening today in San Francisco', + start: getTodayAt(14, 0), + end: getTodayAt(16, 0), + location: 'San Francisco, CA', + location_details: { + resolved_location: { + lat: 37.7749, + lng: -122.4194, + formatted_address: 'San Francisco, CA, USA' + } + }, + tz: 'America/Los_Angeles' + }, + { + id: 'event-weekend-oakland', + name: 'Weekend Event Oakland', + description: 'Weekend event in Oakland', + start: getNextWeekendFriday(18, 0), + end: getNextWeekendFriday(22, 0), + location: 'Oakland, CA', + location_details: { + resolved_location: { + lat: 37.8044, + lng: -122.2712, + formatted_address: 'Oakland, CA, USA' + } + }, + tz: 'America/Los_Angeles' + }, + { + id: 'event-tomorrow-berkeley', + name: 'Tomorrow Event Berkeley', + description: 'Event tomorrow in Berkeley', + start: getTomorrowAt(10, 0), + end: getTomorrowAt(12, 0), + location: 'Berkeley, CA', + location_details: { + resolved_location: { + lat: 37.8715, + lng: -122.2730, + formatted_address: 'Berkeley, CA, USA' + } + }, + tz: 'America/Los_Angeles' + }, + { + id: 'event-unresolved', + name: 'Unresolved Location Event', + description: 'Event with unresolved location', + start: getTodayAt(20, 0), + end: getTodayAt(22, 0), + location: 'gibberish123', + location_details: { + resolved_location: null + }, + tz: 'UNKNOWN_TZ' + } + ], + + // Static dates for timezone edge case testing + timezone: [ + { + id: 'event-utc-midnight', + name: 'UTC Midnight Event', + description: 'Event at midnight UTC to test timezone conversion', + start: '2025-11-01T00:00:00Z', + end: '2025-11-01T02:00:00Z', + location: 'New York, NY', + location_details: { + resolved_location: { + lat: 40.7128, + lng: -74.0060, + formatted_address: 'New York, NY, USA' + } + }, + tz: 'America/New_York' + } + ] +} + +// Existing testSource.ts handler should use TEST_EVENTS.stable +``` + +**Effort:** 2-3 hours +**Value:** High - Foundation for all tests +**Confidence:** 95% + +--- + +### Task 0.2: Add Minimal data-testid + +**Only add ONE data-testid attribute for app state:** + +**File:** `src/app/page.tsx` or `src/components/map/MapContainer.tsx` + +```typescript +// Add hidden state indicator (ONE element, critical for state validation) +