101 lines
4.4 KiB
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,
|
|
]);
|
|
}
|
|
}
|