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

Geolocation::fake() v testoch vašej aplikácie nahradí manažéra zaznamenávajúcim fakom a vráti ho. Iba zaznamenáva: nedotkne sa žiadneho poskytovateľa, siete, cache ani sťahovania MaxMind a vyhľadávania odpovedajú výsledkami, ktoré pripravíte. GeolocationFake rozširuje GeolocationManager a nahradí koreň fasády aj väzbu v kontajneri, takže ho používa fasáda, injektovaný manažér aj makro $request->location():

use RoundlyConsulting\Geolocation\DataTransferObjects\Location;
use RoundlyConsulting\Geolocation\Enum\GeolocationType;
use RoundlyConsulting\Geolocation\Facades\Geolocation;

it('localises checkout from the visitor IP', function () {
    $fake = Geolocation::fake([
        '203.0.113.7' => new Location(
            humanReadable: 'Springfield, US',
            street: '',
            city: 'Springfield',
            countryIsoCode: 'US',
            latitude: 39.7817,
            longitude: -89.6501,
            type: GeolocationType::Ip,
        ),
    ]);

    $this->withServerVariables(['REMOTE_ADDR' => '203.0.113.7'])
        ->get('/checkout')
        ->assertOk();

    $fake->assertLocated('203.0.113.7');
});

Príprava výsledkov a overenie vyhľadávaní

$fake = Geolocation::fake();

$fake->seed('203.0.113.7', $location)          // an IP
    ->seed('Main Street 1, Springfield', $hq)  // an address
    ->seed('48.1486,17.1077', $point)          // coordinates as "lat,lng"
    ->seedDefault($fallback)                   // anything not seeded
    ->seedDistance($distance);                 // returned by every distance() call

// ...exercise your code, then:
$fake->assertLocated('203.0.113.7');
$fake->assertProviderUsed('ipinfo');      // pinned via provider() / using()
$fake->assertProviderNotUsed('google');

// Or, for a code path that must not look anything up:
$fake->assertNothingLocated();

Vzdialenosti, obnovy a cache

use RoundlyConsulting\Geolocation\DataTransferObjects\GeolocationQuery;
use RoundlyConsulting\Geolocation\Enum\DistanceType;

// Distances — through distance() or distanceBetween(); every argument is optional
$fake->assertDistanceRequested(from: $warehouse);
$fake->assertDistanceRequested($warehouse, $customer, DistanceType::Driving);
$fake->assertNoDistanceRequested();

// MaxMind refreshes — Geolocation::updateDatabase() and geolocation:db:update
$fake->assertDatabaseUpdated('GeoLite2-City');   // or no edition for any refresh
$fake->assertDatabaseNotUpdated();

// Cache maintenance
$fake->assertForgotten(GeolocationQuery::forIp('8.8.8.8'));
$fake->assertNothingForgotten();
$fake->assertCacheFlushed();
$fake->assertCacheNotFlushed();

updateDatabase() na fake zaznamená edíciu a vráti nastavenú cestu — a keďže ju volá aj geolocation:db:update, zaznamená sa aj spustenie príkazu v teste.

Všetky metódy

MetódaÚčel
Geolocation::fake(array $results = [])Nahradí manažéra fakom; výsledky podľa IP, adresy alebo „lat,lng“. Poskytovatelia zaregistrovaní cez extend() zostanú zaregistrovaní.
seed(string $key, Location $location)Pridá jeden pripravený výsledok (fluentne).
seedDefault(?Location $location)Výsledok pre každé vyhľadávanie bez pripraveného kľúča.
seedDistance(?Distance $distance)Vráti ho každé volanie distance().
assertLocated(string $key)Kľúč sa aspoň raz vyhľadával.
assertNothingLocated()Neprebehlo žiadne vyhľadávanie.
assertProviderUsed(string $name)Vyhľadávanie, dávka, vzdialenosť alebo matica bežali cez kópiu, ktorú pre toto meno vrátil provider() alebo using() — platí ktorékoľvek z pripnutých mien.
assertProviderNotUsed(string $name)Žiadne volanie nebolo pripnuté na toto meno.
assertDistanceRequested(?$from, ?$to, ?$type)Vzdialenosť sa vyžiadala cez distance() alebo distanceBetween(); každý argument zúži zhodu.
assertNoDistanceRequested()Nevyžiadala sa žiadna vzdialenosť.
assertDatabaseUpdated(?string $edition)Databáza MaxMind sa aktualizovala (pre danú edíciu) — nič sa nesťahuje.
assertDatabaseNotUpdated()Databáza sa neaktualizovala.
assertForgotten($query)forget() prebehol pre daný GeolocationQuery alebo DistanceQuery.
assertNothingForgotten()forget() neprebehol ani raz.
assertCacheFlushed()flushCache() prebehol aspoň raz.
assertCacheNotFlushed()flushCache() neprebehol ani raz.

Fake nespúšťa žiadneho poskytovateľa, takže assertProviderUsed() overuje mená, ktoré váš kód pripol cez provider() / using() pre vyhľadávanie, dávku, vzdialenosť alebo maticu — nie to, ktorý poskytovateľ „by bol odpovedal“. Rovnako ako skutočný manažér vracajú provider() a using() kópiu s obmedzeným rozsahom: pripnutie platí len pre volania zreťazené na nej (Geolocation::provider('ipinfo')->locateIp(…)), takže samostatné Geolocation::provider('ipinfo'); nezaznamená nič. Asercie zavoláte aj staticky na fasáde — Geolocation::assertLocated('8.8.8.8'). Vyhľadávania podľa súradníc majú kľúč „lat,lng“ v obyčajnom desatinnom zápise — „0.00001,0“, nikdy „1.0E-5,0“; Coordinates(1.0, 2.0) je 1,2. distanceMatrix() na fake vracia prázdnu mriežku a withToken() / withTimeout() / withConfig() nerobia nič.

Fake odmieta mená poskytovateľov presne ako skutočný manažér. withToken() / withConfig() hneď vyhodia UnknownProviderException pre meno, ktoré nie je v providers ani zaregistrované cez extend(), a vyhľadávanie, vzdialenosť alebo matica pripnuté na také meno ju vyhodia pri spustení (pripnuté batch() vráti pre každú IP null). Poskytovatelia zaregistrovaní cez extend() pred fake() — napríklad driver, ktorý pri štarte registruje iný balík — zostanú zaregistrovaní.

Simulácia HTTP vrstvy

Ak chcete otestovať mapovanie odpovede skutočného poskytovateľa, pripnite pipeline a nasimulujte HTTP volanie:

use Illuminate\Support\Facades\Http;

it('maps an IPinfo response onto a Location', function () {
    config()->set('geolocation.pipeline', ['ipinfo']);

    Http::fake([
        'ipinfo.io/*' => Http::response(['city' => 'Springfield', 'country' => 'US', 'loc' => '39.7817,-89.6501']),
    ]);

    expect(Geolocation::locateIp('203.0.113.7')?->city)->toBe('Springfield');
});

Simulácia limitera

RateLimits::fake() z http-client-rate-limits-for-laravel zaznamenáva spomaľovanie bez skutočného čakania, takže overíte, že sa limit poskytovateľa uplatnil:

use RoundlyConsulting\HttpClientRateLimits\Facades\RateLimits;

it('paces bulk lookups under the ipinfo budget', function () {
    config()->set('geolocation.pipeline', ['ipinfo']);
    config()->set('geolocation.services.ipinfo.rate_limits.limit', 1);

    $fake = RateLimits::fake();   // no real sleeping
    Http::fake(['ipinfo.io/*' => Http::response(['city' => 'X', 'country' => 'US', 'loc' => '1,2'])]);

    Geolocation::batch(['203.0.113.7', '198.51.100.4']);

    $fake->assertDeferred('geolocation:ipinfo:app');
});

Pracujete priamo na balíku? Jeho vlastné testy spustíte príkazom:

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.