create(); $user = User::factory()->create(['tenant_id' => $tenant->id]); Log::shouldReceive('warning') ->once() ->withArgs(function (string $event, array $ctx) use ($tenant) { return $event === 'validation.rejected' && $ctx['path'] === 'api/projects' && $ctx['tenant_id'] === $tenant->id && in_array('name', $ctx['fields'], true); }); Log::shouldReceive('info')->zeroOrMoreTimes(); Log::shouldReceive('error')->zeroOrMoreTimes(); Log::shouldReceive('debug')->zeroOrMoreTimes(); $this->actingAs($user)->postJson('/api/projects', [ 'name' => '', // пусто → отказ 'signal_type' => 'call', 'signal_identifier' => '79991234567', 'daily_limit_target' => 10, 'regions' => [], 'delivery_days_mask' => 127, ])->assertStatus(422); }); it('НЕ пишет в журнал значения полей — там персональные данные', function () { $tenant = Tenant::factory()->create(); $user = User::factory()->create(['tenant_id' => $tenant->id]); $logged = []; Log::shouldReceive('warning')->andReturnUsing(function (string $event, array $ctx) use (&$logged) { $logged[] = $ctx; }); Log::shouldReceive('info')->zeroOrMoreTimes(); Log::shouldReceive('error')->zeroOrMoreTimes(); Log::shouldReceive('debug')->zeroOrMoreTimes(); $this->actingAs($user)->postJson('/api/projects', [ 'name' => 'Стоматология Дениса', 'signal_type' => 'call', 'signal_identifier' => '79221364286', // личный телефон клиента 'daily_limit_target' => 10, 'regions' => [], 'delivery_days_mask' => 0, // отказ по дням недели ])->assertStatus(422); $flat = json_encode($logged, JSON_UNESCAPED_UNICODE); expect($flat)->toContain('delivery_days_mask') // имя поля — да ->and($flat)->not->toContain('79221364286') // телефон — ни в коем случае ->and($flat)->not->toContain('Стоматология Дениса'); });