Files
portal/app/tests/Feature/Advertising/AdvertisingWalletEndpointTest.php
T
Дмитрий 2590c01477 test: половина грязи рекламных тестов убрана — остаток в базе со 116 до 44
Восьми файлам рекламной папки поставлен откат после теста. Проверено остатком
в базе снаружи: папка оставляла 116 записей арендаторов, теперь 44. Папка
целиком зелёная - 351 из 351. Полный прогон после уборки: 4111 тестов,
4107 зелёных, 4 пропущено, ноль падений - значит на эту грязь никто не
опирался. Побочно прогон стал БЫСТРЕЕ: 12,9 минуты против 16,5.

Один файл намеренно оставлен как был, причина записана прямо в нём:
CampaignBannerEndpointsTest нарочно ловит отказ базы, а Postgres после отказа
внутри транзакции глушит все следующие команды. С откатом файл падает -
чинить надо сам тест, а не обёртку.

Датчик пришлось расшифровывать, и это стоит помнить. Числа сперва выходили
с минусами: файл, который базы не касается вовсе, «уносил» девять записей.
Прямым замером выяснилось, что КАЖДЫЙ прогон начинается с пересборки базы -
было 6 записей, стало 0 после теста про расписание. Значит разница «до/после»
при переборе файлов = оставил этот минус оставил предыдущий. Расшифровал
цепочкой, сумма сошлась со 116 ровно - на этом расшифровка и проверяется.
Поимённый расклад по файлам перенесён в промт.

Грабля на будущее, тоже в промте: uses() обязан стоять НИЖЕ подключений
классов. Подключение действует с места объявления и ниже, поэтому вызов
выше падает «класс не найден» - и падает сразу вся папка. Полное имя
с ведущей чертой не спасает: pint САМ превращает его в подключение внизу
и ломает работавший файл.

Остаток долга измерен и НЕ закрыт: ~20 файлов оставляют по одной-две записи,
среди них миграционные, которым откат может быть противопоказан по сути.
По всей папке Feature без отката 96 файлов из 580 - корень общий,
в app/tests/Pest.php строка RefreshDatabase закомментирована.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 22:46:14 +03:00

64 lines
1.9 KiB
PHP

<?php
declare(strict_types=1);
use App\Models\AdWallet;
use App\Models\Tenant;
use App\Models\User;
use Illuminate\Foundation\Testing\DatabaseTransactions;
/**
* GET /api/advertising/wallet — статус рекламного кошелька для баннера
* «пополните рекламный кошелёк» (Task 9, часть B).
*/
uses(DatabaseTransactions::class);
beforeEach(function () {
$this->tenant = Tenant::factory()->create();
$this->user = User::factory()->create(['tenant_id' => $this->tenant->id]);
$this->actingAs($this->user);
});
it('returns solvent=false and free_rub when balance does not cover frozen', function () {
AdWallet::create(['tenant_id' => $this->tenant->id, 'balance_rub' => '100.00', 'frozen_rub' => '2500.00']);
$response = $this->getJson('/api/advertising/wallet');
$response->assertOk()->assertJson([
'solvent' => false,
'balance_rub' => '100.00',
'frozen_rub' => '2500.00',
'free_rub' => '-2400.00',
]);
});
it('returns solvent=true and free_rub when balance covers frozen', function () {
AdWallet::create(['tenant_id' => $this->tenant->id, 'balance_rub' => '3000.00', 'frozen_rub' => '2500.00']);
$response = $this->getJson('/api/advertising/wallet');
$response->assertOk()->assertJson([
'solvent' => true,
'balance_rub' => '3000.00',
'frozen_rub' => '2500.00',
'free_rub' => '500.00',
]);
});
it('returns solvent=true and zero values when tenant has no wallet row yet', function () {
$response = $this->getJson('/api/advertising/wallet');
$response->assertOk()->assertJson([
'solvent' => true,
'balance_rub' => '0.00',
'frozen_rub' => '0.00',
'free_rub' => '0.00',
]);
});
it('returns 401 without auth', function () {
auth()->logout();
$this->getJson('/api/advertising/wallet')->assertStatus(401);
});