ProcessCallSliceTest.php 4.14 KB
<?php

namespace Tests\Unit;

use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Account;
use App\Models\Campaigns;
use App\Models\Dictionary;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Tokens;
use App\Models\User;
use App\Models\Variable;
use App\Service\Contract\API;
use App\Service\Limits;
use App\Service\Requests\APIRequest;
use Illuminate\Support\Facades\Queue;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ProcessCallSliceTest extends TestCase
{
    use RefreshDatabase;

    private $request;
    private $request_resume;
    private $params;
    private $user;
    private $token;
    private $token_main;
    private $campaign;
    private $dictionaries;
    private $dictionaries_count = 14;

    protected function setUp(): void
    {
        parent::setUp();

        $account = Account::create(['name' => 'Acme Corporation']);

        $this->user = factory(User::class)->create([
            'account_id' => $account->id,
            'first_name' => 'John',
            'last_name' => 'Doe',
            'email' => 'johndoe@example.com',
            'owner' => true,
        ]);

        $this->token = factory(Tokens::class)->create([
            'limit' => 20,
            'created_by' => $this->user->getKey()
        ]);

        $this->token_main = factory(Tokens::class)->create([
            'type' => Tokens::MAIN,
        ]);

        $this->campaign = factory(Campaigns::class)->create([
            'manage' => true,
            'token' => $this->token_main->getKey(),
        ]);

        $this->dictionaries = factory(Dictionary::class, $this->dictionaries_count)->create([
            'token_id' => $this->token->getKey(),
            'type' => Dictionary::CITY,
        ]);

        $this->request = APIRequest::getInstance(API::YANDEX)
            ->setToken($this->token)
            ->getRequest('Campaigns', 'add');

        $this->campaign->dictionaries()->syncWithoutDetaching(
            $this->dictionaries->keyBy(Campaigns::getModel()->getKeyName())->transform(function (Dictionary $dictionary) {
                return DictionaryCampaign::copyPropertyInCampaign($this->campaign);
            })->all()
        );

        $this->assertEquals($this->dictionaries_count, $this->campaign->dictionaries()->count());
        $this->assertEquals($this->dictionaries_count, $this->token->dictionaryCampaignsEnabledForNotExternal->count());

        $this->params = [
            'dictionaryCampaigns' => $this->token->dictionaryCampaignsEnabledForNotExternal,
            'variables' => Variable::all(),
        ];


        $this->request_resume = APIRequest::getInstance(API::YANDEX)
            ->setToken($this->token)
            ->getRequest('Campaigns', 'resume');

    }

    public function testCallApi()
    {
        Queue::fake();

        Queue::assertNothingPushed();

        $this->request->call($this->params);

        $this->request_resume->call([
            'ids' => range(0, $this->dictionaries_count - 1)
        ]);


        Queue::assertPushed(ProcessCallLimitedAPI::class);

        $limits = Limits::getInstance($this->request->getToken());

        $maxObjects = $limits->countObjectsLimit($this->request);

        $this->assertEquals(true, $maxObjects and $maxObjects !== $limits::NAN && $this->request->getObjectsCount() > $maxObjects);

        $requestR = $this->request->slice($maxObjects);

        $this->assertEquals(true, !!$requestR);
        $this->assertEquals(2, $this->request->getObjectsCount());
        $this->assertEquals($this->dictionaries_count - 2, $requestR->getObjectsCount());


        $limits = Limits::getInstance($this->request_resume->getToken());

        $maxObjects = $limits->countObjectsLimit($this->request_resume);

        $this->assertEquals(true, $maxObjects and $maxObjects !== $limits::NAN && $this->request_resume->getObjectsCount() > $maxObjects);

        $requestR = $this->request_resume->slice($maxObjects);

        $this->assertEquals(true, !!$requestR);
        $this->assertEquals(2, $this->request_resume->getObjectsCount());
        $this->assertEquals($this->dictionaries_count - 2, $requestR->getObjectsCount());

    }

    public function testHandleApi()
    {

    }
}