'Тест', 'warmup_started_at' => now()]); } function wiringHead(): SalesUser { return SalesUser::create([ 'name' => 'Начальник '.uniqid(), 'email' => 'wiringhead'.uniqid().'@sales.local', 'password' => bcrypt('secret'), 'role' => 'head', 'is_active' => true, ]); } it('«Греть» открывает эпизод канала', function () { $firm = wiringFirm(); $this->actingAs(wiringHead(), 'sales') ->postJson('/api/sales/warming/yandex/warm', ['firm_ids' => [$firm->id]]) ->assertOk(); $ep = SalesAdAudienceWarmingEpisode::where('firm_id', $firm->id)->where('channel', 'yandex')->sole(); expect($ep->ended_at)->toBeNull(); }); it('повторное «Греть» уже греющейся фирмы второго открытого эпизода не создаёт', function () { $firm = wiringFirm(); $head = wiringHead(); $this->actingAs($head, 'sales')->postJson('/api/sales/warming/yandex/warm', ['firm_ids' => [$firm->id]])->assertOk(); $this->actingAs($head, 'sales')->postJson('/api/sales/warming/yandex/warm', ['firm_ids' => [$firm->id]])->assertOk(); expect(SalesAdAudienceWarmingEpisode::where('firm_id', $firm->id)->where('channel', 'yandex')->count())->toBe(1); }); it('«Убрать» закрывает открытый эпизод канала', function () { $firm = wiringFirm(); $head = wiringHead(); $this->actingAs($head, 'sales')->postJson('/api/sales/warming/yandex/warm', ['firm_ids' => [$firm->id]])->assertOk(); $this->actingAs($head, 'sales')->postJson('/api/sales/warming/yandex/unassign', ['firm_ids' => [$firm->id]])->assertOk(); $ep = SalesAdAudienceWarmingEpisode::where('firm_id', $firm->id)->where('channel', 'yandex')->sole(); expect($ep->ended_at)->not->toBeNull(); }); it('тумблер on=true открывает, on=false закрывает эпизод', function () { $firm = wiringFirm(); $head = wiringHead(); $this->actingAs($head, 'sales') ->postJson("/api/sales/warming/yandex/firms/{$firm->id}/toggle", ['on' => true])->assertOk(); expect(SalesAdAudienceWarmingEpisode::where('firm_id', $firm->id)->whereNull('ended_at')->count())->toBe(1); $this->actingAs($head, 'sales') ->postJson("/api/sales/warming/yandex/firms/{$firm->id}/toggle", ['on' => false])->assertOk(); expect(SalesAdAudienceWarmingEpisode::where('firm_id', $firm->id)->whereNull('ended_at')->count())->toBe(0); }); it('«Убрать» не трогает открытый эпизод другого канала той же фирмы', function () { $firm = wiringFirm(); $head = wiringHead(); $this->actingAs($head, 'sales')->postJson('/api/sales/warming/yandex/warm', ['firm_ids' => [$firm->id]])->assertOk(); $this->actingAs($head, 'sales')->postJson('/api/sales/warming/vk/warm', ['firm_ids' => [$firm->id]])->assertOk(); $this->actingAs($head, 'sales')->postJson('/api/sales/warming/yandex/unassign', ['firm_ids' => [$firm->id]])->assertOk(); $vk = SalesAdAudienceWarmingEpisode::where('firm_id', $firm->id)->where('channel', 'vk')->sole(); $yandex = SalesAdAudienceWarmingEpisode::where('firm_id', $firm->id)->where('channel', 'yandex')->sole(); expect($vk->ended_at)->toBeNull() ->and($yandex->ended_at)->not->toBeNull(); });