Testovanie
Connections::fake() nahradí manažéra zaznamenávajúcim fake — vo fasáde aj v kontajneri, takže sa zaznamenajú aj injektované inštancie ConnectionManager, prístup permissions() a každý zápis cez trait HasConnections. Operácie naďalej zapisujú do testovacej databázy (čítanie teda funguje) a zaznamenajú sa až po úspechu — sloveso, ktoré vyhodí výnimku, nezaznamená nič — podobne ako pri Bus::fake():
use RoundlyConsulting\Connections\Facades\Connections;
it('invites a member to a team', function () {
$user = User::factory()->create();
$team = Team::factory()->create();
$otherTeam = Team::factory()->create();
$fake = Connections::fake();
Connections::between($user, $team)->withPermissions('view')->invite();
$team->acceptConnectionFrom($user); // trait call — recorded too
Connections::between($user, $team)->permissions()->grant('publish');
$fake->assertInvited($user, $team);
$fake->assertAccepted($user, $team);
$fake->assertConnected($user, $team); // connect() or invite() recorded
$fake->assertConnectedTimes(1);
$fake->assertGranted($user, $team, 'publish');
$fake->assertHasPermissionThrough($user, $team, 'view');
$fake->assertNotConnected($user, $otherTeam);
$fake->assertNothingDisconnected();
// Pass-through: the rows were really written.
expect($user->hasPermissionThroughConnection($team, 'publish'))->toBeTrue();
});Všetky asercie
Každý zápis má pozitívnu aserciu a náprotivok assertNothing*:
| Operácia | Asercia | Negatívna asercia |
|---|---|---|
connect() / connectTo() / connectAll() (per target) | assertConnected($a, $b) · assertConnectedTimes($n) | assertNotConnected($a, $b) · assertNothingConnected() |
invite() / inviteConnection() | assertInvited($a, $b) | assertNothingInvited() |
accept() / acceptConnectionFrom() | assertAccepted($a, $b) | assertNothingAccepted() |
block() / blockConnectionFrom() | assertBlocked($a, $b) | assertNothingBlocked() |
disconnect() / disconnectFrom() / disconnectAll() | assertDisconnected($a, $b) | assertNothingDisconnected() |
reconnect() / restore() / reconnectTo() | assertReconnected($a, $b) | assertNothingReconnected() |
extend() | assertExtended($a, $b) | assertNothingExtended() |
permissions()->grant() / grantAll() / grantThroughConnection() | assertGranted($a, $b, ?$permission) | assertNothingGranted() |
permissions()->revoke() / revokeAll() / revokeThroughConnection() | assertRevoked($a, $b, ?$permission) | assertNothingRevoked() |
permissions()->sync() / clear() / syncConnectionPermissions() | assertPermissionsSynced($a, $b, ?$set) · assertPermissionsCleared($a, $b) | assertNothingPermissionsSynced() |
from()->sync() / syncConnections() | assertSynced($connector, ?$set) | assertNothingSynced() |
prune() / connections:prune | assertPruned() | assertNothingPruned() |
| čokoľvek | assertHasPermissionThrough($a, $b, $permission) | assertNothingRecorded() |
toggle() sa zaznamená ako connect() alebo disconnect(), ktoré vykoná. Akcie, ktoré získate a zavoláte priamo, obchádzajú manažéra — prebehnú normálne, ale nezaznamenajú sa. $fake->recorded() vráti surový zoznam objektov RecordedOperation:
$fake = Connections::fake();
Connections::from($user)->sync([$teamA, $teamB]);
Connections::between($user, $teamA)->extend(now()->addYear());
Connections::between($user, $teamA)->permissions()->sync('view', 'edit');
Connections::prune();
$fake->assertSynced($user, [$teamA, $teamB]); // the exact desired set
$fake->assertExtended($user, $teamA);
$fake->assertPermissionsSynced($user, $teamA, ['view', 'edit']);
$fake->assertPruned();
$fake->assertNothingRevoked();
$fake->recorded(); // list<RecordedOperation> — the raw logFactory
Model Connection má factory so stavmi pending(), blocked() a expired() — expired() nastaví expires_at na včerajšok. Doplňte morph kľúče skutočných modelov:
use RoundlyConsulting\Connections\Models\Connection;
$pair = [
'connector_type' => $user->getMorphClass(),
'connector_id' => $user->getKey(),
'connectable_type' => $team->getMorphClass(),
'connectable_id' => $team->getKey(),
];
Connection::factory()->pending()->create([...$pair, 'permissions' => ['view']]); // an open invitation
// Without a state: accepted, no permissions, no expiry.
// Other states: ->blocked() (grants nothing), ->expired() (expires_at a day ago).Asercie eventov
use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Connections\Events\ConnectionInvited;
use RoundlyConsulting\Connections\Facades\Connections;
it('dispatches an invitation event', function () {
Event::fake([ConnectionInvited::class]);
Connections::between($user, $team)->invite();
Event::assertDispatched(ConnectionInvited::class);
});Testy spúšťajte s publikovanou migráciou (napríklad cez RefreshDatabase). Ak test medzi dvoma kontrolami oprávnení upraví riadok prepojenia priamo, použite force: true alebo zavolajte Connections::flushCache() — cache v rámci requestu sleduje len zápisy cez balík.
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.