CaiWuXiTong/tests/Feature/Installation/VerifySystemDatabaseTest.php

101 lines
4.4 KiB
PHP

<?php
namespace Tests\Feature\Installation;
use App\Console\Commands\VerifySystemDatabase;
use App\Utilities\SystemDatabaseConfiguration;
use Mockery;
use RuntimeException;
use Tests\TestCase;
class VerifySystemDatabaseTest extends TestCase
{
public function test_bootstrap_is_not_reported_as_a_failed_remote_connection(): void
{
$configuration = Mockery::mock(SystemDatabaseConfiguration::class);
$configuration->shouldReceive('current')->once()->andReturn([
'mode' => 'bootstrap',
]);
$this->app->instance(SystemDatabaseConfiguration::class, $configuration);
$this->artisan('system-database:verify')
->expectsOutputToContain('尚未接入团队共享系统数据库;本次没有测试远程连接')
->assertExitCode(VerifySystemDatabase::EXIT_SHARED_NOT_CONFIGURED);
}
public function test_shared_mode_with_disabled_stored_configuration_is_not_ready(): void
{
config(['upstreams.stored_configuration.enabled' => false]);
$configuration = Mockery::mock(SystemDatabaseConfiguration::class);
$configuration->shouldReceive('current')->once()->andReturn(['mode' => 'shared']);
$this->app->instance(SystemDatabaseConfiguration::class, $configuration);
$this->artisan('system-database:verify')
->expectsOutputToContain('共享配置未完整启用')
->assertExitCode(VerifySystemDatabase::EXIT_CONFIG_NOT_LOADED);
}
public function test_current_configuration_failure_remains_a_configuration_error(): void
{
$configuration = Mockery::mock(SystemDatabaseConfiguration::class);
$configuration->shouldReceive('current')->once()->andThrow(new RuntimeException('private details'));
$this->app->instance(SystemDatabaseConfiguration::class, $configuration);
$this->artisan('system-database:verify')
->expectsOutputToContain('新配置未被 Laravel 加载')
->assertExitCode(VerifySystemDatabase::EXIT_CONFIG_NOT_LOADED);
}
public function test_shared_success_requires_connection_and_system_table_verification(): void
{
$this->enableSharedMode();
$settings = ['mode' => 'shared', 'connection' => config('database.default')];
$configuration = Mockery::mock(SystemDatabaseConfiguration::class);
$configuration->shouldReceive('current')->once()->andReturn($settings);
$configuration->shouldReceive('probe')->once()->with($settings)->andReturn([]);
$this->app->instance(SystemDatabaseConfiguration::class, $configuration);
$this->artisan('system-database:verify')->expectsOutputToContain('共享系统数据库已通过应用级验证')->assertSuccessful();
}
public function test_verify_command_reports_database_connection_failure(): void
{
$this->enableSharedMode();
$configuration = Mockery::mock(SystemDatabaseConfiguration::class);
$configuration->shouldReceive('current')->once()->andReturn([
'mode' => 'shared',
'connection' => 'missing-connection',
]);
$this->app->instance(SystemDatabaseConfiguration::class, $configuration);
$this->artisan('system-database:verify')
->assertExitCode(VerifySystemDatabase::EXIT_DATABASE_CONNECTION_FAILED);
}
public function test_verify_command_reports_system_table_failure(): void
{
$this->enableSharedMode();
$connection = (string) config('database.default');
$settings = [
'mode' => 'shared',
'connection' => $connection,
];
$configuration = Mockery::mock(SystemDatabaseConfiguration::class);
$configuration->shouldReceive('current')->once()->andReturn($settings);
$configuration->shouldReceive('probe')->once()->with($settings)->andThrow(new RuntimeException('hidden'));
$this->app->instance(SystemDatabaseConfiguration::class, $configuration);
$this->artisan('system-database:verify')
->assertExitCode(VerifySystemDatabase::EXIT_SYSTEM_TABLE_VALIDATION_FAILED);
}
private function enableSharedMode(): void
{
config([
'upstreams.stored_configuration.enabled' => true,
// 生产刷新节点可能通过私有隧道覆盖上游端点;这不影响系统数据库
// 本身是否已切换并加载,验证命令不能把两件事绑定在一起。
'upstreams.local_configuration.enabled' => true,
]);
}
}