# BRAND MIGRATION — TESTS.md
## Visual Regression Tests
```
BRAND-VIS-001: Logo renders in Header at correct dimensions
BRAND-VIS-002: Logo renders in Footer at correct dimensions
BRAND-VIS-003: Logo renders in Admin sidebar
BRAND-VIS-004: Favicon renders in browser tab
BRAND-VIS-005: Primary color matches legacy (inspect CSS after BRAND-FE-001)
BRAND-VIS-006: Accent color matches legacy (inspect CSS after BRAND-FE-001)
BRAND-VIS-007: Footer contains company name from businessConfig
BRAND-VIS-008: Footer contains full address from businessConfig
BRAND-VIS-009: Footer contains phone from businessConfig
BRAND-VIS-010: Footer contains email from businessConfig
BRAND-VIS-011: Footer contains WhatsApp from businessConfig
BRAND-VIS-012: Footer contains business hours from businessConfig
BRAND-VIS-013: Header uses Inter font (system / Google Fonts)
BRAND-VIS-014: Heading font (Playfair Display) renders for page titles
BRAND-VIS-015: Responsive: logo and footer text readable on mobile
```
## Route Tests
```
BRAND-ROUTE-001: GET /about → 200, About page with migrated content
BRAND-ROUTE-002: GET /contact → 200, Contact page with businessConfig info
BRAND-ROUTE-003: GET /shipping → 200, Shipping policy
BRAND-ROUTE-004: GET /terms → 200, Terms page (may be flagged for review)
BRAND-ROUTE-005: GET /privacy → 200, Privacy policy
BRAND-ROUTE-006: GET /cookies → 200, Cookie policy
BRAND-ROUTE-007: GET /legal → 200 or /404 (if not created)
```
## Redirect Tests
```
BRAND-RED-001: GET /quienes-somos → 308 → /about
BRAND-RED-002: GET /contacto → 308 → /contact
BRAND-RED-003: GET /terminos-y-condiciones → 308 → /terms
BRAND-RED-004: GET /politica-de-cookies → 308 → /cookies
BRAND-RED-005: GET /politica-de-privacidad → 308 → /privacy
BRAND-RED-006: GET /donde-estamos → 308 → /contact
BRAND-RED-007: GET /admin → 404 (OpenCart internals blocked)
BRAND-RED-008: GET /?route=product/product&id=42 → 404 (OpenCart query blocked)
BRAND-RED-009: Legacy product slug from sitemap → appropriate redirect
BRAND-RED-010: Legacy category slug → appropriate redirect
```
## SEO Tests
```
BRAND-SEO-001: GET /sitemap.xml → valid XML with all public routes
BRAND-SEO-002: GET /robots.txt → contains sitemap directive
BRAND-SEO-003: GET /robots.txt → does not block /about, /contact, /shipping, /terms, /privacy, /cookies
BRAND-SEO-004: GET /robots.txt → blocks /admin
BRAND-SEO-005:
on /about → includes "Mercado de Vida" or "MercadoDeVida"
BRAND-SEO-006: on /about → present and meaningful
```
## Content Tests
```
BRAND-CONTENT-001: /about page mentions founders (Ivana & Ricardo)
BRAND-CONTENT-002: /about page mentions Estepona/Costa del Sol
BRAND-CONTENT-003: /contact page has clickable phone link (tel:)
BRAND-CONTENT-004: /contact page has clickable email link (mailto:)
BRAND-CONTENT-005: /contact page has WhatsApp link
BRAND-CONTENT-006: Footer copyright year is current year (dynamic)
BRAND-CONTENT-007: All business info fields populated (no empty phone/email/address)
BRAND-CONTENT-008: Legal pages have ⚠️LEGAL_REVIEW flag or equivalent visible in source
```
## businessConfig Tests
```
BRAND-CFG-001: businessConfig.phone matches string used in Header, Footer, Contact
BRAND-CFG-002: businessConfig.email matches string used in Header, Footer, Contact
BRAND-CFG-003: businessConfig.address matches string used in Footer
BRAND-CFG-004: No hardcoded address string in any component outside businessConfig
BRAND-CFG-005: No hardcoded phone string in any component outside businessConfig
BRAND-CFG-006: No hardcoded email string in any component outside businessConfig
```
## Given/When/Then Acceptance Criteria
```
GIVEN a user visits /quienes-somos
WHEN the redirect is implemented
THEN they receive a 308 redirect to /about
AND they land on the About page with migrated content
GIVEN a user visits the footer
WHEN the page renders
THEN the address, phone, email, WhatsApp, and hours all come from businessConfig
AND no string is hardcoded in the Footer component
GIVEN a developer needs to update the company phone number
WHEN they update businessConfig.phone
THEN every page that displays the phone reflects the new value
AND no manual find-replace is required
GIVEN legal text has been migrated from the legacy site
WHEN the Terms page is published
THEN it is flagged as requiring human/legal review
AND no AI-modified version is presented as newly legally approved
GIVEN a search engine bot crawls the site
WHEN it requests /sitemap.xml
THEN it contains all public routes (/about, /contact, /shipping, /products, /categories, etc.)
AND no internal admin routes are exposed
GIVEN a legacy product URL is accessed
WHEN the new platform handles it
THEN it either redirects to the correct new product page
OR returns 404 — it must NOT silently show a broken page
```