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