ILIAS  trunk Revision v12.0_alpha-377-g3641b37b9db
WriterTest.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22
23use PHPUnit\Framework\TestCase;
30
31class WriterTest extends TestCase
32{
33 protected function getURI(string $string): URI
34 {
35 $url = $this->createMock(URI::class);
36 $url->method('__toString')->willReturn($string);
37 return $url;
38 }
39
43 protected function getRequest(
44 string $base_url,
45 Verb $verb,
46 Argument ...$arguments,
47 ): RequestInterface {
48 $base_url = $this->getURI($base_url);
49
50 return new class ($base_url, $verb, $arguments) extends NullRequest {
51 public function __construct(
52 protected URI $base_url,
53 protected Verb $verb,
54 protected array $arguments
55 ) {
56 }
57
58 public function baseURL(): URI
59 {
60 return $this->base_url;
61 }
62
63 public function verb(): Verb
64 {
65 return $this->verb;
66 }
67
68 public function argumentKeys(): \Generator
69 {
70 yield from $this->arguments;
71 }
72
73 public function argumentValue(Argument $argument): string
74 {
75 if (in_array($argument, $this->arguments)) {
76 return $argument->value . '_val';
77 }
78 return '';
79 }
80 };
81 }
82
83 protected function getWriter(string $current_time = '@0'): Writer
84 {
85 return new class ($current_time) extends Writer {
86 public function __construct(protected string $current_time)
87 {
88 }
89
90 protected function getCurrentDateTime(): \DateTimeImmutable
91 {
92 return new \DateTimeImmutable($this->current_time, new \DateTimeZone('UTC'));
93 }
94 };
95 }
96
97 public function testWriteError(): void
98 {
99 $expected_xml = <<<XML
100 <error code="badVerb">some message</error>
101 XML;
102
103 $writer = $this->getWriter();
104 $xml = $writer->writeError(Error::BAD_VERB, 'some message');
105
106 $this->assertXmlStringEqualsXmlString($expected_xml, $xml->saveXML());
107 }
108
109 public function testWriteIdentifyElementsOneAdmin(): void
110 {
111 $expected_xmls = [
112 <<<XML
113 <repositoryName>my repository</repositoryName>
114 XML,
115 <<<XML
116 <baseURL>http://www.my.org/test/repository</baseURL>
117 XML,
118 <<<XML
119 <protocolVersion>2.0</protocolVersion>
120 XML,
121 <<<XML
122 <earliestDatestamp>2017-11-04</earliestDatestamp>
123 XML,
124 <<<XML
125 <deletedRecord>transient</deletedRecord>
126 XML,
127 <<<XML
128 <granularity>YYYY-MM-DD</granularity>
129 XML,
130 <<<XML
131 <adminEmail>somemail@my.org</adminEmail>
132 XML
133 ];
134
135 $writer = $this->getWriter();
136 $xmls = $writer->writeIdentifyElements(
137 'my repository',
138 $this->getURI('http://www.my.org/test/repository'),
139 new \DateTimeImmutable('2017-11-04', new \DateTimeZone('UTC')),
140 'somemail@my.org'
141 );
142
143 $index = 0;
144 foreach ($xmls as $xml) {
145 if ($index < count($expected_xmls)) {
146 $this->assertXmlStringEqualsXmlString($expected_xmls[$index], $xml->saveXML());
147 }
148 $index++;
149 }
150 $this->assertSame(count($expected_xmls), $index);
151 }
152 public function testWriteIdentifyElementsMultipleAdmins(): void
153 {
154 $expected_xmls = [
155 <<<XML
156 <repositoryName>my repository</repositoryName>
157 XML,
158 <<<XML
159 <baseURL>http://www.my.org/test/repository</baseURL>
160 XML,
161 <<<XML
162 <protocolVersion>2.0</protocolVersion>
163 XML,
164 <<<XML
165 <earliestDatestamp>2017-11-04</earliestDatestamp>
166 XML,
167 <<<XML
168 <deletedRecord>transient</deletedRecord>
169 XML,
170 <<<XML
171 <granularity>YYYY-MM-DD</granularity>
172 XML,
173 <<<XML
174 <adminEmail>somemail@my.org</adminEmail>
175 XML,
176 <<<XML
177 <adminEmail>othermail@my.org</adminEmail>
178 XML,
179 <<<XML
180 <adminEmail>thirdmail@my.org</adminEmail>
181 XML
182 ];
183
184 $writer = $this->getWriter();
185 $xmls = $writer->writeIdentifyElements(
186 'my repository',
187 $this->getURI('http://www.my.org/test/repository'),
188 new \DateTimeImmutable('2017-11-04', new \DateTimeZone('UTC')),
189 'somemail@my.org',
190 'othermail@my.org',
191 'thirdmail@my.org'
192 );
193
194 $index = 0;
195 foreach ($xmls as $xml) {
196 if ($index < count($expected_xmls)) {
197 $this->assertXmlStringEqualsXmlString($expected_xmls[$index], $xml->saveXML());
198 }
199 $index++;
200 }
201 $this->assertSame(count($expected_xmls), $index);
202 }
203
204
205 public function testWriteMetadataFormat(): void
206 {
207 $expected_xml = <<<XML
208 <metadataFormat>
209 <metadataPrefix>oai_dc</metadataPrefix>
210 <schema>http://www.openarchives.org/OAI/2.0/oai_dc.xsd</schema>
211 <metadataNamespace>http://www.openarchives.org/OAI/2.0/oai_dc/</metadataNamespace>
212 </metadataFormat>
213 XML;
214
215 $writer = $this->getWriter();
216 $xml = $writer->writeMetadataFormat();
217
218 $this->assertXmlStringEqualsXmlString($expected_xml, $xml->saveXML());
219 }
220
221 public function testWriteRecordHeader(): void
222 {
223 $expected_xml = <<<XML
224 <header>
225 <identifier>id_en:ti/fier</identifier>
226 <datestamp>2013-05-30</datestamp>
227 </header>
228 XML;
229
230 $writer = $this->getWriter();
231 $xml = $writer->writeRecordHeader(
232 'id_en:ti/fier',
233 new \DateTimeImmutable('2013-05-30', new \DateTimeZone('UTC'))
234 );
235
236 $this->assertXmlStringEqualsXmlString($expected_xml, $xml->saveXML());
237 }
238
239 public function testWriteRecordHeaderWithDeletedStatus(): void
240 {
241 $expected_xml = <<<XML
242 <header status="deleted">
243 <identifier>id_en:ti/fier</identifier>
244 <datestamp>2013-05-30</datestamp>
245 </header>
246 XML;
247
248 $writer = $this->getWriter();
249 $xml = $writer->writeRecordHeader(
250 'id_en:ti/fier',
251 new \DateTimeImmutable('2013-05-30', new \DateTimeZone('UTC')),
252 true
253 );
254
255 $this->assertXmlStringEqualsXmlString($expected_xml, $xml->saveXML());
256 }
257
258 public function testWriteRecord(): void
259 {
260 $md_xml = <<<XML
261 <some>
262 <meta>data</meta>
263 <creator importance="very" >me!</creator>
264 </some>
265 XML;
266
267 $header_xml = <<<XML
268 <header>
269 <identifier>id_en:ti/fier</identifier>
270 <datestamp>2013-05-30</datestamp>
271 </header>
272 XML;
273
274 $expected_xml = '<record>' . $header_xml . '<metadata>' . $md_xml . '</metadata></record>';
275 $md_doc = new \DomDocument();
276 $md_doc->loadXML($md_xml);
277
278 $writer = $this->getWriter();
279 $xml = $writer->writeRecord(
280 'id_en:ti/fier',
281 new \DateTimeImmutable('2013-05-30', new \DateTimeZone('UTC')),
282 $md_doc
283 );
284
285 $this->assertXmlStringEqualsXmlString($expected_xml, $xml->saveXML());
286 }
287
288 public function testWriteDeletedRecord(): void
289 {
290 $header_xml = <<<XML
291 <header status="deleted">
292 <identifier>id_en:ti/fier</identifier>
293 <datestamp>2013-05-30</datestamp>
294 </header>
295 XML;
296
297 $expected_xml = '<record>' . $header_xml . '</record>';
298
299 $writer = $this->getWriter();
300 $xml = $writer->writeDeletedRecord(
301 'id_en:ti/fier',
302 new \DateTimeImmutable('2013-05-30', new \DateTimeZone('UTC'))
303 );
304
305 $this->assertXmlStringEqualsXmlString($expected_xml, $xml->saveXML());
306 }
307
308 public function testWriteSet(): void
309 {
310 $expected_xml = <<<XML
311 <set>
312 <setSpec>some spec</setSpec>
313 <setName>some name</setName>
314 </set>
315 XML;
316
317 $writer = $this->getWriter();
318 $xml = $writer->writeSet(
319 'some spec',
320 'some name'
321 );
322
323 $this->assertXmlStringEqualsXmlString($expected_xml, $xml->saveXML());
324 }
325
326 public function testWriteResumptionToken(): void
327 {
328 $expected_xml = <<<XML
329 <resumptionToken completeListSize="1234" cursor="56">some token</resumptionToken>
330 XML;
331
332 $writer = $this->getWriter();
333 $xml = $writer->writeResumptionToken('some token', 1234, 56);
334
335 $this->assertXmlStringEqualsXmlString($expected_xml, $xml->saveXML());
336 }
337
338
339 public function testWriteResponse(): void
340 {
341 $content1_xml = <<<XML
342 <some>
343 <con>tent</con>
344 </some>
345 XML;
346
347 $content2_xml = <<<XML
348 <different>
349 <bits>and</bits>
350 <bobs variety="much"/>
351 </different>
352 XML;
353
354 $expected_xml_start = <<<XML
355 <?xml version="1.0" encoding="UTF-8" ?>
356 <OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/"
357 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
358 xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
359 <responseDate>2018-08-21T02:30:35Z</responseDate>
360 <request verb="GetRecord" identifier="identifier_val"
361 metadataPrefix="metadataPrefix_val">http://www.my.org/test/repository</request>
362 <GetRecord>
363 XML;
364
365 $expected_xml_end = <<<XML
366 </GetRecord>
367 </OAI-PMH>
368 XML;
369
370 $expected_xml = $expected_xml_start . $content1_xml . $content2_xml . $expected_xml_end;
371 $content1_doc = new \DomDocument();
372 $content1_doc->loadXML($content1_xml);
373 $content2_doc = new \DomDocument();
374 $content2_doc->loadXML($content2_xml);
375 $request = $this->getRequest(
376 'http://www.my.org/test/repository',
377 Verb::GET_RECORD,
378 Argument::IDENTIFIER,
379 Argument::MD_PREFIX
380 );
381 $writer = $this->getWriter('2018-08-21T02:30:35Z');
382 $xml = $writer->writeResponse($request, $content1_doc, $content2_doc);
383
384 $this->assertXmlStringEqualsXmlString($expected_xml, $xml->saveXML());
385 }
386
387 public function testWriteErrorResponse(): void
388 {
389 $content1_xml = <<<XML
390 <some>
391 <con>tent</con>
392 </some>
393 XML;
394
395 $content2_xml = <<<XML
396 <different>
397 <bits>and</bits>
398 <bobs variety="much"/>
399 </different>
400 XML;
401
402 $expected_xml_start = <<<XML
403 <?xml version="1.0" encoding="UTF-8" ?>
404 <OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/"
405 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
406 xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
407 <responseDate>2018-08-21T02:30:35Z</responseDate>
408 <request verb="ListIdentifiers" identifier="identifier_val"
409 metadataPrefix="metadataPrefix_val">http://www.my.org/test/repository</request>
410 XML;
411
412 $expected_xml_end = <<<XML
413 </OAI-PMH>
414 XML;
415
416 $expected_xml = $expected_xml_start . $content1_xml . $content2_xml . $expected_xml_end;
417 $content1_doc = new \DomDocument();
418 $content1_doc->loadXML($content1_xml);
419 $content2_doc = new \DomDocument();
420 $content2_doc->loadXML($content2_xml);
421 $request = $this->getRequest(
422 'http://www.my.org/test/repository',
423 Verb::LIST_IDENTIFIERS,
424 Argument::IDENTIFIER,
425 Argument::MD_PREFIX
426 );
427 $writer = $this->getWriter('2018-08-21T02:30:35Z');
428 $xml = $writer->writeErrorResponse($request, $content1_doc, $content2_doc);
429
430 $this->assertXmlStringEqualsXmlString($expected_xml, $xml->saveXML());
431 }
432
433
434
435 public function testWriteErrorResponseNoVerb(): void
436 {
437 $content_xml = <<<XML
438 <some>
439 <con>tent</con>
440 </some>
441 XML;
442
443 $expected_xml_start = <<<XML
444 <?xml version="1.0" encoding="UTF-8" ?>
445 <OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/"
446 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
447 xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
448 <responseDate>2018-08-21T02:30:35Z</responseDate>
449 <request identifier="identifier_val" metadataPrefix="metadataPrefix_val">http://www.my.org/test/repository</request>
450 XML;
451
452 $expected_xml_end = <<<XML
453 </OAI-PMH>
454 XML;
455
456 $expected_xml = $expected_xml_start . $content_xml . $expected_xml_end;
457 $content_doc = new \DomDocument();
458 $content_doc->loadXML($content_xml);
459 $request = $this->getRequest(
460 'http://www.my.org/test/repository',
462 Argument::IDENTIFIER,
463 Argument::MD_PREFIX
464 );
465 $writer = $this->getWriter('2018-08-21T02:30:35Z');
466 $xml = $writer->writeErrorResponse($request, $content_doc);
467
468 $this->assertXmlStringEqualsXmlString($expected_xml, $xml->saveXML());
469 }
470}
The scope of this class is split ilias-conform URI's into components.
Definition: URI.php:35
__construct()
Constructor setup ILIAS global object @access public.
Definition: class.ilias.php:76
error(string $a_errmsg)
static http()
Fetches the global http state from ILIAS.
if( $request_wrapper->has( 'ui_mainbar')) getURI()
Definition: ui_mainbar.php:301
$url
Definition: shib_logout.php:68