feat: complete Smartgift AI Laravel unit testing toolkit

- Add 10 core testing guides (setup, AAA principles, PHPUnit/Pest, mocking, anti-patterns, PHP 8.4+, debugging, data factories, advanced edge cases)
- Add 13 component testing guides covering all Laravel layers
- Add standard templates for PHPUnit 10/11 and Pest v2/v3 including ArchitectureTest
- Add Docker smart test runner, dependency installer, and CI/CD templates (GitHub Actions, GitLab CI)
- Add 4 Claude Code skills (laravel-test-setup, laravel-unit-test with --all mode, laravel-test-review, laravel-mock-helper)
- Add single unified installer script (sg-install-unit-testing.sh) with global support, CLI runners, and 1-click updater (sg-test-update)
- Add comprehensive documentation (README.md, USAGE-GUIDE.md)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-07 16:41:37 +07:00
commit 2045c856e9
60 changed files with 5248 additions and 0 deletions
+28
View File
@@ -0,0 +1,28 @@
# Môi trường cách ly cho Unit & Feature Tests Laravel
APP_NAME="Laravel Test"
APP_ENV=testing
APP_KEY=base64:FakeKeyForTestingPurposesOnly1234567890=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=null
LOG_LEVEL=emergency
# Database SQLite in-memory siêu tốc
DB_CONNECTION=sqlite
DB_DATABASE=:memory:
# Tối ưu mã hóa mật khẩu khi chạy test
BCRYPT_ROUNDS=4
# Chặn gửi mail / queue / cache / session thật
CACHE_STORE=array
CACHE_DRIVER=array
QUEUE_CONNECTION=sync
SESSION_DRIVER=array
MAIL_MAILER=array
# Tắt các monitoring package
TELESCOPE_ENABLED=false
PULSE_ENABLED=false
HORIZON_PREFIX=testing-horizon
+45
View File
@@ -0,0 +1,45 @@
<?php
/*
|--------------------------------------------------------------------------
| Test Case Configuration
|--------------------------------------------------------------------------
|
| Định cấu hình TestCase mặc định cho Unit và Feature tests trong Pest PHP.
|
*/
uses(
Tests\TestCase::class,
// Illuminate\Foundation\Testing\RefreshDatabase::class, // Chỉ bật trong Feature Test
)->in('Feature');
uses(
Tests\TestCase::class,
)->in('Unit');
/*
|--------------------------------------------------------------------------
| Expectations Custom Helpers
|--------------------------------------------------------------------------
|
| Tạo các custom expectation mở rộng của Pest nếu cần.
|
*/
expect()->extend('toBeValidEmail', function () {
return $this->toBeString()->toMatch('/^.+@.+\..+$/');
});
/*
|--------------------------------------------------------------------------
| Functions Helpers
|--------------------------------------------------------------------------
|
| Hàm global hỗ trợ khởi tạo dữ liệu giả lập cho test.
|
*/
// function asUser($user = null) {
// return test()->actingAs($user ?? User::factory()->create());
// }
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd"
bootstrap="vendor/autoload.php"
colors="true"
cacheDirectory=".phpunit.cache"
executionOrder="depends,defects"
requireCoverageMetadata="false"
beStrictAboutCoverageMetadata="false"
beStrictAboutOutputDuringTests="true"
failOnRisky="true"
failOnWarning="true">
<testsuites>
<testsuite name="Unit">
<directory suffix="Test.php">./tests/Unit</directory>
</testsuite>
<testsuite name="Feature">
<directory suffix="Test.php">./tests/Feature</directory>
</testsuite>
</testsuites>
<source restrictDeprecations="true" restrictNotices="true" restrictWarnings="true">
<include>
<directory>./app</directory>
</include>
</source>
<php>
<env name="APP_ENV" value="testing"/>
<env name="APP_MAINTENANCE_DRIVER" value="file"/>
<env name="BCRYPT_ROUNDS" value="4"/>
<env name="CACHE_STORE" value="array"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
<env name="MAIL_MAILER" value="array"/>
<env name="PULSE_ENABLED" value="false"/>
<env name="QUEUE_CONNECTION" value="sync"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="TELESCOPE_ENABLED" value="false"/>
</php>
</phpunit>