chrisandchris/passive-record-orm

View on GitHub
src/ChrisAndChris/Common/RowMapperBundle/Tests/Services/Query/Parser/DefaultParserTest.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php
namespace ChrisAndChris\Common\RowMapperBundle\Tests\Services\Query\Parser;

use ChrisAndChris\Common\RowMapperBundle\Events\Transmitters\SnippetBagEvent;
use ChrisAndChris\Common\RowMapperBundle\Exceptions\MalformedQueryException;
use ChrisAndChris\Common\RowMapperBundle\Exceptions\MissingParameterException;
use ChrisAndChris\Common\RowMapperBundle\Services\Query\Parser\DefaultParser;
use ChrisAndChris\Common\RowMapperBundle\Services\Query\Parser\Snippets\MySqlBag;
use ChrisAndChris\Common\RowMapperBundle\Tests\TestKernel;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

/**
 * @name DefaultParserTest
 * @version   2
 * @since     v2.0.1
 * @package   RowMapperBundle
 * @author    ChrisAndChris
 * @link      https://github.com/chrisandchris
 */
class DefaultParserTest extends TestKernel {

    public function testSimpleExecute() {
        $parser = $this->getParser();
        $parser->setStatement(
            [
                [
                    'type'   => 'select',
                    'params' => [],
                ],
            ]
        );
        $parser->execute();
        $this->assertEquals('SELECT', $parser->getSqlQuery());
    }

    public function testExecute_MustClearPreviousData()
    {
        $parser = $this->getParser();
        $parser->setStatement([
            [
                'type'   => 'select',
                'params' => [],
            ],
        ]);
        // previously set mapping information
        $parser->mappingInfo = [
            'foo' => 'bar',
        ];
        $parser->execute();

        $this->assertEquals([], $parser->mappingInfo);
        $this->assertEquals([], $parser->getMappingInfo());
        $this->assertEquals('SELECT', $parser->getSqlQuery());
    }

    private function getParser() {
        /** @var EventDispatcherInterface $ed */
        $ed = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcher')
                   ->disableOriginalConstructor()
                   ->getMock();

        $event = new SnippetBagEvent();
        $event->add(new MySqlBag(), ['mysql']);

        $ed->method('dispatch')
           ->willReturn($event);

        return new DefaultParser($ed, 'mysql');
    }

    public function testOpenBraces() {
        $parser = $this->getParser();
        $parser->setStatement(
            [
                [
                    'type'   => 'select',
                    'params' => [],
                ],
                [
                    'type'   => 'brace',
                    'params' => [],
                ],
            ]
        );
        try {
            $parser->execute();
            $this->fail('Must fail due to open braces');
        } catch (MalformedQueryException $e) {
            // ignore
        }
    }

    public function testNotOpenedBraces() {
        $parser = $this->getParser();
        $parser->setStatement(
            [
                [
                    'type'   => 'select',
                    'params' => [],
                ],
                [
                    'type'   => 'close',
                    'params' => [],
                ],
            ]
        );
        try {
            $parser->execute();
            $this->fail('Must fail due to never opened braces');
        } catch (MalformedQueryException $e) {
            // ignore
        }
    }

    public function testNullParameters() {
        $parser = $this->getParser();
        $parser->setStatement(
            [
                [
                    'type' => 'value',
                ],
            ]
        );
        try {
            $parser->execute();
            $this->fail('Must fail due to missing parameter');
        } catch (MissingParameterException $e) {
            // ignore
        }

        $parser = $this->getParser();
        $parser->setStatement(
            [
                [
                    'type'   => 'value',
                    'params' => ['value' => 13],
                ],
            ]
        );
        // must not throw any exception
        $parser->execute();

        $parser = $this->getParser();
        $parser->setStatement(
            [
                [
                    'type'   => 'value',
                    'params' => ['value' => null],
                ],
            ]
        );
        // must not throw any exception
        $parser->execute();
    }
}