Testovanie
Slugy sa generujú v bežných eventoch modelu, takže feature testy nepotrebujú žiadnu špeciálnu prípravu — vytvorte modely a overujte cez verejné API:
use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Sluggable\Enums\ChangeReason;
use RoundlyConsulting\Sluggable\Events\SlugChanged;
it('generates unique slugs from the name', function () {
expect(Clinic::create(['name' => 'Happy Paws'])->slug)->toBe('happy-paws');
expect(Clinic::create(['name' => 'Happy Paws'])->slug)->toBe('happy-paws-2');
});
it('announces a manual slug change', function () {
Event::fake([SlugChanged::class]);
$clinic = Clinic::create(['name' => 'Happy Paws']);
$clinic->update(['slug' => 'happy-paws-vienna']);
Event::assertDispatched(SlugChanged::class, fn (SlugChanged $event): bool =>
$event->current === 'happy-paws-vienna' && $event->reason === ChangeReason::Manual);
});
it('redirects a retired slug to the current one', function () {
// Product: ->regenerateOnUpdate()->keepHistory()->routeKey(); Route::get('/products/{product}', …)
$product = Product::create(['name' => 'Classic Chair']);
$product->update(['name' => 'Heritage Chair']);
$this->get('/products/classic-chair')->assertStatus(301)->assertRedirect('/products/heritage-chair');
});- Veľké factories, pri ktorých na slugu nezáleží, spúšťajte vnútri Slugs::withoutGeneration() — vynechá generovanie, eventy aj históriu.
- Testy histórie potrebujú publikované sluggable-migrations v adresári migrácií, aby RefreshDatabase vytvoril tabuľku slug_history.
- Slugs::generate($model) vám vráti hodnotu, ktorú by model dostal, bez toho, aby sa čokoľvek uložilo.
Regenerovanie vo fronte
Slugs::fake() neexistuje: generovanie je deterministické a beží nad vašou vlastnou databázou, preto overujte uložené riadky. Pri queueRegeneration() použite Bus::fake() z Laravelu a overte odoslanie RegenerateSlugsJob:
use Illuminate\Support\Facades\Bus;
use RoundlyConsulting\Sluggable\Enums\RegenerationMode;
use RoundlyConsulting\Sluggable\Facades\Slugs;
use RoundlyConsulting\Sluggable\Jobs\RegenerateSlugsJob;
it('queues a full regeneration', function () {
Product::create(['name' => 'Classic Chair']);
Bus::fake();
Slugs::model(Product::class)->queueRegeneration(mode: RegenerationMode::All);
Bus::assertDispatched(RegenerateSlugsJob::class);
});Vlastná testovacia sada balíka
composer test # Pest
composer test-coverage # Pest with a 90 % coverage floor
composer analyse # Larastan level 7Pest sada beží na SQLite, PostgreSQL aj MySQL vrátane reálnych súbežných zápisov a testov presmerovaní na úrovni HTTP.
Statická analýza
Balík obsahuje rozšírenie pre PHPStan (extension.neon, automaticky zahrnuté cez phpstan/extension-installer), vďaka ktorému Larastan pozná $table->slug(), $table->localizedSlug(), $table->uniqueSlug(), Rule::uniqueSlug() a Rule::validSlug().
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 kryptomienOdoslaní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.