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

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áciaAserciaNegatí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:pruneassertPruned()assertNothingPruned()
čokoľvekassertHasPermissionThrough($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 log

Factory

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 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.