class YamlTest
Same name in this branch
- 9 core/tests/Drupal/Tests/Core/Serialization/YamlTest.php \Drupal\Tests\Core\Serialization\YamlTest
Same name in other branches
- 8.9.x core/tests/Drupal/Tests/Core/Serialization/YamlTest.php \Drupal\Tests\Core\Serialization\YamlTest
- 8.9.x core/tests/Drupal/Tests/Component/Serialization/YamlTest.php \Drupal\Tests\Component\Serialization\YamlTest
- 10 core/tests/Drupal/Tests/Component/Serialization/YamlTest.php \Drupal\Tests\Component\Serialization\YamlTest
- 11.x core/tests/Drupal/Tests/Component/Serialization/YamlTest.php \Drupal\Tests\Component\Serialization\YamlTest
@coversDefaultClass \Drupal\Component\Serialization\Yaml @group Serialization
Hierarchy
- class \Drupal\Tests\Component\Serialization\YamlTest extends \PHPUnit\Framework\TestCase
Expanded class hierarchy of YamlTest
File
-
core/
tests/ Drupal/ Tests/ Component/ Serialization/ YamlTest.php, line 16
Namespace
Drupal\Tests\Component\SerializationView source
class YamlTest extends TestCase {
/**
* @var \PHPUnit\Framework\MockObject\MockObject
*/
protected $mockParser;
/**
* {@inheritdoc}
*/
public function setUp() : void {
parent::setUp();
$this->mockParser = $this->getMockBuilder('\\stdClass')
->addMethods([
'encode',
'decode',
'getFileExtension',
])
->getMock();
YamlParserProxy::setMock($this->mockParser);
}
/**
* {@inheritdoc}
*/
public function tearDown() : void {
YamlParserProxy::setMock(NULL);
parent::tearDown();
}
/**
* @covers ::decode
*/
public function testDecode() {
$this->mockParser
->expects($this->once())
->method('decode');
YamlStub::decode('test');
}
/**
* @covers ::getFileExtension
*/
public function testGetFileExtension() {
$this->mockParser
->expects($this->never())
->method('getFileExtension');
$this->assertEquals('yml', YamlStub::getFileExtension());
}
/**
* Tests all YAML files are decoded in the same way with Symfony and PECL.
*
* This test is a little bit slow but it tests that we do not have any bugs in
* our YAML that might not be decoded correctly in any of our implementations.
*
* @todo This should exist as an integration test not part of our unit tests.
* https://www.drupal.org/node/2597730
*
* @requires extension yaml
* @dataProvider providerYamlFilesInCore
*/
public function testYamlFiles($file) {
$data = file_get_contents($file);
try {
$this->assertEquals(YamlSymfony::decode($data), YamlPecl::decode($data), $file);
} catch (InvalidDataTypeException $e) {
// Provide file context to the failure so the exception message is useful.
$this->fail("Exception thrown parsing {$file}:\n" . $e->getMessage());
}
}
/**
* Ensures that decoding php objects does not work in PECL.
*
* @requires extension yaml
*
* @see \Drupal\Tests\Component\Serialization\YamlTest::testObjectSupportDisabledSymfony()
*/
public function testObjectSupportDisabledPecl() {
$object = new \stdClass();
$object->foo = 'bar';
// In core all Yaml encoding is done via Symfony and it does not support
// objects so in order to encode an object we have to use the PECL
// extension.
// @see \Drupal\Component\Serialization\Yaml::encode()
$yaml = YamlPecl::encode([
$object,
]);
$this->assertEquals([
'O:8:"stdClass":1:{s:3:"foo";s:3:"bar";}',
], YamlPecl::decode($yaml));
}
/**
* Ensures that decoding php objects does not work in Symfony.
*
* @requires extension yaml
*
* @see \Drupal\Tests\Component\Serialization\YamlTest::testObjectSupportDisabledPecl()
*/
public function testObjectSupportDisabledSymfony() {
$this->expectException(InvalidDataTypeException::class);
$this->expectExceptionMessageMatches('/^Object support when parsing a YAML file has been disabled/');
$object = new \stdClass();
$object->foo = 'bar';
// In core all Yaml encoding is done via Symfony and it does not support
// objects so in order to encode an object we have to use the PECL
// extension.
// @see \Drupal\Component\Serialization\Yaml::encode()
$yaml = YamlPecl::encode([
$object,
]);
YamlSymfony::decode($yaml);
}
/**
* Data provider that lists all YAML files in core.
*/
public function providerYamlFilesInCore() {
$files = [];
$dirs = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator(__DIR__ . '/../../../../../', \RecursiveDirectoryIterator::FOLLOW_SYMLINKS));
foreach ($dirs as $dir) {
$pathname = $dir->getPathname();
// Exclude core/node_modules.
if ($dir->getExtension() == 'yml' && strpos($pathname, '/../../../../../node_modules') === FALSE) {
if (strpos($dir->getRealPath(), 'invalid_file') !== FALSE) {
// There are some intentionally invalid files provided for testing
// library API behaviors, ignore them.
continue;
}
$files[] = [
$dir->getRealPath(),
];
}
}
return $files;
}
}
Members
Title Sort descending | Modifiers | Object type | Summary |
---|---|---|---|
YamlTest::$mockParser | protected | property | |
YamlTest::providerYamlFilesInCore | public | function | Data provider that lists all YAML files in core. |
YamlTest::setUp | public | function | |
YamlTest::tearDown | public | function | |
YamlTest::testDecode | public | function | @covers ::decode |
YamlTest::testGetFileExtension | public | function | @covers ::getFileExtension |
YamlTest::testObjectSupportDisabledPecl | public | function | Ensures that decoding php objects does not work in PECL. |
YamlTest::testObjectSupportDisabledSymfony | public | function | Ensures that decoding php objects does not work in Symfony. |
YamlTest::testYamlFiles | public | function | Tests all YAML files are decoded in the same way with Symfony and PECL. |
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.