feat(T07): Warenkorb & Mietanfrage frontend – cart store, drawer, pages, form, tests
This commit is contained in:
+71
-80
@@ -1,100 +1,91 @@
|
||||
# Test Report – T02: Static Pages
|
||||
# Test Report – T07: Warenkorb & Mietanfrage Frontend
|
||||
|
||||
**Date:** 2026-07-10
|
||||
**Task:** T07 – Warenkorb & Mietanfrage Frontend
|
||||
|
||||
## Build Verification
|
||||
|
||||
**Command:** `npm run build`
|
||||
**Result:** ✅ Build complete!
|
||||
**Output:** Nitro build succeeded, all pages compiled successfully.
|
||||
- index-BUIU2FQG.mjs (12.1 kB)
|
||||
- referenzen-yQ6M2U3V.mjs (8.22 kB)
|
||||
- kontakt-DZRjLPTh.mjs (9.47 kB)
|
||||
- impressum-CwZu6BA4.mjs (3.82 kB)
|
||||
- datenschutz (included in build)
|
||||
- agb-vermietung (included in build)
|
||||
- Lightbox component compiled
|
||||
```bash
|
||||
cd /a0/usr/workdir/hms-licht-ton-t04/frontend && npm run build
|
||||
```
|
||||
|
||||
**Result:** ✅ Build successful
|
||||
- All new files compiled without errors
|
||||
- Output includes: `warenkorb-BiU5TV87.mjs`, `mietanfrage-caxImRAG.mjs`, `useCart-DgrwTafY.mjs`
|
||||
- Total size: 2.53 MB (616 kB gzip)
|
||||
|
||||
## Unit Tests
|
||||
|
||||
**Command:** `npx vitest run --reporter verbose`
|
||||
**Result:** ✅ 148 tests passed (8 test files)
|
||||
```bash
|
||||
cd /a0/usr/workdir/hms-licht-ton-t04/frontend && npx vitest run --reporter verbose
|
||||
```
|
||||
|
||||
**Result:** ✅ All 214 tests passed (11 test files)
|
||||
|
||||
### New Test Files:
|
||||
- `tests/unit/HomePage.test.ts` — 11 tests ✅
|
||||
- Hero headline 'Veranstaltungstechnik'
|
||||
- CTA links to /mietkatalog and /kontakt
|
||||
- All 8 services present (Vermietung, Verkauf, Personal, Transport, Lagerung, Werkstatt, Installation, Booking)
|
||||
- Speaker grid with 6 equipment types
|
||||
- About section with stats (20+, 1000+, 500+)
|
||||
- Mietkatalog CTA section
|
||||
- TypeScript + Tailwind + useHead checks
|
||||
- `tests/unit/CartStore.test.ts` – 17 tests (all passed)
|
||||
- Verifies defineStore, CartItem interface, getters (totalCount, isEmpty, hasItems, apiItems), actions (addItem, addItemByFields, removeItem, updateQuantity, incrementQuantity, decrementQuantity, clearCart), RentalRequestPayload & RentalRequestResponse interfaces
|
||||
- `tests/unit/WarenkorbPage.test.ts` – 16 tests (all passed)
|
||||
- Verifies page title, useCart composable, breadcrumb, empty state, cart items, quantity steppers, remove button, clear cart, checkout link, formatPrice, useHead, TypeScript
|
||||
- `tests/unit/MietanfragePage.test.ts` – 26 tests (all passed)
|
||||
- Verifies page title, useCart, useApi, breadcrumb, empty cart state, cart overview, all form fields (event_name, date_start, date_end, location, person_count, contact_name, contact_company, contact_email, contact_phone, contact_street, contact_postalcode, contact_city, message), email validation, validateField/validateAll, error displays, submit button, submitting state, success state with reference_number, error state, POST to /api/rental-requests, clearCart on success, TypeScript
|
||||
|
||||
- `tests/unit/ReferenzenPage.test.ts` — 14 tests ✅
|
||||
- 9 gallery images (picsum.photos count = 9)
|
||||
- 4 filter chips (Alle, Open-Air, Indoor, Rigging)
|
||||
- Lightbox component integration
|
||||
- Filter logic with computed filteredImages
|
||||
- openLightbox function
|
||||
- Lightbox component: close/prev/next buttons with data-testid
|
||||
### Existing Tests (still passing):
|
||||
- `tests/unit/KontaktPage.test.ts` – 18 tests ✅
|
||||
- `tests/unit/EquipmentDetailPage.test.ts` – 19 tests ✅
|
||||
- `tests/unit/MietkatalogPage.test.ts` – 30 tests ✅
|
||||
- `tests/unit/HomePage.test.ts` – 11 tests ✅
|
||||
- `tests/unit/ReferenzenPage.test.ts` – all tests ✅
|
||||
- `tests/unit/useEquipment.test.ts` – 14 tests ✅
|
||||
- `tests/unit/DesignTokens.test.ts` – 18 tests ✅
|
||||
- `tests/unit/Layout.test.ts` – all tests ✅
|
||||
|
||||
- `tests/unit/KontaktPage.test.ts` — 19 tests ✅
|
||||
- Office address card (Grockelhofen 10, 89340 Leipheim)
|
||||
- Warehouse address card (Ellzee)
|
||||
- Opening hours card
|
||||
- 2 contact persons (Markus Hammerschmidt, Thomas Mössle)
|
||||
- Form fields: name*, email*, phone, message*, privacy checkbox*
|
||||
- Email validation with regex
|
||||
- Submit blocked when email empty
|
||||
- Submit blocked when privacy unchecked
|
||||
- POST to /api/contact
|
||||
- Success and error states
|
||||
## E2E Test Files Created
|
||||
|
||||
## Smoke Test (curl)
|
||||
- `tests/e2e/cart.spec.ts` – 10 tests (Playwright)
|
||||
- Warenkorb page renders, empty state, header cart icon, cart drawer open/close, checkout links, mobile cart button
|
||||
- `tests/e2e/mietanfrage.spec.ts` – 4 tests (Playwright)
|
||||
- Mietanfrage page renders, empty cart state, mietkatalog link, breadcrumb
|
||||
|
||||
**Server:** `npm run dev` on localhost:3000
|
||||
## Smoke Test
|
||||
|
||||
| Page | URL | grep pattern | Result |
|
||||
|------|-----|-------------|--------|
|
||||
| Home | / | `Veranstaltungstechnik` | ✅ Found |
|
||||
| Referenzen | /referenzen | `Referenzen` | ✅ Found |
|
||||
| Kontakt | /kontakt | `Planen Sie` | ✅ Found |
|
||||
| Impressum | /impressum | `Hammerschmidt` | ✅ Found |
|
||||
| Datenschutz | /datenschutz | `Datenschutz` | ✅ Found |
|
||||
| AGB Vermietung | /agb-vermietung | `AGB` | ✅ Found |
|
||||
```bash
|
||||
curl -s -o /dev/null -w '%{http_code}' http://localhost:3000/warenkorb
|
||||
# Result: 200
|
||||
|
||||
## E2E Tests (Playwright)
|
||||
curl -s -o /dev/null -w '%{http_code}' http://localhost:3000/mietanfrage
|
||||
# Result: 200
|
||||
```
|
||||
|
||||
**Files created:**
|
||||
- `tests/e2e/home.spec.ts` — 8 tests
|
||||
- `tests/e2e/referenzen.spec.ts` — 8 tests
|
||||
- `tests/e2e/kontakt.spec.ts` — 8 tests
|
||||
- `tests/e2e/legal-pages.spec.ts` — 15 tests
|
||||
Both pages return HTTP 200. Pages are configured as `ssr: false` (client-side rendered) so the initial HTML shell contains the `__nuxt` div which is hydrated client-side.
|
||||
|
||||
**Status:** Written, not yet executed (requires running dev server with Playwright runner).
|
||||
## Files Created/Modified
|
||||
|
||||
## Files Changed
|
||||
### New Files:
|
||||
1. `stores/cart.ts` – Pinia cart store with types, getters, actions
|
||||
2. `plugins/pinia-persist.client.ts` – localStorage persistence plugin
|
||||
3. `composables/useCart.ts` – Cart composable wrapper
|
||||
4. `components/CartDrawer.vue` – Mobile bottom-sheet / desktop side panel
|
||||
5. `pages/warenkorb.vue` – Cart page with steppers, remove, empty state
|
||||
6. `pages/mietanfrage.vue` – Rental request form with validation and submit states
|
||||
7. `tests/unit/CartStore.test.ts` – 17 unit tests
|
||||
8. `tests/unit/WarenkorbPage.test.ts` – 16 unit tests
|
||||
9. `tests/unit/MietanfragePage.test.ts` – 26 unit tests
|
||||
10. `tests/e2e/cart.spec.ts` – 10 E2E tests
|
||||
11. `tests/e2e/mietanfrage.spec.ts` – 4 E2E tests
|
||||
|
||||
### Pages (modified/created):
|
||||
- `pages/index.vue` — Extended: hero with bg image, 6 equipment types, about/stats section, 8 services, CTA
|
||||
- `pages/referenzen.vue` — Full gallery with 9 images, 4 filter chips, lightbox integration
|
||||
- `pages/kontakt.vue` — Full contact page with addresses, persons, form with validation
|
||||
- `pages/impressum.vue` — Full §5 TMG impressum content
|
||||
- `pages/datenschutz.vue` — Full DSGVO datenschutzerklärung
|
||||
- `pages/agb-vermietung.vue` — Full AGB with 8 sections
|
||||
### Modified Files:
|
||||
1. `nuxt.config.ts` – Added `@pinia/nuxt` module
|
||||
2. `components/AppHeader.vue` – Added cart icon with counter badge (desktop + mobile), CartDrawer integration
|
||||
3. `pages/mietkatalog/[id].vue` – Replaced console.log with useCart addItemByFields
|
||||
4. `pages/mietkatalog.vue` – Replaced console.log with useCart addItemByFields
|
||||
|
||||
### Components (created):
|
||||
- `components/Lightbox.vue` — Lightbox with prev/next/close, keyboard navigation, teleport
|
||||
## Acceptance Criteria Verification
|
||||
|
||||
### Tests (created):
|
||||
- `tests/unit/HomePage.test.ts` — 11 tests
|
||||
- `tests/unit/ReferenzenPage.test.ts` — 14 tests (including Lightbox component tests)
|
||||
- `tests/unit/KontaktPage.test.ts` — 19 tests
|
||||
- `tests/e2e/home.spec.ts` — 8 tests
|
||||
- `tests/e2e/referenzen.spec.ts` — 8 tests
|
||||
- `tests/e2e/kontakt.spec.ts` — 8 tests
|
||||
- `tests/e2e/legal-pages.spec.ts` — 15 tests
|
||||
|
||||
## Summary
|
||||
- Build: ✅ PASS
|
||||
- Unit Tests: ✅ 148/148 PASS
|
||||
- Smoke Test: ✅ All 6 pages render correct content
|
||||
- E2E Tests: Written (awaiting Playwright execution with running server)
|
||||
- ✅ Add to cart → header counter updates (via Pinia reactive store)
|
||||
- ✅ Cart persists in localStorage (via pinia-persist.client.ts plugin)
|
||||
- ✅ Warenkorb: steppers, remove, empty state with /mietkatalog link
|
||||
- ✅ Header cart icon: counter (0 empty, N items)
|
||||
- ✅ CartDrawer: mobile bottom-sheet, desktop side panel
|
||||
- ✅ Mietanfrage: cart overview, form with validation, submit states, reference_number on success, empty cart redirect
|
||||
- ✅ Cart clears after successful submit (clearCart() called in handleSubmit success path)
|
||||
|
||||
Reference in New Issue
Block a user