Files
portal/app/tests/Feature/Admin/AdminDashboardSupplyTest.php
T
Дмитрий 02a8a90e4d feat дашборд: Этап 2 — живые плитки Лиды и Заказ у поставщика
Backend: AdminDashboardController +leads/+supply эндпоинты, summary дополнен
плитками leads/supply; сверка заказа вынесена в чистый сервис
SupplyReconciliation (спрос → формула computeOrder=max(max,⌈Σ/3⌉) → факт →
рассинхрон). Лиды: доставлено сегодня / зависшие 4ч+ / нераспределённые /
% доставки — cross-tenant под pgsql_admin.

Frontend: плитки Лиды и Заказ оживлены (убраны заглушки «Этап 2»), drill
с KPI и таблицей групп спрос→формула→факт→совпадает.

Тесты: SupplyReconciliation unit 3/3, Leads/Supply/Summary feature,
admin-срез 87 зелёных, фронт 10/10. stan 0, pint/eslint/type-check/build чисто.
phpstan-baseline перегенерирован (getJson false-positive на новых тестах).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 14:32:31 +03:00

31 lines
1.1 KiB
PHP

<?php
declare(strict_types=1);
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\DB;
uses(DatabaseTransactions::class);
it('GET /api/admin/dashboard/supply возвращает группы и итоги', function () {
// supplier_projects не партиционирован — сеем напрямую. project_routing_snapshots
// партиционирована по дате → в тесте не сеем (контракт ответа проверяем; формула
// покрыта unit-тестом SupplyReconciliation).
DB::table('supplier_projects')->insert([
'platform' => 'B1', 'signal_type' => 'site', 'unique_key' => 'demo-x.ru',
'current_limit' => 50, 'sync_status' => 'ok',
'created_at' => now(), 'updated_at' => now(),
]);
$res = $this->getJson('/api/admin/dashboard/supply');
$res->assertOk();
$res->assertJsonStructure([
'snapshot_date',
'light',
'totals' => ['demand', 'formula', 'ordered', 'mismatches'],
'groups',
]);
expect($res->json('light'))->toBeIn(['green', 'red']);
});