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

Credits::fake() nahradí manažéra záznamníkom, ktorý nezapisuje žiadny záznam do knihy pohybov ani nespúšťa udalosti, a vráti ho. Náhrada platí pre fasádu, každý injektovaný CreditsManager, metódy modelu z HasCredits aj credits:modify:

use RoundlyConsulting\Credits\Facades\Credits;

$fake = Credits::fake();

// ... run the code under test ...

$fake->assertAdded($user, 100, bucket: 'points');   // amount and bucket optional
$fake->assertDeducted($user, 30);                   // the positive amount, as passed to deduct()
$fake->assertSet($user, 0);                         // the requested target
$fake->assertNothingAdded();
$fake->assertNothingDeducted();
$fake->assertNothingSet();
$fake->assertNothingModified();                     // no add, deduct or set at all
  • assertAdded($owner, ?$amount, ?$bucket) / assertNothingAdded() — pripísania podľa vlastníka a voliteľne sumy a skupiny.
  • assertDeducted($owner, ?$amount, ?$bucket) / assertNothingDeducted() — odpisy podľa kladnej sumy, ako ju dostalo deduct().
  • assertSet($owner, ?$amount, ?$bucket) / assertNothingSet() — volania setTo() podľa požadovaného cieľa.
  • assertNothingModified() — žiadne pripísanie, odpis ani nastavenie.

Fake si vedie knihu pohybov v pamäti. Zostatky ju pripočítajú k skutočným záznamom vlastníka, takže pripísanie cez fake sa dá cez fake aj minúť. Ochrana pred prečerpaním platí ďalej: odpis, ktorý by skutočný manažér odmietol, vyhodí InsufficientCreditsException a nezaznamená sa. setTo() sa zaznamená, aj keď zostatok už sedí.

Proti skutočnej databáze

Keď test overuje samotnú knihu pohybov, testujte proti skutočnej databáze s RefreshDatabase — publikovaná migrácia prebehne ako každá iná. Zapisujte cez verejné API a cez neho aj overujte:

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Credits\Events\CreditsModified;
use RoundlyConsulting\Credits\Exceptions\InsufficientCreditsException;

uses(RefreshDatabase::class);

it('grants and spends credits', function () {
    $user = User::factory()->create();

    $user->modifyCredits(100, 'signup bonus');
    $user->modifyCredits(-30, 'purchase', ['order_id' => 42]);

    expect($user->creditsBalance())->toBe(70)
        ->and($user->hasCredits(50))->toBeTrue()
        ->and($user->credits()->count())->toBe(2);
});

it('refuses to overdraw and writes nothing', function () {
    $user = User::factory()->create();
    $user->modifyCredits(20);

    expect(fn () => $user->modifyCredits(-50))
        ->toThrow(InsufficientCreditsException::class);

    expect($user->creditsBalance())->toBe(20)
        ->and($user->credits()->count())->toBe(1);
});

it('announces every change', function () {
    Event::fake([CreditsModified::class]);

    $user = User::factory()->create();
    $user->modifyCredits(10, 'welcome');

    Event::assertDispatched(
        CreditsModified::class,
        fn (CreditsModified $event) => $event->balance === 10 && $event->creditable->is($user),
    );
});

Zostatky k dátumu

Historické zostatky určuje created_at, takže vám stačí cestovanie v čase z Laravelu:

it('reconstructs a past balance', function () {
    $user = User::factory()->create();

    $this->travelTo(now()->subWeek());
    $user->modifyCredits(100);
    $this->travelBack();

    $user->modifyCredits(-40);

    expect($user->creditsBalance(now()->subDays(3)))->toBe(100)
        ->and($user->creditsBalance())->toBe(60);
});

Factory

Credit obsahuje factory na priame vytvorenie záznamov. K vlastníkovi ho pripojíte cez vzťah creditable:

use RoundlyConsulting\Credits\Models\Credit;

// The factory picks a random amount (-1000..1000) unless you set one.
Credit::factory()->for($user, 'creditable')->create(['amount' => 250, 'bucket' => 'promotional']);

Záznamy z factory obchádzajú ochranu pred prečerpaním a nespúšťajú CreditsModified — ak test overuje práve toto, použite modifyCredits().

Databázové enginy

SQLite potichu prijme uuid v celočíselnom stĺpci. Ak ste zmenili key_type alebo primary_key_type, spúšťajte aspoň časť testov na engine, na ktorý nasadzujete.

Testy samotného balíka

Testy balíka spustíte z jeho repozitára:

composer test

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.