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>
This commit is contained in:
parent
9c6b7ed4f3
commit
1f7c0aa430
7 changed files with 527 additions and 0 deletions
92
tests/Feature/Web/AuditFormTest.php
Normal file
92
tests/Feature/Web/AuditFormTest.php
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
<?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);
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue