ReplaceByVariablesTest.php 3.98 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 App\Models\Variable;
use App\Service\StrReplaceByVariables;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class ReplaceByVariablesTest extends TestCase
{
    use RefreshDatabase;

    private $user;
    private $token_main;
    private $token;
    private $campaign;
    private $dictionary;
    private $variable;
    private $variable_2;
    private $dictionaryCampaign;

    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->getKey()
        ]);

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

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

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

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

        $this->dictionaryCampaign = DictionaryCampaign::first();

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

        $this->dictionaryCampaign->refresh();

        $this->assertNull($this->dictionaryCampaign->updated_need);

        $this->actingAs($this->user)
            ->post(route('token.campaign.variable.add', [
                $this->token->id,
                $this->dictionary->getKey(),
                $this->campaign->id,
            ]), [
                'variable' => 'add',
                'name' => 'var',
                'default_value' => 'var value',
            ])
            ->assertStatus(302);

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

        $this->variable = Variable::first();

        $this->actingAs($this->user)
            ->post(route('token.campaign.variable.add', [
                $this->token->id,
                $this->dictionary->getKey(),
                $this->campaign->id,
            ]), [
                'variable' => 'add',
                'name' => 'vartwo',
                'default_value' => 'vartwo value',
            ])
            ->assertStatus(302);

        $this->assertEquals(2, Variable::count());

        $this->dictionaryCampaign->dictionaryCampaignVariables()->create([
            'variable_id' => $this->variable->getKey(),
            'value' => 'custom var value',
        ]);

        $this->dictionaryCampaign->refresh();

        $this->assertNotNull($this->dictionaryCampaign->updated_need);

    }

    public function testReplaceByVariables()
    {
        $this->assertEquals(2, Tokens::count());
        $this->assertEquals(1, Campaigns::count());
        $this->assertEquals(2, Variable::count());
        $this->assertEquals(1, $this->campaign->dictionaryCampaignVariables->count());

        $list = Variable::getListVariablesByDictionaryCampaign($this->dictionaryCampaign);

        $this->assertEquals('String "custom var value"', StrReplaceByVariables::getInstance('String "var"', $list)->get());
        $this->assertEquals('String "vartwo value"', StrReplaceByVariables::getInstance('String "vartwo"', $list)->get());

    }
}