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

Testovanie

Git::fake() nahradí manažér zaznamenávajúcim GitFake — pre fasádu aj pre všetko, čo si injektovalo GitManager — a vráti ho. Každý driver, ktorý vydá, je ProviderFake, ktorý naplníte dátami, žiadne HTTP neopustí proces (Http::preventStrayRequests()) a zaznamená sa každé volanie, či už prešlo plochými metódami drivera, handlom repo() / pullRequest() / installations(), cez webhooks() alebo batch(). Naplňte, čo váš kód číta, spustite ho a overte:

use Illuminate\Support\Carbon;
use RoundlyConsulting\Git\Dto\Owner;
use RoundlyConsulting\Git\Dto\Repository;
use RoundlyConsulting\Git\Enums\ProviderName;
use RoundlyConsulting\Git\Facades\Git;

it('lists the connected repositories', function () {
    $fake = Git::fake();

    $fake->github()->seedRepositories([new Repository(
        provider: ProviderName::Github,
        id: '1',
        path: 'acme/api',
        name: 'api',
        description: null,
        defaultBranch: 'main',
        owner: new Owner(id: '1', name: 'acme', avatar: null),
        createdAt: Carbon::now(),
        lastActivityAt: Carbon::now(),
    )]);

    // run code that calls Git::github()->repositories() ...

    Git::assertSent(ProviderName::Github, 'repositories');
    Git::assertNotSent(ProviderName::Github, 'createRepository');
});

Asercie

Každá asercia pomenúva metódu drivera, na ktorú volanie dorazilo — handly volajú ploché metódy, takže ->pullRequest(12)->merge() sa zaznamená ako mergePullRequest — a callback v assertSent() / assertNotSent() dostane argumenty tejto metódy pozične. Po Git::fake() fungujú všetky staticky na fasáde aj na vrátenom fake:

// run code that calls Git::github()->repo('acme/app')->pullRequest(12)->merge() ...

Git::assertSent(ProviderName::Github, 'mergePullRequest');
Git::assertSent(ProviderName::Github, 'mergePullRequest', fn (string $path, int $number) => $number === 12);
Git::assertSentTimes(ProviderName::Github, 'approvePullRequest', 1);
Git::assertNotSent(ProviderName::Github, 'closePullRequest');
Git::assertNotSent(ProviderName::Github, 'mergePullRequest', fn (string $path) => $path === 'acme/billing');
Git::assertNothingSent(ProviderName::Gitlab);   // nothing reached GitLab
Git::assertNothingSent();                       // nothing reached any provider
Git::assertBatched(ProviderName::Github, 'languages');
Git::assertNotBatched(ProviderName::Github, 'repositories');
Git::assertRepositoryCreated('new-repo');
Git::assertRepositoryCreated('new-repo', owner: 'acme', template: 'acme/package-template');
Git::assertNoRepositoryCreated();
MetódaPrejde, keď
assertSent(provider, method, ?callback)Metóda drivera bola zavolaná — a s callbackom mu vyhovujú argumenty aspoň jedného volania (odovzdané pozične).
assertSentTimes(provider, method, times)Metóda drivera bola zavolaná presne toľkokrát.
assertNotSent(provider, method, ?callback)Žiadne (callbacku vyhovujúce) volanie neprebehlo.
assertNothingSent(?provider)Neprebehlo žiadne volanie — alebo žiadne na daného providera.
assertBatched(provider, method) / assertNotBatched(…)Dávka batch()->{method}() prebehla / neprebehla.
assertRepositoryCreated(name, ?owner, ?template)Volanie createRepository() zodpovedá názvu — a ak sú zadané, aj vlastníkovi a šablóne.
assertNoRepositoryCreated()Neprebehlo žiadne volanie createRepository().
recorded(provider, ?method)Vráti zoznam RecordedCall (method, arguments) od najstaršieho.
fakeFor(provider)Vráti jediný ProviderFake daného providera na naplnenie dátami.

Zaznamenané volania

$calls = Git::recorded(ProviderName::Github, 'mergePullRequest'); // list<RecordedCall>

$calls[0]->method;     // "mergePullRequest"
$calls[0]->arguments;  // ['acme/app', 12, MergeMethod::Merge, null, null, null]

Git::recorded(ProviderName::Github);                  // every GitHub call, oldest first
Git::fakeFor(ProviderName::Gitlab)->seedRepositories([$repositoryDto]);

Injektované manažéry

Keďže GitFake dedí z GitManager, fake dostane aj trieda, ktorá si manažér injektuje cez konštruktor — nič netreba prebindovať:

use RoundlyConsulting\Git\Facades\Git;

it('merges the release pull request', function () {
    Git::fake()->github()->seedMergeCommit('abc123');

    $sha = app(ShipRelease::class)('acme/app', 12);   // constructor-injects GitManager

    expect($sha)->toBe('abc123');
    Git::assertSent(ProviderName::Github, 'mergePullRequest', fn (string $path, int $number) => $number === 12);
});

Správanie bez seedu

Dvojník pokrýva celý kontrakt Provider — každé čítanie, zápis, vyhľadanie inštalácie aj dopyt na commity — takže hostiteľská aplikácia pri raste nikdy nenarazí na nedefinovanú metódu. Jeho správanie určujú tri pravidlá:

Druh volaniaSprávanie bez seedu
Zoznamové čítania (pullRequests, issues, tags, releases, contributors, branches, languages)Prázdna stránka — skutočná odpoveď providera.
Čítania jedného zdroja (repository, commit, contents, issue, release, installation)Vyhodí RuntimeException s názvom seedera, ktorý treba zavolať.
Zápisy (createPullRequest, comment, mergePullRequest, …)Výsledok sa zostaví zo vstupu — nikdy nevyhodí výnimku.

Každý fake driver podporuje presne to, čo jeho skutočný driver: supports(), capabilities() aj featureMatrix() odpovedajú rovnako a operácia, ktorú platforma nemá, vyhodí rovnakú FeatureNotSupportedException ešte pred zaznamenaním — fake Bitbucket odmietne ->pullRequest(1)->merge() rovnako ako Bitbucket, takže test nemôže prejsť pri toku, ktorý by produkcia odmietla.

Seedery

Všetky sú reťaziteľné: seedRepositories, seedRepository, seedCreatedRepository, seedCommits, seedCommit, seedBranches, seedPullRequests, seedPullRequest, seedIssues, seedIssue, seedTags, seedReleases, seedRelease, seedContents, seedComparison, seedContributors, seedLanguages, seedSearchResults, seedComment, seedMergeCommit, seedApprovalState, seedSubmittedReview, seedPullRequestReviews, seedUser, seedInstallation, seedInstallations, seedWebhooks, seedCreatedWebhook, seedBatch.

use RoundlyConsulting\Git\Batch\BatchResult;

$fake->github()
    ->seedPullRequest($pullRequestDto)
    ->seedMergeCommit('abc123');

// ->pullRequest(n)->close() returns the seeded PR with state Closed; ->merge() returns 'abc123'

$fake->fakeFor(ProviderName::Gitlab)->seedRepositories([$repositoryDto]);

$fake->github()->seedBatch('languages', new BatchResult(['acme/api' => ['PHP' => 100]], []));
  • review() nepotrebuje seed: vráti stav, ktorý udalosť skutočne znamená (Comment → COMMENTED, nikdy APPROVED), takže test overujúci verdikt nemôže prejsť proti fake, ak by proti GitHubu zlyhal; seedSubmittedReview() ho prepíše, keď test potrebuje konkrétne id alebo URL.
  • seedPullRequestReviews($reviews, $comments) plní obe polovice zvlášť, pretože skutočné volanie ich číta z dvoch endpointov.
  • createRepository() zostaví vrátené Repository zo vstupu — owner určí cestu a Owner; defaultBranch, prípadne main, ak autoInit alebo šablóna žiadali commit, inak prázdna hodnota, určí predvolenú vetvu — pokiaľ nie je nastavený seedCreatedRepository().
  • Zámerné náhrady: installationRepositories() číta rovnaké dáta ako repositories(), installations()->all() použije jedinú naplnenú inštaláciu, searchRepositories() siahne po naplnených repozitároch, pullRequest() / issue() / release() vezmú prvú položku svojho zoznamu a pull request bez seedu sa vráti s číslom, na ktoré ste sa pýtali.

Toky GitHub App

Git::fake()->githubApp() vracia ten istý dvojník GitHubu, takže celý tok inštalácie a overenia prebehne bez HTTP:

$fake = Git::fake();
$fake->githubApp()->seedInstallation($installation)->seedRepositories([$repositoryDto]);

Git::githubApp()->installations()->forOrganization('acme-inc');
Git::github()->installationRepositories();

Git::assertSent(ProviderName::Github, 'organizationInstallation');

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.