From e6c4c317fe849e6a5258605fb1509f1fb038b5e0 Mon Sep 17 00:00:00 2001 From: lukinovec Date: Sun, 12 Jul 2026 12:40:31 +0200 Subject: [PATCH] Test that using broadcasters that only implement the Broadcaster contract (instead of the abstract class) don't break bootstrap() Covers the `$centralBroadcaster instanceof Broadcaster && $tenantBroadcaster instanceof Broadcaster` check in extend(BroadcasterContract::class, ...) --- .../BroadcastingConfigBootstrapperTest.php | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/Bootstrappers/BroadcastingConfigBootstrapperTest.php b/tests/Bootstrappers/BroadcastingConfigBootstrapperTest.php index f2a06065..aa866d45 100644 --- a/tests/Bootstrappers/BroadcastingConfigBootstrapperTest.php +++ b/tests/Bootstrappers/BroadcastingConfigBootstrapperTest.php @@ -318,3 +318,29 @@ test('mappings specified in credentialsMap override default mapPresets', functio 'ably', 'reverb', ]); + +test('initializing tenancy does not fail when the broadcaster does not extend the abstract Broadcaster class', function () { + config([ + 'tenancy.bootstrappers' => [BroadcastingConfigBootstrapper::class], + 'broadcasting.default' => 'contract', + 'broadcasting.connections.contract.driver' => 'contract', + ]); + + $contractBroadcaster = new class implements BroadcasterContract { + public function auth($request) {} + public function validAuthenticationResponse($request, $result) {} + public function broadcast(array $channels, $event, array $payload = []) {} + }; + + app(BroadcastManager::class)->extend('contract', fn () => clone $contractBroadcaster); + + $centralBroadcaster = app(BroadcasterContract::class); + + // Channel auth closures only exist on broadcasters extending the abstract Broadcaster class, + // so the bootstrapper skips copying them instead of failing. + tenancy()->initialize(Tenant::create()); + + expect(app(BroadcasterContract::class)) + ->toBeInstanceOf(get_class($contractBroadcaster)) + ->not()->toBe($centralBroadcaster); +});