# dddream 套件測試指南

## 快速開始

在 `dddream` 套件目錄下執行：

```bash
cd vendor/daydreamlab/dddream

# 執行所有測試
./test.sh

# 只執行 Unit 測試
./test.sh unit

# 只執行 Feature 測試
./test.sh feature

# 只執行 RoomTypeFeature 相關測試
./test.sh room-type-feature
```

## 使用 PHPUnit 直接執行

```bash
cd vendor/daydreamlab/dddream

# 執行所有測試
php vendor/bin/phpunit

# 執行特定測試套件
php vendor/bin/phpunit --testsuite unit
php vendor/bin/phpunit --testsuite feature

# 執行特定 group 的測試
php vendor/bin/phpunit --group room-type-feature

# 執行特定目錄的測試
php vendor/bin/phpunit tests/Unit/Actions/Hotel/RoomTypeFeature/
```

## 測試結構

- `tests/Unit/` - 單元測試
- `tests/Feature/` - 功能測試

## Docker 環境執行

### 前置條件

- 主專案（例如 `dingsomething-admin`）已使用 Docker 開發環境，且 `docker/dev` 目錄與 `docker-compose` 已配置完成。
- 以下指令皆需從**主專案根目錄**開始，`docker/dev` 為相對於主專案根目錄的路徑。
- 測試在容器內執行時會使用 `phpunit.xml` 設定的 `DB_HOST=mysql` 連接 Docker 內的 MySQL 服務。

### 方法一：不進入容器，直接執行（推薦）

從主專案根目錄執行，不需先 `docker exec` 進入容器：

```bash
cd docker/dev
docker-compose exec php-fpm sh -c "cd /var/www/html && vendor/bin/phpunit -c vendor/daydreamlab/dddream/phpunit.xml --testsuite unit --testdox"
```

### 方法二：先進入容器再執行

```bash
cd docker/dev
docker-compose exec php-fpm sh

# 進入容器後
cd /var/www/html
vendor/bin/phpunit -c vendor/daydreamlab/dddream/phpunit.xml --testsuite unit --testdox
```

### 常用指令範例

僅執行新增子訂單相關測試：

```bash
docker-compose exec php-fpm sh -c "cd /var/www/html && vendor/bin/phpunit -c vendor/daydreamlab/dddream/phpunit.xml vendor/daydreamlab/dddream/tests/Unit/Actions/Hotel/Order/AddHotelOrderToContainerActionTest.php vendor/daydreamlab/dddream/tests/Unit/Actions/Hotel/Order/CreateHotelOrderActionTest.php --testdox"
```

僅執行 CalculateHotelOrder 計算訂單相關測試：

```bash
docker-compose exec php-fpm sh -c "cd /var/www/html && vendor/bin/phpunit -c vendor/daydreamlab/dddream/phpunit.xml vendor/daydreamlab/dddream/tests/Unit/Actions/Hotel/Order/CalculateHotelOrderActionTest.php --testdox"
```

執行特定測試檔案：

```bash
cd docker/dev
docker-compose exec php-fpm sh -c "cd /var/www/html && vendor/bin/phpunit -c vendor/daydreamlab/dddream/phpunit.xml vendor/daydreamlab/dddream/tests/Unit/Actions/Hotel/Order/CreateHotelOrderActionTest.php --testdox"
```

執行特定測試方法（使用 `--filter` 參數）：

```bash
cd docker/dev
docker-compose exec php-fpm sh -c "cd /var/www/html && vendor/bin/phpunit -c vendor/daydreamlab/dddream/phpunit.xml vendor/daydreamlab/dddream/tests/Unit/Actions/Hotel/Order/CreateHotelOrderActionTest.php --filter testCreateConfirmedOrder --testdox"
```

**注意**：執行特定測試方法時，請使用 `--filter` 參數，而不是將方法名稱當作檔案路徑。例如：
- ✅ 正確：`--filter testCreateConfirmedOrder`
- ❌ 錯誤：`CreateHotelOrderActionTest::testCreateConfirmedOrder.php`

## 注意事項

- 測試需要資料庫連接，請確保環境變數配置正確
- 測試配置檔案：`phpunit.xml`
- 所有 RoomTypeFeature 測試已標記 `@group room-type-feature`
