false]); parent::tearDown(); } public function test_module_trait_skips_has_table_when_installer_completed(): void { config(['app.installer_completed' => true]); DB::enableQueryLog(); ModuleManager::getActiveModuleIdentifiers(); $queries = DB::getQueryLog(); DB::disableQueryLog(); $schemaQueries = array_filter( $queries, fn ($q) => str_contains($q['query'], 'information_schema.tables') ); $this->assertCount(0, $schemaQueries, 'installer_completed=true 에서는 information_schema.tables 쿼리가 발생하지 않아야 합니다'); } public function test_plugin_trait_skips_has_table_when_installer_completed(): void { config(['app.installer_completed' => true]); DB::enableQueryLog(); PluginManager::getActivePluginIdentifiers(); $queries = DB::getQueryLog(); DB::disableQueryLog(); $schemaQueries = array_filter( $queries, fn ($q) => str_contains($q['query'], 'information_schema.tables') ); $this->assertCount(0, $schemaQueries); } public function test_template_trait_skips_has_table_when_installer_completed(): void { config(['app.installer_completed' => true]); DB::enableQueryLog(); TemplateManager::getActiveTemplateIdentifiers(); $queries = DB::getQueryLog(); DB::disableQueryLog(); $schemaQueries = array_filter( $queries, fn ($q) => str_contains($q['query'], 'information_schema.tables') ); $this->assertCount(0, $schemaQueries); } public function test_module_trait_falls_back_to_has_table_when_installer_not_completed(): void { config(['app.installer_completed' => false]); DB::enableQueryLog(); ModuleManager::getActiveModuleIdentifiers(); $queries = DB::getQueryLog(); DB::disableQueryLog(); $schemaQueries = array_filter( $queries, fn ($q) => str_contains($q['query'], 'information_schema.tables') ); $this->assertGreaterThan(0, count($schemaQueries), 'installer_completed=false 에서는 기존 hasTable 경로가 실행되어야 합니다'); } }