NelmioApiDocBundle/Tests/Parser/ValidationParserTest.php
2024-06-18 13:29:17 +03:00

198 lines
6.2 KiB
PHP

<?php
/*
* This file is part of the NelmioApiDocBundle.
*
* (c) Nelmio <hello@nelm.io>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace NelmioApiDocBundle\Tests\Parser;
use Nelmio\ApiDocBundle\DataTypes;
use Nelmio\ApiDocBundle\Tests\WebTestCase;
use Nelmio\ApiDocBundle\Parser\ValidationParser;
use Nelmio\ApiDocBundle\Parser\ValidationParserLegacy;
use Symfony\Component\HttpKernel\Kernel;
class ValidationParserTest extends WebTestCase
{
protected $handler;
private ValidationParser $parser;
public function setUp(): void
{
$container = $this->getContainer();
if ($container->has('validator.mapping.class_metadata_factory')) {
$factory = $container->get('validator.mapping.class_metadata_factory');
} else {
$factory = $container->get('validator');
}
if (version_compare(Kernel::VERSION, '2.2.0', '<')) {
$this->parser = new ValidationParserLegacy($factory);
} else {
$this->parser = new ValidationParser($factory);
}
}
/**
* @dataProvider dataTestParser
*/
public function testParser($property, $expected)
{
$result = $this->parser->parse(array('class' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\ValidatorTest'));
foreach ($expected as $name => $value) {
$this->assertArrayHasKey($property, $result);
$this->assertArrayHasKey($name, $result[$property]);
$this->assertEquals($result[$property][$name], $expected[$name]);
}
}
public function dataTestParser()
{
return array(
array(
'property' => 'length10',
'expected' => array(
'format' => '{length: {min: 10}}',
'default' => 'validate this',
)
),
array(
'property' => 'length1to10',
'expected' => array(
'format' => '{length: {min: 1, max: 10}}',
'default' => null,
)
),
array(
'property' => 'notblank',
'expected' => array(
'required' => true,
'default' => null,
)
),
array(
'property' => 'notnull',
'expected' => array(
'required' => true,
'default' => null,
)
),
array(
'property' => 'type',
'expected' => array(
'dataType' => 'DateTime',
'actualType' => DataTypes::DATETIME,
'default' => null,
)
),
array(
'property' => 'date',
'expected' => array(
'format' => '{Date YYYY-MM-DD}',
'actualType' => DataTypes::DATE,
'default' => null,
)
),
array(
'property' => 'dateTime',
'expected' => array(
'format' => '{DateTime YYYY-MM-DD HH:MM:SS}',
'actualType' => DataTypes::DATETIME,
'default' => null,
)
),
array(
'property' => 'time',
'expected' => array(
'format' => '{Time HH:MM:SS}',
'actualType' => DataTypes::TIME,
'default' => null,
)
),
array(
'property' => 'email',
'expected' => array(
'format' => '{email address}',
'default' => null,
)
),
array(
'property' => 'url',
'expected' => array(
'format' => '{url}',
'default' => 'https://github.com',
)
),
array(
'property' => 'ip',
'expected' => array(
'format' => '{ip address}',
'default' => null,
)
),
array(
'property' => 'singlechoice',
'expected' => array(
'format' => '[a|b]',
'actualType' => DataTypes::ENUM,
'default' => null,
)
),
array(
'property' => 'multiplechoice',
'expected' => array(
'format' => '{choice of [x|y|z]}',
'actualType' => DataTypes::COLLECTION,
'subType' => DataTypes::ENUM,
'default' => null,
)
),
array(
'property' => 'multiplerangechoice',
'expected' => array(
'format' => '{min: 2 max: 3 choice of [bar|baz|foo|qux]}',
'actualType' => DataTypes::COLLECTION,
'subType' => DataTypes::ENUM,
'default' => null,
)
),
array(
'property' => 'regexmatch',
'expected' => array(
'format' => '{match: /^\d{1,4}\w{1,4}$/}',
'default' => null,
)
),
array(
'property' => 'regexnomatch',
'expected' => array(
'format' => '{not match: /\d/}',
'default' => null,
)
),
array(
'property' => 'multipleassertions',
'expected' => array(
'required' => true,
'dataType' => 'string',
'format' => '{email address}',
'default' => null,
)
),
array(
'property' => 'multipleformats',
'expected' => array(
'format' => '{url}, {length: {min: 10}}',
'default' => null,
)
)
);
}
}