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

Zámerne bez fake

Fasáda Translatable nemá fake(). Nič na nej nezapisuje do databázy, nezaraďuje do fronty, neposiela e-maily, nevysiela udalosti ani nevolá von, takže fake by nemal čo zaznamenať. Správanie v teste zafixujete konfiguráciou — alebo vymeňte manager za podtriedu, ktorá prepíše jednu metódu; zohľadnia ju volania fasády aj každý model (pozrite DI a akcie):

use RoundlyConsulting\Translatable\Enums\FallbackMode;
use RoundlyConsulting\Translatable\Facades\Translatable;
use RoundlyConsulting\Translatable\Support\TranslationManager;

config()->set('translatable.locales', ['en', 'de']);        // the locale set
config()->set('translatable.fallback', FallbackMode::None); // the fallback chain

// or override one method — facade calls and every model observe the subclass:
Translatable::swap(new class extends TranslationManager {
    public function supported(): array { return ['en', 'de']; }
});

Testovanie vašich modelov

Preklady sú v bežnom stĺpci, takže testy pracujú so skutočnými modelmi: v každom teste nastavte jazyk aplikácie a konfiguráciu, potom asertujte cez verejné API. Príklady predpokladajú predvolené jazyky en/sk a model Topic s fillable atribútom name; test udalostí potrebuje aj DispatchesTranslationEvents:

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Translatable\Enums\FallbackMode;
use RoundlyConsulting\Translatable\Events\TranslationsChanged;

it('falls back to English for an untranslated locale', function () {
    app()->setLocale('sk');

    $topic = new Topic(['name' => ['en' => 'Investing']]);

    expect($topic->name)->toBe('Investing')
        ->and($topic->translatedOrNull('name'))->toBeNull()
        ->and($topic->missingLocales('name'))->toBe(['sk']);
});

it('renders nothing for a missing locale in None mode', function () {
    config()->set('translatable.fallback', FallbackMode::None);
    app()->setLocale('sk');

    $topic = new Topic(['name' => ['en' => 'Investing']]);

    expect($topic->name)->toBeNull();
});

it('dispatches TranslationsChanged on create', function () {
    Event::fake([TranslationsChanged::class]);

    $topic = Topic::create(['name' => ['en' => 'Investing']]);

    Event::assertDispatched(TranslationsChanged::class, fn (TranslationsChanged $event): bool =>
        $event->model->is($topic) && $event->changedAttributes === ['name']);
});

it('shows the missing-locales badge', function () {
    $topic = new Topic(['name' => ['en' => 'Investing']]);

    $html = Blade::render('<x-translatable-status :model="$model" />', ['model' => $topic]);

    expect($html)->toContain('translatable-status--incomplete');
});

Vlastná sada testov balíka

Sada predvolene beží na SQLite. Na skutočnú databázu ju nasmerujete štandardnými premennými TESTING_DB_* — rozhodujúca je TESTING_DB_DRIVER:

composer test

TESTING_DB_DRIVER=pgsql TESTING_DB_HOST=127.0.0.1 TESTING_DB_PORT=5432 \
  TESTING_DB_DATABASE=testing TESTING_DB_USERNAME=testing TESTING_DB_PASSWORD=secret \
  vendor/bin/pest

CI spúšťa všetky tri databázy: SQLite odhalí LIKE bez klauzuly ESCAPE, PostgreSQL pokrýva vetvu ilike a skutočné stĺpce jsonb (vrátane slugov zo sluggable nad nimi) a MySQL overí vetvu like na reálnom serveri. Testy len pre PostgreSQL sa pri nedostupnej databáze viditeľne preskočia, takže beh bez jedinej asercie nemôže skončiť zeleno.

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.