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, ]); } }