diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9271099 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Smartgift & Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index a99e00d..7e1f043 100644 --- a/README.md +++ b/README.md @@ -1,149 +1,337 @@ -# 🚀 Laravel Agent Unit Testing Toolkit +# 🚀 Laravel Unit Testing Toolkit for Claude Code -Bộ công cụ, cẩm nang quy chuẩn và Claude Code Skills chuyên biệt dành cho việc **tự động phân tích, thiết lập môi trường và sinh Unit Test chuẩn xác cho bất kỳ mã nguồn PHP Laravel nào** (hỗ trợ Laravel 9, 10, 11; PHPUnit 9/10/11 & Pest PHP v2/v3). +> **Bộ công cụ tự động hóa toàn diện cho việc thiết lập môi trường, sinh Unit Test chuẩn AAA và kiểm thử tự động cho bất kỳ dự án PHP & Laravel nào (từ Laravel 8 đến 13+, PHP 8.0 đến 8.4+).** + +Được phát triển dưới dạng mã nguồn mở (Open Source) dành cho mọi lập trình viên, đội ngũ kỹ thuật và cộng đồng phát triển phần mềm. --- -## 🌟 Tính Năng Nổi Bật +## 📑 MỤC LỤC +1. [Điểm Nổi Bật & Tính Năng Cốt Lõi](#1-điểm-nổi-bật--tính-năng-cốt-lõi) +2. [Cấu Trúc Thư Mục Repository](#2-cấu-trúc-thư-mục-repository) +3. [Hướng Dẫn Cài Đặt Lần Đầu](#3-hướng-dẫn-cài-đặt-lần-đầu) +4. [Khởi Tạo Cho Một Dự Án Laravel Bất Kỳ](#4-khởi-tạo-cho-một-dự-án-laravel-bất-kỳ) +5. [Quy Trình 5 Bước Sinh & Chạy Unit Test](#5-quy-trình-5-bước-sinh--chạy-unit-test) + - [Bước 1: Quét Môi Trường & Cài Packages (`/laravel-test-setup`)](#bước-1-quét-môi-trường--cài-packages-laravel-test-setup) + - [Bước 2: Sinh Unit Test Tự Động (`/laravel-unit-test`)](#bước-2-sinh-unit-test-tự-động-laravel-unit-test) + - [Bước 3: Chạy Test Thông Minh (`test-runner.sh`)](#bước-3-chạy-test-thông-minh-test-runnersh) + - [Bước 4: Thẩm Định & Chấm Điểm Test (`/laravel-test-review`)](#bước-4-thẩm-định--chấm-điểm-test-laravel-test-review) + - [Bước 5: Sinh Mã Giả Lập Nhanh (`/laravel-mock-helper`)](#bước-5-sinh-mã-giả-lập-nhanh-laravel-mock-helper) +6. [Cách Cập Nhật Bộ Công Cụ Khi Có Nâng Cấp](#6-cách-cập-nhật-bộ-công-cụ-khi-có-nâng-cấp) +7. [Giải Đáp Thắc Mắc & Xử Lý Lỗi (FAQ & Troubleshooting)](#7-giải-đáp-thắc-mắc--xử-lý-lỗi-faq--troubleshooting) +8. [Bảng Tra Cứu Toàn Bộ Lệnh (Full Cheat Sheet)](#8-bảng-tra-cứu-toàn-bộ-lệnh-full-cheat-sheet) +9. [Ma Trận Tương Thích & Bản Quyền](#9-ma-trận-tương-thích--bản-quyền) -1. **Chuẩn Hóa Môi Trường (Step 0)**: - - Tự động phát hiện cấu hình Docker (Sail, Docker Compose) hoặc PHP CLI cục bộ. - - Thiết lập SQLite In-Memory (`:memory:`) siêu tốc, bảo vệ tuyệt đối database dev. - - Script chạy test thông minh `test-runner.sh` tự nhận diện môi trường container. +--- + +## 1. Điểm Nổi Bật & Tính Năng Cốt Lõi + +1. **Chuẩn Hóa Môi Trường Tự Động (Bước 0)**: + - Tự động nhận diện runtime: **Laravel Sail**, **Docker Compose** (service `app`/`php`), hoặc **PHP CLI cục bộ**. + - Bảo vệ an toàn database: thiết lập SQLite In-Memory (`:memory:`), tuyệt đối không chạm hay làm mất dữ liệu dev/local. + - Tự động cài đặt các package còn thiếu (`mockery`, `faker`, `paratest`) thẳng vào đúng container đang chạy. 2. **Triết Lý Kiểm Thử Đỉnh Cao (AAA & Isolation)**: - - Cô lập hoàn toàn logic đơn vị, mock đúng nơi, fake đúng chỗ. - - Tuyệt đối không over-mock DTO, Value Object hay Mock chuỗi Eloquent Builder. -3. **Cẩm Nang Chi Tiết Cho 13 Tầng Kiến Trúc Laravel**: - - Services, Actions, Controllers, FormRequests, Custom Rules, Repositories, Query Builders, Models, Jobs, Events, Listeners, Middlewares, Policies, Notifications, Mails, Commands, View Components, Observers, Exceptions. -4. **Hệ Thống 4 Skills Tự Động Hóa Cho Claude Code**: - - `/laravel-test-setup`: Quét môi trường, cấu hình và chạy Smoke Test. - - `/laravel-unit-test`: Đọc class nguồn -> Sinh file test hoàn chỉnh. - - `/laravel-test-review`: Thẩm định, chấm điểm và chỉ ra lỗi anti-patterns của file test. - - `/laravel-mock-helper`: Sinh code Mockery / Fakes nhanh cho Interface/Class. + - Đảm bảo tính cô lập tuyệt đối (Zero Leakage): mock toàn bộ external services, APIs, queues, mails. + - Không over-mocking: giữ nguyên thực thể DTO, Value Object, Collection thật. + - Chặn đứng lỗi anti-pattern mock chuỗi Eloquent Query Builder dễ vỡ. +3. **Bao Phủ Trọn Vẹn 13 Tầng Kiến Trúc Laravel**: + - Services, Actions, Controllers, FormRequests, Custom Rules, Repositories, Query Builders, Models, Jobs, Events, Listeners, Middlewares, Policies, Notifications, Mailables, Artisan Commands, View Components, Observers, Exceptions. +4. **Chế Độ Autopilot Khép Kín (`/laravel-unit-test --all --run`)**: + - Chỉ với 1 lệnh duy nhất: tự động lập manifest quét toàn bộ dự án, viết test tuần tự không sót file, **viết đến đâu tự chạy test đến đó**, và **tự động sửa lỗi (Auto-Healing)** cho đến khi PASS 100%. +5. **Sẵn Sàng Cho Tương Lai & Architecture Testing**: + - Hỗ trợ đầy đủ tính năng mới nhất của **PHP 8.4+** (Property Hooks, Asymmetric Visibility). + - Tích hợp bộ kiểm thử kiến trúc toàn dự án **Architecture Test** bằng Pest v3 / PHPUnit (`arch()`). + - Cung cấp sẵn file cấu hình CI/CD Quality Gate (GitHub Actions, GitLab CI) chặn merge PR nếu code coverage < 80%. --- -## 📁 Cấu Trúc Dự Án +## 2. Cấu Trúc Thư Mục Repository ```text agent-unit-testing/ +├── install.sh # Script cài đặt chính (hỗ trợ Toàn cục & Theo dự án) ├── .claude/ -│ └── skills/ # Bộ 4 Skills cho Claude Code -│ ├── laravel-test-setup/ # Khởi tạo & kiểm tra môi trường test -│ ├── laravel-unit-test/ # Sinh mã Unit Test tự động -│ ├── laravel-test-review/ # Review & chấm điểm file test -│ └── laravel-mock-helper/ # Hỗ trợ sinh mã Mocking +│ └── skills/ # Bộ 4 Skills tích hợp cho Claude Code +│ ├── laravel-test-setup/ # Kiểm tra môi trường & tự cài đặt dependencies +│ ├── laravel-unit-test/ # Sinh Unit Test tự động (hỗ trợ Autopilot --all --run) +│ ├── laravel-test-review/ # Chấm điểm chất lượng test theo thang 100 & bắt lỗi anti-patterns +│ └── laravel-mock-helper/ # Sinh mã Mockery & Laravel Fakes nhanh │ -├── docs/ # Cẩm nang kiến thức & quy chuẩn cốt lõi -│ ├── 00-environment-and-setup.md # Hướng dẫn setup dependencies, DB in-memory & Docker -│ ├── 01-overview-and-principles.md # Triết lý Unit Test: AAA, Isolation, Boundary -│ ├── 02-test-frameworks.md # So sánh & Cú pháp PHPUnit 10/11 vs Pest PHP +├── docs/ # 10 Cẩm Nang Kiến Thức & Quy Chuẩn Cốt Lõi +│ ├── 00-environment-and-setup.md # Hướng dẫn setup dependencies, SQLite in-memory & Docker +│ ├── 01-overview-and-principles.md # Triết lý Unit Test: AAA, cách ly, ranh giới Feature test +│ ├── 02-test-frameworks.md # So sánh & cú pháp PHPUnit 10/11 vs Pest PHP v2/v3 │ ├── 03-mocking-strategies.md # Toàn tập Mockery vs Laravel Fakes vs Static Facades │ ├── 04-naming-and-structure.md # Quy chuẩn đặt tên file, namespace, test method │ ├── 05-anti-patterns.md # 12 lỗi cấm kỵ khi viết Unit Test Laravel │ ├── 06-future-php84-laravel-latest.md # Hướng dẫn chuyên sâu PHP 8.4+ & Laravel 12/13 -│ ├── 07-troubleshooting-and-debugging.md # Cẩm nang sửa 10 lỗi thường gặp nhất khi test +│ ├── 07-troubleshooting-and-debugging.md # Cẩm nang sửa 10 lỗi thường gặp nhất khi chạy test │ ├── 08-test-data-factories-and-builders.md# Quản lý fixture: Model::make(), States & DTO Builders │ ├── 09-advanced-edge-cases.md # DB::transaction, Traits, File uploads, Serialization │ │ -│ └── components/ # Hướng dẫn test cho 13 loại Laravel Component +│ └── components/ # 13 Cẩm Nang Chi Tiết Cho Từng Component Laravel │ ├── 01-services-and-actions.md # Service Layer, Action classes, DTOs │ ├── 02-controllers.md # API & Web Controllers -│ ├── 03-form-requests-and-rules.md # FormRequest rules, Custom Validation Rules +│ ├── 03-form-requests-and-rules.md # FormRequests & Custom Validation Rules │ ├── 04-repositories-and-queries.md # Repositories & Custom Query Builders │ ├── 05-models.md # Accessors, Mutators, Custom Casts -│ ├── 06-jobs-and-queues.md # Queueable Jobs, handle(), retry logic -│ ├── 07-events-and-listeners.md # Event payloads, Listeners handling +│ ├── 06-jobs-and-queues.md # Queueable Jobs, retry logic, failed() +│ ├── 07-events-and-listeners.md # Event payloads & Listener handlers │ ├── 08-middlewares.md # Request interception, Auth, Role, Tenant -│ ├── 09-policies-and-gates.md # Phân quyền Policy methods (can/cannot) +│ ├── 09-policies-and-gates.md # Policies authorization logic (can/cannot) │ ├── 10-notifications-and-mail.md # Mailables & Notification channels -│ ├── 11-artisan-commands.md # Console input/options, exit code, prompts +│ ├── 11-artisan-commands.md # Console arguments, options, exit codes │ ├── 12-view-components-and-blade.md # Blade View Components & directives │ └── 13-observers-and-exceptions.md # Model Observers & Custom Exceptions │ -├── templates/ # Boilerplate mẫu sẵn dùng -│ ├── configs/ # File config: phpunit.xml, .env.testing, Pest.php -│ ├── docker/ # Script test-runner.sh & docker-compose.test.yml -│ ├── phpunit/ # Templates chuẩn PHPUnit 10/11 (Attributes) -│ └── pest/ # Templates chuẩn Pest PHP v2/v3 +├── templates/ # Templates Mẫu Chuẩn +│ ├── configs/ # phpunit.xml.dist, .env.testing, Pest.php +│ ├── docker/ # Smart test-runner.sh & docker-compose.test.yml +│ ├── ci/ # GitHub Actions & GitLab CI quality gates +│ ├── phpunit/ # 8 Component templates + ArchitectureTest +│ └── pest/ # 8 Component templates + ArchitectureTest │ -└── rules/ # Bộ quy tắc & Checklists - ├── system-prompt-unit-test.md # System prompt tối cao cho AI - ├── edge-cases-matrix.md # Ma trận kịch bản biên (Null, Empty, Boundary, Error) - └── verification-checklist.md # Checklist 10 bước tự kiểm tra trước khi xuất code +├── rules/ # Bộ Quy Tắc & Tiêu Chí Đánh Giá +│ ├── system-prompt-unit-test.md # System prompt cốt lõi cho AI +│ ├── edge-cases-matrix.md # Ma trận kịch bản biên (Null, Boundary, Errors) +│ └── verification-checklist.md # Checklist 10 bước tự kiểm tra trước khi xuất code +│ +├── LICENSE # Giấy phép mã nguồn mở MIT +└── README.md # Tài liệu hướng dẫn chính ``` --- -## ⚡ Cài Đặt Cho Team (1 Dòng Lệnh Duy Nhất) +## 3. Cài Đặt Trực Tiếp Vào Source Code (Không Cần Clone Repo) -Mỗi thành viên trong team chỉ cần mở Terminal, dán lệnh sau và bấm Enter: +Bất kỳ ai muốn sử dụng bộ công cụ này **KHÔNG CẦN phải clone source code công cụ về máy**. + +Chỉ cần mở Terminal, `cd` vào thư mục dự án Laravel của bạn và chạy **đúng 1 dòng lệnh**: + +### 🌟 1 Dòng Lệnh Cài Đặt Từ Xa (Remote 1-Line Installer) ```bash -git clone ssh://git@ssh-git.smartgift.io.vn:2222/Smartgift-AI/agent-unit-testing.git ~/.smartgift/agent-unit-testing && ~/.smartgift/agent-unit-testing/sg-install-unit-testing.sh --global +cd /duong-dan/toi/source-code-laravel-cua-ban + +# Chạy lệnh cài đặt từ xa: +curl -fsSL https://raw.githubusercontent.com//agent-unit-testing/main/install.sh | bash +``` + +*(Đối với thành viên trong nội bộ team Smartgift hoặc khi dùng Git SSH server):* +```bash +cd /duong-dan/toi/source-code-laravel-cua-ban + +# Cài đặt trực tiếp qua Git mà không cần lưu repo công cụ: +bash <(git archive --remote=ssh://git@ssh-git.smartgift.io.vn:2222/Smartgift-AI/agent-unit-testing.git main install.sh | tar -xO) ``` -*Lệnh trên tự động clone vào `~/.smartgift/` và kích hoạt toàn cục trên máy tính.* --- -## 🛠️ Hướng Dẫn Sử Dụng Nhanh +### 🎯 Quy Trình Tự Động Diễn Ra Ngầm: +1. Script sẽ tải các tài nguyên cần thiết từ xa vào thư mục tạm `/tmp/`. +2. Tự động cấy trực tiếp vào source code của bạn: + - Thư mục `.claude/skills/` (với trọn bộ 4 Skills viết test tự động). + - Thư mục `.claude/testing-docs/` (cẩm nang quy chuẩn 13 tầng Laravel). + - Script chạy test thông minh `./test-runner.sh` (tự bắt Docker/Sail/Local). + - Script cài package test `./setup-test-deps.sh`. + - Tự động cấu hình SQLite In-Memory `:memory:` an toàn vào `phpunit.xml`. + - Tự động tạo GitHub Actions CI `.github/workflows/unit-tests.yml`. +3. Tự động xóa sạch thư mục tạm, **hoàn toàn không lưu lại rác hay repository công cụ trên máy của bạn**! + +--- + +## 4. Tùy Chọn: Cài Đặt Toàn Cục Cho Toàn Máy Tính (Global Mode) + +Nếu bạn là lập trình viên muốn cài 1 lần duy nhất cho toàn bộ máy tính (để mọi source code mở Claude Code lên đều tự có sẵn các lệnh): -### Bước 1: Khởi Tạo Vào Dự Án Laravel Bất Kỳ -Mở terminal tại thư mục dự án Laravel của bạn: ```bash -cd /duong-dan/toi/du-an-laravel -sg-install-unit-testing.sh +curl -fsSL https://raw.githubusercontent.com//agent-unit-testing/main/install.sh | bash -s -- --global ``` -### Bước 2: Chuẩn Bị Môi Trường -Mở Claude Code (`claude`) tại thư mục dự án và chạy skill: +🎯 **Lợi ích:** +- Tự động cài đặt 4 Skills vào `~/.claude/skills/`. +- Đăng ký lệnh `sg-test-init` (hoặc `laravel-test-init`) vào Terminal để gõ ở bất kỳ thư mục nào cũng tự tạo `test-runner.sh`. + +--- + +## 5. Quy Trình Trọn Vẹn: Từ Bắt Đầu Đến Hoàn Thành Viết Unit Test + +Dưới đây là **kịch bản thực chiến trọn vẹn từ A đến Z** khi bạn áp dụng vào một source code Laravel thực tế: + +```text +┌────────────────┐ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ +│ 1. CÀI ĐẶT │ ──> │ 2. SETUP ENV │ ──> │ 3. AUTOPILOT │ ──> │ 4. NGHIỆM THU │ +│ curl | bash │ │ test-setup │ │ unit-test --all│ │ Coverage > 80% │ +└────────────────┘ └────────────────┘ └────────────────┘ └────────────────┘ +``` + +--- + +### 🔹 Giai đoạn 1: Cài đặt công cụ vào Source Code (Chỉ mất 5 giây) +Mở terminal, `cd` vào thư mục source code Laravel của bạn và chạy 1 dòng lệnh: ```bash +cd /duong-dan/toi/source-code-laravel +curl -fsSL https://raw.githubusercontent.com//agent-unit-testing/main/install.sh | bash +``` +✅ **Kết quả**: Source code đã được tích hợp bộ Skills, cẩm nang rules, script `./test-runner.sh` và cấu hình SQLite `:memory:` an toàn. + +--- + +### 🔹 Giai đoạn 2: Khởi động Claude Code & Chuẩn hóa môi trường +Mở Claude Code ngay tại thư mục source code: +```bash +claude +``` +Chạy lệnh kiểm tra và tự động cài đặt thư viện kiểm thử còn thiếu: +```text /laravel-test-setup --install ``` -Agent sẽ tự động kiểm tra `composer.json`, kiểm tra database test SQLite và tự cài đặt các package còn thiếu. +✅ **Kết quả**: AI tự động kiểm tra `composer.json`, nếu thiếu `mockery`, `faker`, `paratest` -> AI tự động kích hoạt lệnh cài đặt vào container Docker hoặc môi trường Local của bạn và xác nhận môi trường chuyển sang trạng thái "Xanh" (100% Sẵn sàng). -### Bước 3: Sinh Unit Test Tự Động & Chạy Test Ngay -Chỉ định class, thư mục, hoặc phủ toàn bộ dự án: -```bash -# 🌟 1 lệnh duy nhất Autopilot: Tự động viết test cả dự án & TỰ CHẠY TEST LUÔN: +--- + +### 🔹 Giai đoạn 3: Ra lệnh viết toàn bộ Unit Test & Tự động chạy test luôn +Chỉ cần gõ **đúng 1 lệnh Autopilot**: +```text /laravel-unit-test --all --run - -# Sinh test cho 1 file & tự động chạy test kiểm tra ngay: -/laravel-unit-test app/Services/PaymentService.php --run - -# Cho cả thư mục / module & test luôn: -/laravel-unit-test app/Services/ --run - -# Cho các file vừa sửa trên Git & test luôn (trước khi tạo PR): -/laravel-unit-test --changed --run ``` -### Bước 4: Chạy Kiểm Thử -Sử dụng script thông minh tự động nhận diện Docker / Sail / Local: -```bash -./test-runner.sh --filter=PaymentServiceTest -``` +**Quá trình AI thực hiện tự động hoàn toàn:** +1. **Quét & Lập Manifest**: AI quét toàn bộ `app/Services/`, `app/Actions/`, `app/Http/Requests/`, `app/Jobs/`, `app/Policies/`, `app/Rules/`,... và tạo file kiểm soát `tests/.test-manifest.json` (ví dụ: Tổng cộng 36 files). +2. **Viết test tuần tự**: AI duyệt từng file `[1/36]`, `[2/36]`... sinh mã test chuẩn AAA, đầy đủ kịch bản Happy Path, Edge Cases (0, âm, null, rỗng) và Exception. +3. **Chạy test & Tự động sửa lỗi (Auto-Healing)**: + - Viết xong file nào, AI tự động gọi `./test-runner.sh --filter=` để chạy test file đó ngay. + - Nếu test bị ĐỎ (Fail) do thiếu mock hoặc sai tham số -> AI tự động đọc log lỗi, tự sửa code test ngay tại chỗ cho đến khi XANH (Pass 100%). -### Bước 5: Cập Nhật Bộ Công Cụ Khi Có Phiên Bản Mới -Thành viên đứng ở bất kỳ đâu chỉ cần gõ: +--- + +### 🔹 Giai đoạn 4: Nghiệm thu kết quả & Kiểm tra Code Coverage +Sau khi hoàn tất toàn bộ danh sách trong manifest, AI sẽ tự động chạy: ```bash -sg-test-update +./test-runner.sh --coverage +``` +Bảng báo cáo nghiệm thu sẽ xuất hiện: +```markdown +🎉 HOÀN TẤT VIẾT VÀ TEST TOÀN BỘ DỰ ÁN: +✓ Tổng số class đã phủ test: 36/36 files (100%) +✓ Tổng số test cases được sinh: 142 test cases +✓ Kết quả thực thi: 142 PASSED (0 FAILED) +✓ Code Coverage: 86.4% (Đạt tiêu chuẩn Quality Gate > 80%) ``` --- -## 🎯 Ma Trận Tương Thích (Compatibility Matrix) +### 🔹 Giai đoạn 5 (Tùy chọn): Các chế độ chạy linh hoạt khác +Nếu không muốn chạy cả dự án, bạn có thể chọn các chế độ linh hoạt sau: +- **Chỉ viết cho 1 class & test luôn**: + ```text + /laravel-unit-test app/Services/PaymentService.php --run + ``` +- **Chỉ viết cho cả 1 thư mục & test luôn**: + ```text + /laravel-unit-test app/Services/ --run + ``` +- **Chỉ viết cho các file vừa sửa đổi trên Git trước khi tạo PR**: + ```text + /laravel-unit-test --changed --run + ``` +- **Thẩm định & Chấm điểm 1 file test có sẵn (thang 100)**: + ```text + /laravel-test-review tests/Unit/Services/PaymentServiceTest.php + ``` +- **Sinh nhanh khối mã Mockery cho một Interface**: + ```text + /laravel-mock-helper App\Contracts\PaymentGatewayInterface + ``` -| Thành phần | Phiên bản hỗ trợ & Tương thích tương lai | +--- + +## 6. Cách Cập Nhật Bộ Công Cụ Khi Có Nâng Cấp + +Khi repository công cụ trên Git có tài liệu mới hoặc nâng cấp rules: + +### 🌟 Cách 1: Cập nhật trực tiếp vào source code hiện tại +Đứng tại thư mục source code Laravel của bạn và chạy lại dòng lệnh cài đặt: +```bash +curl -fsSL https://raw.githubusercontent.com//agent-unit-testing/main/install.sh | bash +``` +*(Script sẽ tự động kéo bản mới nhất và ghi đè cập nhật vào `.claude/skills/` và runner của source code).* + +--- + +### ⚡ Cách 2: Nếu bạn đã cài đặt chế độ Toàn Cục (Global) +Bất kể bạn đang đứng ở thư mục nào trong Terminal, chỉ cần gõ: +```bash +laravel-test-update +``` +*(hoặc alias: `sg-test-update`)* +Lệnh sẽ tự động kéo bản cập nhật mới nhất từ Git về máy bạn trong 3 giây. + +--- + +## 7. Giải Đáp Thắc Mắc & Xử Lý Lỗi (FAQ & Troubleshooting) + +### Q1: Tại sao tôi gõ `./install.sh` thì bị báo `zsh: no such file or directory`? +👉 **Trả lời**: Ký hiệu `./` nghĩa là tìm file ngay trong thư mục hiện tại. Khi bạn đã `cd` sang một dự án khác, thư mục đó không có file này. +**Cách sửa**: Bỏ dấu `./` đi, chỉ cần gõ thẳng tên lệnh toàn cục đã được đăng ký: +```bash +laravel-test-init +# Hoặc: +laravel-unit-test-setup +``` + +### Q2: Tôi cài đặt vào một thư mục trống nhưng bị báo chưa có `artisan` hoặc `composer.json`? +👉 **Trả lời**: Mặc định script sẽ kiểm tra để tránh cài nhầm vào thư mục không phải Laravel. Nếu bạn muốn cài đặt trước vào thư mục trống, hãy thêm cờ `--force`: +```bash +install.sh --force +# Hoặc: +laravel-test-init --force +``` + +### Q3: Chạy test trên SQLite `:memory:` bị lỗi hàm MySQL (`JSON_CONTAINS`, `DATE_FORMAT`)? +👉 **Trả lời**: Mở tài liệu `docs/07-troubleshooting-and-debugging.md` (mục 5) để xem cách đăng ký hàm giả lập trong `setUp()`, hoặc chuyển kết nối test sang một container MySQL test riêng. + +### Q4: Làm sao chặn merge Pull Request nếu Code Coverage dưới 80%? +👉 **Trả lời**: Bộ công cụ đã tạo sẵn file `.github/workflows/unit-tests.yml` (hoặc `.gitlab-ci.yml`). Pipeline CI sẽ tự động chạy song song trên PHP 8.2, 8.3, 8.4 và tự động từ chối merge nếu độ phủ < 80%. + +--- + +## 8. Bảng Tra Cứu Toàn Bộ Lệnh (Full Cheat Sheet) + +| Nhiệm Vụ | Lệnh Terminal / Claude Code | Ngữ Cảnh Sử Dụng | +| :--- | :--- | :--- | +| **Cài đặt từ xa (Không cần clone)** | `curl -fsSL /install.sh \| bash` | Đứng tại source code Laravel và chạy 1 dòng duy nhất | +| **Cài đặt toàn cục (Global Mode)** | `curl -fsSL /install.sh \| bash -s -- --global` | Cài vào máy dùng cho mọi folder | +| **Cài đặt vào thư mục trống** | `curl -fsSL /install.sh \| bash -s -- . --force` | Dùng khi thư mục chưa có `composer.json` | +| **Khởi tạo test runner nhanh** | `laravel-test-init` (hoặc `sg-test-init`) | Gõ tại terminal của bất kỳ dự án nào | +| **Cập nhật bộ công cụ (1-Click)** | `laravel-test-update` (hoặc `sg-test-update`) | Kéo bản mới nhất từ Git về máy mọi lúc | +| **Quét & Setup môi trường test** | `/laravel-test-setup` | Chạy trong Claude Code để kiểm tra cấu hình | +| **Tự động cài gói composer thiếu**| `/laravel-test-setup --install` | Cài `mockery`, `faker`, `paratest` vào container | +| **Autopilot: Viết xong test luôn**| `/laravel-unit-test --all --run` | 1 lệnh tự setup, viết test cả dự án, chạy test & tự fix | +| **Sinh test cho 1 file & test luôn**| `/laravel-unit-test app/.../Service.php --run`| Sinh test cho 1 class và chạy test kiểm tra ngay | +| **Sinh test cả thư mục** | `/laravel-unit-test app/Services/ --run` | Khi cần phủ test cho cả 1 folder / module | +| **Quét dự án lớn chưa có test** | `/laravel-unit-test --untested` | Tìm các class thiếu test để sinh hàng loạt | +| **Sinh test cho Git Diff** | `/laravel-unit-test --changed --run` | Trước khi tạo Pull Request trên Git | +| **Review chất lượng file test** | `/laravel-test-review tests/.../Test.php`| Chấm điểm thang 100 & bắt lỗi anti-patterns | +| **Sinh code Mockery nhanh** | `/laravel-mock-helper MyInterface` | Sinh code mock sẵn dùng | +| **Chạy test tự nhận diện** | `./test-runner.sh --filter=MyTest` | Tự bắt Docker / Sail / Local | +| **Tra cứu sửa lỗi** | Đọc `docs/07-troubleshooting-and-debugging.md` | Sửa 10 lỗi thường gặp nhất | +| **Tra cứu 7 ca khó** | Đọc `docs/09-advanced-edge-cases.md` | `DB::transaction()`, Trait, Upload file, Queue | +| **Tra cứu sửa lỗi** | Đọc `docs/07-troubleshooting-and-debugging.md` | Sửa 10 lỗi thường gặp nhất | +| **Tra cứu 7 ca khó** | Đọc `docs/09-advanced-edge-cases.md` | `DB::transaction()`, Trait, Upload file, Queue | + +--- + +## 9. Ma Trận Tương Thích & Bản Quyền + +| Thành Phần | Phiên Bản Hỗ Trợ | | :--- | :--- | -| **PHP** | 8.0, 8.1, 8.2, 8.3, **8.4+** (Hỗ trợ Property Hooks, Asymmetric Visibility) | -| **Laravel** | 9.x, 10.x, 11.x, **12.x & 13.x (Latest & Future-ready)** | -| **PHPUnit** | 9.x (DocBlock), 10.x, **11.x & 12.x** (PHP 8 Attributes `#[Test]`, `#[DataProvider]`) | -| **Pest PHP** | v2.x & **v3.x** (Hỗ trợ Architectural Testing `arch()`, Mutation testing) | +| **PHP** | 8.0, 8.1, 8.2, 8.3, **8.4+** (Property Hooks, Asymmetric Visibility) | +| **Laravel** | 8.x, 9.x, 10.x, 11.x, **12.x & 13.x (Kiến trúc hiện đại)** | +| **PHPUnit** | 9.x (DocBlock fallback), 10.x, **11.x & 12.x** (PHP 8 Attributes `#[Test]`) | +| **Pest PHP** | v2.x & **v3.x** (Architecture Testing `arch()`, Mutation testing) | | **Mocking** | Mockery, PHPUnit Test Doubles, Laravel Built-in Fakes, `Concurrency::fake()`, `Context::fake()` | | **Database** | SQLite In-Memory (`:memory:`), MySQL Test DB | -| **Môi trường** | Docker Compose, Laravel Sail, Native PHP CLI | +| **Hệ Điều Hành** | macOS, Linux, WSL2 (Windows), Docker, CI/CD Environments | ---- - -## 📜 Giấy Phép & Bản Quyền -Phát triển bởi Smartgift AI Team. Phục vụ tự động hóa quy trình kiểm thử phần mềm đạt chuẩn chất lượng cao. +### Giấy Phép (License) +Phát hành theo giấy phép mã nguồn mở [MIT License](LICENSE). Bất kỳ ai cũng có quyền tự do sử dụng, chỉnh sửa và đóng góp cho dự án. diff --git a/USAGE-GUIDE.md b/USAGE-GUIDE.md deleted file mode 100644 index b873e41..0000000 --- a/USAGE-GUIDE.md +++ /dev/null @@ -1,300 +0,0 @@ -# 📖 CẨM NANG TOÀN TẬP: HƯỚNG DẪN CÀI ĐẶT, SỬ DỤNG & CẬP NHẬT -## BỘ CÔNG CỤ TỰ ĐỘNG HÓA LARAVEL UNIT TESTING (SMARTGIFT AI) - -Tài liệu chuẩn hóa dành cho toàn thể thành viên Team Smartgift: Từ bước cài đặt lần đầu, sử dụng cho dự án bất kỳ, quy trình viết test, cho đến cách cập nhật phiên bản mới nhất khi bộ công cụ có nâng cấp. - ---- - -## 📑 MỤC LỤC -1. [Cơ Chế Hoạt Động Của Bộ Công Cụ](#1-cơ-chế-hoạt-động-của-bộ-công-cụ) -2. [Cài Đặt Lần Đầu (Dành Cho Thành Viên Mới)](#2-cài-đặt-lần-đầu-dành-cho-thành-viên-mới) -3. [Khởi Tạo Cho Một Dự Án Laravel Bất Kỳ](#3-khởi-tạo-cho-một-dự-án-laravel-bất-kỳ) -4. [Quy Trình 5 Bước Sinh & Chạy Unit Test](#4-quy-trình-5-bước-sinh--chạy-unit-test) -5. [Cách Cập Nhật Khi Bộ Công Cụ Có Thay Đổi Mới (Update Guide)](#5-cách-cập-nhật-khi-bộ-công-cụ-có-thay-đổi-mới-update-guide) -6. [Giải Đáp Thắc Mắc & Lỗi Thường Gặp (FAQ & Troubleshooting)](#6-giải-đáp-thắc-mắc--lỗi-thường-gặp-faq--troubleshooting) -7. [Bảng Tra Cứu Toàn Bộ Lệnh (Full Cheat Sheet)](#7-bảng-tra-cứu-toàn-bộ-lệnh-full-cheat-sheet) - ---- - -## 1. Cơ Chế Hoạt Động Của Bộ Công Cụ - -Bộ công cụ này biến **Claude Code** thành một **Chuyên Gia Tự Động Hóa Kiểm Thử (Senior QA Automation Engineer)** thông qua 3 thành phần: - -1. **Bộ 4 Claude Code Skills** (Cài đặt tại `~/.claude/skills/`): - - Tự động quét môi trường, phát hiện thiếu thư viện (`/laravel-test-setup`). - - Tự động phân tích class nguồn và sinh Unit Test chuẩn AAA (`/laravel-unit-test`). - - Tự động thẩm định, bắt lỗi anti-patterns theo thang điểm 100 (`/laravel-test-review`). - - Tự động sinh mã Mockery / Laravel Fakes nhanh (`/laravel-mock-helper`). -2. **Hệ Thống Tri Thức (Knowledge Base - 23 Files Docs & Rules)**: - - Hướng dẫn chi tiết 13 tầng kiến trúc Laravel (Services, Controllers, Jobs, Policies, Rules,...). - - Xử lý các ca khó: `DB::transaction()`, Upload files, Traits, PHP 8.4 Property Hooks. -3. **Bộ Scripts Chạy Test Thông Minh (Smart Runners)**: - - `./test-runner.sh`: Tự nhận diện Laravel Sail, Docker Compose hay PHP Local. - - `./setup-test-deps.sh`: Tự động cài package test vào đúng container. - ---- - -## 2. Cài Đặt Lần Đầu (Dành Cho Thành Viên Mới) - -Mỗi thành viên trong team khi bắt đầu chỉ cần cài đặt **đúng 1 lần duy nhất** trên máy tính theo 1 trong 2 cách sau: - -### 🌟 Cách A: Cài Đặt Siêu Tốc Bằng 1 Dòng Lệnh (KHUYÊN DÙNG NHẤT) -Mở Terminal lên, dán dòng lệnh sau và bấm Enter: -```bash -git clone ssh://git@ssh-git.smartgift.io.vn:2222/Smartgift-AI/agent-unit-testing.git ~/.smartgift/agent-unit-testing && ~/.smartgift/agent-unit-testing/sg-install-unit-testing.sh --global -``` -*Lệnh này sẽ tự động clone repo về thư mục chuẩn `~/.smartgift/agent-unit-testing` (gọn gàng, không làm rác Desktop) và tự động kích hoạt toàn cục.* - ---- - -### 🔹 Cách B: Clone Thủ Công -Nếu muốn lưu repo ở thư mục tùy ý trên máy (ví dụ trong `~/Workspace/`): -```bash -# 1. Clone repository về máy -git clone ssh://git@ssh-git.smartgift.io.vn:2222/Smartgift-AI/agent-unit-testing.git - -# 2. Di chuyển vào thư mục và chạy cài đặt toàn cục -cd agent-unit-testing -./sg-install-unit-testing.sh --global -``` - -🎯 **Lợi ích sau khi cài đặt thành công:** -- Bộ 4 Skills được cài đặt toàn cục vào tài khoản máy của bạn (`~/.claude/skills/`). -- Các lệnh CLI `sg-install-unit-testing.sh`, `laravel-unit-test-setup`, `sg-test-update` được đăng ký vào `$PATH` của hệ thống. -- **Kể từ lúc này, bạn có thể đứng ở BẤT KỲ FOLDER NÀO trên máy tính để sử dụng mà không cần phải quay lại thư mục `agent-unit-testing` nữa!** - ---- - -## 3. Khởi Tạo Cho Một Dự Án Laravel Bất Kỳ - -Giả sử bạn đang làm việc trên một dự án Laravel (ví dụ: `~/Workspace/my-project`, `/var/www/client-app`): - -### Trường hợp A: Dự án đã có sẵn mã nguồn Laravel -Mở terminal tại thư mục dự án đó: -```bash -cd /duong-dan/toi/du-an-laravel-cua-ban - -# Chạy lệnh khởi tạo (KHÔNG CẦN dấu ./ ở đầu): -sg-install-unit-testing.sh -``` -*(Hoặc gõ lệnh: `laravel-unit-test-setup`)* - -Lệnh sẽ tự động sinh ngay 2 file vào thư mục dự án: -- `test-runner.sh`: Script chạy test thông minh tự động bắt Docker / Sail / Local. -- `setup-test-deps.sh`: Script tự động cài package test vào container. - -### Trường hợp B: Thư mục mới/trống (Chưa có `composer.json`) -Nếu bạn muốn cài đặt sẵn công cụ vào một thư mục trống: -```bash -cd /duong-dan/toi/thu-muc-trong -sg-install-unit-testing.sh --force -``` - ---- - -## 4. Quy Trình 5 Bước Sinh & Chạy Unit Test - -Sau khi khởi tạo, bạn mở dự án bằng **Claude Code** (`claude`) và thực hiện quy trình sau: - -```text - [1. Setup Env] --> [2. Generate Test] --> [3. Run Test] --> [4. Review] -/laravel-test-setup /laravel-unit-test ./test-runner.sh /laravel-test-review -``` - ---- - -### Bước 1: Quét Môi Trường & Cài Thư Viện (`/laravel-test-setup`) - -Trước khi viết bài test đầu tiên, hãy kiểm tra và cài đặt đầy đủ các thư viện cần thiết (`mockery`, `faker`, `paratest`): - -1. **Kiểm tra sức khỏe môi trường (Health-Check)**: - ```text - /laravel-test-setup - ``` -2. **Tự động cài đặt các thư viện còn thiếu (Auto-Install)**: - ```text - /laravel-test-setup --install - ``` - *AI sẽ tự động xác định bạn đang dùng Docker Compose hay Sail hay Local và chạy lệnh `composer require --dev ...` chính xác vào container của bạn.* - ---- - -### Bước 2: Sinh Unit Test Tự Động (`/laravel-unit-test`) - -Tùy vào nhu cầu thực tế, bạn chọn 1 trong 5 cách sau: - -#### 🌟 Cách 1: 1 LỆNH AUTOPILOT VIẾT TOÀN BỘ VÀ TỰ CHẠY TEST LUÔN (`--all --run`) -Khi bạn muốn AI tự động viết test cho toàn bộ dự án từ A-Z, **viết đến đâu tự chạy test đến đó và tự sửa lỗi nếu test fail**: -```text -/laravel-unit-test --all --run -# Hoặc: -/laravel-unit-test --autopilot -``` -🎯 **Quy trình 4-trong-1 hoàn toàn tự động:** -1. **Tự động Setup**: Tự kiểm tra môi trường, cấu hình SQLite `:memory:` và tự cài packages nếu thiếu. -2. **Lập Manifest Kiểm Soát**: Quét toàn bộ `app/`, lập danh sách tất cả các class cần test (`tests/.test-manifest.json`). -3. **Viết & Chạy Test Ngay (Auto-Healing)**: Sinh xong file test nào -> Tự chạy ngay `./test-runner.sh --filter=`. Nếu fail -> Tự đọc lỗi và sửa lại test ngay cho đến khi PASS 100%. -4. **Nghiệm Thu Toàn Dự Án**: Tự chạy `./test-runner.sh --coverage` và in bảng tổng kết độ phủ code. - ---- - -#### 🔹 Cách 2: Sinh Cho 1 Class & Chạy Test Ngay (`--run`) -Khi bạn chỉ muốn viết test cho 1 file và muốn AI test luôn file đó ngay lập tức: -```text -/laravel-unit-test app/Services/PaymentService.php --run -``` - ---- - -#### 🔹 Cách 2: Sinh hàng loạt cho cả một thư mục (Batch Directory Mode) -Khi bạn chỉ muốn phủ test cho 1 module hoặc 1 layer cụ thể: -```text -/laravel-unit-test app/Services/ -# Hoặc toàn bộ Actions: -/laravel-unit-test app/Actions/ -# Hoặc toàn bộ Module (DDD / Modular): -/laravel-unit-test Modules/Order/ -``` - -#### 🔹 Cách 3: Quét & Phủ test có chọn lọc (`--untested`) -Khi muốn AI quét tìm các class chưa có test và hiển thị danh sách để bạn chọn nhóm cần ưu tiên: -```text -/laravel-unit-test --untested -``` - -#### 🔹 Cách 4: Tự động sinh test cho Git Diff (`--changed` - Dành cho PR) -Trước khi tạo Pull Request trên Git: -```text -/laravel-unit-test --changed -``` - -#### 🔹 Cách 5: Sinh cho một class cụ thể (Single File Mode) -Khi bạn đang code hoặc refactor duy nhất 1 file: -```text -/laravel-unit-test app/Services/PaymentService.php -``` - ---- - -### Bước 3: Chạy Test Thông Minh (`test-runner.sh`) - -Không cần nhớ cú pháp docker phức tạp, chỉ cần chạy script thông minh: - -```bash -# Chạy toàn bộ Unit Test: -./test-runner.sh - -# Chạy riêng 1 file test vừa sinh: -./test-runner.sh --filter=PaymentServiceTest - -# Chạy kèm đo độ phủ Code Coverage: -./test-runner.sh --coverage -``` - -*Cơ chế tự động:* -- Nếu Sail đang chạy -> Tự gọi `./vendor/bin/sail test`. -- Nếu có Docker Compose -> Tự gọi `docker compose exec -T php artisan test`. -- Nếu chạy máy Local -> Tự gọi `php artisan test` và kiểm tra extension `pdo_sqlite`. - ---- - -### Bước 4: Thẩm Định & Review Chất Lượng Test (`/laravel-test-review`) - -Để kiểm tra xem file test có đạt chuẩn AAA, có bị over-mocking hay thiếu kịch bản biên không: -```text -/laravel-test-review tests/Unit/Services/PaymentServiceTest.php -``` -AI sẽ chấm điểm theo thang 100, chỉ ra các lỗi Anti-patterns và đưa ra đoạn mã refactor chuẩn. - ---- - -### Bước 5: Sinh Mã Giả Lập Nhanh (`/laravel-mock-helper`) - -Khi tự viết test và cần mock nhanh một Interface phức tạp: -```text -/laravel-mock-helper App\Contracts\PaymentGatewayInterface -``` -AI sẽ sinh sẵn khối code Mockery với 2 kịch bản (Thành công & Thất bại) để bạn copy vào test. - ---- - -## 5. Cách Cập Nhật Khi Bộ Công Cụ Có Thay Đổi Mới (Update Guide) - -Khi Trưởng nhóm (hoặc thành viên khác) cập nhật thêm tài liệu `.md`, thêm rules mới hoặc nâng cấp template lên Git, các thành viên khác làm thế nào để có phiên bản mới nhất? - -### 🌟 Cách 1: Dùng Lệnh Cập Nhật 1-Click Toàn Cục (KHUYÊN DÙNG) -Bất kể bạn đang đứng ở thư mục nào trong Terminal, chỉ cần gõ: -```bash -sg-test-update -``` -*(hoặc `laravel-test-update`)* - -#### Lệnh này sẽ tự động: -1. Chạy `git pull origin main` trên repo `agent-unit-testing` của bạn để kéo toàn bộ thay đổi mới nhất về máy. -2. Tự động đồng bộ toàn bộ Skills, Rules, Docs vào hệ thống Claude Code (`~/.claude/`). -3. Báo cáo hoàn tất thành công! - -#### Nếu bạn muốn cập nhật luôn các script runner trong một dự án cụ thể: -```bash -sg-test-update /duong-dan/toi/du-an-laravel-cua-ban -``` - ---- - -### ⚡ Cách 2: Kỹ Thuật Symlink Tự Động (Dành Cho Thành Viên Giữ Repo) -Nếu bạn đã cài đặt qua `--global`, toàn bộ skills đã được liên kết mềm (Symlink) trực tiếp vào repo `agent-unit-testing`. - -Do đó, bạn chỉ cần: -```bash -cd /duong-dan/toi/agent-unit-testing -git pull origin main -``` -**Chỉ cần `git pull` là xong!** Toàn bộ Claude Code trên máy của bạn sẽ tự động cập nhật nội dung mới nhất ngay lập tức mà không cần chạy thêm bất kỳ lệnh cài đặt nào. - ---- - -## 6. Giải Đáp Thắc Mắc & Lỗi Thường Gặp (FAQ & Troubleshooting) - -### Q1: Tại sao tôi gõ `./sg-install-unit-testing.sh` thì bị báo `zsh: no such file or directory`? -👉 **Trả lời**: Ký hiệu `./` nghĩa là tìm file ngay trong thư mục hiện tại. Khi bạn đã `cd` sang một dự án khác, thư mục đó không có file này. -**Cách sửa**: Bỏ dấu `./` đi, chỉ cần gõ thẳng: -```bash -sg-install-unit-testing.sh -# Hoặc: -laravel-unit-test-setup -``` - -### Q2: Tôi cài đặt vào một thư mục trống nhưng bị báo chưa có `artisan` hoặc `composer.json`? -👉 **Trả lời**: Mặc định script sẽ kiểm tra để tránh cài nhầm vào thư mục không phải Laravel. Nếu bạn muốn cài đặt trước vào thư mục trống, hãy thêm cờ `--force`: -```bash -sg-install-unit-testing.sh --force -``` - -### Q3: Chạy test trên SQLite `:memory:` bị lỗi hàm MySQL (`JSON_CONTAINS`, `DATE_FORMAT`)? -👉 **Trả lời**: Mở tài liệu `docs/07-troubleshooting-and-debugging.md` (mục 5) để xem cách đăng ký hàm giả lập trong `setUp()`, hoặc chuyển kết nối test sang một container MySQL test riêng. - -### Q4: Làm sao chặn merge Pull Request nếu Code Coverage dưới 80%? -👉 **Trả lời**: Bộ công cụ đã tạo sẵn file `.github/workflows/unit-tests.yml` (hoặc `.gitlab-ci.yml`). Pipeline CI sẽ tự động chạy song song trên PHP 8.2, 8.3, 8.4 và tự động từ chối merge nếu độ phủ < 80%. - ---- - -## 7. Bảng Tra Cứu Toàn Bộ Lệnh (Full Cheat Sheet) - -| Nhiệm Vụ | Lệnh Terminal / Claude Code | Ngữ Cảnh Sử Dụng | -| :--- | :--- | :--- | -| **Cài đặt lần đầu (Toàn cục)** | `./sg-install-unit-testing.sh --global` | Chạy 1 lần duy nhất trong repo `agent-unit-testing` | -| **Khởi tạo vào dự án bất kỳ** | `sg-install-unit-testing.sh` | Chạy tại terminal của bất kỳ dự án Laravel nào | -| **Khởi tạo vào thư mục trống** | `sg-install-unit-testing.sh --force` | Dùng khi thư mục chưa có `composer.json` | -| **Cập nhật bộ công cụ (1-Click)**| `sg-test-update` | Kéo bản mới nhất từ Git về máy mọi lúc | -| **Quét & Setup môi trường test** | `/laravel-test-setup` | Chạy trong Claude Code để kiểm tra cấu hình | -| **Tự động cài gói composer thiếu**| `/laravel-test-setup --install` | Cài `mockery`, `faker`, `paratest` vào container | -| **Autopilot: Viết xong test luôn**| `/laravel-unit-test --all --run` | 1 lệnh tự setup, viết test cả dự án, chạy test & tự fix | -| **Sinh test cho 1 file & test luôn**| `/laravel-unit-test app/.../Service.php --run`| Sinh test cho 1 class và chạy test kiểm tra ngay | -| **Sinh test cả thư mục** | `/laravel-unit-test app/Services/` | Khi cần phủ test cho cả 1 folder / module | -| **Quét dự án lớn chưa có test** | `/laravel-unit-test --untested` | Tìm các class thiếu test để sinh hàng loạt | -| **Sinh test cho Git Diff** | `/laravel-unit-test --changed` | Trước khi tạo Pull Request trên Git | -| **Review chất lượng file test** | `/laravel-test-review tests/.../Test.php`| Chấm điểm thang 100 & bắt lỗi anti-patterns | -| **Sinh code Mockery nhanh** | `/laravel-mock-helper MyInterface` | Sinh code mock sẵn dùng | -| **Chạy test tự nhận diện** | `./test-runner.sh --filter=MyTest` | Tự bắt Docker / Sail / Local | -| **Tra cứu sửa lỗi** | Đọc `docs/07-troubleshooting-and-debugging.md` | Sửa 10 lỗi thường gặp nhất | -| **Tra cứu 7 ca khó** | Đọc `docs/09-advanced-edge-cases.md` | `DB::transaction()`, Trait, Upload file, Queue | diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..9290935 --- /dev/null +++ b/install.sh @@ -0,0 +1,234 @@ +#!/usr/bin/env bash + +# ============================================================================== +# SMARTGIFT AI - LARAVEL UNIT TESTING TOOLKIT INSTALLER +# Cài đặt bộ công cụ Unit Test vào bất kỳ source code Laravel nào mà KHÔNG CẦN clone repo về máy. +# +# Cách dùng 1 (Khuyên dùng - Đứng trong source code Laravel và chạy): +# curl -fsSL https://raw.githubusercontent.com//agent-unit-testing/main/install.sh | bash +# Hoặc: +# bash <(curl -fsSL https://raw.githubusercontent.com//agent-unit-testing/main/install.sh) +# +# Cách dùng 2 (Cài Toàn Cục vào máy): +# curl -fsSL https://raw.githubusercontent.com//agent-unit-testing/main/install.sh | bash -s -- --global +# ============================================================================== + +set -e + +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +RED='\033[0;31m' +CYAN='\033[0;36m' +BOLD='\033[1m' +NC='\033[0m' + +# Remote Repository URL (Có thể override qua biến môi trường LARAVEL_TEST_REPO) +DEFAULT_REPO="ssh://git@ssh-git.smartgift.io.vn:2222/Smartgift-AI/agent-unit-testing.git" +REPO_URL="${LARAVEL_TEST_REPO:-$DEFAULT_REPO}" + +TARGET_DIR="${1:-.}" +GLOBAL_MODE=false +FORCE_MODE=false + +for arg in "$@"; do + case "$arg" in + --global|-g) + GLOBAL_MODE=true + ;; + --force|-f) + FORCE_MODE=true + ;; + --help|-h) + echo -e "${BLUE}===================================================================${NC}" + echo -e "${CYAN}${BOLD} SMARTGIFT AI: LARAVEL UNIT TESTING TOOLKIT INSTALLER${NC}" + echo -e "${BLUE}===================================================================${NC}" + echo -e "Cách dùng:" + echo -e " 1. Cài đặt trực tiếp vào source code Laravel hiện tại:" + echo -e " ${YELLOW}curl -fsSL /install.sh | bash${NC}" + echo -e " 2. Cài đặt vào một source code ở đường dẫn cụ thể:" + echo -e " ${YELLOW}curl -fsSL /install.sh | bash -s -- /duong-dan/source-code${NC}" + echo -e " 3. Cài đặt Toàn Cục vào máy tính (dùng cho mọi folder):" + echo -e " ${YELLOW}curl -fsSL /install.sh | bash -s -- --global${NC}" + echo -e " 4. Cài đặt vào thư mục trống:" + echo -e " ${YELLOW}curl -fsSL /install.sh | bash -s -- . --force${NC}" + exit 0 + ;; + *) + if [ "$arg" != "." ] && [ ! -d "$arg" ] && [ "$GLOBAL_MODE" = false ]; then + TARGET_DIR="$arg" + fi + ;; + esac +done + +echo -e "${BLUE}===================================================================${NC}" +echo -e "${CYAN}${BOLD} 🚀 SMARTGIFT AI - LARAVEL UNIT TESTING TOOLKIT INSTALLER${NC}" +echo -e "${BLUE}===================================================================${NC}" + +# 1. Tìm hoặc Tải nguồn tài nguyên (Local nếu có, hoặc tải tạm qua Git) +CLEANUP_TEMP=false +PACKAGE_ROOT="" + +SOURCE="${BASH_SOURCE[0]:-$0}" +SCRIPT_DIR="" +if [ -f "$SOURCE" ]; then + SCRIPT_DIR="$(cd -P "$(dirname "$SOURCE")" 2>/dev/null && pwd || echo "")" +fi + +if [ -n "$SCRIPT_DIR" ] && [ -d "$SCRIPT_DIR/.claude/skills" ]; then + PACKAGE_ROOT="$SCRIPT_DIR" + echo -e "${GREEN}✓ Sử dụng tài nguyên có sẵn tại local.${NC}" +else + echo -e "${YELLOW}📥 Đang tải bộ công cụ từ remote repository...${NC}" + TMP_DIR="$(mktemp -d 2>/dev/null || mktemp -d -t 'sg_unit_testing')" + git clone --depth 1 "$REPO_URL" "$TMP_DIR" --quiet + PACKAGE_ROOT="$TMP_DIR" + CLEANUP_TEMP=true + echo -e "${GREEN}✓ Tải thành công!${NC}" +fi + +cleanup() { + if [ "$CLEANUP_TEMP" = true ] && [ -d "$PACKAGE_ROOT" ]; then + rm -rf "$PACKAGE_ROOT" + fi +} +trap cleanup EXIT + +# ============================================================================== +# 2. XỬ LÝ CÀI ĐẶT TOÀN CỤC (GLOBAL MODE: CHO TẤT CẢ FOLDER TRÊN MÁY) +# ============================================================================== +if [ "$GLOBAL_MODE" = true ]; then + echo -e "${YELLOW}⚙️ Đang cài đặt chế độ Toàn Cục vào $HOME/.claude/skills/...${NC}" + + mkdir -p "$HOME/.claude/skills" + cp -R "$PACKAGE_ROOT/.claude/skills/"* "$HOME/.claude/skills/" + + mkdir -p "$HOME/.claude/laravel-testing-docs/templates" + cp -R "$PACKAGE_ROOT/docs/"* "$HOME/.claude/laravel-testing-docs/" + cp -R "$PACKAGE_ROOT/rules/"* "$HOME/.claude/laravel-testing-docs/" + cp -R "$PACKAGE_ROOT/templates/"* "$HOME/.claude/laravel-testing-docs/templates/" + + mkdir -p "$HOME/.local/bin" + cat << 'EOF' > "$HOME/.local/bin/sg-test-init" +#!/usr/bin/env bash +TARGET_DIR="${1:-.}" +SOURCE_DIR="$HOME/.claude/laravel-testing-docs" + +if [ ! -d "$TARGET_DIR" ]; then + echo "Lỗi: Thư mục '$TARGET_DIR' không tồn tại!" + exit 1 +fi + +echo "🚀 Đang khởi tạo test runner cho dự án tại: $TARGET_DIR" +if [ -f "$SOURCE_DIR/templates/docker/test-runner.sh" ]; then + cp "$SOURCE_DIR/templates/docker/test-runner.sh" "$TARGET_DIR/test-runner.sh" + chmod +x "$TARGET_DIR/test-runner.sh" + echo " ✓ Đã tạo $TARGET_DIR/test-runner.sh" +fi + +if [ -f "$SOURCE_DIR/templates/setup-dependencies.sh" ]; then + cp "$SOURCE_DIR/templates/setup-dependencies.sh" "$TARGET_DIR/setup-test-deps.sh" + chmod +x "$TARGET_DIR/setup-test-deps.sh" + echo " ✓ Đã tạo $TARGET_DIR/setup-test-deps.sh" +fi + +echo "🎉 Hoàn tất! Mở Claude Code và gõ: /laravel-unit-test --all --run" +EOF + chmod +x "$HOME/.local/bin/sg-test-init" + cp "$HOME/.local/bin/sg-test-init" "$HOME/.local/bin/laravel-test-init" + chmod +x "$HOME/.local/bin/laravel-test-init" + + echo -e "${GREEN}${BOLD}✓ CÀI ĐẶT TOÀN CỤC HOÀN TẤT THÀNH CÔNG!${NC}" + echo -e "Kể từ bây giờ, ở bất kỳ source code nào, bạn mở Claude Code là có thể gõ ngay:" + echo -e " • ${CYAN}/laravel-test-setup --install${NC}" + echo -e " • ${CYAN}/laravel-unit-test --all --run${NC}" + exit 0 +fi + +# ============================================================================== +# 3. XỬ LÝ CÀI ĐẶT TRỰC TIẾP VÀO SOURCE CODE HIỆN TẠI (PROJECT MODE - KHUYÊN DÙNG) +# ============================================================================== +TARGET_DIR="$(cd "$TARGET_DIR" 2>/dev/null && pwd || echo "$TARGET_DIR")" + +if [ ! -d "$TARGET_DIR" ]; then + echo -e "${RED}Lỗi: Thư mục '$TARGET_DIR' không tồn tại!${NC}" + exit 1 +fi + +if [ ! -f "$TARGET_DIR/artisan" ] && [ ! -f "$TARGET_DIR/composer.json" ]; then + if [ "$FORCE_MODE" = false ]; then + echo -e "${YELLOW}⚠️ Cảnh báo: Thư mục '$TARGET_DIR' chưa có file artisan hoặc composer.json.${NC}" + echo -e "Nếu bạn vẫn muốn cài đặt vào thư mục này, hãy thêm cờ: ${GREEN}--force${NC}" + exit 1 + fi +fi + +echo -e "📦 Đang cài đặt công cụ vào source code: ${YELLOW}$TARGET_DIR${NC}" + +# A. Copy Claude Skills vào .claude/skills/ của source code +mkdir -p "$TARGET_DIR/.claude/skills" +cp -R "$PACKAGE_ROOT/.claude/skills/"* "$TARGET_DIR/.claude/skills/" +echo -e " ${GREEN}✓${NC} Đã cài bộ 4 Claude Code Skills (.claude/skills/)" + +# B. Copy cẩm nang tài liệu vào .claude/testing-docs/ +mkdir -p "$TARGET_DIR/.claude/testing-docs" +cp -R "$PACKAGE_ROOT/docs/"* "$TARGET_DIR/.claude/testing-docs/" +cp -R "$PACKAGE_ROOT/rules/"* "$TARGET_DIR/.claude/testing-docs/" +echo -e " ${GREEN}✓${NC} Đã đồng bộ cẩm nang & rules kiểm thử (.claude/testing-docs/)" + +# C. Copy Test Runners vào root của source code +cp "$PACKAGE_ROOT/templates/docker/test-runner.sh" "$TARGET_DIR/test-runner.sh" +chmod +x "$TARGET_DIR/test-runner.sh" +echo -e " ${GREEN}✓${NC} Đã tạo smart runner: ./test-runner.sh" + +cp "$PACKAGE_ROOT/templates/setup-dependencies.sh" "$TARGET_DIR/setup-test-deps.sh" +chmod +x "$TARGET_DIR/setup-test-deps.sh" +echo -e " ${GREEN}✓${NC} Đã tạo dependency installer: ./setup-test-deps.sh" + +# D. Tự động cấu hình SQLite In-Memory vào phpunit.xml +PHPUNIT_XML="$TARGET_DIR/phpunit.xml" +PHPUNIT_DIST="$TARGET_DIR/phpunit.xml.dist" +TARGET_XML="" +if [ -f "$PHPUNIT_XML" ]; then + TARGET_XML="$PHPUNIT_XML" +elif [ -f "$PHPUNIT_DIST" ]; then + TARGET_XML="$PHPUNIT_DIST" +fi + +if [ -n "$TARGET_XML" ]; then + if ! grep -q 'name="DB_CONNECTION"' "$TARGET_XML" || ! grep -q 'value="sqlite"' "$TARGET_XML"; then + if grep -q '' "$TARGET_XML"; then + sed -i.bak '//a\ + \ + \ + \ + \ + \ + +' "$TARGET_XML" 2>/dev/null || true + rm -f "$TARGET_XML.bak" 2>/dev/null || true + echo -e " ${GREEN}✓${NC} Đã cấu hình SQLite in-memory (:memory:) an toàn vào phpunit.xml" + fi + else + echo -e " ${GREEN}✓${NC} Cấu hình SQLite in-memory trong phpunit.xml đã chuẩn xác" + fi +fi + +# E. Tạo GitHub Actions CI workflow nếu có .git +if [ -d "$TARGET_DIR/.git" ]; then + mkdir -p "$TARGET_DIR/.github/workflows" + if [ ! -f "$TARGET_DIR/.github/workflows/unit-tests.yml" ]; then + cp "$PACKAGE_ROOT/templates/ci/github-actions.yml.template" "$TARGET_DIR/.github/workflows/unit-tests.yml" + echo -e " ${GREEN}✓${NC} Đã tạo CI/CD Quality Gate (.github/workflows/unit-tests.yml)" + fi +fi + +echo -e "\n${GREEN}${BOLD}🎉 CÀI ĐẶT HOÀN TẤT THÀNH CÔNG VÀO SOURCE CODE!${NC}" +echo -e "\n${YELLOW}${BOLD}BÂY GIỜ BẠN CÓ THỂ VIẾT UNIT TEST NGAY:${NC}" +echo -e "1. Mở Claude Code tại source code này:" +echo -e " ${CYAN}claude${NC}" +echo -e "2. Gõ 1 lệnh duy nhất để AI viết test toàn bộ và tự chạy test luôn:" +echo -e " ${CYAN}/laravel-unit-test --all --run${NC}" +echo -e "3. Hoặc chạy test trực tiếp từ terminal:" +echo -e " ${CYAN}./test-runner.sh${NC}" diff --git a/sg-install-unit-testing.sh b/sg-install-unit-testing.sh deleted file mode 100755 index 22facfe..0000000 --- a/sg-install-unit-testing.sh +++ /dev/null @@ -1,258 +0,0 @@ -#!/usr/bin/env bash - -# ============================================================================== -# SMARTGIFT AI - LARAVEL UNIT TESTING TOOLKIT INSTALLER -# Bộ cài đặt công cụ chuẩn hóa và tự động sinh Unit Test cho dự án Laravel -# -# Cách dùng: -# 1. Cài đặt TOÀN CỤC (Khuyên dùng cho cả Team - chạy được ở MỌI thư mục): -# ./sg-install-unit-testing.sh --global -# -# 2. Cài đặt riêng vào một dự án cụ thể: -# ./sg-install-unit-testing.sh /duong-dan/toi/du-an-laravel -# -# 3. Cài đặt ngay tại thư mục hiện tại: -# ./sg-install-unit-testing.sh . -# ============================================================================== - -set -e - -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -RED='\033[0;31m' -CYAN='\033[0;36m' -NC='\033[0m' - -# Tự động tìm đường dẫn gốc của repository (kể cả khi gọi qua symlink ở bất kỳ đâu) -SOURCE="${BASH_SOURCE[0]}" -while [ -L "$SOURCE" ]; do - DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)" - SOURCE="$(readlink "$SOURCE")" - [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" -done -CURRENT_DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)" - -if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then - echo -e "${BLUE}===================================================================${NC}" - echo -e "${CYAN} SMARTGIFT AI: LARAVEL UNIT TESTING TOOLKIT INSTALLER${NC}" - echo -e "${BLUE}===================================================================${NC}" - echo -e "Cách dùng:" - echo -e " 1. Cài đặt toàn cục (dùng ở mọi nơi trên máy):" - echo -e " ${YELLOW}sg-install-unit-testing.sh --global${NC}" - echo -e " 2. Khởi tạo vào dự án tại thư mục hiện tại:" - echo -e " ${YELLOW}sg-install-unit-testing.sh${NC} (hoặc ${YELLOW}sg-install-unit-testing.sh .${NC})" - echo -e " 3. Khởi tạo vào một thư mục dự án cụ thể:" - echo -e " ${YELLOW}sg-install-unit-testing.sh /duong-dan/toi/du-an${NC}" - exit 0 -fi - -# ============================================================================== -# 1. XỬ LÝ CÀI ĐẶT TOÀN CỤC (GLOBAL MODE: DÙNG CHO MỌI THƯ MỤC TRÊN MÁY TÍNH) -# ============================================================================== -if [ "$1" = "--global" ] || [ "$1" = "-g" ]; then - echo -e "${BLUE}===================================================================${NC}" - echo -e "${CYAN} SMARTGIFT AI: CÀI ĐẶT BỘ LARAVEL UNIT TESTING TOOLKIT TOÀN CỤC${NC}" - echo -e "${YELLOW} Thư mục đích: $HOME/.claude/skills/${NC}" - echo -e "${BLUE}===================================================================${NC}" - - # 1. Cài đặt Skills cho Claude Code (Liên kết động để khi git pull tự động cập nhật ngay) - mkdir -p "$HOME/.claude/skills" - echo -e "📦 Đang liên kết bộ 4 Claude Code Skills vào $HOME/.claude/skills/..." - for skill_dir in "$CURRENT_DIR/.claude/skills/"*; do - skill_name="$(basename "$skill_dir")" - ln -sfn "$skill_dir" "$HOME/.claude/skills/$skill_name" - done - - # 2. Lưu trữ Docs và Templates tham khảo toàn cục - mkdir -p "$HOME/.claude/laravel-testing-docs/templates" - cp -R "$CURRENT_DIR/docs/"* "$HOME/.claude/laravel-testing-docs/" - cp -R "$CURRENT_DIR/rules/"* "$HOME/.claude/laravel-testing-docs/" - cp -R "$CURRENT_DIR/templates/"* "$HOME/.claude/laravel-testing-docs/templates/" - - # 3. Tạo lệnh CLI toàn cục: laravel-unit-test-setup & sg-test-init - mkdir -p "$HOME/.local/bin" - cat << 'EOF' > "$HOME/.local/bin/laravel-unit-test-setup" -#!/usr/bin/env bash -# Smartgift AI - Laravel Unit Test Project Initializer - -if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then - echo "==================================================================" - echo " SMARTGIFT AI: LARAVEL UNIT TEST PROJECT INITIALIZER" - echo "==================================================================" - echo "Cách dùng: laravel-unit-test-setup [đường-dẫn-dự-án]" - echo "Mặc định khởi tạo vào thư mục hiện tại nếu không truyền tham số." - exit 0 -fi - -TARGET_DIR="${1:-.}" -SOURCE_DIR="$HOME/.claude/laravel-testing-docs" - -if [ ! -d "$TARGET_DIR" ]; then - echo "Lỗi: Thư mục '$TARGET_DIR' không tồn tại!" - exit 1 -fi - -echo "🚀 Đang khởi tạo công cụ test cho dự án tại: $TARGET_DIR" - -if [ -f "$SOURCE_DIR/templates/docker/test-runner.sh" ]; then - cp "$SOURCE_DIR/templates/docker/test-runner.sh" "$TARGET_DIR/test-runner.sh" - chmod +x "$TARGET_DIR/test-runner.sh" - echo " ✓ Đã tạo $TARGET_DIR/test-runner.sh" -fi - -if [ -f "$SOURCE_DIR/templates/setup-dependencies.sh" ]; then - cp "$SOURCE_DIR/templates/setup-dependencies.sh" "$TARGET_DIR/setup-test-deps.sh" - chmod +x "$TARGET_DIR/setup-test-deps.sh" - echo " ✓ Đã tạo $TARGET_DIR/setup-test-deps.sh" -fi - -echo "🎉 Khởi tạo hoàn tất! Bạn có thể mở Claude Code tại thư mục này và gõ /laravel-test-setup" -EOF - chmod +x "$HOME/.local/bin/laravel-unit-test-setup" - - # Tạo thêm các bí danh ngắn gọn - rm -f "$HOME/.local/bin/laravel-test-init" "$HOME/.local/bin/sg-test-init" - cp "$HOME/.local/bin/laravel-unit-test-setup" "$HOME/.local/bin/laravel-test-init" - cp "$HOME/.local/bin/laravel-unit-test-setup" "$HOME/.local/bin/sg-test-init" - chmod +x "$HOME/.local/bin/laravel-test-init" "$HOME/.local/bin/sg-test-init" - - # 4. Tạo lệnh CLI toàn cục: sg-test-update (Cập nhật 1-Click cho Team) - cat << EOF > "$HOME/.local/bin/sg-test-update" -#!/usr/bin/env bash -# Smartgift AI - One-Click Toolkit Updater - -TOOLKIT_REPO="$CURRENT_DIR" -TARGET_DIR="\${1:-}" - -# Tự động nhận diện nếu đang đứng trong một dự án Laravel -if [ -z "\$TARGET_DIR" ] && [ -f "./composer.json" ]; then - TARGET_DIR="." -fi - -echo "🔄 Đang cập nhật bộ công cụ Smartgift AI Unit Testing từ Git..." - -if [ -d "\$TOOLKIT_REPO/.git" ]; then - git -C "\$TOOLKIT_REPO" pull origin main - echo "✓ Đã kéo mã nguồn mới nhất từ remote Git." -else - echo "⚠️ Không tìm thấy git repo tại \$TOOLKIT_REPO" -fi - -# Tự động đồng bộ lại docs và skills -mkdir -p "$HOME/.claude/laravel-testing-docs/templates" -cp -R "\$TOOLKIT_REPO/docs/"* "$HOME/.claude/laravel-testing-docs/" -cp -R "\$TOOLKIT_REPO/rules/"* "$HOME/.claude/laravel-testing-docs/" -cp -R "\$TOOLKIT_REPO/templates/"* "$HOME/.claude/laravel-testing-docs/templates/" - -# Nếu có truyền đường dẫn dự án cụ thể, update luôn cho dự án đó -if [ -n "\$TARGET_DIR" ] && [ -d "\$TARGET_DIR" ]; then - echo "📦 Cập nhật cho dự án: \$TARGET_DIR" - cp "\$TOOLKIT_REPO/templates/docker/test-runner.sh" "\$TARGET_DIR/test-runner.sh" 2>/dev/null || true - cp "\$TOOLKIT_REPO/templates/setup-dependencies.sh" "\$TARGET_DIR/setup-test-deps.sh" 2>/dev/null || true - chmod +x "\$TARGET_DIR/test-runner.sh" "\$TARGET_DIR/setup-test-deps.sh" 2>/dev/null || true - if [ -d "\$TARGET_DIR/.claude/testing-docs" ]; then - cp -R "\$TOOLKIT_REPO/docs/"* "\$TARGET_DIR/.claude/testing-docs/" - cp -R "\$TOOLKIT_REPO/rules/"* "\$TARGET_DIR/.claude/testing-docs/" - fi -fi - -echo "🎉 CẬP NHẬT HOÀN TẤT! Tất cả các Skills & Docs đã ở phiên bản mới nhất." -EOF - chmod +x "$HOME/.local/bin/sg-test-update" - cp "$HOME/.local/bin/sg-test-update" "$HOME/.local/bin/laravel-test-update" - chmod +x "$HOME/.local/bin/laravel-test-update" - - echo -e "${GREEN}✓ CÀI ĐẶT TOÀN CỤC CHO TEAM THÀNH CÔNG RỰC RỠ!${NC}" - echo -e "" - echo -e "${YELLOW}Kể từ bây giờ, ở BẤT KỲ THƯ MỤC NÀO trên máy tính của bạn:${NC}" - echo -e " 1. Khi mở Claude Code (gõ 'claude'), các lệnh sau luôn sẵn sàng 100%:" - echo -e " - ${CYAN}/laravel-test-setup${NC} -> Tự động kiểm tra môi trường & cài package" - echo -e " - ${CYAN}/laravel-unit-test ${NC} -> Sinh test cho file, folder, hoặc --changed" - echo -e " - ${CYAN}/laravel-test-review ${NC} -> Chấm điểm và bắt lỗi anti-patterns" - echo -e " - ${CYAN}/laravel-mock-helper ${NC} -> Sinh mã Mockery nhanh" - echo -e " 2. Lệnh khởi tạo runner cho bất kỳ dự án nào:" - echo -e " ${CYAN}laravel-unit-test-setup${NC} (hoặc ${CYAN}sg-test-init${NC})" - echo -e " 3. Lệnh cập nhật 1-Click khi team có thay đổi mới:" - echo -e " ${CYAN}sg-test-update${NC} (hoặc ${CYAN}laravel-test-update${NC})" - exit 0 -fi - -# ============================================================================== -# 2. XỬ LÝ CÀI ĐẶT VÀO MỘT DỰ ÁN CỤ THỂ (PROJECT-SPECIFIC MODE) -# ============================================================================== -TARGET_DIR="${1:-.}" -FORCE_INSTALL=false - -if [ "$2" = "--force" ] || [ "$1" = "--force" ]; then - FORCE_INSTALL=true - if [ "$1" = "--force" ]; then - TARGET_DIR="${2:-.}" - fi -fi - -# Chuẩn hóa đường dẫn tương đối thành tuyệt đối -TARGET_DIR="$(cd "$TARGET_DIR" 2>/dev/null && pwd || echo "$TARGET_DIR")" - -if [ ! -d "$TARGET_DIR" ]; then - echo -e "${RED}Lỗi: Thư mục '$TARGET_DIR' không tồn tại!${NC}" - exit 1 -fi - -if [ ! -f "$TARGET_DIR/artisan" ] && [ ! -f "$TARGET_DIR/composer.json" ]; then - if [ "$FORCE_INSTALL" = false ]; then - echo -e "${YELLOW}⚠️ Cảnh báo: Thư mục '$TARGET_DIR' chưa có file artisan hoặc composer.json.${NC}" - echo -e "Nếu bạn vẫn muốn cài đặt trước bộ skills vào thư mục này, hãy thêm cờ: ${GREEN}--force${NC}" - echo -e "Ví dụ: ${BLUE}$0 $TARGET_DIR --force${NC}" - exit 1 - else - echo -e "${YELLOW}ℹ Chế độ --force: Tiến hành cài đặt skills dù chưa có artisan/composer.json.${NC}" - fi -fi - -echo -e "${BLUE}===================================================================${NC}" -echo -e "${CYAN} SMARTGIFT AI: CÀI ĐẶT LARAVEL UNIT TESTING TOOLKIT VÀO DỰ ÁN${NC}" -echo -e "${YELLOW} Thư mục đích: $TARGET_DIR${NC}" -echo -e "${BLUE}===================================================================${NC}" - -# Tạo thư mục .claude/skills trong dự án đích -mkdir -p "$TARGET_DIR/.claude/skills" -echo -e "📦 Đang copy bộ skills..." -cp -R "$CURRENT_DIR/.claude/skills/"* "$TARGET_DIR/.claude/skills/" - -# Tạo thư mục chứa docs tham khảo -mkdir -p "$TARGET_DIR/.claude/testing-docs" -cp -R "$CURRENT_DIR/docs/"* "$TARGET_DIR/.claude/testing-docs/" -cp -R "$CURRENT_DIR/rules/"* "$TARGET_DIR/.claude/testing-docs/" - -# Cài đặt test runner script & dependency setup script -if [ ! -f "$TARGET_DIR/test-runner.sh" ]; then - echo -e "🚀 Cài đặt smart test-runner.sh vào root của dự án..." - cp "$CURRENT_DIR/templates/docker/test-runner.sh" "$TARGET_DIR/test-runner.sh" - chmod +x "$TARGET_DIR/test-runner.sh" -fi - -if [ ! -f "$TARGET_DIR/setup-test-deps.sh" ]; then - echo -e "📦 Cài đặt smart setup-test-deps.sh vào root của dự án..." - cp "$CURRENT_DIR/templates/setup-dependencies.sh" "$TARGET_DIR/setup-test-deps.sh" - chmod +x "$TARGET_DIR/setup-test-deps.sh" -fi - -# Cài đặt GitHub Actions CI/CD Pipeline (nếu dự án dùng git) -if [ -d "$TARGET_DIR/.github" ] || [ -d "$TARGET_DIR/.git" ]; then - mkdir -p "$TARGET_DIR/.github/workflows" - if [ ! -f "$TARGET_DIR/.github/workflows/unit-tests.yml" ]; then - echo -e "⚙️ Cài đặt GitHub Actions CI Workflow vào .github/workflows/unit-tests.yml..." - cp "$CURRENT_DIR/templates/ci/github-actions.yml.template" "$TARGET_DIR/.github/workflows/unit-tests.yml" - fi -fi - -echo -e "${GREEN}✓ Cài đặt hoàn tất thành công!${NC}" -echo -e "" -echo -e "${YELLOW}Các lệnh bạn có thể sử dụng ngay trong dự án đích với Claude Code:${NC}" -echo -e " 1. ${CYAN}/laravel-test-setup${NC} -> Quét và kiểm tra môi trường test" -echo -e " 2. ${CYAN}/laravel-unit-test ${NC} -> Tự động sinh Unit Test (hỗ trợ cả file, folder, và --changed)" -echo -e " 3. ${CYAN}/laravel-test-review ${NC} -> Review chất lượng file test" -echo -e " 4. ${CYAN}/laravel-mock-helper ${NC} -> Sinh mã Mockery nhanh" -echo -e " 5. ${CYAN}./test-runner.sh${NC} -> Chạy test tự nhận diện Docker / Sail / Local" -echo -e " 6. ${CYAN}./setup-test-deps.sh${NC} -> Tự động cài thư viện test còn thiếu"