42 lines
1.5 KiB
TypeScript
42 lines
1.5 KiB
TypeScript
import { expect, test } from '@playwright/test';
|
|
|
|
const shouldRun = process.env.E2E_CONTACT_SPAM === '1';
|
|
const baseUrl = process.env.E2E_BASE_URL ?? 'https://test-y0k0.fotospiel.app';
|
|
|
|
test.describe('Marketing contact form spam/throttle', () => {
|
|
test.skip(!shouldRun, 'Set E2E_CONTACT_SPAM=1 to run contact spam/throttle check on staging.');
|
|
|
|
test('honeypot rejects bot submission and throttling kicks in', async ({ page }) => {
|
|
await page.goto(`${baseUrl}/de#contact`);
|
|
|
|
const acceptCookies = page.getByRole('button', { name: /akzeptieren|accept/i });
|
|
if (await acceptCookies.isVisible()) {
|
|
await acceptCookies.click();
|
|
}
|
|
|
|
// Fill visible fields
|
|
await page.fill('input[name="name"]', 'Spam Bot');
|
|
await page.fill('input[name="email"]', 'spam@example.com');
|
|
await page.fill('textarea[name="message"]', 'Test spam message');
|
|
|
|
// Trip honeypot
|
|
await page.$eval('input[name="nickname"]', (el: HTMLInputElement) => {
|
|
el.value = 'bot-field';
|
|
});
|
|
|
|
const submit = page.getByRole('button', { name: /senden|absenden|submit/i }).first();
|
|
await submit.click();
|
|
|
|
await expect(page.locator('text=/error|ungültig|invalid/i')).toBeVisible();
|
|
|
|
// Rapid resubmits to trigger throttle (best-effort)
|
|
for (let i = 0; i < 5; i += 1) {
|
|
await submit.click();
|
|
}
|
|
|
|
// Either error message or no success flash should be present
|
|
const success = page.locator('text=/Danke|Erfolg|success/i');
|
|
await expect(success).not.toBeVisible({ timeout: 1000 });
|
|
});
|
|
});
|