Testing Audit Logs
Fake the manager and assert application audit behavior.
Fake the audit manager
Call AuditLog::fake() to replace the database manager with an in-memory fake:
use HosmelQ\AuditLog\Facades\AuditLog;
use function HosmelQ\AuditLog\audit_log;
AuditLog::fake();
audit_log('document.published')
->tenant('org_123')
->record();
AuditLog::assertRecorded('document.published');The fake preserves the manager's batching and correlation behavior without writing to the database.
Assert recorded events
Assertions accept event strings or backed enums:
AuditLog::assertRecorded('document.published');
AuditLog::assertNotRecorded('document.archived');
AuditLog::assertRecordedInCorrelation('document.published', 'notification.sent');
AuditLog::assertRecordedTimes('document.published', 1);Use assertNothingRecorded when no logs should have been recorded:
AuditLog::assertNothingRecorded();assertRecorded() and assertNotRecorded() also accept closures when an assertion depends on the complete payload.
Inspect recorded data
Pass a closure to inspect matching AuditLogData objects:
use HosmelQ\AuditLog\Data\AuditLogData;
use HosmelQ\AuditLog\Facades\AuditLog;
AuditLog::assertRecorded(function (AuditLogData $log): bool {
return $log->event === 'document.published'
&& $log->tenantId === 'org_123'
&& $log->actor->id === 'member_123';
});Retrieve recorded logs as a collection and filter them by event string, backed enum, or closure:
use HosmelQ\AuditLog\Data\AuditLogData;
use HosmelQ\AuditLog\Facades\AuditLog;
$all = AuditLog::recorded();
$logs = AuditLog::recorded('document.published');
$filtered = AuditLog::recorded(fn (AuditLogData $log): bool => $log->tenantId === 'org_123');Assert correlations
Use assertRecordedInCorrelation() when several events must share one correlation ID:
AuditLog::assertRecordedInCorrelation(
'document.published',
'notification.sent',
);The assertion passes only when one correlation contains every expected event.