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