Files
a620906209 d6cc1cbca9
Run Tests / test (pull_request) Failing after 1m8s
test(unit): 補齊三個純邏輯 Unit test——狀態機、Enum 完整性、Email 正規化
BookingTransitionTest:驗證 canTransitionTo() 所有合法/非法轉換與終態不可逃脫(18 案例)
BookingStatusTest:驗證 7 個狀態完整性、from/tryFrom、VALID_TRANSITIONS 覆蓋一致性(10 案例)
NormalizesEmailTest:驗證大小寫與空白正規化邏輯(5 案例)

全部使用 PHPUnit 原生 TestCase,不需要資料庫連線,執行 1.82s。
全套件 187 passed / 464 assertions,零 regression。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 17:31:48 +08:00

68 lines
2.2 KiB
PHP

<?php
namespace Tests\Unit\Enums;
use App\Enums\BookingStatus;
use PHPUnit\Framework\TestCase;
/**
* BookingStatus enum 完整性測試。
* 確保 7 個狀態值與 booking-lifecycle 規格一致,
* 防止新增/刪除狀態時忘記同步 VALID_TRANSITIONS 常數。
*/
class BookingStatusTest extends TestCase
{
public function test_all_seven_cases_exist(): void
{
$values = array_map(fn ($case) => $case->value, BookingStatus::cases());
$this->assertEqualsCanonicalizing([
'pending',
'confirmed',
'completed',
'rejected',
'expired',
'member_cancelled',
'provider_cancelled',
], $values);
}
/** @dataProvider validStringProvider */
public function test_from_returns_correct_case(string $value, BookingStatus $expected): void
{
$this->assertSame($expected, BookingStatus::from($value));
}
public static function validStringProvider(): array
{
return [
['pending', BookingStatus::Pending],
['confirmed', BookingStatus::Confirmed],
['completed', BookingStatus::Completed],
['rejected', BookingStatus::Rejected],
['expired', BookingStatus::Expired],
['member_cancelled', BookingStatus::MemberCancelled],
['provider_cancelled', BookingStatus::ProviderCancelled],
];
}
public function test_try_from_returns_null_for_invalid_value(): void
{
$this->assertNull(BookingStatus::tryFrom('invalid_status'));
$this->assertNull(BookingStatus::tryFrom(''));
$this->assertNull(BookingStatus::tryFrom('PENDING'));
}
public function test_valid_transitions_covers_all_cases(): void
{
$allCases = array_map(fn ($case) => $case->value, BookingStatus::cases());
$transitionKeys = array_keys(\App\Models\Booking::VALID_TRANSITIONS);
$this->assertEqualsCanonicalizing(
$allCases,
$transitionKeys,
'VALID_TRANSITIONS 必須包含所有 BookingStatus 狀態,避免未知狀態繞過狀態機'
);
}
}