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

Advertisements::fake() nainštaluje RoundlyConsulting\Advertisements\Testing\AdvertisementsFake — podtyp AdvertisementManager — za fasádu aj do kontajnera, takže ho zasiahnu aj manažéry injektované cez konštruktor a metódy modelu ($ad->publish(), $ad->delete(), …). Vráti fake ako handle pre asserty:

use RoundlyConsulting\Advertisements\Facades\Advertisements;
use RoundlyConsulting\Advertisements\Models\Advertisement;
use RoundlyConsulting\Advertisements\Models\Placement;
use RoundlyConsulting\Advertisements\Testing\RecordedEvent;
use RoundlyConsulting\Advertisements\Testing\RecordedPlacements;

it('launches an ad in the sidebar and counts an impression', function () {
    $fake = Advertisements::fake();
    Placement::factory()->create(['slug' => 'sidebar']);
    $ad = Advertisement::factory()->create();

    Advertisements::for($ad)->placements()->attach(['sidebar']); // still runs: track() needs it
    $ad->publish();                                              // model sugar — recorded too
    Advertisements::for($ad)->track('sidebar')->impression();    // in memory only, returns null

    $fake->assertPlacementsAttached(fn (RecordedPlacements $c) => $c->includes('sidebar'));
    $fake->assertPublished($ad);
    $fake->assertImpressionRecorded(fn (RecordedEvent $e) => $e->ad->is($ad) && $e->placement === 'sidebar');
    $fake->assertNothingDeleted();
});

it('tracks nothing for a page without ads', function () {
    $fake = Advertisements::fake();

    // … render a page without placements …

    $fake->assertNothingRecorded();
});
  • Zmeny životného cyklu a umiestnení stále bežia nad databázou — čítanie aj udalosti sa správajú bežne — a zároveň sa zaznamenajú.
  • Meranie sa zaznamená len v pamäti — žiadny riadok, počítadlo ani job — a vráti null. Kontrola živej reklamy aj umiestnenia v track() stále platí, preto reklamu pred meraním zverejnite a umiestnenie priraďte.
  • Opakované volanie fake() vráti už nainštalovaný fake.
  • Fake nahrádza manažéra, nie akcie — trieda akcie, ktorú si vyžiadate priamo (RecordImpression), riadky stále zapisuje.

Všetky asserty

ZaznamenávaAssertNegatívny assert
createassertCreated(…)assertNothingCreated()
updateassertUpdated(…)assertNothingUpdated()
publish / $ad->publish()assertPublished(…)assertNothingPublished()
unpublish / $ad->unpublish()assertUnpublished(…)assertNothingUnpublished()
expire / $ad->expire()assertExpired(…)assertNothingExpired()
archive / $ad->archive()assertArchived(…)assertNothingArchived()
delete / $ad->delete()assertDeleted(…)assertNothingDeleted()
for($ad)->placements()->attach()assertPlacementsAttached(…)assertNothingAttached()
for($ad)->placements()->detach()assertPlacementsDetached(…)assertNothingDetached()
for($ad)->placements()->sync()assertPlacementsSynced(…)assertNothingSynced()
for($ad)->track()->impression()assertImpressionRecorded(…)assertNothingRecorded()
for($ad)->track()->click()assertClickRecorded(…)assertNothingRecorded()

Každý assert prijíma Advertisement, Closure alebo nič. Closure pri životnom cykle dostane Advertisement, pri umiestneniach RecordedPlacements (ad, umiestnenia tak, ako boli zadané, a includes($placement), ktoré porovnáva podľa modelu, id aj slugu) a pri meraní RecordedEvent (ad, type, zadané placement a data):

// Lifecycle — each takes an Advertisement, a Closure(Advertisement) or nothing
$fake->assertCreated(fn (Advertisement $ad) => $ad->name === 'Vintage road bike');
$fake->assertUpdated($ad);
$fake->assertPublished($ad);
$fake->assertUnpublished($ad);
$fake->assertExpired($ad);
$fake->assertArchived($ad);
$fake->assertDeleted($ad);
$fake->assertNothingCreated();      // … and assertNothingUpdated / Published / Unpublished /
$fake->assertNothingArchived();     //     Expired / Archived / Deleted

// Placements — an Advertisement, a Closure(RecordedPlacements) or nothing
$fake->assertPlacementsAttached(fn (RecordedPlacements $c) => $c->includes('sidebar'));
$fake->assertPlacementsDetached($ad);
$fake->assertPlacementsSynced($ad);
$fake->assertNothingAttached();
$fake->assertNothingDetached();
$fake->assertNothingSynced();

// Tracking — an Advertisement, a Closure(RecordedEvent) or nothing
$fake->assertImpressionRecorded(fn (RecordedEvent $e) => $e->placement === 'sidebar');
$fake->assertClickRecorded($ad);
$fake->assertNothingRecorded();     // no impression and no click

Továrne

Na testovanie a seedovanie sú pripravené továrne. Továreň reklám má stavy published(), scheduled(), expired() a archived(), továreň udalostí stavy impression() a click():

use RoundlyConsulting\Advertisements\Models\Advertisement;
use RoundlyConsulting\Advertisements\Models\AdvertisementEvent;
use RoundlyConsulting\Advertisements\Models\Category;
use RoundlyConsulting\Advertisements\Models\Placement;

Advertisement::factory()->create();              // a draft with a random EUR price
Advertisement::factory()->published()->create();
Advertisement::factory()->scheduled()->create();
Advertisement::factory()->expired()->create();
Advertisement::factory()->archived()->create();

Placement::factory()->create(['slug' => 'sidebar', 'width' => 300, 'height' => 250]);
Category::factory()->create(['slug' => 'vehicles', 'name' => ['en' => 'Vehicles']]);

AdvertisementEvent::factory()->impression()->create(['advertisement_id' => $ad->id]);
AdvertisementEvent::factory()->click()->create(['advertisement_id' => $ad->id]);

Riadky z továrne udalostí nezvyšujú počítadlá reklamy — ak test potrebuje impressions_count alebo clicks_count, merajte cez Advertisements::for($ad)->track() bez fake.

Simulácia geolokácie

Falošnú implementáciu geolocation-for-laravel naplňte pripravenými polohami — bez HTTP a bez poskytovateľa:

use RoundlyConsulting\Advertisements\DataTransferObjects\ImpressionData;
use RoundlyConsulting\Advertisements\Facades\Advertisements;
use RoundlyConsulting\Advertisements\Models\Advertisement;
use RoundlyConsulting\Geolocation\DataTransferObjects\Location;
use RoundlyConsulting\Geolocation\Enum\GeolocationType;
use RoundlyConsulting\Geolocation\Facades\Geolocation;

it('reports impressions per country', function () {
    Geolocation::fake([
        '203.0.113.7' => new Location(
            humanReadable: 'Bratislava SK',
            street: '',
            city: 'Bratislava',
            countryIsoCode: 'SK',
            latitude: 48.1486,
            longitude: 17.1077,
            type: GeolocationType::Ip,
        ),
    ]);

    $ad = Advertisement::factory()->published()->create();

    Advertisements::for($ad)->track()->impression(new ImpressionData(ip: '203.0.113.7'));

    expect($ad->impressionsByCountry())->toBe(['SK' => 1]);
});

Udalosti životného cyklu

use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Advertisements\Events\AdvertisementPublished;
use RoundlyConsulting\Advertisements\Facades\Advertisements;
use RoundlyConsulting\Advertisements\Models\Advertisement;

it('announces a publish', function () {
    Event::fake([AdvertisementPublished::class]);

    $ad = Advertisement::factory()->create();
    Advertisements::publish($ad);

    Event::assertDispatched(AdvertisementPublished::class, fn ($e) => $e->advertisement->is($ad));
    expect($ad->isPublished())->toBeTrue();
});

V testovacej databáze spúšťajte publikované migrácie (RefreshDatabase) — vždy, keď test vykresľuje reklamu, aj migrácie media-library, a pri testovaní kreatív aj Storage::fake() s UploadedFile::fake()->image().

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.