NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Testing for Laravel

Žiadne názvy tried v API

Väčšina hostiteľských aplikácií nemá morph mapu, takže stĺpec *_type obsahuje App\Models\User — a ak ho pošlete klientovi, prezradíte štruktúru menných priestorov hostiteľa a naviažete na ňu jeho API. Každý súvisiaci model preto vykreslite cez referenčný resource s {id, type: class_basename} a pripnite to cez toExposeNoClassNames() — alebo Assert::exposesNoClassNames() v čistom PHPUnit:

use Illuminate\Database\Eloquent\Relations\Relation;
use RoundlyConsulting\Testing\Assert;

it('renders the author without a class name', function (): void {
    Relation::morphMap([], merge: false); // no morph map, like most hosts

    $resource = new CommentResource($comment->load('author'));

    expect($resource)->toExposeNoClassNames();                   // the response body, wrapping included
    expect($this->getJson('/comments'))->toExposeNoClassNames(); // a TestResponse
    expect($payload)->toExposeNoClassNames();                    // an array or a JSON string

    Assert::exposesNoClassNames($payload);                       // plain PHPUnit
});

Čo prečíta

VstupPrečíta sa ako
Reťazec JSONDekódovaný; reťazec, ktorý nie je JSON, vyhodí InvalidArgumentException.
PolePayload tak, ako je.
JsonResourcetoResponse(request()) — telo, ktoré dostane klient, vrátane obalenia do data, with() a additional().
Response / JsonResponse / TestResponseTelo odpovede, dekódované.

Čokoľvek iné — int, obyčajný objekt — vyhodí InvalidArgumentException.

Čo zlyhá

Kontroluje sa každý kľúč a každá reťazcová hodnota v ľubovoľnej hĺbke a každý únik sa uvedie s cestou (data.author.type), nielen prvý:

  • Názov triedy s menným priestorom kdekoľvek — App\Models\User, \App\Models\User, kópia zakódovaná do JSON vnútri reťazca, názov v texte (No query results for model [App\Models\User]) aj názov použitý ako kľúč. Stačí tvar Vendor\Name v StudlyCase; reťazec malými písmenami sa počíta, ak trieda naozaj existuje.
  • Kľúč *_type s triedou, nahlásený ako morph stĺpec — vrátane globálnej triedy bez menného priestoru, ktorý by ju prezradil ("subject_type": "ArrayObject").
  • Nie je čo kontrolovať. Prázdny reťazec, {}, [], null, prázdny resource alebo odpoveď bez tela zlyhá: payload bez jedinej hodnoty nedokazuje, že sa niečo vykreslilo.
// Passes — a reference resource's basename, and morph aliases
expect(['id' => 1, 'type' => 'User'])->toExposeNoClassNames();
expect(['subject_type' => 'post', 'payment_type' => 'card'])->toExposeNoClassNames();

// Fails — every leak listed with its path
expect(['data' => ['author' => ['id' => 1, 'type' => 'App\Models\User']]])->toExposeNoClassNames();
// `data.author.type` holds the class name `App\Models\User`

expect(['commentable_type' => 'App\Models\Post', 'commentable_id' => 3])->toExposeNoClassNames();
// the morph type column `commentable_type` holds the class name `App\Models\Post`

expect(['subject_type' => 'ArrayObject'])->toExposeNoClassNames();
// the morph type column `subject_type` holds the class name `ArrayObject`

expect(['message' => 'No query results for model [App\Models\User] 5'])->toExposeNoClassNames();
// `message` holds the class name `App\Models\User`

// Fails — nothing to check
expect([])->toExposeNoClassNames();
// There is nothing to check: the payload is empty, so "it exposes no class names" would pass
// without anything having rendered. Assert on the populated payload.

Čo prejde

  • Vlastné {"id": 1, "type": "User"} referenčného resource — type nie je stĺpec *_type a základný názov triedy nemá menný priestor.
  • Morph alias v stĺpci *_type ("commentable_type": "post").
  • Skalárne hodnoty, hodnoty null, URL a cesty s lomkami.

Obmedzenia

  • Cesta vo Windows (C:\Users\Jane) vyzerá ako názov triedy a zlyhá — je to únik sám osebe.
  • Kontroluje to, čo dostane. Interné formáty na spiatočný prenos — exporty, výkazy účtovnej knihy, payloady vo fronte — pravidlo nemusia spĺňať; nesmerujte ju na ne.
  • Podmienku „bez morph mapy“ za vás nenastaví: v teste morph mapu vyprázdnite, inak môže payload obsahovať alias, ktorý zakryje, čo by videl hostiteľ bez nej.

Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

Ďalšie spôsoby podpory vrátane kryptomien

Odoslaním daru súhlasíte s našimi podmienkami prijímania darov.

Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.