withType('welcome')->create(); $this->assertEquals('welcome', $template->type); } /** * subject가 array로 캐스팅됨 */ public function test_subject_is_cast_to_array(): void { $template = MailTemplate::factory()->create([ 'subject' => ['ko' => '한국어 제목', 'en' => 'English Subject'], ]); $this->assertIsArray($template->subject); $this->assertEquals('한국어 제목', $template->subject['ko']); } /** * body가 array로 캐스팅됨 */ public function test_body_is_cast_to_array(): void { $template = MailTemplate::factory()->create([ 'body' => ['ko' => '
본문
', 'en' => 'Body
'], ]); $this->assertIsArray($template->body); $this->assertEquals('본문
', $template->body['ko']); } /** * variables가 array로 캐스팅됨 */ public function test_variables_is_cast_to_array(): void { $template = MailTemplate::factory()->create([ 'variables' => [['key' => 'name', 'description' => '이름']], ]); $this->assertIsArray($template->variables); $this->assertEquals('name', $template->variables[0]['key']); } /** * is_active가 boolean으로 캐스팅됨 */ public function test_is_active_is_cast_to_boolean(): void { $template = MailTemplate::factory()->create(['is_active' => 1]); $this->assertIsBool($template->is_active); $this->assertTrue($template->is_active); } /** * is_default가 boolean으로 캐스팅됨 */ public function test_is_default_is_cast_to_boolean(): void { $template = MailTemplate::factory()->create(['is_default' => 0]); $this->assertIsBool($template->is_default); $this->assertFalse($template->is_default); } // ======================================================================== // 관계 // ======================================================================== /** * updater 관계가 User를 반환 */ public function test_updater_returns_user(): void { $user = User::factory()->create(); $template = MailTemplate::factory()->create(['updated_by' => $user->id]); $this->assertInstanceOf(User::class, $template->updater); $this->assertEquals($user->id, $template->updater->id); } /** * updated_by가 null이면 updater도 null */ public function test_updater_returns_null_when_no_updater(): void { $template = MailTemplate::factory()->create(['updated_by' => null]); $this->assertNull($template->updater); } // ======================================================================== // scopeActive // ======================================================================== /** * active 스코프가 활성 템플릿만 반환 */ public function test_scope_active_filters_correctly(): void { MailTemplate::factory()->count(2)->create(['is_active' => true]); MailTemplate::factory()->inactive()->create(); $result = MailTemplate::active()->get(); $this->assertCount(2, $result); } // ======================================================================== // scopeByType // ======================================================================== /** * byType 스코프가 특정 유형만 반환 */ public function test_scope_by_type_filters_correctly(): void { MailTemplate::factory()->withType('welcome')->create(); MailTemplate::factory()->withType('reset_password')->create(); $result = MailTemplate::byType('welcome')->get(); $this->assertCount(1, $result); $this->assertEquals('welcome', $result->first()->type); } // ======================================================================== // getLocalizedSubject / getLocalizedBody // ======================================================================== /** * getLocalizedSubject가 현재 로케일 제목을 반환 */ public function test_get_localized_subject_returns_current_locale(): void { app()->setLocale('ko'); $template = MailTemplate::factory()->create([ 'subject' => ['ko' => '한국어 제목', 'en' => 'English Subject'], ]); $this->assertEquals('한국어 제목', $template->getLocalizedSubject()); } /** * getLocalizedSubject가 지정된 로케일 제목을 반환 */ public function test_get_localized_subject_with_specific_locale(): void { $template = MailTemplate::factory()->create([ 'subject' => ['ko' => '한국어 제목', 'en' => 'English Subject'], ]); $this->assertEquals('English Subject', $template->getLocalizedSubject('en')); } /** * getLocalizedSubject가 fallback으로 ko를 반환 */ public function test_get_localized_subject_falls_back_to_ko(): void { $template = MailTemplate::factory()->create([ 'subject' => ['ko' => '한국어 제목'], ]); $this->assertEquals('한국어 제목', $template->getLocalizedSubject('ja')); } /** * getLocalizedBody가 현재 로케일 본문을 반환 */ public function test_get_localized_body_returns_current_locale(): void { app()->setLocale('en'); $template = MailTemplate::factory()->create([ 'body' => ['ko' => '본문
', 'en' => 'Body
'], ]); $this->assertEquals('Body
', $template->getLocalizedBody()); } // ======================================================================== // replaceVariables // ======================================================================== /** * replaceVariables가 변수를 올바르게 치환 */ public function test_replace_variables_substitutes_correctly(): void { $template = MailTemplate::factory()->withVariables()->create(); $result = $template->replaceVariables([ 'name' => '홍길동', 'app_name' => 'G7', ], 'ko'); $this->assertEquals('[G7] 홍길동님 환영합니다', $result['subject']); $this->assertStringContainsString('홍길동님, G7에 가입해 주셔서', $result['body']); } /** * replaceVariables가 누락된 변수는 그대로 유지 */ public function test_replace_variables_keeps_unreplaced_variables(): void { $template = MailTemplate::factory()->withVariables()->create(); $result = $template->replaceVariables(['name' => '홍길동'], 'ko'); $this->assertStringContainsString('{app_name}', $result['subject']); } }