markemacht/tests/Feature/Web/AuditFormTest.php
Kevin Adametz 1f7c0aa430 feat(marketing): Audit-Anfrageformular als Livewire-Komponente
Das markemacht.de-Anfrageformular (Audit-Modal) war nach der Laravel-
Integration ohne Endpoint. Es wird jetzt serverseitig über Livewire
verarbeitet statt über das alte statische PHP-Skript.

- AuditAnfrage-Mailable + Mail-View, Reply-To = Absender
- config/marketing.php: Empfänger via MARKETING_ANFRAGE_TO (Default info@markemacht.de)
- Livewire-SFC web.audit-form: Validierung (dt.), Honeypot, Rate-Limit (3/10 Min),
  dispatch('audit-sent') schließt das Modal
- Modal-Markup auf <livewire:web.audit-form /> umgestellt
- Feature-Tests (Validierung, Versand, Honeypot, Throttle)
- Entwicklungsplan unter dev/audit-formular-cookies/

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 13:20:21 +00:00

92 lines
2.6 KiB
PHP

<?php
use App\Mail\AuditAnfrage;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\RateLimiter;
use Livewire\Livewire;
use function Pest\Laravel\get;
test('das anfrageformular ist im audit-modal eingebunden', function () {
get(route('audit'))
->assertOk()
->assertSee('wire:submit', false)
->assertSee('livewire', false);
});
test('leeres formular zeigt validierungsfehler und versendet nichts', function () {
Mail::fake();
Livewire::test('web.audit-form')
->call('submit')
->assertHasErrors(['name', 'email', 'message', 'privacy']);
Mail::assertNothingSent();
});
test('ungültige e-mail wird abgewiesen', function () {
Livewire::test('web.audit-form')
->set('name', 'Max Muster')
->set('email', 'keine-email')
->set('message', 'Text')
->set('privacy', true)
->call('submit')
->assertHasErrors(['email']);
});
test('gültige anfrage wird versendet und löst das schließen-event aus', function () {
Mail::fake();
Livewire::test('web.audit-form')
->set('name', 'Max Muster')
->set('email', 'max@example.com')
->set('message', 'Wir brauchen Klarheit.')
->set('privacy', true)
->call('submit')
->assertHasNoErrors()
->assertSet('sent', true)
->assertDispatched('audit-sent');
Mail::assertSent(AuditAnfrage::class, function (AuditAnfrage $mail) {
return $mail->hasTo(config('marketing.anfrage_empfaenger'))
&& $mail->hasReplyTo('max@example.com');
});
});
test('honeypot-feld unterdrückt den versand, meldet aber erfolg', function () {
Mail::fake();
Livewire::test('web.audit-form')
->set('name', 'Bot')
->set('email', 'bot@example.com')
->set('message', 'spam')
->set('privacy', true)
->set('company', 'ausgefuellt')
->call('submit')
->assertHasNoErrors()
->assertSet('sent', true);
Mail::assertNothingSent();
});
test('zu viele anfragen werden gedrosselt', function () {
Mail::fake();
RateLimiter::clear('audit-anfrage:127.0.0.1');
$sende = fn () => Livewire::test('web.audit-form')
->set('name', 'Max Muster')
->set('email', 'max@example.com')
->set('message', 'Anfrage')
->set('privacy', true)
->call('submit');
// Drei erlaubte Versuche …
$sende();
$sende();
$sende();
// … der vierte wird gedrosselt: kein vierter Versand.
$sende()->assertSet('sent', false);
Mail::assertSent(AuditAnfrage::class, 3);
});