Testy a nástroje#
Čím se v tomhle projektu ověřuje, že něco funguje — a čím se to ověřit nedá.
Testy#
tests/ — 314 souborů (find tests -name "*.php" | wc -l):
| Sada | Souborů | Co obsahuje |
|---|---|---|
Unit/ |
75 | jednotkové — Security/, Hydrators/, Filters/, Routers/, Cache/, Core/, UI/, Utils/ |
Integration/ |
15 | průchod víc vrstvami |
Manual/ |
200 | ruční scénáře a harnessy pro CLI |
Fixtures/, Support/ |
23 | data a pomocné třídy |
Strukturální testy#
Zvláštní kategorie: testy, které čtou zdrojáky a hlídají, že se na něco nezapomnělo. Zapomenutý guard v jedné nové metodě totiž nic neshodí — díra tam prostě zůstane.
| Test | Co hlídá |
|---|---|
ApiPermissionCoverageTest |
že guard oprávnění je v každé get*Data() |
PermissionResolverTest |
že v SQL resolveru nejsou skupiny oprávnění |
FieldAccessCoverageTest |
že pole s podezřelým jménem je anotované, nebo má výjimku s důvodem |
ConditionallyUpdatableContractTest |
že pojmenovaná kontrolní metoda existuje |
ExternalReadonlyCoverageTest |
že server-počítaná pole nejdou zapsat zvenčí |
Tautologický guard nedokazuje nic
Kontrola porovnávající hodnotu samu se sebou projde vždycky. Každý guard ověř protipříkladem — tedy tím, že ukážeš, kdy neprojde.
Seed ve fixture bývá známka chybějícího kódu
Musí-li test data doplnit ručně, aby prošel, obvykle to znamená, že je nedoplňuje aplikace. Než seed přidáš, ověř, jestli nemají vzniknout v kódu.
Co testy nezachytí#
Tohle je nejdůležitější oddíl celé kapitoly.
| Chyba | Proč projde | Čím se chytí |
|---|---|---|
formulář nejde odeslat (mixed v onSuccess) |
build formuláře i Api endpoint pod ním projdou | POST nebo živý proklik |
setValidationScope([]) vyprázdní hodnoty |
testy jdou přes Api s ručním payloadem | živý proklik |
| CLI harness bez tokenu vrací prázdno | vrátí prázdno bez chyby | zkontrolovat, že data opravdu přišla |
| nepřekreslený snippet s chybovou hláškou | selhání je němé | proklik prohlížečem |
Živý proklik odhalí to, co harness nemůže
CLI běh obchází vrstvy, které se v prohlížeči uplatní — formuláře, snippety, signály, JavaScript. Než něco prohlásíš za hotové, proklikej to.
Harness v CLI potřebuje interní token
Bez něj běží jako guest, dostane Permission denied uvnitř mostu a vrátí
prázdno bez chyby. Test nad tím projde zeleně a netestuje nic. Řešení:
ApiBridge::setInternalAuthToken($jwtManager->generateToken(…)) — podrobně
Volání API.
Shodné skóre z Elasticsearch není důkaz pořadí
Když mají dokumenty stejné skóre, pořadí určuje interní pořadí indexu — a to se může změnit bez zásahu do kódu. Test nad takovým seznamem dokazuje jen to, že hledání něco vrátilo.
PHPStan#
phpstan.neon, úroveň 9, k tomu 23 baseline souborů (ls phpstan-baseline*.neon).
Mrtvá cesta v baseline zabrání spuštění ÚPLNĚ
PHPStan skončí chybou a analýza vůbec neproběhne — a protože výstup nevypadá jako nález, snadno se to splete s „prošlo to“. Po přejmenování nebo smazání souboru projdi baseline.
Holé číslo chyb kolísá i bez změny kódu
Naměřeno 5795–5857 mezi běhy. Rozdíly přijímej podle seznamu nálezů, ne podle čísla — jinak budeš honit šum.
Pre-commit hook#
.githooks/pre-commit (aktivace: git config core.hooksPath .githooks) blokuje tři
věci:
- ladicí volání v PHP —
bdump(,dumpe(,dd(v přidaných řádcích, :rootv komponentním SCSS — tokeny patří na selektor komponenty, ne do globálu (allowlist má výjimky pro token vrstvy),- porušení ráčny vrstev
Manager → Service → Mapper → Repository.
--no-verify obchází všechny tři
Je to určené pro výjimky, ne pro spěch. Co projde přes --no-verify, přijde na
řadu při code review — nebo za měsíc v produkci.
Sestavení assetů#
npm run build:admin # JS i CSS administrace
npm run build:admin:css
npm run build:admin:js
npm run watch:admin:css
Front téma se sestavuje ze své složky — viz Témata frontendu.
npx sass je jiná verze překladače než sass
Vyrobí jiný výstup. Používej příkazy z package.json.
Skills#
skills/ — 19 postupů. Nejsou to doporučení, je to závazný popis, jak se
v tomhle projektu dělá konkrétní věc.
| Skupina | Pro co |
|---|---|
code-standard/ |
konvence po vrstvách (PHP, model, presenter, komponenta, formuláře, signály, Latte, Core) |
cs-admin-* |
administrace — grid, formulář, picker, audit formuláře |
cs-template-* |
šablony a témata |
cs-translations |
překlady |
cs-scss-structure |
SCSS |
cs-module-refactoring, cs-payment-gateway, cs-ui-audit |
ucelené postupy |
Před úkolem otevři příslušný skill — ne všechny
Každý cs-conv-* si o své závislosti řekne sám. Přehled je v
Konvence kódu.
🔴 Produkce a vývoj sdílejí databázi#
Každý zápis je ostrý
Neexistuje „nejdřív to zkusím na vývojovém“. Experimenty dělej v transakci s návratem zpět, a než něco hromadně přepíšeš, spočítej si, kolika řádků se to týká.
Soubory jsou naopak po strojích rozdělené
Databáze je sdílená, ale vygenerované soubory (PDF, obrázky, feedy) ne. Chybějící PDF na vývojovém stroji proto nemusí znamenat chybu generátoru — může jen ležet jinde.
Redis a soubory se mezi lokálem a dev serverem nesdílejí
Vyprázdnění cache lokálně neznamená vyprázdněnou cache na dev serveru. Ověřovat se musí tam, kde to má fungovat.
Kam sáhnout#
| Chci | Kde |
|---|---|
| jednotkové testy | tests/Unit/ |
| ruční harnessy | tests/Manual/ |
| konfiguraci statické analýzy | phpstan.neon + phpstan-baseline*.neon |
| pre-commit kontroly | .githooks/pre-commit |
| příkazy sestavení | package.json, composer.json |
| závazné postupy | skills/ |
Navazující kapitoly: Konvence kódu · Checklist nasazení · Volání API · RBAC v API