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

Appointments::fake() podstrčí zaznamenávajúci AppointmentsFake — za fasádu aj do kontajnera, takže fake dostane aj injektovaný AppointmentManager — a vráti ho. Operácie naďalej bežia nad databázou: kontroly dostupnosti, čítanie cez participants() aj eventy balíka fungujú ďalej. Zaznamená sa každý zápis, či prišiel cez fasádu, injektovaný manažér, builder, handle for() alebo skratku na modeli, napríklad $appointment->cancel():

use RoundlyConsulting\Appointments\Enums\Status;
use RoundlyConsulting\Appointments\Facades\Appointments;
use RoundlyConsulting\Appointments\Models\Appointment;

$fake = Appointments::fake();

$this->post('/bookings', [...]);

$fake->assertScheduled(fn (Appointment $appointment) => $appointment->name === 'Consultation');
$fake->assertTransitioned(fn (Appointment $appointment, Status $to, Status $from) => $to === Status::Cancelled);
$fake->assertRescheduled(fn (Appointment $appointment, $previousStartsAt) => true);
$fake->assertParticipantAdded(fn (Appointment $appointment, $participant, $row) => $participant->is($user));
$fake->assertParticipantRemoved(fn (Appointment $appointment, $participant) => $participant->is($user));

$fake->assertNothingScheduled();
$fake->assertNothingRescheduled();
$fake->assertNothingTransitioned();
$fake->assertNoParticipantAdded();
$fake->assertNoParticipantRemoved();

Všetky asercie

AserciaCallback dostaneZaznamená ju
assertScheduled(?Closure) · assertNothingScheduled()Appointmentcreate(), schedule()->create(), createRecurring() — jeden záznam na výskyt.
assertRescheduled(?Closure) · assertNothingRescheduled()Appointment, CarbonImmutable $previousStartsAtfor()->reschedule().
assertTransitioned(?Closure) · assertNothingTransitioned()Appointment, Status $to, Status $fromfor()->transition() a jej skratky, plus confirm(), cancel(), complete(), decline(), markNoShow() a transitionTo() na modeli.
assertParticipantAdded(?Closure) · assertNoParticipantAdded()Appointment, Model $participant, Participant $rowfor()->participants()->add().
assertParticipantRemoved(?Closure) · assertNoParticipantRemoved()Appointment, Model $participant — odobraný riadok sa zaznamená ako jeho modelfor()->participants()->remove().
  • Každý callback je voliteľný — bez neho asercia prejde, ak sa zaznamenalo čokoľvek daného druhu.
  • Každá asercia funguje aj staticky na fasáde, napríklad Appointments::assertScheduled().
  • Účastníci uvedení pri novom termíne patria k jeho naplánovaniu; ako pridaný sa ráta len participants()->add().
  • Požiadavka na stav, ktorý termín už má, nič neurobí, preto sa nezaznamená ako prechod.
  • Odmietnuté volanie — také, ktoré vyhodí výnimku — sa nezaznamená. Zmeny stavu zo synchronizačného listenera schvaľovania nie sú volaniami hostiteľskej aplikácie, takže sa nezaznamenajú tiež.
  • Priamo volané akcie fake obchádzajú.
Appointments::fake();

Appointments::for($appointment)->cancel();   // or $appointment->cancel() — recorded either way

Appointments::assertTransitioned(fn (Appointment $appointment, Status $to) => $to === Status::Cancelled);
Appointments::assertNothingScheduled();

Factory modelu

Model Appointment z balíka má factory — čakajúci termín so začiatkom zajtra a trvaním 60 minút — a stav withStatus():

use RoundlyConsulting\Appointments\Enums\Status;
use RoundlyConsulting\Appointments\Models\Appointment;

$appointment = Appointment::factory()->create();          // pending, starts tomorrow, 60 minutes

$confirmed = Appointment::factory()
    ->withStatus(Status::Confirmed)
    ->create(['starts_at' => now()->addWeek()]);

Ukážkové testy

Fakujte len eventy, ktoré overujete, a používajte ten istý builder a pomocné metódy ako vaša aplikácia:

use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Appointments\Enums\Status;
use RoundlyConsulting\Appointments\Events\AppointmentStatusChanged;
use RoundlyConsulting\Appointments\Exceptions\SchedulingConflictException;
use RoundlyConsulting\Appointments\Facades\Appointments;
use RoundlyConsulting\Appointments\Models\Appointment;

it('confirms a booking and announces it', function () {
    Event::fake([AppointmentStatusChanged::class]);

    $appointment = Appointment::factory()->create();
    Appointments::for($appointment)->confirm();

    expect($appointment->status)->toBe(Status::Confirmed);
    Event::assertDispatched(
        AppointmentStatusChanged::class,
        fn (AppointmentStatusChanged $e) => $e->from === Status::Pending && $e->to === Status::Confirmed,
    );
});

it('blocks a double booking', function () {
    $doctor = User::factory()->create();

    Appointments::schedule('First')->startingAt('2026-07-01 09:00')->lasting(60)
        ->withParticipant($doctor)->create();

    expect(fn () => Appointments::schedule('Clash')->startingAt('2026-07-01 09:30')->lasting(60)
        ->withParticipant($doctor)->preventConflicts()->create()
    )->toThrow(SchedulingConflictException::class);
});

Testy spúšťajte s načítanými publikovanými migráciami (RefreshDatabase) — tabuľkami termínov aj tabuľkami provider balíkov z Inštalácie.

Vlastná sada testov 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.