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

Teams::fake() vloží RoundlyConsulting\Teams\Testing\TeamsFake — zaznamenávajúcu podtriedu TeamsManager — za fasádu aj za väzbu TeamsManager v kontajneri a vráti ju. Operácie sa naďalej vykonajú v testovacej databáze; fake každú zaznamená, takže môžete overiť, o čo váš kód požiadal:

use RoundlyConsulting\Teams\DataTransferObjects\CreateTeamData;
use RoundlyConsulting\Teams\Facades\Teams;

it('creates a team and adds an admin', function () {
    $fake = Teams::fake();   // TeamsFake — also swapped in for an injected TeamsManager
    $owner = User::factory()->create();
    $alice = User::factory()->create();
    $bob = User::factory()->create();

    $team = Teams::create(new CreateTeamData(name: 'Acme', owner: $owner));
    Teams::for($team)->members()->add($alice, 'admin');
    $team->addMember($bob, 'member');   // a model method — recorded too

    $fake->assertTeamCreated('Acme');
    Teams::assertMemberAdded($team, $alice, 'admin');   // the facade forwards to the fake
    Teams::assertMemberAdded($team, $bob);
    Teams::assertNothingRemoved();

    expect($alice)->toBeMemberOf($team);   // the operation really ran
});

Každá zmena stavu prechádza jednou metódou managera, takže fake vidí volania cez fasádu, injektovaný TeamsManager, všetky handly, metódy modelov ($team->addMember(), $invite->revoke(), $membership->removeFromTeam()), Artisan príkazy aj listener schvaľovania. Asercie voláte na vrátenom fake objekte alebo cez fasádu.

  • Zaznamená sa len operácia, ktorú ste zavolali, nie to, čo robí vnútri — prijatie pozvánky sa zapíše ako prijatie, nie ako pridanie člena, ktoré v ňom prebehne.
  • Odmietnuté volanie (pozvánka iného tímu, nečlen) vyhodí výnimku ešte pred vykonaním a nezaznamená sa.
  • Registrácia globálnych rolí a oprávnení je konfigurácia pri štarte a nezaznamenáva sa; Teams::members()->expiring() je len čítanie, takže tiež nie.
  • Priame volanie akcie obíde manager, preto ho fake nevidí.

Všetky asercie

OperáciaAserciaNegatívna asercia
create()assertTeamCreated(?name)assertNothingCreated()
transferOwnershipTo()assertOwnershipTransferred($team, ?to)assertNothingTransferred()
members()->add()assertMemberAdded($team, $member, ?role), assertMemberNotAdded($team, $member)assertNothingAdded()
members()->remove()assertMemberRemoved($team, $member)assertNothingRemoved()
members()->changeRole()assertRoleChanged($team, $member, ?role)assertNoRoleChanged()
invites()->create()assertInviteCreated($team, ?email)assertNothingInvited()
invites()->resend()assertInviteResent($invite)assertNothingResent()
invites()->revoke()assertInviteRevoked($invite)assertNothingRevoked()
invites()->accept()assertInviteAccepted(?invite, ?by)assertNothingAccepted()
joinRequests()->open()assertJoinRequested($team, ?requester)assertNothingRequested()
joinRequests()->approve()assertJoinRequestApproved($request, ?by)assertNothingApproved()
joinRequests()->deny()assertJoinRequestDenied($request, ?by)assertNothingDenied()
roles()->define()assertRoleDefined($team, ?key)assertNothingDefined()
members()->notifyExpiring()assertExpiringMembersNotified()assertNothingNotified()
invites()->prune(), members()->prune(), joinRequests()->expire()assertInvitesPruned(), assertMembersPruned(), assertJoinRequestsExpired()assertNothingPruned()
čokoľvekrecorded(?TeamOperation)assertNothingRecorded()
use RoundlyConsulting\Teams\Enums\TeamOperation;
use RoundlyConsulting\Teams\Facades\Teams;

// Teams
Teams::assertTeamCreated('Acme');                    // name optional
Teams::assertOwnershipTransferred($team, to: $alice);
Teams::assertNothingCreated();
Teams::assertNothingTransferred();

// Members
Teams::assertMemberAdded($team, $alice, 'admin');    // role optional
Teams::assertMemberNotAdded($team, $carol);
Teams::assertMemberRemoved($team, $bob);
Teams::assertRoleChanged($team, $alice, 'editor');   // role optional
Teams::assertExpiringMembersNotified();
Teams::assertNothingAdded();
Teams::assertNothingRemoved();
Teams::assertNoRoleChanged();
Teams::assertNothingNotified();

// Invites
Teams::assertInviteCreated($team, '[email protected]'); // email optional
Teams::assertInviteResent($invite);
Teams::assertInviteRevoked($invite);
Teams::assertInviteAccepted($invite, by: $user);     // both optional
Teams::assertNothingInvited();
Teams::assertNothingResent();
Teams::assertNothingRevoked();
Teams::assertNothingAccepted();

// Join requests and per-team roles
Teams::assertJoinRequested($team, $user);            // requester optional
Teams::assertJoinRequestApproved($request, by: $admin);
Teams::assertJoinRequestDenied($request, by: $admin);
Teams::assertRoleDefined($team, 'editor');           // key optional
Teams::assertNothingRequested();
Teams::assertNothingApproved();
Teams::assertNothingDenied();
Teams::assertNothingDefined();

// Housekeeping
Teams::assertInvitesPruned();
Teams::assertMembersPruned();
Teams::assertJoinRequestsExpired();
Teams::assertNothingPruned();

// Anything
Teams::recorded();                                   // list<RecordedTeamOperation>
Teams::recorded(TeamOperation::AddMember);           // only one operation
Teams::assertNothingRecorded();

Zaznamenané operácie

recorded() vracia objekty RecordedTeamOperation — operáciu, kontext volania a jeho výsledok — s pomocníkmi na čítanie kontextu (kľúče ako team, member, role, invite, email, requester, request, by a key):

use RoundlyConsulting\Teams\Enums\TeamOperation;

$op = Teams::recorded(TeamOperation::AddMember)[0];

$op->operation;                  // TeamOperation::AddMember
$op->result;                     // the Member the call returned
$op->model('member');            // ?Model from the call's context
$op->involves('team', $team);    // bool
$op->string('role');             // ?string — 'admin'

Pest matchery

Tri expectation matchery zaregistrujete v tests/Pest.php — zavolajte TeamExpectations::register() alebo pripojte súbor publikovaný cez teams-stubs:

// tests/Pest.php
use RoundlyConsulting\Teams\Testing\TeamExpectations;

TeamExpectations::register();

// or, after publishing teams-stubs:
require __DIR__.'/Teams.php';
expect($user)
    ->toBeMemberOf($team)
    ->withRole($team, 'admin')
    ->toHaveTeamPermission($team, 'posts.publish');

Factories

Každý model má factory so stavmi pre prípady životného cyklu:

use RoundlyConsulting\Teams\Models\Invite;
use RoundlyConsulting\Teams\Models\JoinRequest;
use RoundlyConsulting\Teams\Models\Member;
use RoundlyConsulting\Teams\Models\Team;

Team::factory()->create();
Member::factory()->expired()->create();
Member::factory()->expiringAt(now()->addDays(5))->create();
Invite::factory()->maxUses(5)->forEmail('[email protected]')->create();
Invite::factory()->expired()->create();
JoinRequest::factory()->expiringWithin(3)->create();
JoinRequest::factory()->expired()->create();

Factories členov a žiadostí vypĺňajú morph stĺpce zástupnými hodnotami — ak potrebujete skutočný model, zadajte member_type a member_id (alebo requester_type a requester_id).

Testy samotného balíka

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.