registry = $this->app->make(LanguagePackRegistry::class); $this->injector = $this->app->make(LanguagePackSeedInjector::class); $this->packRoot = base_path('lang-packs/test-core-idv-ja'); File::ensureDirectoryExists($this->packRoot.'/seed'); } protected function tearDown(): void { File::deleteDirectory($this->packRoot); File::deleteDirectory(base_path('lang-packs/test-module-idv-ja')); parent::tearDown(); } private function setupCorePackWithSeed(array $seedData): void { File::put($this->packRoot.'/seed/identity_messages.json', json_encode($seedData)); LanguagePack::query()->create([ 'identifier' => 'test-core-idv-ja', 'vendor' => 'test', 'scope' => LanguagePackScope::Core->value, 'target_identifier' => null, 'locale' => 'ja', 'locale_name' => 'Japanese', 'locale_native_name' => '日本語', 'text_direction' => 'ltr', 'version' => '1.0.0', 'status' => LanguagePackStatus::Active->value, 'is_protected' => false, 'manifest' => [], 'source_type' => 'zip', ]); $this->app->forgetInstance(LanguagePackRegistry::class); $this->app->forgetInstance(LanguagePackSeedInjector::class); $this->registry = $this->app->make(LanguagePackRegistry::class); $this->injector = $this->app->make(LanguagePackSeedInjector::class); } public function test_inject_identity_messages_merges_definition_and_templates_for_string_keyed(): void { // config/core.php::identity_messages 패턴 (string-keyed array) $this->setupCorePackWithSeed([ 'mail.purpose.signup' => [ 'definition' => [ 'name' => '会員登録認証', 'description' => '会員登録時のメール認証', ], 'templates' => [ 'mail' => [ 'subject' => '[アプリ] 会員登録認証コード', 'body' => '

認証コード: {code}

', ], ], ], ]); $definitions = [ 'mail.purpose.signup' => [ 'provider_id' => 'g7:core.mail', 'scope_type' => 'purpose', 'scope_value' => 'signup', 'name' => ['ko' => '회원가입 인증', 'en' => 'Signup Verification'], 'description' => ['ko' => '회원가입 인증', 'en' => ''], 'channels' => ['mail'], 'templates' => [ [ 'channel' => 'mail', 'subject' => ['ko' => '[앱] 회원가입 인증', 'en' => '[App] Signup'], 'body' => ['ko' => '

코드: {code}

', 'en' => '

Code: {code}

'], ], ], ], ]; $result = $this->injector->injectIdentityMessages($definitions); $this->assertSame('会員登録認証', $result['mail.purpose.signup']['name']['ja']); $this->assertSame('会員登録時のメール認証', $result['mail.purpose.signup']['description']['ja']); $this->assertSame('[アプリ] 会員登録認証コード', $result['mail.purpose.signup']['templates'][0]['subject']['ja']); $this->assertSame('

認証コード: {code}

', $result['mail.purpose.signup']['templates'][0]['body']['ja']); // ko/en 보존 $this->assertSame('회원가입 인증', $result['mail.purpose.signup']['name']['ko']); $this->assertSame('Signup Verification', $result['mail.purpose.signup']['name']['en']); } public function test_inject_identity_messages_skips_definitions_without_seed_match(): void { $this->setupCorePackWithSeed([ 'mail.purpose.signup' => [ 'definition' => ['name' => '会員登録認証', 'description' => ''], 'templates' => [], ], ]); $definitions = [ 'mail.provider_default' => [ 'provider_id' => 'g7:core.mail', 'scope_type' => 'provider_default', 'scope_value' => '', 'name' => ['ko' => '기본', 'en' => 'Default'], 'description' => ['ko' => '', 'en' => ''], 'templates' => [], ], ]; $result = $this->injector->injectIdentityMessages($definitions); // seed 미매칭 → ja 키 추가되지 않음 $this->assertArrayNotHasKey('ja', $result['mail.provider_default']['name']); $this->assertSame('기본', $result['mail.provider_default']['name']['ko']); } public function test_inject_extension_identity_messages_merges_module_pack_seed(): void { $packRoot = base_path('lang-packs/test-module-idv-ja'); File::ensureDirectoryExists($packRoot.'/seed'); File::put($packRoot.'/seed/identity_messages.json', json_encode([ 'mail.policy.module_specific' => [ 'definition' => ['name' => 'モジュール固有', 'description' => ''], 'templates' => [ 'mail' => ['subject' => '件名', 'body' => '本文'], ], ], ])); LanguagePack::query()->create([ 'identifier' => 'test-module-idv-ja', 'vendor' => 'test', 'scope' => LanguagePackScope::Module->value, 'target_identifier' => 'test-module', 'locale' => 'ja', 'locale_name' => 'Japanese', 'locale_native_name' => '日本語', 'text_direction' => 'ltr', 'version' => '1.0.0', 'status' => LanguagePackStatus::Active->value, 'is_protected' => false, 'manifest' => [], 'source_type' => 'zip', ]); $this->registry->invalidate(); // 모듈 측은 numeric-indexed (config/core.php 와 달리 list 형태로 선언) $definitions = [ [ 'provider_id' => 'g7:core.mail', 'scope_type' => 'policy', 'scope_value' => 'module_specific', 'name' => ['ko' => '모듈 고유', 'en' => 'Module Specific'], 'description' => ['ko' => '', 'en' => ''], 'templates' => [ [ 'channel' => 'mail', 'subject' => ['ko' => '제목', 'en' => 'Subject'], 'body' => ['ko' => '본문', 'en' => 'Body'], ], ], ], ]; $result = $this->injector->injectExtensionIdentityMessages($definitions, 'test-module'); $this->assertSame('モジュール固有', $result[0]['name']['ja']); $this->assertSame('件名', $result[0]['templates'][0]['subject']['ja']); $this->assertSame('本文', $result[0]['templates'][0]['body']['ja']); } public function test_inject_identity_messages_skips_when_no_active_pack(): void { $definitions = [ 'mail.purpose.signup' => [ 'provider_id' => 'g7:core.mail', 'scope_type' => 'purpose', 'scope_value' => 'signup', 'name' => ['ko' => '회원가입', 'en' => 'Signup'], 'templates' => [], ], ]; $result = $this->injector->injectIdentityMessages($definitions); $this->assertSame($definitions, $result); } }