R0.3: Newsletter-Sync-Binding config-aware + ehrliche Test-Sync-Meldung
Bisher wurde der NullNewsletterSyncClient unbedingt gebunden - NEWSLETTER_SYNC_ENABLED=true mit echtem Provider haette stumm nichts getan. Jetzt: Platzhalter-Provider -> No-Op-Client, aktivierter aber nicht implementierter Provider -> RuntimeException (fail fast). Das Admin-UI weist beim Test-Sync auf den Platzhalter hin. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
a4184af4fb
commit
f9e3c64238
3 changed files with 44 additions and 1 deletions
|
|
@ -44,7 +44,20 @@ class AppServiceProvider extends ServiceProvider
|
|||
*/
|
||||
public function register(): void
|
||||
{
|
||||
$this->app->bind(NewsletterSyncClient::class, NullNewsletterSyncClient::class);
|
||||
$this->app->bind(NewsletterSyncClient::class, function (): NewsletterSyncClient {
|
||||
$provider = (string) config('newsletter.sync.provider', 'placeholder');
|
||||
|
||||
// Es existiert bislang nur der No-Op-Client. Ein aktivierter, aber
|
||||
// nicht implementierter Provider soll laut schlagen statt stumm
|
||||
// ins Leere zu synchronisieren.
|
||||
if (config('newsletter.sync.enabled') && $provider !== 'placeholder') {
|
||||
throw new \RuntimeException(
|
||||
"Newsletter-Sync-Provider [{$provider}] ist nicht implementiert – es existiert nur der Platzhalter-Client."
|
||||
);
|
||||
}
|
||||
|
||||
return new NullNewsletterSyncClient;
|
||||
});
|
||||
$this->app->singleton(PressReleaseService::class);
|
||||
$this->app->singleton(AdminRequestPerformanceMetrics::class);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,6 +47,10 @@ new #[Layout('components.layouts.app'), Title('Newsletter Sync')] class extends
|
|||
: 'unsubscribe';
|
||||
|
||||
$this->syncMessage = "Test-Sync ausgefuehrt ({$action}) fuer Subscription #{$subscription->id}.";
|
||||
|
||||
if ((string) config('newsletter.sync.provider') === 'placeholder') {
|
||||
$this->syncMessage .= ' Hinweis: Platzhalter-Provider – es wurde kein externes System aufgerufen.';
|
||||
}
|
||||
}
|
||||
|
||||
public function with(): array
|
||||
|
|
|
|||
26
tests/Feature/NewsletterSyncBindingTest.php
Normal file
26
tests/Feature/NewsletterSyncBindingTest.php
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
<?php
|
||||
|
||||
use App\Contracts\NewsletterSyncClient;
|
||||
use App\Services\Newsletter\NullNewsletterSyncClient;
|
||||
|
||||
test('newsletter sync resolves to the null client while no real provider exists', function () {
|
||||
config()->set('newsletter.sync.enabled', false);
|
||||
config()->set('newsletter.sync.provider', 'placeholder');
|
||||
|
||||
expect(app(NewsletterSyncClient::class))->toBeInstanceOf(NullNewsletterSyncClient::class);
|
||||
});
|
||||
|
||||
test('newsletter sync resolves to the null client for the placeholder provider even when enabled', function () {
|
||||
config()->set('newsletter.sync.enabled', true);
|
||||
config()->set('newsletter.sync.provider', 'placeholder');
|
||||
|
||||
expect(app(NewsletterSyncClient::class))->toBeInstanceOf(NullNewsletterSyncClient::class);
|
||||
});
|
||||
|
||||
test('an enabled but unimplemented sync provider fails fast instead of silently doing nothing', function () {
|
||||
config()->set('newsletter.sync.enabled', true);
|
||||
config()->set('newsletter.sync.provider', 'mailchimp');
|
||||
|
||||
expect(fn () => app(NewsletterSyncClient::class))
|
||||
->toThrow(RuntimeException::class, 'mailchimp');
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue