diff --git a/src/Bootstrappers/QueueTenancyBootstrapper.php b/src/Bootstrappers/QueueTenancyBootstrapper.php index 92c95ef6..3f46a112 100644 --- a/src/Bootstrappers/QueueTenancyBootstrapper.php +++ b/src/Bootstrappers/QueueTenancyBootstrapper.php @@ -41,7 +41,7 @@ class QueueTenancyBootstrapper implements TenancyBootstrapper */ public static function __constructStatic(Application $app): void { - static::setUpJobListener($app->make(Dispatcher::class), $app->runningUnitTests()); + static::setUpJobListener($app->make(Dispatcher::class)); } public function __construct(Repository $config, QueueManager $queue) @@ -52,7 +52,7 @@ class QueueTenancyBootstrapper implements TenancyBootstrapper $this->setUpPayloadGenerator(); } - protected static function setUpJobListener(Dispatcher $dispatcher, bool $runningTests): void + protected static function setUpJobListener(Dispatcher $dispatcher): void { $previousTenant = null; @@ -69,10 +69,8 @@ class QueueTenancyBootstrapper implements TenancyBootstrapper }); // If we're running tests, we make sure to clean up after any artisan('queue:work') calls - $revertToPreviousState = function ($event) use (&$previousTenant, $runningTests) { - if ($runningTests) { - static::revertToPreviousState($event, $previousTenant); - } + $revertToPreviousState = function ($event) use (&$previousTenant) { + static::revertToPreviousState($event, $previousTenant); }; $dispatcher->listen(JobProcessed::class, $revertToPreviousState); // artisan('queue:work') which succeeds diff --git a/tests/QueueTest.php b/tests/QueueTest.php index 211e9526..e15e4878 100644 --- a/tests/QueueTest.php +++ b/tests/QueueTest.php @@ -111,6 +111,8 @@ test('tenancy is initialized inside queues', function (bool $shouldEndTenancy) { pest()->artisan('queue:work --once'); + expect(! tenancy()->initialized)->toBe($shouldEndTenancy); + expect(DB::connection('central')->table('failed_jobs')->count())->toBe(0); expect(pest()->valuestore->get('tenant_id'))->toBe('The current tenant id is: ' . $tenant->id); @@ -168,12 +170,21 @@ test('tenancy is initialized when retrying jobs', function (bool $shouldEndTenan pest()->artisan('queue:work --once'); + expect(! tenancy()->initialized)->toBe($shouldEndTenancy); + expect(DB::connection('central')->table('failed_jobs')->count())->toBe(1); expect(pest()->valuestore->get('tenant_id'))->toBeNull(); // job failed pest()->artisan('queue:retry all'); + + if ($shouldEndTenancy) { + tenancy()->end(); + } + pest()->artisan('queue:work --once'); + expect(! tenancy()->initialized)->toBe($shouldEndTenancy); + expect(DB::connection('central')->table('failed_jobs')->count())->toBe(0); expect(pest()->valuestore->get('tenant_id'))->toBe('The current tenant id is: ' . $tenant->id); // job succeeded @@ -202,6 +213,22 @@ test('the tenant used by the job doesnt change when the current tenant changes', expect(pest()->valuestore->get('tenant_id'))->toBe('The current tenant id is: ' . $tenant1->getTenantKey()); }); +test('tenant connections do not persist after tenant jobs get processed', function() { + withTenantDatabases(); + + $tenant = Tenant::create(); + + tenancy()->initialize($tenant); + + dispatch(new TestJob(pest()->valuestore)); + + tenancy()->end(); + + pest()->artisan('queue:work --once'); + + expect(collect(DB::select('SHOW FULL PROCESSLIST'))->pluck('db'))->not()->toContain($tenant->database()->getName()); +}); + function createValueStore(): void { $valueStorePath = __DIR__ . '/Etc/tmp/queuetest.json';