fedi-feed-router/backend/tests/Unit/Services/Log/LogSaverTest.php
2025-08-15 18:20:19 +02:00

282 lines
No EOL
8.8 KiB
PHP

<?php
namespace Tests\Unit\Services\Log;
use Domains\Logging\Enums\LogLevelEnum;
use Domains\Platform\Enums\PlatformEnum;
use Domains\Logging\Models\Log;
use Domains\Platform\Models\PlatformChannel;
use Domains\Platform\Models\PlatformInstance;
use Domains\Logging\Services\LogSaver;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class LogSaverTest extends TestCase
{
use RefreshDatabase;
private LogSaver $logSaver;
protected function setUp(): void
{
parent::setUp();
$this->logSaver = new LogSaver();
}
public function test_info_creates_log_record_with_info_level(): void
{
$message = 'Test info message';
$context = ['key' => 'value'];
$this->logSaver->info($message, null, $context);
$this->assertDatabaseHas('logs', [
'level' => LogLevelEnum::INFO,
'message' => $message,
]);
$log = Log::first();
$this->assertEquals($context, $log->context);
}
public function test_error_creates_log_record_with_error_level(): void
{
$message = 'Test error message';
$context = ['error_code' => 500];
$this->logSaver->error($message, null, $context);
$this->assertDatabaseHas('logs', [
'level' => LogLevelEnum::ERROR,
'message' => $message,
]);
$log = Log::first();
$this->assertEquals($context, $log->context);
}
public function test_warning_creates_log_record_with_warning_level(): void
{
$message = 'Test warning message';
$context = ['warning_type' => 'deprecation'];
$this->logSaver->warning($message, null, $context);
$this->assertDatabaseHas('logs', [
'level' => LogLevelEnum::WARNING,
'message' => $message,
]);
$log = Log::first();
$this->assertEquals($context, $log->context);
}
public function test_debug_creates_log_record_with_debug_level(): void
{
$message = 'Test debug message';
$context = ['debug_info' => 'trace'];
$this->logSaver->debug($message, null, $context);
$this->assertDatabaseHas('logs', [
'level' => LogLevelEnum::DEBUG,
'message' => $message,
]);
$log = Log::first();
$this->assertEquals($context, $log->context);
}
public function test_log_with_channel_includes_channel_information_in_context(): void
{
$platformInstance = PlatformInstance::factory()->create([
'platform' => PlatformEnum::LEMMY,
'url' => 'https://lemmy.example.com'
]);
$channel = PlatformChannel::factory()->create([
'name' => 'Test Channel',
'platform_instance_id' => $platformInstance->id
]);
$message = 'Test message with channel';
$originalContext = ['original_key' => 'original_value'];
$this->logSaver->info($message, $channel, $originalContext);
$log = Log::first();
$expectedContext = array_merge($originalContext, [
'channel_id' => $channel->id,
'channel_name' => 'Test Channel',
'platform' => PlatformEnum::LEMMY->value,
'instance_url' => 'https://lemmy.example.com',
]);
$this->assertEquals($expectedContext, $log->context);
$this->assertEquals($message, $log->message);
$this->assertEquals(LogLevelEnum::INFO, $log->level);
}
public function test_log_without_channel_uses_original_context_only(): void
{
$message = 'Test message without channel';
$context = ['test_key' => 'test_value'];
$this->logSaver->info($message, null, $context);
$log = Log::first();
$this->assertEquals($context, $log->context);
$this->assertEquals($message, $log->message);
}
public function test_log_with_empty_context_creates_minimal_log(): void
{
$message = 'Simple message';
$this->logSaver->info($message);
$this->assertDatabaseHas('logs', [
'level' => LogLevelEnum::INFO,
'message' => $message,
]);
$log = Log::first();
$this->assertEquals([], $log->context);
}
public function test_log_with_channel_but_empty_context_includes_only_channel_info(): void
{
$platformInstance = PlatformInstance::factory()->create([
'platform' => PlatformEnum::LEMMY,
'url' => 'https://test.lemmy.com'
]);
$channel = PlatformChannel::factory()->create([
'name' => 'Empty Context Channel',
'platform_instance_id' => $platformInstance->id
]);
$message = 'Message with channel but no context';
$this->logSaver->warning($message, $channel);
$log = Log::first();
$expectedContext = [
'channel_id' => $channel->id,
'channel_name' => 'Empty Context Channel',
'platform' => PlatformEnum::LEMMY->value,
'instance_url' => 'https://test.lemmy.com',
];
$this->assertEquals($expectedContext, $log->context);
$this->assertEquals(LogLevelEnum::WARNING, $log->level);
}
public function test_context_merging_preserves_original_keys_and_adds_channel_info(): void
{
$platformInstance = PlatformInstance::factory()->create([
'platform' => PlatformEnum::LEMMY,
'url' => 'https://merge.lemmy.com'
]);
$channel = PlatformChannel::factory()->create([
'name' => 'Merge Test Channel',
'platform_instance_id' => $platformInstance->id
]);
$originalContext = [
'article_id' => 123,
'user_action' => 'publish',
'timestamp' => '2024-01-01 12:00:00'
];
$this->logSaver->error('Context merge test', $channel, $originalContext);
$log = Log::first();
$expectedContext = [
'article_id' => 123,
'user_action' => 'publish',
'timestamp' => '2024-01-01 12:00:00',
'channel_id' => $channel->id,
'channel_name' => 'Merge Test Channel',
'platform' => PlatformEnum::LEMMY->value,
'instance_url' => 'https://merge.lemmy.com',
];
$this->assertEquals($expectedContext, $log->context);
}
public function test_multiple_logs_are_created_independently(): void
{
$this->logSaver->info('First message', null, ['id' => 1]);
$this->logSaver->error('Second message', null, ['id' => 2]);
$this->logSaver->warning('Third message', null, ['id' => 3]);
$this->assertDatabaseCount('logs', 3);
$logs = Log::orderBy('id')->get();
$this->assertEquals(LogLevelEnum::INFO, $logs[0]->level);
$this->assertEquals('First message', $logs[0]->message);
$this->assertEquals(['id' => 1], $logs[0]->context);
$this->assertEquals(LogLevelEnum::ERROR, $logs[1]->level);
$this->assertEquals('Second message', $logs[1]->message);
$this->assertEquals(['id' => 2], $logs[1]->context);
$this->assertEquals(LogLevelEnum::WARNING, $logs[2]->level);
$this->assertEquals('Third message', $logs[2]->message);
$this->assertEquals(['id' => 3], $logs[2]->context);
}
public function test_log_with_complex_context_data(): void
{
$complexContext = [
'nested' => [
'array' => ['value1', 'value2'],
'object' => ['key' => 'value']
],
'numbers' => [1, 2, 3.14],
'boolean' => true,
'null_value' => null
];
$this->logSaver->debug('Complex context test', null, $complexContext);
$log = Log::first();
$this->assertEquals($complexContext, $log->context);
}
public function test_each_log_level_method_delegates_to_private_log_method(): void
{
$message = 'Test message';
$context = ['test' => true];
// Test all four log level methods
$this->logSaver->info($message, null, $context);
$this->logSaver->error($message, null, $context);
$this->logSaver->warning($message, null, $context);
$this->logSaver->debug($message, null, $context);
// Should have 4 log entries
$this->assertDatabaseCount('logs', 4);
$logs = Log::orderBy('id')->get();
// Verify each level was set correctly
$this->assertEquals(LogLevelEnum::INFO, $logs[0]->level);
$this->assertEquals(LogLevelEnum::ERROR, $logs[1]->level);
$this->assertEquals(LogLevelEnum::WARNING, $logs[2]->level);
$this->assertEquals(LogLevelEnum::DEBUG, $logs[3]->level);
// All should have the same message and context
foreach ($logs as $log) {
$this->assertEquals($message, $log->message);
$this->assertEquals($context, $log->context);
}
}
}