# Manual Testing Plan - UI/UX Improvements

**Date**: 2026-01-20
**Testing Focus**: Onboarding Tour, Mobile Navigation, Dark Mode, Admin Routes
**Tester**: [Your Name]
**Environment**: Dev Container (`http://localhost:5173`)

---

## Pre-Testing Setup

### 1. Start Dev Server

```bash
podman exec -it flyer-crawler-dev npm run dev:container
```

**Expected**: Server starts at `http://localhost:5173`

### 2. Open Browser

- Primary browser: Chrome/Edge (DevTools required)
- Secondary: Firefox, Safari (for cross-browser testing)
- Enable DevTools: F12 or Ctrl+Shift+I

### 3. Prepare Test Environment

- Clear browser cache
- Clear all cookies for localhost
- Open DevTools → Application → Local Storage
- Note any existing keys

---

## Test Suite 1: Onboarding Tour

### Test 1.1: First-Time User Experience ⭐ CRITICAL

**Objective**: Verify tour starts automatically for new users

**Steps**:

1. Open DevTools → Application → Local Storage → `http://localhost:5173`
2. Delete key: `flyer_crawler_onboarding_completed` (if exists)
3. Refresh page (F5)
4. Observe page load

**Expected Results**:

- ✅ Tour modal appears automatically within 2 seconds
- ✅ First tooltip points to "Flyer Uploader" section
- ✅ Tooltip shows "Step 1 of 6"
- ✅ Tooltip contains text: "Upload grocery flyers here..."
- ✅ "Skip" button visible in top-right
- ✅ "Next" button visible at bottom

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 1.2: Tour Navigation

**Objective**: Verify all 6 tour steps are accessible and display correctly

**Steps**:

1. Ensure tour is active (from Test 1.1)
2. Click "Next" button
3. Repeat for all 6 steps, noting each tooltip

**Expected Results**:

| Step | Target Element       | Tooltip Text Snippet                   | Pass/Fail |
| ---- | -------------------- | -------------------------------------- | --------- |
| 1    | Flyer Uploader       | "Upload grocery flyers here..."        | [ ]       |
| 2    | Extracted Data Table | "View AI-extracted items..."           | [ ]       |
| 3    | Watch Button         | "Click + Watch to track items..."      | [ ]       |
| 4    | Watched Items List   | "Your watchlist appears here..."       | [ ]       |
| 5    | Price Chart          | "See active deals on watched items..." | [ ]       |
| 6    | Shopping List        | "Create shopping lists..."             | [ ]       |

**Additional Checks**:

- ✅ Progress indicator updates (1/6 → 2/6 → ... → 6/6)
- ✅ Each tooltip highlights correct element
- ✅ "Previous" button works (after step 2)
- ✅ No JavaScript errors in console

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 1.3: Tour Completion

**Objective**: Verify tour completion saves to localStorage

**Steps**:

1. Complete all 6 steps (click "Next" 5 times)
2. On step 6, click "Done" or "Finish"
3. Open DevTools → Application → Local Storage
4. Check for key: `flyer_crawler_onboarding_completed`

**Expected Results**:

- ✅ Tour closes after final step
- ✅ localStorage key `flyer_crawler_onboarding_completed` = `"true"`
- ✅ No tour modal visible
- ✅ Application fully functional

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 1.4: Tour Skip

**Objective**: Verify "Skip" button works and saves preference

**Steps**:

1. Delete localStorage key (reset)
2. Refresh page to start tour
3. Click "Skip" button on step 1
4. Check localStorage

**Expected Results**:

- ✅ Tour closes immediately
- ✅ localStorage key saved: `flyer_crawler_onboarding_completed` = `"true"`
- ✅ Application remains functional
- ✅ No errors in console

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 1.5: Tour Does Not Repeat

**Objective**: Verify tour doesn't show for returning users

**Steps**:

1. Ensure localStorage key exists from previous test
2. Refresh page multiple times
3. Navigate to different routes (/deals, /lists)
4. Return to home page

**Expected Results**:

- ✅ Tour modal never appears
- ✅ No tour-related elements visible
- ✅ Application loads normally

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

## Test Suite 2: Mobile Navigation

### Test 2.1: Responsive Breakpoints - Mobile (375px)

**Objective**: Verify mobile layout at iPhone SE width

**Setup**:

1. Open DevTools → Toggle Device Toolbar (Ctrl+Shift+M)
2. Select "iPhone SE" or set custom width to 375px
3. Refresh page

**Expected Results**:

| Element                   | Expected Behavior             | Pass/Fail |
| ------------------------- | ----------------------------- | --------- |
| Bottom Tab Bar            | ✅ Visible at bottom          | [ ]       |
| Left Sidebar (Flyer List) | ✅ Hidden                     | [ ]       |
| Right Sidebar (Widgets)   | ✅ Hidden                     | [ ]       |
| Main Content              | ✅ Full width, single column  | [ ]       |
| Bottom Padding            | ✅ 64px padding below content | [ ]       |

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 2.2: Responsive Breakpoints - Tablet (768px)

**Objective**: Verify mobile layout at iPad width

**Setup**:

1. Set device width to 768px (iPad)
2. Refresh page

**Expected Results**:

- ✅ Bottom tab bar still visible
- ✅ Sidebars still hidden
- ✅ Content uses full width
- ✅ Tab bar does NOT overlap content

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 2.3: Responsive Breakpoints - Desktop (1024px+)

**Objective**: Verify desktop layout unchanged

**Setup**:

1. Set device width to 1440px (desktop)
2. Refresh page

**Expected Results**:

- ✅ Bottom tab bar HIDDEN
- ✅ Left sidebar (flyer list) VISIBLE
- ✅ Right sidebar (widgets) VISIBLE
- ✅ 3-column grid layout intact
- ✅ No layout changes from before

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 2.4: Tab Navigation - Home

**Objective**: Verify Home tab navigation

**Setup**: Set width to 375px (mobile)

**Steps**:

1. Tap "Home" tab in bottom bar
2. Observe page content

**Expected Results**:

- ✅ Tab icon highlighted in teal (#14b8a6)
- ✅ Tab label highlighted
- ✅ URL changes to `/`
- ✅ HomePage component renders
- ✅ Shows flyer view and upload section

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 2.5: Tab Navigation - Deals

**Objective**: Verify Deals tab navigation

**Steps**:

1. Tap "Deals" tab (TagIcon)
2. Observe page content

**Expected Results**:

- ✅ Tab icon highlighted in teal
- ✅ URL changes to `/deals`
- ✅ DealsPage component renders
- ✅ Shows WatchedItemsList component
- ✅ Shows PriceChart component
- ✅ Shows PriceHistoryChart component
- ✅ Previous tab (Home) is unhighlighted

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 2.6: Tab Navigation - Lists

**Objective**: Verify Lists tab navigation

**Steps**:

1. Tap "Lists" tab (ListBulletIcon)
2. Observe page content

**Expected Results**:

- ✅ Tab icon highlighted in teal
- ✅ URL changes to `/lists`
- ✅ ShoppingListsPage component renders
- ✅ Shows ShoppingList component
- ✅ Can create/view shopping lists

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 2.7: Tab Navigation - Profile

**Objective**: Verify Profile tab navigation

**Steps**:

1. Tap "Profile" tab (UserIcon)
2. Observe page content

**Expected Results**:

- ✅ Tab icon highlighted in teal
- ✅ URL changes to `/profile`
- ✅ UserProfilePage component renders
- ✅ Shows user profile information
- ✅ Shows achievements (if logged in)

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 2.8: Touch Target Size (Accessibility)

**Objective**: Verify touch targets meet 44x44px minimum (WCAG 2.5.5)

**Steps**:

1. Stay in mobile view (375px)
2. Open DevTools → Elements
3. Inspect each tab in bottom bar
4. Check computed dimensions

**Expected Results**:

- ✅ Each tab button: min-height: 44px
- ✅ Each tab button: min-width: 44px
- ✅ Icon is centered
- ✅ Label is readable below icon
- ✅ Adequate spacing between tabs

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 2.9: Tab Bar Visibility on Admin Routes

**Objective**: Verify tab bar hidden on admin pages

**Steps**:

1. Navigate to `/admin` (may need to log in as admin)
2. Check bottom of page
3. Navigate to `/admin/stats`
4. Navigate to `/admin/corrections`

**Expected Results**:

- ✅ Tab bar NOT visible on `/admin`
- ✅ Tab bar NOT visible on any `/admin/*` routes
- ✅ Admin pages function normally
- ✅ Footer visible as normal

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

## Test Suite 3: Dark Mode

### Test 3.1: Dark Mode Toggle

**Objective**: Verify dark mode toggle works for new components

**Steps**:

1. Ensure you're in light mode (check header toggle)
2. Click dark mode toggle in header
3. Observe all new components

**Expected Results - DealsPage**:

- ✅ Background changes to dark gray (#1f2937 or similar)
- ✅ Text changes to light colors
- ✅ WatchedItemsList: dark background, light text
- ✅ PriceChart: dark theme colors
- ✅ No white boxes remaining

**Expected Results - ShoppingListsPage**:

- ✅ Background changes to dark
- ✅ ShoppingList cards: dark background
- ✅ Input fields: dark background with light text
- ✅ Buttons maintain brand colors

**Expected Results - FlyersPage**:

- ✅ Background dark
- ✅ Flyer cards: dark theme
- ✅ FlyerUploader: dark background

**Expected Results - MobileTabBar**:

- ✅ Tab bar background: dark (#111827 or similar)
- ✅ Border top: dark border color
- ✅ Inactive tab icons: gray
- ✅ Active tab icon: teal (#14b8a6)

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 3.2: Dark Mode Persistence

**Objective**: Verify dark mode preference persists across navigation

**Steps**:

1. Enable dark mode
2. Navigate between tabs: Home → Deals → Lists → Profile
3. Refresh page
4. Check mode

**Expected Results**:

- ✅ Dark mode stays enabled across all routes
- ✅ Dark mode persists after page refresh
- ✅ All pages render in dark mode consistently

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 3.3: Button Component in Dark Mode

**Objective**: Verify Button component variants in dark mode

**Setup**: Enable dark mode

**Check each variant**:

| Variant   | Expected Dark Mode Colors      | Pass/Fail |
| --------- | ------------------------------ | --------- |
| Primary   | bg-brand-secondary, text-white | [ ]       |
| Secondary | bg-gray-700, text-gray-200     | [ ]       |
| Danger    | bg-red-900/50, text-red-300    | [ ]       |
| Ghost     | hover: bg-gray-700/50          | [ ]       |

**Locations to check**:

- FlyerUploader: "Upload Another Flyer" (primary)
- ShoppingList: "New List" (secondary)
- ShoppingList: "Delete List" (danger)
- FlyerUploader: "Stop Watching" (ghost)

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 3.4: Onboarding Tour in Dark Mode

**Objective**: Verify tour tooltips work in dark mode

**Steps**:

1. Enable dark mode
2. Delete localStorage key to reset tour
3. Refresh to start tour
4. Navigate through all 6 steps

**Expected Results**:

- ✅ Tooltip background visible (not too dark)
- ✅ Tooltip text readable (good contrast)
- ✅ Progress indicator visible
- ✅ Buttons clearly visible
- ✅ Highlighted elements stand out
- ✅ No visual glitches

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

## Test Suite 4: Admin Routes

### Test 4.1: Admin Access (Requires Admin User)

**Objective**: Verify admin routes still function correctly

**Prerequisites**: Need admin account credentials

**Steps**:

1. Log in as admin user
2. Click admin shield icon in header
3. Should navigate to `/admin`

**Expected Results**:

- ✅ Admin dashboard loads
- ✅ 4 links visible: Corrections, Stats, Flyer Review, Stores
- ✅ SystemCheck component shows health checks
- ✅ Layout looks correct (no mobile tab bar)

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 4.2: Admin Subpages

**Objective**: Verify all admin subpages load

**Steps**:

1. From admin dashboard, click each link:
   - Corrections → `/admin/corrections`
   - Stats → `/admin/stats`
   - Flyer Review → `/admin/flyer-review`
   - Stores → `/admin/stores`

**Expected Results**:

- ✅ Each page loads without errors
- ✅ No mobile tab bar visible
- ✅ Desktop layout maintained
- ✅ All admin functionality works
- ✅ Can navigate back to `/admin`

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 4.3: Admin in Mobile View

**Objective**: Verify admin pages work in mobile view

**Steps**:

1. Set device width to 375px
2. Navigate to `/admin`
3. Check layout

**Expected Results**:

- ✅ Admin page renders correctly
- ✅ No mobile tab bar visible
- ✅ Content is readable (may scroll)
- ✅ All buttons/links clickable
- ✅ No layout breaking

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

## Test Suite 5: Integration Tests

### Test 5.1: Cross-Feature Navigation

**Objective**: Verify navigation between new and old features

**Scenario**: User journey through app

**Steps**:

1. Start on Home page (mobile view)
2. Upload a flyer (if possible)
3. Click "Deals" tab → should see deals page
4. Add item to watchlist (from deals page)
5. Click "Lists" tab → create shopping list
6. Add item to shopping list
7. Click "Profile" tab → view profile
8. Click "Home" tab → return to home

**Expected Results**:

- ✅ All navigation works smoothly
- ✅ No data loss between pages
- ✅ Active tab always correct
- ✅ Back button works (browser history)
- ✅ No JavaScript errors

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 5.2: Button Component Integration

**Objective**: Verify Button component works in all contexts

**Steps**:

1. Navigate to page with buttons (FlyerUploader, ShoppingList)
2. Click each button variant
3. Test loading states
4. Test disabled states

**Expected Results**:

- ✅ All buttons clickable
- ✅ Loading spinner appears when appropriate
- ✅ Disabled buttons prevent clicks
- ✅ Icons render correctly
- ✅ Hover states work

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 5.3: Brand Colors Visual Check

**Objective**: Verify brand colors display correctly throughout app

**Check these elements**:

- ✅ Active tab in tab bar: teal (#14b8a6)
- ✅ Primary buttons: teal background
- ✅ Links on hover: teal color
- ✅ Focus rings: teal color
- ✅ Watched item indicators: green (not brand color)
- ✅ All teal shades consistent

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

## Test Suite 6: Error Scenarios

### Test 6.1: Missing Data

**Objective**: Verify pages handle empty states gracefully

**Steps**:

1. Navigate to /deals (without watched items)
2. Navigate to /lists (without shopping lists)
3. Navigate to /flyers (without uploaded flyers)

**Expected Results**:

- ✅ Empty state messages shown
- ✅ No JavaScript errors
- ✅ Clear calls to action displayed
- ✅ Page structure intact

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 6.2: Network Errors (Simulated)

**Objective**: Verify app handles network failures

**Steps**:

1. Open DevTools → Network tab
2. Set throttling to "Offline"
3. Try to navigate between tabs
4. Try to load data

**Expected Results**:

- ✅ Error messages displayed
- ✅ App doesn't crash
- ✅ Can retry actions
- ✅ Navigation still works (cached)

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

## Test Suite 7: Performance

### Test 7.1: Page Load Speed

**Objective**: Verify new features don't slow down app

**Steps**:

1. Open DevTools → Network tab
2. Disable cache
3. Refresh page
4. Note "Load" time in Network tab

**Expected Results**:

- ✅ Initial load: < 3 seconds
- ✅ Route changes: < 500ms
- ✅ No long-running scripts
- ✅ No memory leaks (use Performance Monitor)

**Pass/Fail**: [ ]

**Measurements**:

- Initial load: **\_\_\_** ms
- Home → Deals: **\_\_\_** ms
- Deals → Lists: **\_\_\_** ms

---

### Test 7.2: Bundle Size

**Objective**: Verify bundle size increase is acceptable

**Steps**:

1. Run: `npm run build`
2. Check `dist/` folder size
3. Compare to previous build (if available)

**Expected Results**:

- ✅ Bundle size increase: < 50KB
- ✅ No duplicate libraries loaded
- ✅ Tree-shaking working

**Pass/Fail**: [ ]

**Measurements**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

## Cross-Browser Testing

### Test 8.1: Chrome/Edge

**Browser Version**: **\*\***\_\_\_**\*\***

**Tests to Run**:

- [ ] All Test Suite 1 (Onboarding)
- [ ] All Test Suite 2 (Mobile Nav)
- [ ] Test 3.1-3.4 (Dark Mode)

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 8.2: Firefox

**Browser Version**: **\*\***\_\_\_**\*\***

**Tests to Run**:

- [ ] Test 1.1, 1.2 (Onboarding basics)
- [ ] Test 2.4-2.7 (Tab navigation)
- [ ] Test 3.1 (Dark mode)

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

### Test 8.3: Safari (macOS/iOS)

**Browser Version**: **\*\***\_\_\_**\*\***

**Tests to Run**:

- [ ] Test 1.1 (Tour starts)
- [ ] Test 2.1 (Mobile layout)
- [ ] Test 3.1 (Dark mode)

**Pass/Fail**: [ ]

**Notes**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***

---

## Test Summary

### Overall Results

| Test Suite           | Pass | Fail | Skipped | Total  |
| -------------------- | ---- | ---- | ------- | ------ |
| 1. Onboarding Tour   |      |      |         | 5      |
| 2. Mobile Navigation |      |      |         | 9      |
| 3. Dark Mode         |      |      |         | 4      |
| 4. Admin Routes      |      |      |         | 3      |
| 5. Integration       |      |      |         | 3      |
| 6. Error Scenarios   |      |      |         | 2      |
| 7. Performance       |      |      |         | 2      |
| 8. Cross-Browser     |      |      |         | 3      |
| **TOTAL**            |      |      |         | **31** |

### Critical Issues Found

1. ***
2. ***
3. ***

### Minor Issues Found

1. ***
2. ***
3. ***

### Recommendations

1. ***
2. ***
3. ***

---

## Sign-Off

**Tester Name**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***
**Date Completed**: \***\*\*\*\*\***\*\*\***\*\*\*\*\***\_\_\_\***\*\*\*\*\***\*\*\***\*\*\*\*\***
**Overall Status**: [ ] PASS [ ] PASS WITH ISSUES [ ] FAIL

**Ready for Production**: [ ] YES [ ] NO [ ] WITH FIXES

**Additional Comments**:

---

---

---
