create([ 'codigo' => RoleCode::AdminApp->value, 'nombre' => 'Operador', ]); $permission = Permission::query()->create([ 'codigo' => PermissionCode::ScanTickets->value, 'nombre' => 'Escanear tickets', ]); $role->permissions()->attach($permission->codigo); $tenant = Tenant::query()->create([ 'codigo' => 'acme', 'nombre' => 'Acme', 'dominio' => 'acme.test', ]); $user = User::factory()->create([ 'email' => 'scanner@example.com', 'password' => Hash::make('secret123'), 'rol_codigo' => $role->codigo, 'tenant_codigo' => $tenant->codigo, ]); $response = $this->postJson('/api/v1/scanner/login', [ 'email' => ' SCANNER@EXAMPLE.COM ', 'password' => 'secret123', ]); $response ->assertOk() ->assertJsonPath('user.id', $user->id) ->assertJsonPath('user.rol_codigo', RoleCode::AdminApp->value) ->assertJsonPath('token_type', 'Bearer'); $this->assertSame(['scanner'], $user->tokens()->sole()->abilities); } public function test_it_rejects_a_user_without_scan_permission(): void { $role = Role::query()->create([ 'codigo' => RoleCode::Scanner->value, 'nombre' => 'Scanner sin permiso', ]); $tenant = Tenant::query()->create([ 'codigo' => 'acme', 'nombre' => 'Acme', 'dominio' => 'acme.test', ]); $user = User::factory()->create([ 'email' => 'customer@example.com', 'password' => Hash::make('secret123'), 'rol_codigo' => $role->codigo, 'tenant_codigo' => $tenant->codigo, ]); $this->postJson('/api/v1/scanner/login', [ 'email' => $user->email, 'password' => 'secret123', ])->assertUnprocessable()->assertJsonValidationErrors(['email']); } }