67 lines
1.8 KiB
PHP
67 lines
1.8 KiB
PHP
<?php
|
|
|
|
use App\Models\AuditLog;
|
|
use App\Models\User;
|
|
use App\Services\AuditLogger;
|
|
use Illuminate\Http\Request;
|
|
|
|
it('creates audit log with actor and subject', function (): void {
|
|
$user = User::factory()->create();
|
|
$subject = User::factory()->create();
|
|
|
|
$request = Request::create('/api/test', 'POST');
|
|
$request->headers->set('User-Agent', 'phpunit');
|
|
$request->server->set('REMOTE_ADDR', '127.0.0.1');
|
|
|
|
$logger = new AuditLogger();
|
|
$result = $logger->log(
|
|
$request,
|
|
'user.updated',
|
|
$subject,
|
|
['field' => 'name'],
|
|
$user
|
|
);
|
|
|
|
expect($result)->toBeInstanceOf(AuditLog::class);
|
|
$this->assertDatabaseHas('audit_logs', [
|
|
'user_id' => $user->id,
|
|
'action' => 'user.updated',
|
|
'subject_type' => $subject::class,
|
|
'subject_id' => $subject->id,
|
|
'ip_address' => '127.0.0.1',
|
|
'user_agent' => 'phpunit',
|
|
]);
|
|
});
|
|
|
|
it('handles missing user', function (): void {
|
|
$request = Request::create('/api/test', 'POST');
|
|
$request->headers->set('User-Agent', 'phpunit');
|
|
$request->server->set('REMOTE_ADDR', '127.0.0.1');
|
|
|
|
$logger = new AuditLogger();
|
|
$result = $logger->log($request, 'system.ping');
|
|
|
|
expect($result)->toBeInstanceOf(AuditLog::class);
|
|
$this->assertDatabaseHas('audit_logs', [
|
|
'action' => 'system.ping',
|
|
'user_id' => null,
|
|
]);
|
|
});
|
|
|
|
it('returns null when logging fails', function (): void {
|
|
AuditLog::creating(function () {
|
|
throw new RuntimeException('fail');
|
|
});
|
|
|
|
$request = Request::create('/api/test', 'POST');
|
|
$request->headers->set('User-Agent', 'phpunit');
|
|
$request->server->set('REMOTE_ADDR', '127.0.0.1');
|
|
|
|
$logger = new AuditLogger();
|
|
$result = $logger->log($request, 'system.fail');
|
|
|
|
expect($result)->toBeNull();
|
|
|
|
AuditLog::flushEventListeners();
|
|
});
|