d2d.emegrendeles.hu/CLAUDE.md
E98Developer 11a18eb1a6 ADD CLAUDE.md a fejlesztői munkafolyamat rögzítésére
A teszt-optimalizálás során több olyan szabály és csapda derült ki, ami a kódból
nem olvasható ki, és amit egy új session vagy a jövőbeli önmagunk könnyen
elrontana:

- A teljes suite --parallel-lel fut, EGY tesztre viszont ne: ott a hat processz
  bootja tiszta veszteség.
- A tests/TestCase.php DB-név mintáját nem szabad str_starts_with($db, 'd2d')-re
  lazítani, mert az átengedné az éles adatbázist.
- A ParallelTesting::callSetUpTestCaseCallbacks() hívás nem felesleges: enélkül
  a processzenkénti adatbázis sosem jön létre.
- A mysql kliens PATH-on léte nélkül az egész suite elszáll, nem csak lassabb.
- A bootstrap/cache/blade-icons.php adja a boot idejének a felét.
- Új migráció után schema:dump kell, --prune viszont soha.
- A deployment tesztek fájljai ne nőjenek 35 mp fölé.

A deploy szakasz azért került bele, mert a kézi fájlmásolás egyszer valódi éles
incidenst okozott, és a queue worker újraindításának sorrendje sem magától
értetődő.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 12:22:18 +02:00

4.4 KiB

CLAUDE.md

Laravel 12 (PHP 8.4) + Filament 4 + Livewire 3, Pest 3 tesztekkel, MariaDB adatbázison. Fejlesztés Windowson, egyetlen gépen — nincs csapat és nincs CI.

Tesztek futtatása

Teljes suite (~77 mp, 6 processzen):

php artisan test --parallel

Egy tesztre vagy egy fájlra --parallel nélkül — ott a hat processz bootja tiszta veszteség, a párhuzamos futás lassabb:

php artisan test --filter="részlet"

Hasznos még: --retry (előbb a bukott teszteket futtatja, első hibánál megáll) és --profile (a 10 leglassabb teszt). A Pest 3.8-ban nincs --dirty kapcsoló.

A tests/Feature/ExampleTest.php (GET / → 302) régóta bukik, függetlenül minden más munkától. Egy bukó teszt a teljes suite-on ez, nem regresszió.

Adatbázis-védelem

A tests/TestCase.php setUp()-ja a RefreshDatabase előtt ellenőrzi a konfigurált adatbázisnevet, mert a RefreshDatabase feltétel nélkül eldobja a táblákat. Az éles d2d név azonnali exit(1)-et vált ki.

Elfogadott név: /^d2dtest(_test_\d+)?$/. A _test_N alak a --parallel processzenkénti adatbázisa (a nevet a Laravel TestDatabases::testDatabase() adja). Ezt a mintát ne lazítsd str_starts_with($db, 'd2d')-re — az átengedné az éles adatbázist is.

A setUp() szándékosan hívja meg maga a ParallelTesting::callSetUpTestCaseCallbacks()-ot: a Laravel ezt csak akkor futtatná, ha ő hozta létre az alkalmazást, mi viszont előbb bootolunk az ellenőrzés miatt. Enélkül a processzenkénti adatbázis sosem jönne létre, és minden processz ugyanazt az adatbázist migrálná.

Gépfüggő beállítások

A mysql kliensnek a PATH-on kell lennie, különben az egész teszt-suite elszáll (MySqlSchemaState.php). Binárisok: C:\www\envkit\services\mysql\11.8.2\bin.

bootstrap/cache/blade-icons.php — ez adja az app boot idejének a felét (nélküle 8,2 mp, vele 3,8 mp minden php artisan hívás). Gitignore-olt, tehát gépenként kell egyszer:

php artisan icons:cache

Új ikonkészlet vagy ikonokat szállító csomag után újra kell generálni. A php artisan filament:optimize nem hoz további nyereséget (mérve), viszont elrejtené az újonnan létrehozott Filament resource-okat — ne használd fejlesztés közben.

Migrációk és séma dump

database/schema/mysql-schema.sql váltja ki a 103 migráció lefuttatását a teszteknél. Minden új migráció után újra kell generálni:

php artisan schema:dump

Ha elmarad, az nem törik el semmit — a Laravel betölti a dumpot, majd a dump utáni migrációkat egyenként lefuttatja rá.

A dumpot a Laravel csak akkor tölti be, ha a migrations tábla üres. Az e2e/d2d környezetek, ahol már vannak lefutott migrációk, változatlanul inkrementálisan migrálnak. A --prune kapcsolót ne használd: az törölné a migrációs fájlokat.

A deployment tesztek szerkezete

tests/Feature/Deployment/ hat fájlból áll, mert a paratest fájlonként osztja szét a munkát — egyetlen nagy fájlból nem tud párhuzamosítani. A felosztás mért időkre van kalibrálva, a leghosszabb fájl ~35 mp.

Ha új tesztet írsz, a téma szerinti fájlba tedd — de ha az a fájl 35 mp fölé nőne, bontsd tovább: a párhuzamos futás faliórája a leghosszabb fájlhoz van kötve.

A közös segédfüggvények a DeploymentTestHelpers.php-ban vannak (nem *Test.php, ezért a phpunit nem szedi fel). A temp git repó processzenként egyszer épül fel, a tesztek File::copyDirectory-val kapnak róla saját másolatot. A takarítás register_shutdown_function-ben van, nem afterAll()-ban: az fájlonként futna le, és a következő teszt-fájl alól húzná ki a mintát.

Deploy

A deploy kézi fájlmásolással történik, nem gittel. Emiatt egy „benne van-e már élesben ez a javítás" kérdés nem válaszolható meg a git állapotából — a deployolt fájl tartalmát kell megnézni.

Queue-alapú funkcióknál a fájlmásolás önmagában nem elég: a queue:work hosszan futó folyamat, a memóriájában tartja a régi kódot. A sorrend:

php artisan config:clear && php artisan cache:clear

majd a workert futtató service force-restartja (d2d-n d2d-environment_queue). A restart a cache ürítés után jön, különben a frissen induló worker a régi konfigot töltené be.