Remove obsolete Livewire fuel search components and consolidate pricing tiers
- Delete unused Livewire Search test and fuel type select Blade component - Move subscription webhook listener from EventServiceProvider to AppServiceProvider - Add FUEL_TYPES global config to app layout for client-side use - Add Billable trait to User model and include email_verified_at in fillable - Implement monthly/annual cadence toggle with pricing display and smart CTA routing on homepage - Update VerifyApiKeyMiddlewareTest to use e10 instead of petrol - Refactor PollFuelPrices to auto-refresh stale stations based on last_seen_at - Add incremental polling with cached timestamp and effective-start-timestamp param to FuelPriceService - Normalize amenities/fuel_types from API objects to flat arrays, skip stations missing required fields - Log response body on API failures in ApiLogger - Default homepage sort to 'reliable' instead of 'price'
This commit is contained in:
@@ -20,7 +20,7 @@ it('returns stations near coordinates filtered by fuel type', function () {
|
||||
'price_pence' => 14500,
|
||||
]);
|
||||
|
||||
$this->getJson('/api/stations?lat=52.555064&lng=-0.256119&fuel_type=diesel&radius=10&sort=price')
|
||||
$this->getJson('/api/stations?lat=52.555064&lng=-0.256119&fuel_type=b7_standard&radius=10&sort=price')
|
||||
->assertOk()
|
||||
->assertJsonStructure([
|
||||
'data' => [['station_id', 'name', 'brand', 'is_supermarket', 'lat', 'lng', 'distance_km', 'fuel_type', 'price_pence', 'price', 'price_updated_at']],
|
||||
@@ -38,7 +38,7 @@ it('excludes stations with no matching fuel type', function () {
|
||||
'price_pence' => 13800,
|
||||
]);
|
||||
|
||||
$this->getJson('/api/stations?lat=52.555064&lng=-0.256119&fuel_type=diesel&radius=10')
|
||||
$this->getJson('/api/stations?lat=52.555064&lng=-0.256119&fuel_type=b7_standard&radius=10')
|
||||
->assertOk()
|
||||
->assertJsonPath('meta.count', 0);
|
||||
});
|
||||
@@ -54,7 +54,7 @@ it('excludes temporarily closed stations', function () {
|
||||
'price_pence' => 14200,
|
||||
]);
|
||||
|
||||
$this->getJson('/api/stations?lat=52.555064&lng=-0.256119&fuel_type=diesel&radius=10')
|
||||
$this->getJson('/api/stations?lat=52.555064&lng=-0.256119&fuel_type=b7_standard&radius=10')
|
||||
->assertOk()
|
||||
->assertJsonPath('meta.count', 0);
|
||||
});
|
||||
@@ -68,7 +68,7 @@ it('excludes stations beyond radius', function () {
|
||||
'price_pence' => 14200,
|
||||
]);
|
||||
|
||||
$this->getJson('/api/stations?lat=52.555064&lng=-0.256119&fuel_type=diesel&radius=10')
|
||||
$this->getJson('/api/stations?lat=52.555064&lng=-0.256119&fuel_type=b7_standard&radius=10')
|
||||
->assertOk()
|
||||
->assertJsonPath('meta.count', 0);
|
||||
});
|
||||
@@ -82,7 +82,7 @@ it('sorts by price when sort=price', function () {
|
||||
StationPriceCurrent::factory()->create(['station_id' => $cheap->node_id, 'fuel_type' => FuelType::B7Standard, 'price_pence' => 13900]);
|
||||
StationPriceCurrent::factory()->create(['station_id' => $expensive->node_id, 'fuel_type' => FuelType::B7Standard, 'price_pence' => 14500]);
|
||||
|
||||
$this->getJson("/api/stations?lat={$sLat}&lng={$sLng}&fuel_type=diesel&radius=10&sort=price")
|
||||
$this->getJson("/api/stations?lat={$sLat}&lng={$sLng}&fuel_type=b7_standard&radius=10&sort=price")
|
||||
->assertOk()
|
||||
->assertJsonPath('data.0.price_pence', 13900);
|
||||
});
|
||||
@@ -91,7 +91,7 @@ it('logs a search record for each request', function () {
|
||||
$station = Station::factory()->create(['lat' => 52.555064, 'lng' => -0.256119]);
|
||||
StationPriceCurrent::factory()->create(['station_id' => $station->node_id, 'fuel_type' => FuelType::B7Standard, 'price_pence' => 14500]);
|
||||
|
||||
$this->getJson('/api/stations?lat=52.555064&lng=-0.256119&fuel_type=diesel&radius=10');
|
||||
$this->getJson('/api/stations?lat=52.555064&lng=-0.256119&fuel_type=b7_standard&radius=10');
|
||||
|
||||
$this->assertDatabaseHas('searches', [
|
||||
'lat_bucket' => '52.56',
|
||||
@@ -166,7 +166,7 @@ it('includes resolved lat and lng in meta', function () {
|
||||
'price_pence' => 14500,
|
||||
]);
|
||||
|
||||
$this->getJson('/api/stations?lat=52.555064&lng=-0.256119&fuel_type=diesel&radius=10')
|
||||
$this->getJson('/api/stations?lat=52.555064&lng=-0.256119&fuel_type=b7_standard&radius=10')
|
||||
->assertOk()
|
||||
->assertJsonPath('meta.lat', 52.555064)
|
||||
->assertJsonPath('meta.lng', -0.256119);
|
||||
|
||||
@@ -5,23 +5,23 @@ use Illuminate\Support\Facades\Hash;
|
||||
use Laravel\Sanctum\Sanctum;
|
||||
|
||||
it('returns user preferences for authenticated user', function (): void {
|
||||
$user = User::factory()->create(['preferred_fuel_type' => 'diesel']);
|
||||
$user = User::factory()->create(['preferred_fuel_type' => 'b7_standard']);
|
||||
Sanctum::actingAs($user);
|
||||
|
||||
$this->getJson('/api/user/preferences')
|
||||
->assertOk()
|
||||
->assertJsonFragment(['preferred_fuel_type' => 'diesel']);
|
||||
->assertJsonFragment(['preferred_fuel_type' => 'b7_standard']);
|
||||
});
|
||||
|
||||
it('updates user preferences', function (): void {
|
||||
$user = User::factory()->create(['preferred_fuel_type' => 'petrol']);
|
||||
$user = User::factory()->create(['preferred_fuel_type' => 'e10']);
|
||||
Sanctum::actingAs($user);
|
||||
|
||||
$this->putJson('/api/user/preferences', ['preferred_fuel_type' => 'diesel'])
|
||||
$this->putJson('/api/user/preferences', ['preferred_fuel_type' => 'b7_standard'])
|
||||
->assertOk()
|
||||
->assertJsonFragment(['preferred_fuel_type' => 'diesel']);
|
||||
->assertJsonFragment(['preferred_fuel_type' => 'b7_standard']);
|
||||
|
||||
expect($user->fresh()->preferred_fuel_type)->toBe('diesel');
|
||||
expect($user->fresh()->preferred_fuel_type)->toBe('b7_standard');
|
||||
});
|
||||
|
||||
it('rejects invalid fuel type in preferences update', function (): void {
|
||||
|
||||
Reference in New Issue
Block a user