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

Fake cez Messages::fake()

Messages::fake() podstrčí zaznamenávajúci fake a vráti ho — ten potom slúži na overovanie:

use RoundlyConsulting\Messages\Facades\Messages;

$fake = Messages::fake();

$alice->sendMessageTo($thread, 'Hi');                          // model traits are recorded too
Messages::thread($thread)->rename('Launch', by: $alice);

$fake->assertSent('Hi', to: $thread);
$fake->assertThreadRenamed($thread, to: 'Launch');
$fake->assertNothingDeleted();

Fake je podtyp MessagesManager, takže ho dostanú aj managery vložené cez konštruktor. Každú operáciu naďalej skutočne vykoná — riadky sa zapíšu, udalosti sa spustia — a zaznamená každú úspešnú, nech prišla akoukoľvek cestou: cez fasádu, vložený manager, buildery, handly, trait HasMessaging, Thread::markReadFor() a typing(), Participant::markAsRead() či pomocníkov z InteractsWithMessaging. Prácu, ktorú akcia robí sama za seba — účastníkov, ktorých pridá start(), či systémové správy — samostatne nezaznamenáva a akcie volané priamo fake obchádzajú.

Všetky overenia

Ku každému overeniu patrí aj negatívne assertNothing…. Voliteľné argumenty zužujú zhodu; modely sa porovnávajú cez Model::is():

use RoundlyConsulting\Messages\Enums\ParticipantRole;

$fake->assertThreadCreated('Launch');              // start()->create(), or a direct() that created one
$fake->assertNothingCreated();

$fake->assertSent('Hi', to: $thread);              // both arguments optional
$fake->assertSentCount(2);
$fake->assertNothingSent();

$fake->assertThreadRenamed($thread, to: 'Launch crew');
$fake->assertNothingRenamed();

$fake->assertThreadArchived($thread);
$fake->assertNothingArchived();

$fake->assertMarkedRead($thread, by: $bob);
$fake->assertNothingMarkedRead();

$fake->assertTyping($thread, $bob);
$fake->assertNothingTyping();

$fake->assertParticipantAdded($thread, $carol);    // new rows only, not a re-add
$fake->assertNothingAdded();

$fake->assertParticipantRemoved($thread, $carol);  // remove() or leave()
$fake->assertNothingRemoved();

$fake->assertRoleChanged($thread, $carol, ParticipantRole::Admin);
$fake->assertNothingRoleChanged();

$fake->assertOwnershipTransferred($thread, to: $bob);
$fake->assertNothingTransferred();

$fake->assertEdited($message, 'fixed typo');
$fake->assertNothingEdited();

$fake->assertDeleted($message);
$fake->assertNothingDeleted();

$fake->assertPruned(days: 30);
$fake->assertNothingPruned();

assertThreadCreated() zaráta aj direct(), ktoré muselo vlákno vytvoriť, a assertParticipantAdded() len nové záznamy, nikdy opätovné pridanie. Na vlastné kontroly vráti recorded() všetky zaznamenané MessagingCall, voliteľne podľa operácie:

use RoundlyConsulting\Messages\Enums\MessagingOperation;

$sends = $fake->recorded(MessagingOperation::Send);   // list<MessagingCall>, in call order

$sends[0]->thread;   // the Thread
$sends[0]->text;     // the body
$sends[0]->result;   // the Message the call returned

Stavy factories

use RoundlyConsulting\Messages\Enums\ParticipantRole;
use RoundlyConsulting\Messages\Models\Message;
use RoundlyConsulting\Messages\Models\Participant;
use RoundlyConsulting\Messages\Models\Thread;

$thread = Thread::factory()->public()->create();   // also ->private(), ->direct(), ->open()

Message::factory()->inThread($thread)->system()->create();

Participant::factory()->inThread($thread)->owner()->read()->create();
Participant::factory()->inThread($thread)->role(ParticipantRole::Admin)->unread()->create();

Factory účastníka predvolene nastaví participant_type na user s náhodným id — pre skutočný model odovzdajte participant_type a participant_id. read() nastaví záznam tak, ako ho necháva Messages::markRead(): ukazovateľ na najnovšej správe vlákna a vyplnené read_at; unread() vynuluje oboje.

Pomocníci a Pest expectations

Pre testy vašej aplikácie pridá trait InteractsWithMessaging fluentných pomocníkov — všetci idú cez manager, takže ich fake zaznamená — a MessageExpectations zaregistruje Pest expectations:

// tests/Pest.php
RoundlyConsulting\Messages\Testing\MessageExpectations::register();

// in a test
uses(RoundlyConsulting\Messages\Testing\InteractsWithMessaging::class);

$thread = $this->startConversation($alice, $bob);
$this->actingAsParticipant($alice)->sendMessageAs($thread, 'Hi');

expect($thread)
    ->toHaveSentMessage('Hi')
    ->toHaveParticipant($bob)
    ->toHaveUnread($bob)
    ->toHaveRole($alice, ParticipantRole::Owner);

expect($reply)->toBeReplyTo($original);
  • actingAsParticipant($model) — zapamätá si vykonávateľa (actor) pre sendMessageAs() a markReadAs().
  • startConversation(...$models) — skupinové vlákno, prvý model je vlastník.
  • directThread($a, $b) — nájde alebo vytvorí priamu konverzáciu.
  • sendMessageAs($thread, $body, ?$actor) a markReadAs($thread, ?$actor) — vyhodia výnimku, ak vykonávateľ nie je nastavený ani odovzdaný.
  • toHaveSentMessage(?$body), toHaveParticipant(), toHaveUnread(), toHaveRole() na Thread; toBeReplyTo() na Message.

Kompletný test

use RoundlyConsulting\Messages\Testing\InteractsWithMessaging;

uses(InteractsWithMessaging::class);

it('tracks unread state in a direct thread', function () {
    $alice = User::factory()->create();
    $bob = User::factory()->create();

    $thread = $this->directThread($alice, $bob);
    $this->actingAsParticipant($alice)->sendMessageAs($thread, 'Hi Bob');

    expect($thread)
        ->toHaveSentMessage('Hi Bob')
        ->toHaveUnread($bob);

    $this->markReadAs($thread, $bob);

    expect($bob->unreadCount())->toBe(0);
});

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.