- Registrierungs-Schritt ehrlich beschrieben (E-Mail/Google, Freischaltung nach E-Mail-Bestaetigung statt 'direkt freigeschaltet'; Magic-Link ist nur Anmeldeweg) - Newsroom-Karte: 'getrennte Berechtigungen'/'mehrere Redakteure' durch belegbare Aussagen ersetzt (keine Team-Verwaltung im Panel) - Kuendigungs-FAQ nach E5 (Jahreszahlweise 12 Monate, danach monatlich) + Link auf die Selfservice-Kuendigungsseite - B2B-Erkennbarkeits-Satz im Tarife-Intro (AGB v0.6 / T14) - Wording T16: 'Inhaltsprüfung' statt Redakteurs-Versprechen; 'kein automatisierter Durchlauf'-Behauptung entfernt - Widerrufs-Button + Modal-Includes entfernt (Entscheidung E2 B2B-only, T3neu: Kuendigungsbutton bleibt freiwillig); Backend/Route bleibt schlafend erhalten, reaktivierbar bei B2C-Oeffnung - Hub-FAQ/Footer verlinken die API-Seite statt der toten docs-Route Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
99 lines
3.7 KiB
PHP
99 lines
3.7 KiB
PHP
<?php
|
|
|
|
use App\Mail\WithdrawalRequestReceived;
|
|
use App\Mail\WithdrawalRequestSubmitted;
|
|
use App\Models\WithdrawalRequest;
|
|
use Illuminate\Support\Facades\Mail;
|
|
use Tests\TestCase;
|
|
|
|
test('the withdrawal ui is retired on the hub (B2B-only, decision E2)', function () {
|
|
/** @var TestCase $this */
|
|
// Der Widerrufs-Button/-Modal entfällt seit der B2B-only-Entscheidung
|
|
// (E2, 03.07.2026); der POST-Endpunkt bleibt schlafend erhalten und ist
|
|
// bei einer B2C-Öffnung reaktivierbar (samt archivierter Belehrung).
|
|
$response = $this->get('https://pressekonto.test/')->assertSuccessful();
|
|
$content = $response->getContent();
|
|
|
|
expect($content)
|
|
->not->toContain('Vertrag widerrufen')
|
|
->not->toContain('open-withdrawal-modal');
|
|
});
|
|
|
|
test('a withdrawal is persisted and both mails are sent immediately', function () {
|
|
/** @var TestCase $this */
|
|
Mail::fake();
|
|
config()->set('domains.domains.pressekonto.brand.contact_email', 'kontakt@pressekonto.de');
|
|
|
|
$this->from('https://pressekonto.test/')
|
|
->post('https://pressekonto.test/widerruf', [
|
|
'name' => 'Paula Presse',
|
|
'email' => 'paula@example.test',
|
|
'order_reference' => 'STR-2026-0042',
|
|
])
|
|
->assertRedirect('https://pressekonto.test/')
|
|
->assertSessionHas('withdrawal-status');
|
|
|
|
$request = WithdrawalRequest::query()->firstOrFail();
|
|
|
|
expect($request->name)->toBe('Paula Presse');
|
|
expect($request->email)->toBe('paula@example.test');
|
|
expect($request->order_reference)->toBe('STR-2026-0042');
|
|
expect($request->host)->toBe('pressekonto.test');
|
|
expect($request->status)->toBe('open');
|
|
|
|
// Gesetzlich vorgeschrieben: sofortige automatische Eingangsbestätigung.
|
|
Mail::assertSent(WithdrawalRequestReceived::class, fn (WithdrawalRequestReceived $mail) => $mail->hasTo('paula@example.test'));
|
|
Mail::assertSent(WithdrawalRequestSubmitted::class, fn (WithdrawalRequestSubmitted $mail) => $mail->hasTo('kontakt@pressekonto.de'));
|
|
});
|
|
|
|
test('the order reference is optional', function () {
|
|
/** @var TestCase $this */
|
|
Mail::fake();
|
|
|
|
$this->post('https://pressekonto.test/widerruf', [
|
|
'name' => 'Paula Presse',
|
|
'email' => 'paula@example.test',
|
|
])->assertSessionHas('withdrawal-status');
|
|
|
|
expect(WithdrawalRequest::query()->firstOrFail()->order_reference)->toBeNull();
|
|
});
|
|
|
|
test('withdrawal validation errors land in the withdrawal error bag', function () {
|
|
/** @var TestCase $this */
|
|
Mail::fake();
|
|
|
|
$this->post('https://pressekonto.test/widerruf', [
|
|
'name' => '',
|
|
'email' => 'keine-mail',
|
|
])->assertSessionHasErrorsIn('withdrawal', ['name', 'email']);
|
|
|
|
expect(WithdrawalRequest::query()->count())->toBe(0);
|
|
Mail::assertNothingSent();
|
|
});
|
|
|
|
test('honeypot submissions are silently accepted without persisting or mailing', function () {
|
|
/** @var TestCase $this */
|
|
Mail::fake();
|
|
|
|
$this->post('https://pressekonto.test/widerruf', [
|
|
'name' => 'Bot',
|
|
'email' => 'bot@example.test',
|
|
'website' => 'https://spam.example',
|
|
])->assertSessionHas('withdrawal-status');
|
|
|
|
expect(WithdrawalRequest::query()->count())->toBe(0);
|
|
Mail::assertNothingSent();
|
|
});
|
|
|
|
test('a withdrawal from a spoke domain goes to that brand address', function () {
|
|
/** @var TestCase $this */
|
|
Mail::fake();
|
|
config()->set('domains.domains.presseecho.brand.contact_email', 'redaktion@presseecho.de');
|
|
|
|
$this->post('https://presseecho.test/widerruf', [
|
|
'name' => 'Paula Presse',
|
|
'email' => 'paula@example.test',
|
|
])->assertSessionHas('withdrawal-status');
|
|
|
|
Mail::assertSent(WithdrawalRequestSubmitted::class, fn (WithdrawalRequestSubmitted $mail) => $mail->hasTo('redaktion@presseecho.de'));
|
|
});
|