Files
portal/app/tests/Feature/Sales/SmsPerChannelSenderTest.php
T

59 lines
2.4 KiB
PHP

<?php
declare(strict_types=1);
use App\Jobs\SendSmsCampaignJob;
use App\Models\SalesAdAudiencePhone;
use App\Models\SalesSmsCampaign;
use App\Models\SalesSmsMessage;
use App\Models\SalesSmsSender;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Tests\Concerns\SharesSupplierPdo;
uses(DatabaseTransactions::class, SharesSupplierPdo::class);
function per_channel_campaign(string $phone): SalesSmsCampaign
{
SalesAdAudiencePhone::create([
'phone' => $phone, 'expires_at' => now()->addDays(30),
'state' => 'active', 'operator' => 'МТС', 'phone_type' => 'mobile',
]);
return SalesSmsCampaign::create([
'title' => 'Прогрев', 'body' => 'Здравствуйте!', 'created_by' => 1,
'status' => SalesSmsCampaign::STATUS_QUEUED,
]);
}
it('в песочнице имя берётся для канала fake', function () {
SalesSmsSender::create(['name' => 'liderra.ru', 'provider_key' => 'fake', 'status' => 'active']);
$campaign = per_channel_campaign('79990000020');
(new SendSmsCampaignJob($campaign->id, ['79990000020']))->handle();
expect($campaign->refresh()->sent_count)->toBe(1);
});
it('нет имени для канала → номер помечается skipped_no_sender, деньги целы', function () {
// Активное имя есть, но для ДРУГОГО канала — для fake имени нет.
SalesSmsSender::create(['name' => 'liderra.ru', 'provider_key' => 'mts', 'status' => 'active']);
$campaign = per_channel_campaign('79990000021');
(new SendSmsCampaignJob($campaign->id, ['79990000021']))->handle();
$row = SalesSmsMessage::where('campaign_id', $campaign->id)->first();
expect($row->status)->toBe(SalesSmsMessage::SKIP_NO_SENDER)
->and($row->cost_kopecks)->toBe(0)
->and($campaign->refresh()->sent_count)->toBe(0);
});
it('не стартует, если ни одного активного имени нет', function () {
SalesSmsSender::create(['name' => 'liderra.ru', 'provider_key' => 'fake', 'status' => 'pending']);
$campaign = per_channel_campaign('79990000022');
(new SendSmsCampaignJob($campaign->id, ['79990000022']))->handle();
expect($campaign->refresh()->status)->toBe(SalesSmsCampaign::STATUS_FAILED)
->and($campaign->last_error)->toContain('имя отправителя');
});