Files
fotospiel-app/tests/e2e/marketing-package-flow.test.ts

69 lines
3.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { test, expect } from '@playwright/test';
import { execSync } from 'child_process'; // Für artisan seed
test.describe('Marketing Package Flow: Auswahl → Registrierung → Kauf (Free & Paid)', () => {
test.beforeAll(async () => {
// Seed Test-Tenant (einmalig)
execSync('php artisan tenant:add-dummy --email=test@example.com --password=password123 --first_name=Test --last_name=User --address="Teststr. 1" --phone="+49123"');
// Mock Verifizierung: Update DB (in Test-Env)
execSync('php artisan tinker --execute="App\\Models\\User::where(\'email\', \'test@example.com\')->update([\'email_verified_at\' => now()]);"');
});
test('Free-Paket-Flow (ID=1, Starter)', async ({ page }) => {
await page.goto('http://localhost:8000/de'); // Lokaler Server (vite dev)
await expect(page).toHaveTitle(/Fotospiel/);
await page.screenshot({ path: 'free-step1-home.png', fullPage: true });
// Paketauswahl
await page.getByRole('link', { name: 'Alle Packages ansehen' }).click();
await expect(page).toHaveURL(/\/de\/packages/);
await page.screenshot({ path: 'free-step2-packages.png', fullPage: true });
await page.getByRole('button', { name: 'Details anzeigen' }).first().click(); // Erstes Paket (Free)
await expect(page.locator('dialog')).toBeVisible();
await page.screenshot({ path: 'free-step3-modal.png', fullPage: true });
await page.getByRole('tab', { name: 'Kaufen' }).click();
await page.getByRole('link', { name: 'Registrieren & Kaufen' }).click();
await expect(page).toHaveURL(/\/de\/register\?package_id=1/);
await page.screenshot({ path: 'free-step4-register.png', fullPage: true });
// Registrierung (Test-Daten, aber seedet vorab hier Login simulieren falls nötig)
// Da seeded: Verwende Login statt neuer Registrierung für Test
await page.fill('[name="email"]', 'test@example.com');
await page.fill('[name="password"]', 'password123');
await page.getByRole('button', { name: 'Anmelden' }).click(); // Falls Login-Form nach Redirect
await expect(page).toHaveURL(/\/buy-packages\/1/);
await page.screenshot({ path: 'free-step5-buy.png', fullPage: true });
// Kauf (Free: Direkte Success)
await expect(page.locator('text=Free package assigned')).toContainText('success'); // API-Response oder Page-Text
await page.goto('/marketing/success');
await expect(page).toHaveURL(/\/marketing\/success/);
await page.screenshot({ path: 'free-step6-success.png', fullPage: true });
await expect(page).toHaveURL(/\/admin/); // Redirect
await page.screenshot({ path: 'free-step7-admin.png', fullPage: true });
await expect(page.locator('text=Remaining Photos')).toContainText('300'); // Limits aus package-flow.test.ts integriert
});
test('Paid-Paket-Flow (ID=2, Pro mit Stripe-Test)', async ({ page }) => {
// Ähnlich wie Free, aber package_id=2
await page.goto('http://localhost:8000/de/packages');
await page.getByRole('button', { name: 'Details anzeigen' }).nth(1).click(); // Zweites Paket (Paid)
// ... (Modal, Register/Login wie oben)
await expect(page).toHaveURL(/\/buy-packages\/2/);
// Mock Stripe
await page.route('https://checkout.stripe.com/**', async route => {
await route.fulfill({ status: 200, body: '<html>Mock Stripe Success</html>' });
});
// Simuliere Checkout: Fill Test-Karte
await page.fill('[name="cardNumber"]', '4242424242424242');
await page.fill('[name="cardExpiry"]', '12/25');
await page.fill('[name="cardCvc"]', '123');
await page.click('[name="submit"]');
await page.waitForURL(/\/marketing\/success/); // Nach Webhook
await page.screenshot({ path: 'paid-step6-success.png', fullPage: true });
// Integration: Limits-Check wie in package-flow.test.ts
await expect(page.locator('text=Remaining Photos')).toContainText('Unbegrenzt'); // Pro-Limit
});
});