[ 'tenant_id' => ['value' => '44'], ], ], ); expect($context->toQuery()) ->toMatchArray([ 'tableFilters' => [ 'tenant_id' => ['value' => '44'], ], 'nav' => [ 'source_surface' => 'finding.detail_section', 'canonical_route_name' => 'admin.operations.view', 'tenant_id' => 44, 'back_label' => 'Back to finding', 'back_url' => '/admin/findings/12', ], ]); }); it('round trips from a request payload', function (): void { $request = Request::create('/admin/operations/12', 'GET', [ 'nav' => [ 'source_surface' => 'backup_set.detail_section', 'canonical_route_name' => 'admin.operations.view', 'tenant_id' => 22, 'back_label' => 'Back to backup set', 'back_url' => '/admin/backup-sets/8', ], ]); $context = CanonicalNavigationContext::fromRequest($request); expect($context)->not->toBeNull() ->and($context?->tenantId)->toBe(22) ->and($context?->backLinkLabel)->toBe('Back to backup set') ->and($context?->backLinkUrl)->toBe('/admin/backup-sets/8'); }); it('serializes governance inbox family context for secondary surface return links', function (): void { $context = CanonicalNavigationContext::forGovernanceInbox( canonicalRouteName: 'filament.admin.pages.governance.inbox', tenantId: 12, familyKey: 'finding_exceptions', backLinkUrl: '/admin/governance/inbox?tenant_id=12&family=finding_exceptions', ); $roundTrip = CanonicalNavigationContext::fromRequest(Request::create('/admin/finding-exceptions/queue', 'GET', $context->toQuery())); expect($context->toQuery()['nav']) ->toMatchArray([ 'source_surface' => 'governance.inbox', 'tenant_id' => 12, 'family_key' => 'finding_exceptions', 'back_label' => 'Back to governance inbox', ]) ->and($roundTrip?->sourceSurface)->toBe('governance.inbox') ->and($roundTrip?->tenantId)->toBe(12) ->and($roundTrip?->familyKey)->toBe('finding_exceptions') ->and($roundTrip?->backLinkUrl)->toBe('/admin/governance/inbox?tenant_id=12&family=finding_exceptions'); });