AddCampaignsTest.php 5.13 KB
<?php

namespace Tests\Unit;

use App\Jobs\ProcessCallAPI;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Account;
use App\Models\Campaigns;
use App\Models\Dictionary;
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 AddCampaignsTest extends TestCase
{
    use RefreshDatabase;

    private $request;
    private $params;
    private $user;
    private $token;
    private $token_main;
    private $campaign;
    private $dictionary;

    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([
            'created_by' => $this->user->getKey()
        ]);

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

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

        $this->dictionary = factory(Dictionary::class)->create([
            'region_id' => 1,
            'type' => Dictionary::CITY,
        ]);

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

        $this->actingAs($this->user)
            ->post(route('token.city.store', [
                $this->token->id,
                $this->dictionary->getKey(),
            ]))
            ->assertStatus(302);

        $this->assertEquals(11, $this->dictionary->campaigns->count());

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

    }

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

        Queue::assertNothingPushed();

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

        Queue::assertPushed(ProcessCallLimitedAPI::class);
    }

    public function testHandleApi()
    {


        $this->dictionary->refresh();

        $data = [
            'result' => [
                'AddResults' => [
                    [
                        'Id' => 1,
                    ],
                ]
            ]
        ];

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

        $this->request->handle($data);

        $this->dictionary->campaigns->first()->pivot->refresh();

        $this->assertEquals(1, $this->dictionary->campaigns->first()->pivot->external_id);
        $this->assertNotNull(1, $this->dictionary->campaigns->first()->pivot->external_upload_at);

    }

    public function test_prepare_request_and_slice(){
        $this->assertEquals(11, $this->dictionary->campaigns->count());
        $this->assertEquals(11, $this->token->dictionaryCampaignsEnabledForNotExternalForNotReserveCreate->count());

        $this->request->requestPrepare([
            'dictionaryCampaigns' => $this->token->dictionaryCampaignsEnabledForNotExternalForNotReserveCreate,
            'variables' => Variable::all(),
        ]);

        $params = $this->request->getParams();
        $this->assertCount(11, $params['Campaigns']);

        $newRequest = $this->request->slice(5);

        $params = $this->request->getParams();
        $this->assertCount(5, $params['Campaigns']);

        $params = $newRequest->getParams();
        $this->assertCount(6, $params['Campaigns']);

    }

    public function test_call_api(){
        Queue::fake();
        $this->request->call([
            'dictionaryCampaigns' => $this->token->dictionaryCampaignsEnabledForNotExternalForNotReserveCreate,
            'variables' => Variable::all(),
        ]);

        Queue::assertPushed(ProcessCallLimitedAPI::class);

        $limits = Limits::getInstance($this->request->getToken());
        $this->token->limit = 10000;
        $this->token->save();
        //получаем сколько объектов можем обработать
        $objects = $limits->countObjectsLimit($this->request);
        $this->assertEquals($objects, 10);
        $limitId = $limits->doRezerv($this->request, $objects);

        $limit = \App\Models\Limits::find($limitId);
        $limits = Limits::getInstance($this->request->getToken());
        $maxObjects = $limits->countObjectsLimit($this->request);

        if ($maxObjects and $maxObjects !== $limits::NAN && $this->request->getObjectsCount() > $maxObjects) {
            //те на которые не хватило баллов помещаем в очередь
            if ($apiR = $this->request->slice($maxObjects)) {
                dispatch(new ProcessCallLimitedAPI($apiR))->onQueue('limits');
            }
        }

        Queue::assertPushed(ProcessCallLimitedAPI::class, 2);
    }
}