ILIAS  trunk Revision v11.0_alpha-1715-g7fc467680fb
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
ilXlsFoParserTest.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 {
26  private function verifyFoGeneratedFromXhtml(array $form_data, string $fo): void
27  {
28  $settings = $this->getMockBuilder(ilSetting::class)
29  ->disableOriginalConstructor()
30  ->getMock();
31  $settings->method('get')->willReturnArgument(0);
32 
33  $language = $this->getMockBuilder(ilLanguage::class)->disableOriginalConstructor()->onlyMethods(
34  ['txt']
35  )->getMock();
36  $language->method('txt')->willReturnArgument(0);
37 
38  $page_formats = new ilPageFormats($language);
39 
40  $util_helper = $this->getMockBuilder(ilCertificateUtilHelper::class)
41  ->disableOriginalConstructor()
42  ->getMock();
43 
44  $util_helper->method('stripSlashes')
45  ->willReturnArgument(0);
46 
47  $xmlChecker = new ilXMLChecker(new ILIAS\Data\Factory());
48  $xslt_process = new ilCertificateXlstProcess();
49 
50  $language = $this->getMockBuilder(ilLanguage::class)
51  ->disableOriginalConstructor()
52  ->getMock();
53 
54  $xsl_loader = new ilCertificateXlsFileLoader();
55 
56  $xlsFoParser = new ilXlsFoParser(
57  $settings,
58  $page_formats,
59  $xmlChecker,
60  $util_helper,
61  $xslt_process,
62  $language,
63  $xsl_loader
64  );
65 
66  $output = $xlsFoParser->parse($form_data);
67 
68  $this->assertSame($this->normalizeXml($fo), $this->normalizeXml($output));
69  }
70 
71  private function normalizeXml(string $xml): string
72  {
73  $xml = str_replace(["\n", "\r", "\t"], '', $xml);
74  $xml = preg_replace("/>(\s+)</", "><", $xml);
75  $xml = preg_replace('# {2,}#', ' ', $xml);
76  $xml = trim($xml);
77 
78  return $xml;
79  }
80 
81  public function testParseWithNonCustomPageFormatting(): void
82  {
83  $formData = [
84  'certificate_text' => '<xml> Some Context </xml>',
85  'margin_body' => [
86  'top' => '1cm',
87  'right' => '2cm',
88  'bottom' => '3cm',
89  'left' => '4cm'
90  ],
91  'pageformat' => 'a4'
92  ];
93 
94  $settings = $this->getMockBuilder(ilSetting::class)
95  ->disableOriginalConstructor()
96  ->getMock();
97 
98  $settings->method('get')
99  ->willReturn('Something');
100 
101  $pageFormats = $this->getMockBuilder(ilPageFormats::class)
102  ->disableOriginalConstructor()
103  ->getMock();
104 
105  $pageFormats->method('fetchPageFormats')
106  ->willReturn([
107  'a4' => [
108  'name' => 'A4',
109  'value' => 'a4',
110  'width' => '210mm',
111  'height' => '297mm'
112  ],
113  ]);
114 
115  $xmlChecker = new ilXMLChecker(new ILIAS\Data\Factory());
116 
117  $utilHelper = $this->getMockBuilder(ilCertificateUtilHelper::class)
118  ->disableOriginalConstructor()
119  ->getMock();
120 
121  $utilHelper->method('stripSlashes')
122  ->willReturnOnConsecutiveCalls(
123  '297mm',
124  '210mm',
125  '1cm',
126  '2cm',
127  '3cm',
128  '4cm'
129  );
130 
131  $xlstProcess = $this->getMockBuilder(ilCertificateXlstProcess::class)
132  ->getMock();
133 
134  $xlstProcess->method('process')
135  ->with(
136  [
137  '/_xml' => '<html><body><xml> Some Context </xml></body></html>',
138  '/_xsl' => '<xml>Some XLS Content</xml>'
139  ],
140  [
141  'pageheight' => '297mm',
142  'pagewidth' => '210mm',
143  'backgroundimage' => '[BACKGROUND_IMAGE]',
144  'marginbody' => '1cm 2cm 3cm 4cm'
145  ]
146  )
147  ->willReturn('Something Processed');
148 
149  $language = $this->getMockBuilder(ilLanguage::class)
150  ->disableOriginalConstructor()
151  ->getMock();
152 
153  $certificateXlsFileLoader = $this->getMockBuilder(ilCertificateXlsFileLoader::class)
154  ->getMock();
155 
156  $certificateXlsFileLoader->method('getXlsCertificateContent')
157  ->willReturn('<xml>Some XLS Content</xml>');
158 
159  $xlsFoParser = new ilXlsFoParser(
160  $settings,
161  $pageFormats,
162  $xmlChecker,
163  $utilHelper,
164  $xlstProcess,
165  $language,
166  $certificateXlsFileLoader
167  );
168 
169  $output = $xlsFoParser->parse($formData);
170 
171  $this->assertSame('Something Processed', $output);
172  }
173 
174  public function testParseButXmlCheckerFindsAnError(): never
175  {
176  $this->expectException(Exception::class);
177 
178  $formData = [
179  'certificate_text' => '<xml> Some Context <xml>',
180  'margin_body' => [
181  'top' => '1cm',
182  'right' => '2cm',
183  'bottom' => '3cm',
184  'left' => '4cm'
185  ],
186  'pageformat' => 'custom'
187  ];
188 
189  $settings = $this->getMockBuilder(ilSetting::class)
190  ->disableOriginalConstructor()
191  ->getMock();
192 
193  $settings->method('get')
194  ->willReturn('Something');
195 
196  $pageFormats = $this->getMockBuilder(ilPageFormats::class)
197  ->disableOriginalConstructor()
198  ->getMock();
199 
200  $pageFormats->method('fetchPageFormats')
201  ->willReturn([
202  'a4' => [
203  'name' => 'A4',
204  'value' => 'a4',
205  'width' => '210mm',
206  'height' => '297mm'
207  ],
208  ]);
209 
210  $xmlChecker = new ilXMLChecker(new ILIAS\Data\Factory());
211 
212  $utilHelper = $this->getMockBuilder(ilCertificateUtilHelper::class)
213  ->disableOriginalConstructor()
214  ->getMock();
215 
216  $xlstProcess = $this->getMockBuilder(ilCertificateXlstProcess::class)
217  ->getMock();
218 
219  $language = $this->getMockBuilder(ilLanguage::class)
220  ->disableOriginalConstructor()
221  ->onlyMethods(['txt'])
222  ->getMock();
223  $language->expects($this->once())->method('txt')->willReturn('certificate_not_well_formed');
224 
225  $certificateXlsFileLoader = $this->getMockBuilder(ilCertificateXlsFileLoader::class)
226  ->getMock();
227 
228  $certificateXlsFileLoader->method('getXlsCertificateContent')
229  ->willReturn('<xml>Some XLS Content</xml>');
230 
231  $xlsFoParser = new ilXlsFoParser(
232  $settings,
233  $pageFormats,
234  $xmlChecker,
235  $utilHelper,
236  $xlstProcess,
237  $language,
238  $certificateXlsFileLoader
239  );
240 
241  $xlsFoParser->parse($formData);
242 
243  $this->fail();
244  }
245 
246  public function testParseWithCustomPageFormatting(): void
247  {
248  $formData = [
249  'certificate_text' => '<xml> Some Context </xml>',
250  'margin_body' => [
251  'top' => '1cm',
252  'right' => '2cm',
253  'bottom' => '3cm',
254  'left' => '4cm'
255  ],
256  'pageformat' => 'custom',
257  'pagewidth' => '210mm',
258  'pageheight' => '297mm'
259  ];
260 
261  $settings = $this->getMockBuilder(ilSetting::class)
262  ->disableOriginalConstructor()
263  ->getMock();
264 
265  $settings->method('get')
266  ->willReturn('Something');
267 
268  $pageFormats = $this->getMockBuilder(ilPageFormats::class)
269  ->disableOriginalConstructor()
270  ->getMock();
271 
272  $pageFormats->method('fetchPageFormats')
273  ->willReturn([
274  'a4' => [
275  'name' => 'A4',
276  'value' => 'a4',
277  'width' => '210mm',
278  'height' => '297mm'
279  ],
280  ]);
281 
282  $xmlChecker = new ilXMLChecker(new ILIAS\Data\Factory());
283 
284  $utilHelper = $this->getMockBuilder(ilCertificateUtilHelper::class)
285  ->disableOriginalConstructor()
286  ->getMock();
287 
288  $utilHelper->method('stripSlashes')
289  ->willReturnOnConsecutiveCalls(
290  '297mm',
291  '210mm',
292  '1cm',
293  '2cm',
294  '3cm',
295  '4cm'
296  );
297 
298  $xlstProcess = $this->getMockBuilder(ilCertificateXlstProcess::class)
299  ->getMock();
300 
301  $xlstProcess->method('process')
302  ->with(
303  [
304  '/_xml' => '<html><body><xml> Some Context </xml></body></html>',
305  '/_xsl' => '<xml>Some XLS Content</xml>'
306  ],
307  [
308  'pageheight' => '297mm',
309  'pagewidth' => '210mm',
310  'backgroundimage' => '[BACKGROUND_IMAGE]',
311  'marginbody' => '1cm 2cm 3cm 4cm'
312  ]
313  )
314  ->willReturn('Something Processed');
315 
316  $language = $this->getMockBuilder(ilLanguage::class)
317  ->disableOriginalConstructor()
318  ->getMock();
319 
320  $certificateXlsFileLoader = $this->getMockBuilder(ilCertificateXlsFileLoader::class)
321  ->getMock();
322 
323  $certificateXlsFileLoader->method('getXlsCertificateContent')
324  ->willReturn('<xml>Some XLS Content</xml>');
325 
326  $xlsFoParser = new ilXlsFoParser(
327  $settings,
328  $pageFormats,
329  $xmlChecker,
330  $utilHelper,
331  $xlstProcess,
332  $language,
333  $certificateXlsFileLoader
334  );
335 
336  $output = $xlsFoParser->parse($formData);
337 
338  $this->assertSame('Something Processed', $output);
339  }
340 
342  {
343  $formData = [
344  'certificate_text' => '<xml> Some Context </xml>',
345  'margin_body' => [
346  'top' => '1cm',
347  'right' => '2cm',
348  'bottom' => '3cm',
349  'left' => '4cm'
350  ],
351  'pageformat' => 'custom',
352  'pagewidth' => '210mm',
353  'pageheight' => '297mm'
354  ];
355 
356  $settings = $this->getMockBuilder(ilSetting::class)
357  ->disableOriginalConstructor()
358  ->getMock();
359 
360  $settings->method('get')
361  ->willReturn('Something');
362 
363  $pageFormats = $this->getMockBuilder(ilPageFormats::class)
364  ->disableOriginalConstructor()
365  ->getMock();
366 
367  $pageFormats->method('fetchPageFormats')
368  ->willReturn([
369  'a4' => [
370  'name' => 'A4',
371  'value' => 'a4',
372  'width' => '21,0mm',
373  'height' => '29,7mm'
374  ],
375  ]);
376 
377  $xmlChecker = new ilXMLChecker(new ILIAS\Data\Factory());
378 
379  $utilHelper = $this->getMockBuilder(ilCertificateUtilHelper::class)
380  ->disableOriginalConstructor()
381  ->getMock();
382 
383  $utilHelper->method('stripSlashes')
384  ->willReturnOnConsecutiveCalls(
385  '29,7mm',
386  '21,0mm',
387  '1cm',
388  '2cm',
389  '3cm',
390  '4cm'
391  );
392 
393  $xlstProcess = $this->getMockBuilder(ilCertificateXlstProcess::class)
394  ->getMock();
395 
396  $xlstProcess->method('process')
397  ->with(
398  [
399  '/_xml' => '<html><body><xml> Some Context </xml></body></html>',
400  '/_xsl' => '<xml>Some XLS Content</xml>'
401  ],
402  [
403  'pageheight' => '29.7mm',
404  'pagewidth' => '21.0mm',
405  'backgroundimage' => '[BACKGROUND_IMAGE]',
406  'marginbody' => '1cm 2cm 3cm 4cm'
407  ]
408  )
409  ->willReturn('Something Processed');
410 
411  $language = $this->getMockBuilder(ilLanguage::class)
412  ->disableOriginalConstructor()
413  ->getMock();
414 
415  $certificateXlsFileLoader = $this->getMockBuilder(ilCertificateXlsFileLoader::class)
416  ->getMock();
417 
418  $certificateXlsFileLoader->method('getXlsCertificateContent')
419  ->willReturn('<xml>Some XLS Content</xml>');
420 
421  $xlsFoParser = new ilXlsFoParser(
422  $settings,
423  $pageFormats,
424  $xmlChecker,
425  $utilHelper,
426  $xlstProcess,
427  $language,
428  $certificateXlsFileLoader
429  );
430 
431  $output = $xlsFoParser->parse($formData);
432 
433  $this->assertSame('Something Processed', $output);
434  }
435 
437  {
438  $expected_fo_with_centered_block = <<<EOT
439 <?xml version="1.0"?>
440 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="rpc_pdf_font">
441  <fo:layout-master-set>
442  <fo:simple-page-master master-name="ILIAS_certificate" page-height="297mm" page-width="210mm">
443  <fo:region-body margin="1cm 2cm 3cm 4cm"/>
444  <fo:region-before region-name="background-image" extent="0"/>
445  </fo:simple-page-master>
446  </fo:layout-master-set>
447  <fo:page-sequence master-reference="ILIAS_certificate">
448  <fo:static-content flow-name="background-image">
449  <fo:block-container absolute-position="absolute" top="0cm" left="0cm" z-index="0">
450  <fo:block>
451  <fo:external-graphic src="url([BACKGROUND_IMAGE])" content-height="297mm" content-width="210mm"/>
452  </fo:block>
453  </fo:block-container>
454  </fo:static-content>
455  <fo:flow flow-name="xsl-region-body">
456  <fo:block>
457  <fo:block text-align="center">&#160;</fo:block>
458  </fo:block>
459  </fo:flow>
460  </fo:page-sequence>
461 </fo:root>
462 EOT;
463 
464  yield 'Centered Paragraph' => [
465  [
466  'certificate_text' => '<p style="text-align: center;"></p>',
467  'margin_body' => [
468  'top' => '1cm',
469  'right' => '2cm',
470  'bottom' => '3cm',
471  'left' => '4cm'
472  ],
473  'pageformat' => 'custom',
474  'pagewidth' => '210mm',
475  'pageheight' => '297mm'
476  ],
477  $expected_fo_with_centered_block
478  ];
479 
480  $expected_fo_with_centered_block = <<<EOT
481 <?xml version="1.0"?>
482 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="rpc_pdf_font">
483  <fo:layout-master-set>
484  <fo:simple-page-master master-name="ILIAS_certificate" page-height="297mm" page-width="210mm">
485  <fo:region-body margin="1cm 2cm 3cm 4cm"/>
486  <fo:region-before region-name="background-image" extent="0"/>
487  </fo:simple-page-master>
488  </fo:layout-master-set>
489  <fo:page-sequence master-reference="ILIAS_certificate">
490  <fo:static-content flow-name="background-image">
491  <fo:block-container absolute-position="absolute" top="0cm" left="0cm" z-index="0">
492  <fo:block>
493  <fo:external-graphic src="url([BACKGROUND_IMAGE])" content-height="297mm" content-width="210mm"/>
494  </fo:block>
495  </fo:block-container>
496  </fo:static-content>
497  <fo:flow flow-name="xsl-region-body">
498  <fo:block>
499  <fo:block>&#160;</fo:block>
500  </fo:block>
501  </fo:flow>
502  </fo:page-sequence>
503 </fo:root>
504 EOT;
505 
506  yield 'Empty paragraph' => [
507  [
508  'certificate_text' => '<p></p>',
509  'margin_body' => [
510  'top' => '1cm',
511  'right' => '2cm',
512  'bottom' => '3cm',
513  'left' => '4cm'
514  ],
515  'pageformat' => 'custom',
516  'pagewidth' => '210mm',
517  'pageheight' => '297mm'
518  ],
519  $expected_fo_with_centered_block
520  ];
521  }
522 
528  array $form_data,
529  string $fo
530  ): void {
531  $this->verifyFoGeneratedFromXhtml($form_data, $fo);
532  }
533 
535  {
536  $expected_fo_with_centered_block = <<<EOT
537 <?xml version="1.0"?>
538 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="rpc_pdf_font">
539  <fo:layout-master-set>
540  <fo:simple-page-master master-name="ILIAS_certificate" page-height="297mm" page-width="210mm">
541  <fo:region-body margin="1cm 2cm 3cm 4cm"/>
542  <fo:region-before region-name="background-image" extent="0"/>
543  </fo:simple-page-master>
544  </fo:layout-master-set>
545  <fo:page-sequence master-reference="ILIAS_certificate">
546  <fo:static-content flow-name="background-image">
547  <fo:block-container absolute-position="absolute" top="0cm" left="0cm" z-index="0">
548  <fo:block>
549  <fo:external-graphic src="url([BACKGROUND_IMAGE])" content-height="297mm" content-width="210mm"/>
550  </fo:block>
551  </fo:block-container>
552  </fo:static-content>
553  <fo:flow flow-name="xsl-region-body">
554  <fo:block>
555  <fo:block>[USER_FULLNAME]</fo:block>
556  </fo:block>
557  </fo:flow>
558  </fo:page-sequence>
559 </fo:root>
560 EOT;
561 
562  yield 'Paragraph with Text' => [
563  [
564  'certificate_text' => '<p>[USER_FULLNAME]</p>',
565  'margin_body' => [
566  'top' => '1cm',
567  'right' => '2cm',
568  'bottom' => '3cm',
569  'left' => '4cm'
570  ],
571  'pageformat' => 'custom',
572  'pagewidth' => '210mm',
573  'pageheight' => '297mm'
574  ],
575  $expected_fo_with_centered_block
576  ];
577 
578  $expected_fo_with_centered_block = <<<EOT
579 <?xml version="1.0"?>
580 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="rpc_pdf_font">
581  <fo:layout-master-set>
582  <fo:simple-page-master master-name="ILIAS_certificate" page-height="297mm" page-width="210mm">
583  <fo:region-body margin="1cm 2cm 3cm 4cm"/>
584  <fo:region-before region-name="background-image" extent="0"/>
585  </fo:simple-page-master>
586  </fo:layout-master-set>
587  <fo:page-sequence master-reference="ILIAS_certificate">
588  <fo:static-content flow-name="background-image">
589  <fo:block-container absolute-position="absolute" top="0cm" left="0cm" z-index="0">
590  <fo:block>
591  <fo:external-graphic src="url([BACKGROUND_IMAGE])" content-height="297mm" content-width="210mm"/>
592  </fo:block>
593  </fo:block-container>
594  </fo:static-content>
595  <fo:flow flow-name="xsl-region-body">
596  <fo:block>
597  <fo:block><fo:inline font-size="24pt">[USER_FULLNAME]</fo:inline></fo:block>
598  </fo:block>
599  </fo:flow>
600  </fo:page-sequence>
601 </fo:root>
602 EOT;
603 
604  yield 'Paragraph with Nodes' => [
605  [
606  'certificate_text' => '<p><span style="font-size: 24pt;">[USER_FULLNAME]</span></p>',
607  'margin_body' => [
608  'top' => '1cm',
609  'right' => '2cm',
610  'bottom' => '3cm',
611  'left' => '4cm'
612  ],
613  'pageformat' => 'custom',
614  'pagewidth' => '210mm',
615  'pageheight' => '297mm'
616  ],
617  $expected_fo_with_centered_block
618  ];
619  }
620 
626  array $form_data,
627  string $fo
628  ): void {
629  $this->verifyFoGeneratedFromXhtml($form_data, $fo);
630  }
631 }
simple()
description: > This example show how the UI-Elements itself looks like.
Definition: simple.php:37
Interface Observer Contains several chained tasks and infos about them.
static noNonBreakingSpaceIsAddedDataProvider()
testTransformingParagraphsWithNoTextAndNoChildrenResultsInNonBreakingSpaceXslFoBlock(array $form_data, string $fo)
nonBreakingSpaceIsAddedDataProvider
testCommasWillBeConvertedToPointInDecimalSepartor()
Class ilCertificateBaseTestCase.
testTransformingParagraphsWithTextOrChildrenResultsNotInNonBreakingSpaceXslFoBlock(array $form_data, string $fo)
noNonBreakingSpaceIsAddedDataProvider
normalizeXml(string $xml)
static nonBreakingSpaceIsAddedDataProvider()
verifyFoGeneratedFromXhtml(array $form_data, string $fo)