Audit items #15, #16, #20, #22. #15 — AuthController::me and UserResource form/table now read tier via PlanFeatures::for($user)->tier() instead of Plan::resolveForUser($user) ->name. Tiers.md: PlanFeatures is the single entitlement gate. #16 — Moved SQLite GREATEST/LEAST PHP-backed function registration from AppServiceProvider::boot to tests/TestCase::setUp. Production app boot no longer checks the DB driver name. #20 — FetchOilPrices: added Log::warning on EIA fallback and Log::error on both-providers-failed so primary-source reliability can be trended beyond the cron output buffer. #22 — FuelPriceService::flattenEnabledFlags is now an instance method, matching the rest of the class. No external callers. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
33 lines
1.1 KiB
PHP
33 lines
1.1 KiB
PHP
<?php
|
|
|
|
namespace Tests;
|
|
|
|
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Laravel\Fortify\Features;
|
|
|
|
abstract class TestCase extends BaseTestCase
|
|
{
|
|
protected function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
|
|
// SQLite lacks GREATEST/LEAST scalar functions — register PHP-backed
|
|
// shims so the haversine and other math expressions used in
|
|
// production-style queries run identically in :memory: tests.
|
|
// Idempotent: registering twice on the same PDO is harmless.
|
|
if (DB::connection()->getDriverName() === 'sqlite') {
|
|
$pdo = DB::connection()->getPdo();
|
|
$pdo->sqliteCreateFunction('GREATEST', fn (...$args) => max($args), -1);
|
|
$pdo->sqliteCreateFunction('LEAST', fn (...$args) => min($args), -1);
|
|
}
|
|
}
|
|
|
|
protected function skipUnlessFortifyHas(string $feature, ?string $message = null): void
|
|
{
|
|
if (! Features::enabled($feature)) {
|
|
$this->markTestSkipped($message ?? "Fortify feature [{$feature}] is not enabled.");
|
|
}
|
|
}
|
|
}
|