---
name: GenerateIntegrationTest
description: Hướng dẫn tạo Integration Test (người thật việc thật) sử dụng WebApplicationFactory và Testcontainers.
---

# GenerateIntegrationTest Skill

Khi user yêu cầu tạo **Integration Test** để kiểm tra API endpoint từ đầu đến cuối, bạn cần sinh ra code theo hướng dẫn sau:

## Mục đích
- Test xem các mảnh ghép lắp vào ghép với nhau có chạy đúng không.
- Flow: Client gọi API -> Middleware -> Controller -> CQRS Handler/Service -> Ghi/Đọc Database thật.

## Hướng dẫn thực hiện
1. **Setup WebApplicationFactory:**
   - Tự động setup `WebApplicationFactory<Program>` (tạo một test server ngay trong RAM của .NET).
   - Override cấu hình ứng dụng nếu cần thiết (ví dụ thay đổi ConnectionString trỏ sang test container).

2. **Setup Testcontainers (Real Database):**
   - Sử dụng thư viện `Testcontainers` (hoặc cấu hình tương tự) để tự động spin up một Docker container chứa Database thật (ví dụ: PostgreSQL, SQL Server).
   - Đảm bảo database container này được start trước khi chạy test và tự động xóa (dispose) sau khi test xong. Tránh dùng SQLite in-memory vì hay bị lỗi vặt và không tương đương với database production.

3. **Viết kịch bản Test gọi API (Arrange - Act - Assert):**
   - Tạo đối tượng `HttpClient` từ `WebApplicationFactory.CreateClient()`.
   - **Arrange:** Chuẩn bị payload data dạng JSON objects hoặc tạo trước data base records nếu là API GET/PUT/DELETE.
   - **Act:** Gọi thẳng vào API endpoint tương ứng bằng code. VD: `await client.PostAsJsonAsync("/api/v1/samples", payload);`.
   - **Assert:** Kiểm tra kết quả trả về:
     - Check HTTP Status: có phải `200 OK` hay `400 Bad Request` không.
     - Deserialize response body để check chính xác object.
     - (Tùy chọn) Query thẳng vào database container xem bản ghi đã được sinh ra/cập nhật thật chưa.

## Định dạng file đầu ra
- **Đường dẫn:** Chứa trong project test tương ứng như `tests/MyNewProjectName.IntegrationTests/Controllers/...`.
- **Tên file:** `[ControllerName]Tests.cs` (ví dụ: `OrdersControllerTests.cs`).
