R2.1: Kontaktformular-Backend (Controller + Mailable + Brand-Empfaenger)
POST kontakt mit Validierung, Honeypot (vor der Validierung, stilles Abnicken), IP-Rate-Limit (5/h) + throttle:10,1. Versand an brand.contact_email (neue CONTACT_EMAIL_*-Keys, [EXTERN: echte Adressen]), Fallback MAIL_FROM_ADDRESS; Reply-To = Absender. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
1e9c2f96ed
commit
a4d054b3ab
7 changed files with 234 additions and 0 deletions
78
tests/Feature/Web/ContactFormTest.php
Normal file
78
tests/Feature/Web/ContactFormTest.php
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
<?php
|
||||
|
||||
use App\Mail\ContactRequestSubmitted;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use Tests\TestCase;
|
||||
|
||||
test('the contact page renders the form', function () {
|
||||
/** @var TestCase $this */
|
||||
$this->get('https://businessportal24.test/de/kontakt')
|
||||
->assertSuccessful()
|
||||
->assertSee('name="name"', false)
|
||||
->assertSee('name="email"', false)
|
||||
->assertSee('name="message"', false)
|
||||
->assertSee('Nachricht senden');
|
||||
});
|
||||
|
||||
test('a valid contact request sends a mail to the configured recipient', function () {
|
||||
/** @var TestCase $this */
|
||||
Mail::fake();
|
||||
config()->set('domains.domains.businessportal24.brand.contact_email', 'redaktion@businessportal24.de');
|
||||
|
||||
$this->from('https://businessportal24.test/de/kontakt')
|
||||
->post('https://businessportal24.test/de/kontakt', [
|
||||
'name' => 'Paula Presse',
|
||||
'email' => 'paula@example.test',
|
||||
'message' => 'Ich habe eine Frage zu Ihrer Plattform und bitte um Rückruf.',
|
||||
])
|
||||
->assertRedirect('https://businessportal24.test/de/kontakt')
|
||||
->assertSessionHas('contact-status');
|
||||
|
||||
Mail::assertSent(ContactRequestSubmitted::class, function (ContactRequestSubmitted $mail) {
|
||||
return $mail->hasTo('redaktion@businessportal24.de')
|
||||
&& $mail->hasReplyTo('paula@example.test')
|
||||
&& $mail->senderName === 'Paula Presse';
|
||||
});
|
||||
});
|
||||
|
||||
test('without a configured brand address the mail falls back to the from address', function () {
|
||||
/** @var TestCase $this */
|
||||
Mail::fake();
|
||||
config()->set('domains.domains.businessportal24.brand.contact_email', null);
|
||||
config()->set('mail.from.address', 'fallback@pressekonto.de');
|
||||
|
||||
$this->post('https://businessportal24.test/de/kontakt', [
|
||||
'name' => 'Paula Presse',
|
||||
'email' => 'paula@example.test',
|
||||
'message' => 'Ich habe eine Frage zu Ihrer Plattform und bitte um Rückruf.',
|
||||
])->assertSessionHas('contact-status');
|
||||
|
||||
Mail::assertSent(ContactRequestSubmitted::class, fn (ContactRequestSubmitted $mail) => $mail->hasTo('fallback@pressekonto.de'));
|
||||
});
|
||||
|
||||
test('honeypot submissions are silently accepted without sending mail', function () {
|
||||
/** @var TestCase $this */
|
||||
Mail::fake();
|
||||
|
||||
$this->post('https://businessportal24.test/de/kontakt', [
|
||||
'name' => 'Bot',
|
||||
'email' => 'bot@example.test',
|
||||
'message' => 'Automatisierter Inhalt mit ausreichend Länge für die Validierung.',
|
||||
'website' => 'https://spam.example',
|
||||
])->assertSessionHas('contact-status');
|
||||
|
||||
Mail::assertNothingSent();
|
||||
});
|
||||
|
||||
test('the contact form validates its inputs', function () {
|
||||
/** @var TestCase $this */
|
||||
Mail::fake();
|
||||
|
||||
$this->post('https://businessportal24.test/de/kontakt', [
|
||||
'name' => '',
|
||||
'email' => 'keine-mail',
|
||||
'message' => 'kurz',
|
||||
])->assertSessionHasErrors(['name', 'email', 'message']);
|
||||
|
||||
Mail::assertNothingSent();
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue