presseportale/tests/Feature/Web/ContactFormTest.php
Kevin Adametz a4d054b3ab 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>
2026-07-03 08:14:52 +00:00

78 lines
2.9 KiB
PHP

<?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();
});