Files
portal/app/tests/Feature/Advertising/AdWalletRefreezeTest.php
T

35 lines
2.0 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
use App\Models\AdWallet;
use App\Models\Tenant;
use App\Services\Advertising\AdWalletService;
/**
* ШОВ между паузой и возобновлением. Два зелёных теста в
* AdvertisingCampaignPauseResumeTest покрывают половинки по отдельности:
* «пауза снимает заморозку» замораживает и снимает, «возобновление снова морозит»
* стартует с кампании, которую НИКОГДА не морозили. Последовательность
* заморозить → снять → заморозить снова не проверяет никто.
*
* А в жизни она обязательна: пауза → возобновление, отказ модерации → «Исправить» →
* повторный запуск. release() не удаляет строку брони, а метит её released,
* при этом на ad_wallet_holds висит уникальный ключ
* (tenant_id, channel, source_type, source_id) — значит второй freeze() падает
* на дубле ключа.
*/
it('морозит повторно после снятия заморозки — пауза и возобновление той же кампании', function () {
$tenant = Tenant::factory()->create();
AdWallet::create(['tenant_id' => $tenant->id, 'balance_rub' => '3000.00', 'frozen_rub' => '0.00']);
$svc = app(AdWalletService::class);
$svc->freeze($tenant->id, 'yandex', 'campaign', 1, '1000.00');
$svc->release($tenant->id, 'yandex', 'campaign', 1);
// Возобновление той же кампании: та же четвёрка ключа, бронь уже released.
$svc->freeze($tenant->id, 'yandex', 'campaign', 1, '1000.00');
expect((string) AdWallet::where('tenant_id', $tenant->id)->first()->frozen_rub)->toBe('1000.00');
});