create([ 'codigo' => RoleCode::Scanner->value, 'nombre' => 'Scanner', ]); $permission = Permission::query()->create([ 'codigo' => PermissionCode::ScanTickets->value, 'nombre' => 'Escanear tickets', ]); $scannerRole->permissions()->attach($permission->codigo); $tenant = $this->createTenant(); $home = Menu::query()->create([ 'code' => 'scanner.inicio', 'label' => 'Inicio', 'route' => '/scanner/inicio', ]); $scan = Menu::query()->create([ 'code' => 'scanner.scan', 'label' => 'Escanear', 'route' => '/scanner/scan', ]); $foreign = Menu::query()->create([ 'code' => 'adminapp.inicio', 'label' => 'Administración', 'route' => '/admin/inicio', ]); $scannerRole->menus()->sync([$home->code, $scan->code]); $tenant->menues()->sync([$home->code, $scan->code, $foreign->code]); $user = User::factory()->create([ 'rol_codigo' => $scannerRole->codigo, 'tenant_codigo' => $tenant->codigo, ]); Sanctum::actingAs($user); $this->getJson('/api/v1/scanner/me') ->assertOk() ->assertJsonPath('data.user.id', $user->id) ->assertJsonPath('data.tenant.codigo', $tenant->codigo) ->assertJsonCount(2, 'data.tenant.menues') ->assertJsonMissing(['code' => $foreign->code]); } public function test_it_rejects_an_adminapp_user_even_with_scan_permission(): void { $adminAppRole = Role::query()->create([ 'codigo' => RoleCode::AdminApp->value, 'nombre' => 'Administrador', ]); $permission = Permission::query()->create([ 'codigo' => PermissionCode::ScanTickets->value, 'nombre' => 'Escanear tickets', ]); $adminAppRole->permissions()->attach($permission->codigo); $tenant = $this->createTenant(); $adminApp = User::factory()->create([ 'rol_codigo' => $adminAppRole->codigo, 'tenant_codigo' => $tenant->codigo, ]); Sanctum::actingAs($adminApp); $this->getJson('/api/v1/scanner/me')->assertForbidden(); } private function createTenant(): Tenant { $logo = Attachment::query()->create([ 'key' => (string) Str::uuid(), 'path' => 'tests/scanner-me-logo.png', 'filename' => 'scanner-me-logo.png', 'type' => 'image', 'mime_type' => 'image/png', 'extension' => 'png', 'size' => 1, ]); return Tenant::query()->create([ 'codigo' => 'acme', 'nombre' => 'Acme', 'dominio' => 'acme.test', 'primary_color' => '#000000', 'secondary_color' => '#000000', 'danger_color' => '#000000', 'header_bg_color' => '#000000', 'footer_bg_color' => '#000000', 'header_logo_id' => $logo->id, 'footer_logo_id' => $logo->id, ]); } }