create(); $tenant->makeCurrent(); $policy = Policy::factory()->for($tenant)->create([ 'external_id' => 'policy-123', ]); $user = User::factory()->create(); $this->actingAs($user); $user->tenants()->syncWithoutDetaching([ $tenant->getKey() => ['role' => 'owner'], ]); Filament::setTenant($tenant, true); $this->mock(PolicySnapshotService::class, function (MockInterface $mock) use ($policy) { $mock->shouldReceive('fetch') ->once() ->andReturn([ 'payload' => [ 'id' => $policy->external_id, 'name' => $policy->display_name, 'roleScopeTagIds' => ['0'], ], ]); }); $this->mock(AssignmentFetcher::class, function (MockInterface $mock) { $mock->shouldReceive('fetch')->never(); }); $this->mock(ScopeTagResolver::class, function (MockInterface $mock) { $mock->shouldReceive('resolve') ->once() ->andReturn([ ['id' => '0', 'displayName' => 'Default'], ]); }); Livewire::test(ViewPolicy::class, ['record' => $policy->getRouteKey()]) ->callAction('capture_snapshot', data: [ 'include_assignments' => false, 'include_scope_tags' => true, ]); $job = null; $lock = new class implements Lock { public function get($callback = null): bool { return true; } public function block($seconds, $callback = null): bool { return true; } public function release(): bool { return true; } public function owner(): string { return 'test'; } public function forceRelease(): void { // no-op } }; Cache::partialMock() ->shouldReceive('lock') ->andReturn($lock); Queue::assertPushed(CapturePolicySnapshotJob::class, function (CapturePolicySnapshotJob $queuedJob) use (&$job): bool { $job = $queuedJob; return true; }); expect($job)->not->toBeNull(); app()->call([$job, 'handle']); $worker = null; Queue::assertPushed(CapturePolicySnapshotWorkerJob::class, function (CapturePolicySnapshotWorkerJob $queuedWorker) use (&$worker): bool { $worker = $queuedWorker; return true; }); expect($worker)->not->toBeNull(); app()->call([$worker, 'handle']); $version = $policy->versions()->first(); expect($version)->not->toBeNull(); expect($version->assignments)->toBeNull(); expect($version->scope_tags)->toBe([ 'ids' => ['0'], 'names' => ['Default'], ]); });