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“.
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 pripnuté na toto meno cez 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“. 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č.

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.