CheckCampaignsTest.php 5.18 KB
<?php

namespace Tests\Unit;

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\Service\Contract\API;
use App\Service\Requests\APIRequest;
use Illuminate\Support\Facades\Queue;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;

class CheckCampaignsTest extends TestCase
{
    use RefreshDatabase;

    private $request;
    private $user;
    private $token_main;
    private $token;
    private $dictionary;
    private $request_main;

    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->request_main = APIRequest::getInstance(API::YANDEX)
            ->setToken($this->token_main)
            ->getRequest('Changes', 'checkCampaigns');

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

    }

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

        Queue::assertNothingPushed();

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

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

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

        $this->request_main->handle([
            'result' => [
                'Timestamp' => 1622459151,
                'Campaigns' => [
                    [
                        'ChangesIn' => ['SELF', 'CHILDREN'],
                        'CampaignId' => 1
                    ],
                    [
                        'ChangesIn' => ['CHILDREN'],
                        'CampaignId' => 2
                    ]
                ]
            ]
        ]);

        $this->assertEquals($this->request_main->getToken()->check_changes_campaign_at->timestamp, 1622459151);
        $this->assertEquals(1, Campaigns::forUpdatedSelf()->count());
        $this->assertEquals(2, Campaigns::forUpdatedChildren()->count());

        $campaign = Campaigns::first();

        $this->actingAs($this->user)
            ->post(route('token.campaign.managed', [
                $this->token_main->getKey(),
                $campaign->getKey(),
            ]), [
                'managed' => true,
            ])
            ->assertStatus(302);

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

        $campaign->refresh();

        $this->assertEquals(true, $campaign->manage);
        $this->assertEquals(1, $campaign->external_id);

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

        $this->dictionary->load('campaigns');

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

        $this->request->handle([
            'result' => [
                'Timestamp' => 1622459200,
                'Campaigns' => [
                    [
                        'ChangesIn' => ['SELF', 'CHILDREN'],
                        'CampaignId' => 1
                    ]
                ]
            ]
        ]);

        $this->assertEquals($this->request->getToken()->check_changes_campaign_at->timestamp, 1622459200);

        $campaign = $this->dictionary->campaigns()->first();

        $this->assertNotNull($campaign->pivot->external_updated_at);
        $this->assertNotNull($campaign->pivot->updated_self);
        $this->assertNotNull($campaign->pivot->updated_children);

        $campaign->pivot->update([
            'external_id' => 1,
            'external_updated_at' => null,
        ]);

        $campaign->update([
            'name' => 'change name',
        ]);

        $campaign = $this->dictionary->campaigns()->first();

        $this->assertEquals(1, $campaign->pivot->external_id);
        $this->assertNotNull( $campaign->pivot->updated_need);
        $this->assertEquals('change name', $campaign->name);
        $this->assertEquals('change name', $campaign->pivot->name);


        $campaign->pivot->update([
            'synced' => false,
        ]);

        $campaign->update([
            'name' => 'edit name',
        ]);

        $campaign = $this->dictionary->campaigns()->first();

        $this->assertEquals('edit name', $campaign->name);
        $this->assertEquals('change name', $campaign->pivot->name);


    }
}