shouldReceive('current')->once()->andReturn([ 'mode' => 'bootstrap', ]); $this->app->instance(SystemDatabaseConfiguration::class, $configuration); $this->artisan('system-database:verify') ->assertExitCode(VerifySystemDatabase::EXIT_CONFIG_NOT_LOADED); } 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, ]); } }