<?php

namespace tests\Unit\Domain\TemplateManagement;

use PHPUnit\Framework\TestCase;
use Infinito\Domain\TemplateManagement\ActionTemplateDataStoreServiceInterface;
use Infinito\Domain\TemplateManagement\ActionTemplateDataStoreService;
use Infinito\Exception\NoValidChoiceException;
use Infinito\Exception\NotSetException;
use Infinito\DBAL\Types\ActionType;
use Infinito\Exception\AllreadySetException;
use Infinito\Exception\NotCorrectInstanceException;

/**
 * @author kevinfrantz
 */
class ActionTemplateDataStoreServiceTest extends TestCase
{
    /**
     * @var ActionTemplateDataStoreServiceInterface
     */
    private $actionTemplateDataStoreService;

    /**
     * {@inheritdoc}
     *
     * @see \PHPUnit\Framework\TestCase::setUp()
     */
    public function setUp(): void
    {
        $this->actionTemplateDataStoreService = new ActionTemplateDataStoreService();
    }

    public function testNotValidChoiceSetException(): void
    {
        $this->expectException(NoValidChoiceException::class);
        $this->actionTemplateDataStoreService->setData('1231232N', ' ');
    }

    public function testNotCorrectInstanceSetException(): void
    {
        $this->expectException(NotCorrectInstanceException::class);
        $data = new class() {
        };
        $this->actionTemplateDataStoreService->setData(ActionType::READ, $data);
    }

    public function testNotValidChoiceGetException(): void
    {
        $this->expectException(NoValidChoiceException::class);
        $this->actionTemplateDataStoreService->getData('1231232N');
    }

    public function testNotSetGetException(): void
    {
        $this->expectException(NotSetException::class);
        $this->actionTemplateDataStoreService->getData(ActionType::READ);
    }

    public function testAccessors(): void
    {
        foreach (ActionType::getValues() as $actionType) {
            $instance = ActionTemplateDataStoreService::ACTION_DATA_MAPPING[$actionType];
            $data = $this->createMock($instance);
            $this->assertFalse($this->actionTemplateDataStoreService->isDataStored($actionType));
            $this->assertNull($this->actionTemplateDataStoreService->setData($actionType, $data));
            $this->assertTrue($this->actionTemplateDataStoreService->isDataStored($actionType));
            $this->assertEquals($data, $this->actionTemplateDataStoreService->getData($actionType));
        }
        $this->expectException(AllreadySetException::class);
        $this->assertNull($this->actionTemplateDataStoreService->setData($actionType, $data));
    }
}