CityTest.php 3.51 KB
<?php

namespace Tests\Unit;

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 Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class CityTest extends TestCase
{
    use RefreshDatabase;

    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)->create([
            'external_id' => 1,
            'manage' => true,
            'token' => $this->token_main->getKey(),
        ]);

        $this->campaign_2 = factory(Campaigns::class)->create([
            'external_id' => 2,
            'manage' => false,
            'token' => $this->token_main->getKey(),
        ]);

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

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

    }

    public function testAddCity()
    {
        $this->assertEquals(2, Tokens::count());
        $this->assertEquals(2, Campaigns::count());
        $this->assertEquals(2, Dictionary::count());

        $this->token->load('cities.campaigns');

        $this->assertEquals(1, $this->token->cities->count());
        $this->assertEquals(0, $this->token->cities->first()->campaigns->count());

        $this->token_main->load('campaignsNotForManaged');
        $this->assertEquals(1, $this->token_main->campaignsForManaged->count());

        $this->token_main->load('campaignsForManaged');
        $this->assertEquals(1, $this->token_main->campaignsNotForManaged->count());

        $this->dictionary->campaigns()->syncWithoutDetaching(
            $this->token_main->campaignsForManaged->keyBy($this->token_main->campaignsForManaged->first()->getKeyName())->transform(function (Campaigns $campaign) {
                return DictionaryCampaign::copyPropertyInCampaign($campaign);
            })->all()
        );

        $this->token->load('cities.campaigns');
        $this->assertEquals(1, $this->token->cities->first()->campaigns->count());

        $this->token_main->campaignsNotForManaged()->first()->update([
            'manage' => true,
        ]);

        $this->token_main->load('campaignsForManaged');
        $this->assertEquals(2, $this->token_main->campaignsForManaged->count());

        $this->token->load('cities.campaigns');
        $this->assertEquals(2, $this->token->cities->first()->campaigns->count());

        $this->token_main->campaignsForManaged->first()->update([
            'manage' => false,
        ]);

        $this->token_main->load('campaignsForManaged');
        $this->assertEquals(1, $this->token_main->campaignsForManaged->count());

        $this->token->load('cities.campaigns');
        $this->assertEquals(1, $this->token->cities->first()->campaigns->count());

    }
}