CheckChangesAdGroupsTest.php 6.15 KB
<?php

namespace Tests\Unit;

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

class CheckChangesAdGroupsTest extends TestCase
{
    use RefreshDatabase;

    private $request;
    private $user;
    private $token_main;
    private $token;
    private $dictionary;
    private $campaign;
    private $request_main;
    private $request_main_params;
    private $ad_group;
    private $ad_group_data;

    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_main = factory(Tokens::class)->create([
            'type' => Tokens::MAIN,
            'created_by' => $this->user->id
        ]);

        $this->token = factory(Tokens::class)->create([
            'created_by' => $this->user->id
        ]);

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

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

        $this->ad_group = factory(AdGroup::class)->create([
            'campaign_external_id' => $this->campaign->external_id,
            'campaign_id' => $this->campaign->getKey(),
        ]);

        $this->request_main = APIRequest::getInstance(API::YANDEX)
            ->setToken($this->token_main)
            ->getRequest('Changes', 'check');

        $this->request_main_params = [
            'CampaignIds' => Campaigns::forUpdatedChildren()->pluck('external_id')->all(),
            'FieldNames' => [
                'AdGroupIds',
            ],
            'Timestamp' => $this->token_main->check_changes_ad_group_at->toIso8601ZuluString(),
        ];

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

        $this->ad_group_data = [
            'result' => [
                'AdGroups' => [
                    [
                        'Id' => $this->ad_group->external_id,
                        'Name' => 'Группа №1',
                        'CampaignId' => $this->campaign->external_id,
                        'Status' => 'ACCEPTED',
                        'Type' => 'TEXT_AD_GROUP',
                        'Subtype' => 'NONE',
                        'ServingStatus' => 'ELIGIBLE',
                        'RestrictedRegionIds' => NULL,
                        'RegionIds' =>
                            [
                                0 => 1,
                            ],
                        'NegativeKeywords' =>
                            [
                                'Items' => [
                                    'minusword1',
                                    'minusword3',
                                ],
                            ],
                        'NegativeKeywordSharedSetIds' => NULL,
                        'TrackingParams' => '',
                    ],
                ]
            ]
        ];

    }

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

        Queue::assertNothingPushed();

        $this->request_main->call($this->request_main_params);

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

    public function testHandleApi()
    {
        $this->assertEquals(1, AdGroup::count());
        $this->assertEquals(1, DictionaryCampaign::count());
        $this->assertEquals(1, GoalAdGroup::count());
        $this->assertEquals(0, AdGroup::forUpdatedSelf()->count());
        $this->assertEquals(1, Campaigns::forUpdatedChildren()->count());

        $goalAdGroup = GoalAdGroup::first();

        $goalAdGroup->update([
            'external_id' => 1,
        ]);

        $goalAdGroup->refresh();

        $this->assertEquals($this->ad_group->name, $goalAdGroup->name);

        $this->request_main->setParams($this->request_main_params);

        $this->request_main->handle([
            'result' => [
                'Modified' => [
                    'AdGroupIds' => [
                        AdGroup::first()->external_id,
                    ],
                ],
                'Timestamp' => '2015-02-02T12:23:11Z',
            ]
        ]);

        $this->assertEquals(1, AdGroup::forUpdatedSelf()->count());
        $this->assertEquals(0, Campaigns::forUpdatedChildren()->count());

        $this->request_main = APIRequest::getInstance(API::YANDEX)
            ->setToken($this->token_main)
            ->getRequest('AdGroups', 'get');

        $this->request_main->handle($this->ad_group_data);

        $this->ad_group->refresh();

        $this->assertEquals(0, AdGroup::forUpdatedSelf()->count());
        $this->assertEquals($this->ad_group_data['result']['AdGroups'][0]['Name'], $this->ad_group->name);
        $this->assertEquals($this->ad_group_data['result']['AdGroups'][0]['Name'], GoalAdGroup::first()->name);

        $this->assertEquals(1, GoalAdGroup::needUpdated()->count());

        $goalAdGroup->refresh();

        $this->request_main = APIRequest::getInstance(API::YANDEX)
            ->setToken($this->token_main)
            ->getRequest('AdGroups', 'update');

        $this->request_main->handle([
            'result' => [
                'UpdateResults' => [
                    [
                        'Id' => GoalAdGroup::needUpdated()->first()->external_id,
                    ],
                ]
            ]
        ]);

        $this->assertEquals(0, GoalAdGroup::needUpdated()->count());

    }
}