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

RateLimits::fake() nahradí manager zaznamenávajúcim fake, aby testy mohli overovať obmedzenie bez skutočného čakania a bez Redisu:

use RoundlyConsulting\HttpClientRateLimits\Facades\RateLimits;

$fake = RateLimits::fake();

Http::rateLimit(1, by: 'acct-1')->get('https://api.example.com/one');
Http::rateLimit(1, by: 'acct-1')->get('https://api.example.com/two');

$fake->assertDeferred('acct-1');   // a request for this key was throttled
$fake->assertAllowed();            // at least one request went through
// $fake->assertNothingDeferred(); // would fail here

RateLimits::perMinute(60)->by('stripe')->reset();
$fake->assertReset('stripe');

fake() vráti RateLimitsFake — podtyp RateLimitManager vložený do kontajnera, takže ho dostane fasáda, injektovaný manager aj Http::rateLimit(). Limiter naďalej beží: pokusy sa počítajú a čakania vypočítajú, ale nič nečaká a Redis sa nepoužije. Požiadavky sa stále odosielajú, preto ho kombinujte s Http::fake().

Všetky asercie

MetódaOverí / vráti
assertDeferred(?string $key = null)Niektorá požiadavka bola odložená — pri zadanom kľúči práve pre tohto vlastníka.
assertNothingDeferred()Žiadna požiadavka nebola odložená.
assertAllowed(?string $key = null)Niektorá požiadavka bola povolená — pri zadanom kľúči práve pre tohto vlastníka.
assertNothingAllowed()Žiadna požiadavka nebola povolená.
assertReset(?string $key = null)Niektorý limit bol vynulovaný — pri zadanom kľúči práve pre tohto vlastníka.
assertNothingReset()Žiaden limit nebol vynulovaný.
deferredCount() / allowedCount()Počet odložených / povolených požiadaviek.
store()Zdieľaný InMemoryStore; pokusy čítajte podľa kľúča úložiska, napr. hits('acct-1:minute').
deferrer()RecordingDeferrer: defers() a deferCount().
// Every assertion returns the fake, so they chain.
$fake->assertDeferred();                // some request was deferred
$fake->assertDeferred('acct-1');        // … for this owner key
$fake->assertNothingDeferred();         // no request was deferred

$fake->assertAllowed();                 // some request was allowed
$fake->assertAllowed('acct-1');         // … for this owner key
$fake->assertNothingAllowed();          // no request went through

$fake->assertReset();                   // some limit was reset
$fake->assertReset('stripe');           // … for this owner key
$fake->assertNothingReset();            // nothing was reset

$fake->deferredCount();                 // int
$fake->allowedCount();                  // int
$fake->store()->hits('acct-1:minute');  // hits recorded for a key + window
$fake->deferrer()->defers();            // every wait in ms, e.g. [60000]
$fake->deferrer()->deferCount();        // int

Kompletný test

use Illuminate\Support\Facades\Http;
use RoundlyConsulting\HttpClientRateLimits\Facades\RateLimits;

it('throttles the second call for the same account', function () {
    Http::fake(['*' => Http::response('ok')]);

    $fake = RateLimits::fake();

    Http::rateLimit(1, by: 'acct-1')->get('https://api.example.com/one');
    Http::rateLimit(1, by: 'acct-1')->get('https://api.example.com/two');

    $fake->assertAllowed('acct-1')->assertDeferred('acct-1');

    expect($fake->deferredCount())->toBe(1)
        ->and($fake->allowedCount())->toBe(2)
        ->and($fake->deferrer()->defers())->toBe([60_000]); // one full minute
});
  • Všetky limity vytvorené počas aktívneho fake zdieľajú jeden InMemoryStore a jeden RecordingDeferrer — samostatné volania Http::rateLimit() s rovnakým kľúčom a oknom teda zdieľajú limit.
  • RateLimits::usingStore(), usingDeferrer() a releasingJob() platia aj pod fake: vrátia manager s vaším prepisom, ktorý si pre druhú polovicu ponechá zaznamenávajúce úložisko alebo deferrer z fake — vrátená úloha sa teda naozaj vráti do fronty a jej udalosti fake aj tak zaznamená.
  • RecordingDeferrer nikdy nečaká: každé čakanie zaznamená (defers(), deferCount()) a posunie vlastné hodiny, takže okná postupujú deterministicky.
  • Počas fake sú udalosti vždy zapnuté bez ohľadu na events_enabled — asercie na nich stavajú.
  • Kombinujte s Http::fake(), aby z testu neodišla žiadna skutočná požiadavka.

Fake Sleep namiesto toho

Ak chcete ponechať skutočný limiter a len preskočiť čakanie, použite fake Sleep od Laravelu — predvolený SleepDeferrer čaká práve cez neho:

use Illuminate\Support\Sleep;
use RoundlyConsulting\HttpClientRateLimits\Facades\RateLimits;

Sleep::fake();

$limit = RateLimits::perSecond(1);

Http::withMiddleware($limit)->get('https://api.example.com/one');
Http::withMiddleware($limit)->get('https://api.example.com/two');

Sleep::assertSleptTimes(1); // the SleepDeferrer paused once, without really sleeping

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.