PageRenderTime 48ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/FluentDOMTest.php

http://github.com/ThomasWeinert/FluentDOM
PHP | 326 lines | 199 code | 24 blank | 103 comment | 0 complexity | ec87f776e53c9c800fdf5d1cbeb1e4d2 MD5 | raw file
  1. <?php
  2. /*
  3. * FluentDOM
  4. *
  5. * @link https://thomas.weinert.info/FluentDOM/
  6. * @copyright Copyright 2009-2021 FluentDOM Contributors
  7. * @license http://www.opensource.org/licenses/mit-license.php The MIT License
  8. *
  9. */
  10. use FluentDOM\DOM\Document;
  11. use FluentDOM\Exceptions\NoSerializer;
  12. use FluentDOM\Loadable;
  13. use FluentDOM\Loader\Result as LoaderResult;
  14. use FluentDOM\TestCase;
  15. use FluentDOM\Xpath\Transformer as XpathTransformer;
  16. require_once __DIR__.'/FluentDOM/TestCase.php';
  17. class FluentDOMTest extends TestCase {
  18. /**
  19. * @group FactoryFunctions
  20. * @covers FluentDOM
  21. */
  22. public function testQueryWithNode(): void {
  23. $document = new DOMDocument();
  24. $document->appendChild($document->createElement('test'));
  25. $query = FluentDOM::Query($document->documentElement);
  26. $this->assertCount(1, $query);
  27. $this->assertXmlStringEqualsXmlString("<?xml version=\"1.0\"?>\n<test/>\n", (string)$query);
  28. }
  29. /**
  30. * @group FactoryFunctions
  31. * @covers FluentDOM
  32. */
  33. public function testCreator(): void {
  34. $write = FluentDOM::create();
  35. $this->assertXmlStringEqualsXmlString(
  36. "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<test/>\n",
  37. (string)$write('test')
  38. );
  39. }
  40. /**
  41. * @group FactoryFunctions
  42. * @covers FluentDOM
  43. */
  44. public function testCreatorWithArguments(): void {
  45. $write = FluentDOM::create('2.0', 'ASCII');
  46. $this->assertEquals(
  47. "<?xml version=\"2.0\" encoding=\"ASCII\"?>\n<test/>\n",
  48. (string)$write('test')
  49. );
  50. }
  51. /**
  52. * @group FactoryFunctions
  53. * @covers FluentDOM
  54. */
  55. public function testLoadWithDefaultLoader(): void {
  56. FluentDOM::setLoader(NULL);
  57. $document = FluentDOM::load('<foo/>');
  58. $this->assertXmlStringEqualsXmlString('<foo/>', $document->saveXml());
  59. }
  60. /**
  61. * @group FactoryFunctions
  62. * @covers FluentDOM
  63. */
  64. public function testLoadWithDefinedLoader(): void {
  65. $result = new LoaderResult(
  66. $document = new Document(),
  67. 'type'
  68. );
  69. $loader = $this->createMock(Loadable::class);
  70. $loader
  71. ->expects($this->once())
  72. ->method('load')
  73. ->with('source', 'type')
  74. ->willReturn($result);
  75. FluentDOM::setLoader($loader);
  76. $this->assertSame(
  77. $document,
  78. FluentDOM::load('source', 'type')
  79. );
  80. }
  81. /**
  82. * @group FactoryFunctions
  83. * @covers FluentDOM
  84. */
  85. public function testSetLoaderWithInvalidObject(): void {
  86. $this->expectException(TypeError::class);
  87. /** @noinspection PhpParamsInspection */
  88. FluentDOM::setLoader(new stdClass());
  89. }
  90. /**
  91. * @group FactoryFunctions
  92. * @group Plugins
  93. * @covers FluentDOM
  94. */
  95. public function testRegisterLoader(): void {
  96. $document = new Document();
  97. $document->loadXML('<success/>');
  98. $mockLoader = $this->createMock(Loadable::class);
  99. $mockLoader
  100. ->method('supports')
  101. ->willReturn(TRUE);
  102. $mockLoader
  103. ->method('load')
  104. ->with('test.xml', 'mock/loader')
  105. ->willReturn(new LoaderResult($document, 'mock/loader'));
  106. FluentDOM::registerLoader($mockLoader);
  107. $this->assertEquals(
  108. $document,
  109. FluentDOM::load('test.xml', "mock/loader")
  110. );
  111. }
  112. /**
  113. * @group FactoryFunctions
  114. * @group Plugins
  115. * @covers FluentDOM
  116. */
  117. public function testRegisterLoaderWithContentTypes(): void {
  118. $document = new Document();
  119. $document->loadXML('<success/>');
  120. $mockLoader = $this->createMock(Loadable::class);
  121. $mockLoader
  122. ->method('supports')
  123. ->willReturn(TRUE);
  124. $mockLoader
  125. ->method('load')
  126. ->with('test.xml', 'two')
  127. ->willReturn(new LoaderResult($document, ''));
  128. FluentDOM::registerLoader($mockLoader, 'one', 'two');
  129. $this->assertEquals(
  130. $document,
  131. FluentDOM::load('test.xml', "two")
  132. );
  133. }
  134. /**
  135. * @group FactoryFunctions
  136. * @group Plugins
  137. * @covers FluentDOM
  138. */
  139. public function testRegisterLoaderWithCallable(): void {
  140. $document = new Document();
  141. $document->loadXML('<success/>');
  142. $mockLoader = $this->createMock(Loadable::class);
  143. $mockLoader
  144. ->method('supports')
  145. ->willReturn(TRUE);
  146. $mockLoader
  147. ->method('load')
  148. ->with('test.xml', 'some/type')
  149. ->willReturn(new LoaderResult($document, ''));
  150. FluentDOM::registerLoader(function() use ($mockLoader) { return $mockLoader; });
  151. $this->assertEquals(
  152. $document,
  153. FluentDOM::load('test.xml', 'some/type')
  154. );
  155. }
  156. /**
  157. * @group FactoryFunctions
  158. * @group Plugins
  159. * @covers FluentDOM
  160. */
  161. public function testGetXPathTransformerAfterRegister(): void {
  162. $transformer = $this->createMock(FluentDOM\Xpath\Transformer::class);
  163. FluentDOM::registerXpathTransformer($transformer, TRUE);
  164. $this->assertSame(
  165. $transformer,
  166. FluentDOM::getXPathTransformer()
  167. );
  168. }
  169. /**
  170. * @group FactoryFunctions
  171. * @group Plugins
  172. * @covers FluentDOM
  173. */
  174. public function testGetXPathTransformerAfterRegisterWithCallback(): void {
  175. $transformer = $this->createMock(XpathTransformer::class);
  176. FluentDOM::registerXpathTransformer(
  177. function() use ($transformer) {
  178. return $transformer;
  179. },
  180. TRUE
  181. );
  182. $this->assertSame(
  183. $transformer,
  184. FluentDOM::getXPathTransformer()
  185. );
  186. }
  187. /**
  188. * @group FactoryFunctions
  189. * @group Plugins
  190. * @covers FluentDOM
  191. */
  192. public function testGetXPathTransformerAfterRegisterWithClassName(): void {
  193. FluentDOM::registerXpathTransformer(
  194. FluentDOMXpathTransformer_TestProxy::class,
  195. TRUE
  196. );
  197. $this->assertInstanceOf(
  198. FluentDOMXpathTransformer_TestProxy::class,
  199. FluentDOM::getXPathTransformer()
  200. );
  201. }
  202. /**
  203. * @group FactoryFunctions
  204. * @group Plugins
  205. * @covers FluentDOM
  206. */
  207. public function testGetXPathTransformerExpectingException(): void {
  208. FluentDOM::registerXpathTransformer('', TRUE);
  209. $this->expectException(\LogicException::class);
  210. $this->expectExceptionMessage('No CSS selector support installed');
  211. FluentDOM::getXPathTransformer();
  212. }
  213. /**
  214. * @group FactoryFunction
  215. * @group Plugins
  216. * @covers FluentDOM
  217. */
  218. public function testRegisterSerializerFactory(): void {
  219. $factory = static function() {};
  220. FluentDOM::registerSerializerFactory($factory, 'example/type');
  221. $this->assertSame($factory, FluentDOM::getSerializerFactories()['example/type']);
  222. }
  223. /**
  224. * @group FactoryFunction
  225. * @group Plugins
  226. * @covers FluentDOM
  227. */
  228. public function testGetSerializerFactories(): void {
  229. $document = new Document();
  230. $serializers = FluentDOM::getSerializerFactories();
  231. $this->assertInstanceOf(FluentDOM\Serializer\Xml::class, $serializers->createSerializer($document, 'xml'));
  232. $this->assertInstanceOf(FluentDOM\Serializer\Html::class, $serializers->createSerializer($document, 'html'));
  233. $this->assertInstanceOf(FluentDOM\Serializer\Json::class, $serializers->createSerializer($document, 'json'));
  234. }
  235. /**
  236. * @group FactoryFunction
  237. * @group Plugins
  238. * @covers FluentDOM
  239. */
  240. public function testSave(): void {
  241. $document = new Document();
  242. $document->appendElement('foo');
  243. $this->assertXmlStringEqualsXmlString(
  244. '<foo/>', FluentDOM::save($document)
  245. );
  246. }
  247. /**
  248. * @group FactoryFunction
  249. * @group Plugins
  250. * @covers FluentDOM
  251. */
  252. public function testSaveWithChildNode(): void {
  253. $document = new Document();
  254. $document->appendElement('foo')->appendElement('bar');
  255. $this->assertXmlStringEqualsXmlString(
  256. '<bar/>', FluentDOM::save($document->documentElement->firstChild)
  257. );
  258. }
  259. /**
  260. * @group FactoryFunction
  261. * @group Plugins
  262. * @covers FluentDOM
  263. */
  264. public function testSaveWithQueryObject(): void {
  265. $document = new Document();
  266. $document->appendElement('foo');
  267. $this->assertXmlStringEqualsXmlString(
  268. '<foo/>', FluentDOM::save(FluentDOM($document->documentElement))
  269. );
  270. }
  271. /**
  272. * @group FactoryFunction
  273. * @group Plugins
  274. * @covers FluentDOM
  275. */
  276. public function testSaveWithContentTypeHTML(): void {
  277. $document = new Document();
  278. $document->appendElement('input');
  279. $this->assertEquals(
  280. "<input>\n", FluentDOM::save($document, 'text/html')
  281. );
  282. }
  283. /**
  284. * @group FactoryFunction
  285. * @group Plugins
  286. * @covers FluentDOM
  287. */
  288. public function testSaveWithInvalidContentType(): void {
  289. $this->expectException(NoSerializer::class);
  290. $this->assertEquals(
  291. "<input>\n", FluentDOM::save(new Document(), 'type/invalid')
  292. );
  293. }
  294. }
  295. class FluentDOMXpathTransformer_TestProxy implements XpathTransformer {
  296. public function toXpath(
  297. string $selector,
  298. int $contextMode = FluentDOM\Xpath\Transformer::CONTEXT_CHILDREN,
  299. bool $isHtml = false):string {
  300. return '';
  301. }
  302. }