assertTrue(class_exists($listenerClass)); $this->assertSame( 'sirsoft-ecommerce', ExtensionManager::resolveExtensionByFqcn($listenerClass) ); } public function test_loggable_model_fqcn_resolves_to_ecommerce_identifier(): void { $this->assertSame( 'sirsoft-ecommerce', ExtensionManager::resolveExtensionByFqcn(\Modules\Sirsoft\Ecommerce\Models\Order::class) ); } public function test_module_lang_action_array_includes_module_specific_last_segments_ko(): void { $langFile = __DIR__.'/../../src/lang/ko/activity_log.php'; $this->assertFileExists($langFile); $lang = require $langFile; $this->assertArrayHasKey('action', $lang, '모듈 lang 에 action 배열이 신설되어야 함 (이슈 #317)'); // 이커머스 specific 키들 — 코어 lang 에서 제거되었으므로 모듈 lang 에 정의 필수 $required = ['confirm', 'partial_cancel', 'payment_complete', 'earn', 'use', 'change_option', 'update_quantity']; foreach ($required as $key) { $this->assertArrayHasKey($key, $lang['action'], "ko: action.{$key} 누락"); $this->assertNotEmpty($lang['action'][$key], "ko: action.{$key} 라벨 비어있음"); } } public function test_module_lang_action_array_includes_module_specific_last_segments_en(): void { $langFile = __DIR__.'/../../src/lang/en/activity_log.php'; $this->assertFileExists($langFile); $lang = require $langFile; $this->assertArrayHasKey('action', $lang, 'Module lang must define action array (#317)'); $required = ['confirm', 'partial_cancel', 'payment_complete', 'earn', 'use', 'change_option', 'update_quantity']; foreach ($required as $key) { $this->assertArrayHasKey($key, $lang['action'], "en: action.{$key} missing"); $this->assertNotEmpty($lang['action'][$key], "en: action.{$key} empty"); } } }