annotate core/tests/Drupal/Tests/Component/Serialization/YamlTest.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Drupal\Tests\Component\Serialization;
Chris@0 4
Chris@0 5 use Drupal\Component\Serialization\Exception\InvalidDataTypeException;
Chris@0 6 use Drupal\Component\Serialization\SerializationInterface;
Chris@0 7 use Drupal\Component\Serialization\Yaml;
Chris@0 8 use Drupal\Component\Serialization\YamlPecl;
Chris@0 9 use Drupal\Component\Serialization\YamlSymfony;
Chris@0 10 use PHPUnit\Framework\TestCase;
Chris@0 11
Chris@0 12 /**
Chris@0 13 * @coversDefaultClass \Drupal\Component\Serialization\Yaml
Chris@0 14 * @group Serialization
Chris@0 15 */
Chris@0 16 class YamlTest extends TestCase {
Chris@0 17
Chris@0 18 /**
Chris@0 19 * @var \PHPUnit_Framework_MockObject_MockObject
Chris@0 20 */
Chris@0 21 protected $mockParser;
Chris@0 22
Chris@0 23 public function setUp() {
Chris@0 24 parent::setUp();
Chris@0 25 $this->mockParser = $this->getMockBuilder('\stdClass')
Chris@0 26 ->setMethods(['encode', 'decode', 'getFileExtension'])
Chris@0 27 ->getMock();
Chris@0 28 YamlParserProxy::setMock($this->mockParser);
Chris@0 29 }
Chris@0 30
Chris@0 31 public function tearDown() {
Chris@0 32 YamlParserProxy::setMock(NULL);
Chris@0 33 parent::tearDown();
Chris@0 34 }
Chris@0 35
Chris@0 36 /**
Chris@0 37 * @covers ::decode
Chris@0 38 */
Chris@0 39 public function testDecode() {
Chris@0 40 $this->mockParser
Chris@0 41 ->expects($this->once())
Chris@0 42 ->method('decode');
Chris@0 43 YamlStub::decode('test');
Chris@0 44 }
Chris@0 45
Chris@0 46 /**
Chris@0 47 * @covers ::getFileExtension
Chris@0 48 */
Chris@0 49 public function testGetFileExtension() {
Chris@0 50 $this->mockParser
Chris@0 51 ->expects($this->never())
Chris@0 52 ->method('getFileExtension');
Chris@0 53 $this->assertEquals('yml', YamlStub::getFileExtension());
Chris@0 54 }
Chris@0 55
Chris@0 56 /**
Chris@0 57 * Tests all YAML files are decoded in the same way with Symfony and PECL.
Chris@0 58 *
Chris@0 59 * This test is a little bit slow but it tests that we do not have any bugs in
Chris@0 60 * our YAML that might not be decoded correctly in any of our implementations.
Chris@0 61 *
Chris@0 62 * @todo This should exist as an integration test not part of our unit tests.
Chris@0 63 * https://www.drupal.org/node/2597730
Chris@0 64 *
Chris@0 65 * @requires extension yaml
Chris@0 66 * @dataProvider providerYamlFilesInCore
Chris@0 67 */
Chris@0 68 public function testYamlFiles($file) {
Chris@0 69 $data = file_get_contents($file);
Chris@0 70 try {
Chris@0 71 $this->assertEquals(YamlSymfony::decode($data), YamlPecl::decode($data), $file);
Chris@0 72 }
Chris@0 73 catch (InvalidDataTypeException $e) {
Chris@0 74 // Provide file context to the failure so the exception message is useful.
Chris@0 75 $this->fail("Exception thrown parsing $file:\n" . $e->getMessage());
Chris@0 76 }
Chris@0 77 }
Chris@0 78
Chris@0 79 /**
Chris@0 80 * Ensures that decoding php objects is similar for PECL and Symfony.
Chris@0 81 *
Chris@0 82 * @requires extension yaml
Chris@0 83 */
Chris@0 84 public function testObjectSupportDisabled() {
Chris@0 85 $object = new \stdClass();
Chris@0 86 $object->foo = 'bar';
Chris@0 87 // In core all Yaml encoding is done via Symfony and it does not support
Chris@0 88 // objects so in order to encode an object we hace to use the PECL
Chris@0 89 // extension.
Chris@0 90 // @see \Drupal\Component\Serialization\Yaml::encode()
Chris@0 91 $yaml = YamlPecl::encode([$object]);
Chris@0 92 $this->assertEquals(['O:8:"stdClass":1:{s:3:"foo";s:3:"bar";}'], YamlPecl::decode($yaml));
Chris@0 93 $this->assertEquals(['!php/object "O:8:\"stdClass\":1:{s:3:\"foo\";s:3:\"bar\";}"'], YamlSymfony::decode($yaml));
Chris@0 94 }
Chris@0 95
Chris@0 96 /**
Chris@0 97 * Data provider that lists all YAML files in core.
Chris@0 98 */
Chris@0 99 public function providerYamlFilesInCore() {
Chris@0 100 $files = [];
Chris@0 101 $dirs = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator(__DIR__ . '/../../../../../', \RecursiveDirectoryIterator::FOLLOW_SYMLINKS));
Chris@0 102 foreach ($dirs as $dir) {
Chris@0 103 $pathname = $dir->getPathname();
Chris@0 104 // Exclude vendor.
Chris@0 105 if ($dir->getExtension() == 'yml' && strpos($pathname, '/../../../../../vendor') === FALSE) {
Chris@0 106 if (strpos($dir->getRealPath(), 'invalid_file') !== FALSE) {
Chris@0 107 // There are some intentionally invalid files provided for testing
Chris@0 108 // library API behaviours, ignore them.
Chris@0 109 continue;
Chris@0 110 }
Chris@0 111 $files[] = [$dir->getRealPath()];
Chris@0 112 }
Chris@0 113 }
Chris@0 114 return $files;
Chris@0 115 }
Chris@0 116
Chris@0 117 }
Chris@0 118
Chris@0 119 class YamlStub extends Yaml {
Chris@0 120
Chris@0 121 public static function getSerializer() {
Chris@0 122 return '\Drupal\Tests\Component\Serialization\YamlParserProxy';
Chris@0 123 }
Chris@0 124
Chris@0 125 }
Chris@0 126
Chris@0 127 class YamlParserProxy implements SerializationInterface {
Chris@0 128
Chris@0 129 /**
Chris@0 130 * @var \Drupal\Component\Serialization\SerializationInterface
Chris@0 131 */
Chris@0 132 protected static $mock;
Chris@0 133
Chris@0 134 public static function setMock($mock) {
Chris@0 135 static::$mock = $mock;
Chris@0 136 }
Chris@0 137
Chris@0 138 public static function encode($data) {
Chris@0 139 return static::$mock->encode($data);
Chris@0 140 }
Chris@0 141
Chris@0 142 public static function decode($raw) {
Chris@0 143 return static::$mock->decode($raw);
Chris@0 144 }
Chris@0 145
Chris@0 146 public static function getFileExtension() {
Chris@0 147 return static::$mock->getFileExtension();
Chris@0 148 }
Chris@0 149
Chris@0 150 }