# 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): ```bash 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: ```bash 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: ```bash 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:** ```bash 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: ```bash 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.