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

Forms::fake() nahradí manažéra triedou FormsFake — zaznamenávajúcim podtypom FormsManager, takže platí aj pre injektovaných manažérov — a vráti ju ako váš handle. Operácie stále bežia nad databázou: očakávané riadky naozaj vzniknú, udalosti sa spustia a schvaľovanie stále otvorí svoju žiadosť. Fake navrch zaznamená každé volanie — cez fasádu, injektovaného manažéra, buildery, Forms::submission(), trait HasForms aj forms:sync:

use RoundlyConsulting\Approvals\Models\ApprovalRequest;
use RoundlyConsulting\Forms\Facades\Forms;
use RoundlyConsulting\Forms\Models\FormSubmission;

$fake = Forms::fake();

// ... exercise your application code that submits the form ...

$fake->assertSubmitted($form);
$fake->assertSubmitted($form, fn ($result, $form) => $result->fieldCount === 3);
$fake->assertSubmittedCount(1);
$fake->assertNotSubmitted($otherForm);
$fake->assertReviewOpened(fn (ApprovalRequest $request, FormSubmission $submission) => $request->quorum === 2);

Všetky aserty

ZaznamenávaAsertyAserty „nič“
submit(), $user->submitTo()assertSubmitted(?Form, ?callable), assertSubmittedCount(int), assertNotSubmitted(?Form)assertNothingSubmitted()
draft(), $user->draftTo()assertDrafted(?Form, ?callable)assertNothingDrafted()
finalize(), submission()->finalize()assertFinalized(?string $uuid)assertNothingFinalized()
define()assertFormDefined(string $key)assertNoFormDefined()
create(), define()->create()assertFormCreated(?callable)assertNoFormCreated()
update()->save()assertFormUpdated(string $key)assertNoFormUpdated()
createSubmission()assertSubmissionCreated(?callable)assertNoSubmissionCreated()
sync(), forms:syncassertSynced()assertNothingSynced()
review()->…->open()assertReviewOpened(?callable)assertNothingReviewed()
use RoundlyConsulting\Approvals\Models\ApprovalRequest;
use RoundlyConsulting\Forms\DataTransferObjects\SubmissionResult;
use RoundlyConsulting\Forms\Models\Form;
use RoundlyConsulting\Forms\Models\FormSubmission;
use RoundlyConsulting\Forms\Models\Submission;

// submit(), $user->submitTo()
$fake->assertSubmitted($form, fn (SubmissionResult $result, Form $form) => $result->fieldCount === 3);
$fake->assertSubmittedCount(1);
$fake->assertNotSubmitted($otherForm);
$fake->assertNothingSubmitted();

// draft(), $user->draftTo()
$fake->assertDrafted($form, fn (SubmissionResult $result, Form $form) => $result->fieldCount > 0);
$fake->assertNothingDrafted();

// finalize(), Forms::submission($uuid)->finalize()
$fake->assertFinalized($draft->uuid);
$fake->assertNothingFinalized();

// define(), create(), update()->save()
$fake->assertFormDefined('contact');
$fake->assertNoFormDefined();
$fake->assertFormCreated(fn (Form $form) => $form->key === 'contact');
$fake->assertNoFormCreated();
$fake->assertFormUpdated('contact');     // only once save() has run
$fake->assertNoFormUpdated();

// createSubmission()
$fake->assertSubmissionCreated(fn (Submission $row) => $row->uuid === $uuid);
$fake->assertNoSubmissionCreated();

// sync(), php artisan forms:sync
$fake->assertSynced();
$fake->assertNothingSynced();

// review()->…->open()
$fake->assertReviewOpened(fn (ApprovalRequest $request, FormSubmission $submission) => $request->quorum === 2);
$fake->assertNothingReviewed();
  • assertSubmitted() a assertDrafted() porovnávajú podľa kľúča formulára; ich callbacky dostanú SubmissionResult a Form a pre jedno zaznamenané volanie musia vrátiť true.
  • assertFormCreated() vidí formuláre uložené cez Forms::create() a define()->create(); formuláre vytvorené v rámci sync() splnia len assertSynced().
  • assertFormDefined($key) prejde, ak bežalo define($key, …) alebo vznikol formulár s týmto kľúčom.
  • Úprava sa zaznamená až pri save() — samotné Forms::update($key) nezaznamená nič, takže assertFormUpdated() prejde až po save().
  • Callbacky assertReviewOpened() dostanú ApprovalRequest a FormSubmission.

Testovacie pomocníky

Trait InteractsWithForms pridáva fakeForms(), submitForm($form, $values, $sender) a draftForm(...). Hodnoty sú vnorené podľa skupín alebo ploché podľa group_key.field_key (v jednej skupine jeden štýl) — kľúč formulára doplní pomocník za vás:

uses(RoundlyConsulting\Forms\Testing\InteractsWithForms::class);

$fake = $this->fakeForms();
$this->submitForm($form, ['details' => ['name' => 'Ann']]);
$this->submitForm($form, ['details.name' => 'Ann']);   // the same submission, flat
$fake->assertSubmitted($form);

Pest matchery

Matchery pre expect() zapnete v tests/Pest.php:

RoundlyConsulting\Forms\Testing\FormExpectations::register();

expect($form)->toBeAcceptingSubmissions();
expect($expiredForm)->toBeExpired();

Úplný príklad

use RoundlyConsulting\Forms\Facades\Forms;
use RoundlyConsulting\Forms\GroupBuilder;

it('stores a contact submission', function () {
    $fake = Forms::fake();

    $form = Forms::define('contact', 'Contact us')
        ->public()
        ->group('details', 'Details', function (GroupBuilder $g): void {
            $g->field('name', 'Name')->required();
        })
        ->create();

    $this->post('/contact', ['contact' => ['details' => ['name' => 'Ann']]])
        ->assertRedirect();

    $fake->assertSubmitted($form, fn ($result) => $result->fieldCount === 1);
    expect(Forms::submissions($form)->first()->value('name'))->toBe('Ann');
});

Factories

Každý model má factory so stavmi pre bežné prípady:

use RoundlyConsulting\Forms\Models\Form;
use RoundlyConsulting\Forms\Models\FormSubmission;
use RoundlyConsulting\Forms\Models\Submission;

Form::factory()->public()->create();
Form::factory()->withExpiration()->create();

Submission::factory()->draft()->create();
FormSubmission::factory()->pending()->create();

Testy spúšťajte s načítanými migráciami formulárov (aj závislých balíkov), napríklad cez RefreshDatabase. Vlastné testy balíka spustíte takto:

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.