Files
Gnuboard7/tests/Unit/Services/TemplateCustomTranslationServiceTest.php
2026-07-01 10:30:32 +09:00

119 lines
4.0 KiB
PHP

<?php
namespace Tests\Unit\Services;
use App\Models\Template;
use App\Models\TemplateCustomTranslation;
use App\Services\TemplateCustomTranslationService;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
/**
* TemplateCustomTranslationService 단위 테스트.
*
* 키 네이밍 정규화 / 활성 로케일 시드 / 폴백 / seq 증가를 검증합니다.
*/
class TemplateCustomTranslationServiceTest extends TestCase
{
use RefreshDatabase;
/**
* 같은 스위트의 DB 테스트와 migrate:fresh 정합성을 위해 일관 선언
* (requiredExtensions 누락 시 migrate:fresh 1회 함정 — feedback_required_extensions_all_db_tests).
*
* @var array<string>
*/
protected array $requiredExtensions = [
'plugins/sirsoft-gdpr',
];
private TemplateCustomTranslationService $service;
private Template $template;
protected function setUp(): void
{
parent::setUp();
$this->service = app(TemplateCustomTranslationService::class);
$this->template = Template::factory()->create();
}
public function test_create_key_normalizes_layout_name_with_slash(): void
{
$model = $this->service->createKey($this->template->id, 'board/list', 'ko', '값');
$this->assertSame('custom.board_list.1', $model->translation_key);
$this->assertSame('board/list', $model->layout_name);
}
public function test_create_key_seeds_all_active_locales(): void
{
$model = $this->service->createKey($this->template->id, 'home', 'ko', '안녕');
// config('app.supported_locales') = ['ko', 'en']
$this->assertArrayHasKey('ko', $model->values);
$this->assertArrayHasKey('en', $model->values);
$this->assertSame('안녕', $model->values['ko']);
$this->assertSame('안녕', $model->values['en']);
}
public function test_create_key_increments_seq(): void
{
$first = $this->service->createKey($this->template->id, 'home', 'ko', 'a');
$second = $this->service->createKey($this->template->id, 'home', 'ko', 'b');
$third = $this->service->createKey($this->template->id, 'home', 'ko', 'c');
$this->assertSame('custom.home.1', $first->translation_key);
$this->assertSame('custom.home.2', $second->translation_key);
$this->assertSame('custom.home.3', $third->translation_key);
}
public function test_create_key_seq_is_isolated_per_layout(): void
{
$this->service->createKey($this->template->id, 'home', 'ko', 'a');
$boardKey = $this->service->createKey($this->template->id, 'board/list', 'ko', 'b');
$this->assertSame('custom.board_list.1', $boardKey->translation_key);
}
public function test_create_key_continues_seq_after_existing_rows(): void
{
TemplateCustomTranslation::create([
'template_id' => $this->template->id,
'layout_name' => 'home',
'translation_key' => 'custom.home.5',
'values' => ['ko' => 'x', 'en' => 'x'],
'status' => 'active',
'lock_version' => 0,
]);
$next = $this->service->createKey($this->template->id, 'home', 'ko', 'y');
$this->assertSame('custom.home.6', $next->translation_key);
}
public function test_update_values_preserves_user_overrides_tracking(): void
{
$model = $this->service->createKey($this->template->id, 'home', 'ko', 'orig');
$updated = $this->service->updateValues(
$model->id,
['ko' => '수정', 'en' => 'edited'],
0,
);
$this->assertSame('수정', $updated->values['ko']);
$this->assertSame(1, $updated->lock_version);
// HasUserOverrides — 사용자가 손댄 로케일이 추적됨
$this->assertNotNull($updated->fresh()->user_overrides);
}
public function test_normalize_empty_layout_name_falls_back_to_layout(): void
{
$model = $this->service->createKey($this->template->id, ' ', 'ko', 'v');
$this->assertSame('custom.layout.1', $model->translation_key);
}
}