2026-07-24 20:55:03 +03:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
|
|
|
|
use App\Models\AdWallet;
|
|
|
|
|
use App\Models\Tenant;
|
|
|
|
|
use App\Services\Advertising\AdWalletService;
|
2026-08-02 01:15:44 +03:00
|
|
|
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
|
|
|
|
|
|
|
|
|
// Откат после теста. Без него записи файла остаются в базе и роняют ЧУЖИЕ тесты:
|
|
|
|
|
// 01.08.2026 девятнадцать чужих проводок уронили денежную проверку приёмника МТС.
|
|
|
|
|
uses(DatabaseTransactions::class);
|
2026-07-24 20:55:03 +03:00
|
|
|
|
|
|
|
|
it('charges actual spend from balance idempotently', function () {
|
|
|
|
|
$tenant = Tenant::factory()->create();
|
|
|
|
|
AdWallet::create(['tenant_id' => $tenant->id, 'balance_rub' => '3000.00', 'frozen_rub' => '2500.00']);
|
|
|
|
|
$svc = app(AdWalletService::class);
|
|
|
|
|
|
|
|
|
|
$svc->charge($tenant->id, channel: 'yandex', relatedType: 'campaign', relatedId: 1,
|
|
|
|
|
amountRub: '260.00', externalKey: 'yandex:1:2026-07-24');
|
|
|
|
|
// повтор того же события — не списывает второй раз
|
|
|
|
|
$svc->charge($tenant->id, 'yandex', 'campaign', 1, '260.00', 'yandex:1:2026-07-24');
|
|
|
|
|
|
|
|
|
|
$wallet = AdWallet::where('tenant_id', $tenant->id)->first();
|
|
|
|
|
expect($wallet->balance_rub)->toBe('2740.00'); // 3000 − 260, списано ОДИН раз
|
|
|
|
|
});
|