Files
Gnuboard7/modules/_bundled/sirsoft-ecommerce/tests/Unit/Database/Seeders/SequenceSeederTest.php
T
2026-04-20 20:37:49 +09:00

74 lines
2.8 KiB
PHP

<?php
namespace Modules\Sirsoft\Ecommerce\Tests\Unit\Database\Seeders;
use Modules\Sirsoft\Ecommerce\Database\Seeders\SequenceSeeder;
use Modules\Sirsoft\Ecommerce\Enums\SequenceType;
use Modules\Sirsoft\Ecommerce\Models\Sequence;
use Modules\Sirsoft\Ecommerce\Tests\ModuleTestCase;
/**
* SequenceSeeder 테스트
*
* 핵심 불변: current_value 는 운영 중 자동 증가하는 counter 이므로 재실행 시 리셋되면 안 됨.
*/
class SequenceSeederTest extends ModuleTestCase
{
public function test_seeder_creates_four_sequences_on_fresh_install(): void
{
$this->seed(SequenceSeeder::class);
$this->assertEquals(4, Sequence::count());
foreach ([SequenceType::PRODUCT, SequenceType::ORDER, SequenceType::CANCEL, SequenceType::REFUND] as $type) {
$this->assertTrue(
Sequence::where('type', $type->value)->exists(),
"{$type->value} 시퀀스가 생성되어야 함"
);
}
}
public function test_seeder_is_idempotent(): void
{
$this->seed(SequenceSeeder::class);
$this->seed(SequenceSeeder::class);
$this->assertEquals(4, Sequence::count(), '재실행해도 중복 생성되지 않아야 함');
}
/**
* 핵심 회귀 테스트: current_value 는 재시드 시 보존되어야 함
* (이전 delete+insert 패턴으로 리셋되던 버그 회귀 방지)
*/
public function test_seeder_preserves_current_value_on_reinstall(): void
{
$this->seed(SequenceSeeder::class);
// 운영 중 주문이 발생하여 current_value 가 증가한 상황 시뮬레이션
Sequence::where('type', SequenceType::ORDER->value)->update(['current_value' => 12345]);
Sequence::where('type', SequenceType::PRODUCT->value)->update(['current_value' => 9876]);
// 재시드 (install --force 시나리오)
$this->seed(SequenceSeeder::class);
$orderSequence = Sequence::where('type', SequenceType::ORDER->value)->first();
$productSequence = Sequence::where('type', SequenceType::PRODUCT->value)->first();
$this->assertEquals(12345, $orderSequence->current_value, '주문 current_value 가 보존되어야 함');
$this->assertEquals(9876, $productSequence->current_value, '상품 current_value 가 보존되어야 함');
}
public function test_seeder_creates_missing_sequence_when_partially_deleted(): void
{
$this->seed(SequenceSeeder::class);
// 사용자가 주문 시퀀스만 남기고 나머지 삭제한 상황
Sequence::where('type', '!=', SequenceType::ORDER->value)->delete();
$this->assertEquals(1, Sequence::count());
$this->seed(SequenceSeeder::class);
$this->assertEquals(4, Sequence::count(), '누락된 시퀀스가 재생성되어야 함');
}
}