<?php

namespace tests\Unit\Domain\ParameterManagement;

use PHPUnit\Framework\TestCase;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Infinito\Domain\ParameterManagement\OptionalGetParameterServiceInterface;
use Infinito\Domain\ParameterManagement\OptionalGetParameterService;
use Infinito\Exception\UnvalidParameterException;
use Infinito\Exception\NotDefinedException;

/**
 * @author kevinfrantz
 */
class OptionalGetParameterServiceTest extends TestCase
{
    /**
     * @var Request
     */
    private $currentRequest;

    /**
     * @var RequestStack
     */
    private $requestStack;

    /**
     * @var OptionalGetParameterServiceInterface
     */
    private $optionalGetParameterService;

    public function setUp(): void
    {
        $this->currentRequest = new Request();
        $this->requestStack = $this->createMock(RequestStack::class);
        $this->requestStack->method('getCurrentRequest')->willReturn($this->currentRequest);
        $this->optionalGetParameterService = new OptionalGetParameterService($this->requestStack);
    }

    public function testConstructor(): void
    {
        $this->expectException(UnvalidParameterException::class);
        $this->currentRequest->query->set('asdwgwe', 'adasa');
        new OptionalGetParameterService($this->requestStack);
    }

    public function testHasAndGetParameter(): void
    {
        foreach (OptionalGetParameterServiceInterface::OPTIONAL_PARAMETERS as $key) {
            $this->assertFalse($this->optionalGetParameterService->hasParameter($key));
            $this->currentRequest->query->set($key, 'adasa');
            $this->assertTrue($this->optionalGetParameterService->hasParameter($key));
            $this->assertEquals('adasa', $this->optionalGetParameterService->getParameter($key));
        }
        $this->expectException(UnvalidParameterException::class);
        $this->optionalGetParameterService->getParameter('12312312asdas');
    }

    public function testSetParameterException(): void
    {
        $this->expectException(NotDefinedException::class);
        $this->optionalGetParameterService->getParameter(OptionalGetParameterServiceInterface::VERSION_PARAMETER);
    }
}