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>
92 lines
2.6 KiB
PHP
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);
|
|
});
|