ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
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>no</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>no</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 testWriteRecord(): void
240 {
241 $md_xml = <<<XML
242 <some>
243 <meta>data</meta>
244 <creator importance="very" >me!</creator>
245 </some>
246 XML;
247
248 $header_xml = <<<XML
249 <header>
250 <identifier>id_en:ti/fier</identifier>
251 <datestamp>2013-05-30</datestamp>
252 </header>
253 XML;
254
255 $expected_xml = '<record>' . $header_xml . '<metadata>' . $md_xml . '</metadata></record>';
256 $md_doc = new \DomDocument();
257 $md_doc->loadXML($md_xml);
258
259 $writer = $this->getWriter();
260 $xml = $writer->writeRecord(
261 'id_en:ti/fier',
262 new \DateTimeImmutable('2013-05-30', new \DateTimeZone('UTC')),
263 $md_doc
264 );
265
266 $this->assertXmlStringEqualsXmlString($expected_xml, $xml->saveXML());
267 }
268
269 public function testWriteSet(): void
270 {
271 $expected_xml = <<<XML
272 <set>
273 <setSpec>some spec</setSpec>
274 <setName>some name</setName>
275 </set>
276 XML;
277
278 $writer = $this->getWriter();
279 $xml = $writer->writeSet(
280 'some spec',
281 'some name'
282 );
283
284 $this->assertXmlStringEqualsXmlString($expected_xml, $xml->saveXML());
285 }
286
287 public function testWriteResumptionToken(): void
288 {
289 $expected_xml = <<<XML
290 <resumptionToken completeListSize="1234" cursor="56">some token</resumptionToken>
291 XML;
292
293 $writer = $this->getWriter();
294 $xml = $writer->writeResumptionToken('some token', 1234, 56);
295
296 $this->assertXmlStringEqualsXmlString($expected_xml, $xml->saveXML());
297 }
298
299
300 public function testWriteResponse(): void
301 {
302 $content1_xml = <<<XML
303 <some>
304 <con>tent</con>
305 </some>
306 XML;
307
308 $content2_xml = <<<XML
309 <different>
310 <bits>and</bits>
311 <bobs variety="much"/>
312 </different>
313 XML;
314
315 $expected_xml_start = <<<XML
316 <?xml version="1.0" encoding="UTF-8" ?>
317 <OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/"
318 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
319 xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
320 <responseDate>2018-08-21T02:30:35Z</responseDate>
321 <request verb="GetRecord" identifier="identifier_val"
322 metadataPrefix="metadataPrefix_val">http://www.my.org/test/repository</request>
323 <GetRecord>
324 XML;
325
326 $expected_xml_end = <<<XML
327 </GetRecord>
328 </OAI-PMH>
329 XML;
330
331 $expected_xml = $expected_xml_start . $content1_xml . $content2_xml . $expected_xml_end;
332 $content1_doc = new \DomDocument();
333 $content1_doc->loadXML($content1_xml);
334 $content2_doc = new \DomDocument();
335 $content2_doc->loadXML($content2_xml);
336 $request = $this->getRequest(
337 'http://www.my.org/test/repository',
338 Verb::GET_RECORD,
339 Argument::IDENTIFIER,
340 Argument::MD_PREFIX
341 );
342 $writer = $this->getWriter('2018-08-21T02:30:35Z');
343 $xml = $writer->writeResponse($request, $content1_doc, $content2_doc);
344
345 $this->assertXmlStringEqualsXmlString($expected_xml, $xml->saveXML());
346 }
347
348 public function testWriteErrorResponse(): void
349 {
350 $content1_xml = <<<XML
351 <some>
352 <con>tent</con>
353 </some>
354 XML;
355
356 $content2_xml = <<<XML
357 <different>
358 <bits>and</bits>
359 <bobs variety="much"/>
360 </different>
361 XML;
362
363 $expected_xml_start = <<<XML
364 <?xml version="1.0" encoding="UTF-8" ?>
365 <OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/"
366 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
367 xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
368 <responseDate>2018-08-21T02:30:35Z</responseDate>
369 <request verb="ListIdentifiers" identifier="identifier_val"
370 metadataPrefix="metadataPrefix_val">http://www.my.org/test/repository</request>
371 XML;
372
373 $expected_xml_end = <<<XML
374 </OAI-PMH>
375 XML;
376
377 $expected_xml = $expected_xml_start . $content1_xml . $content2_xml . $expected_xml_end;
378 $content1_doc = new \DomDocument();
379 $content1_doc->loadXML($content1_xml);
380 $content2_doc = new \DomDocument();
381 $content2_doc->loadXML($content2_xml);
382 $request = $this->getRequest(
383 'http://www.my.org/test/repository',
384 Verb::LIST_IDENTIFIERS,
385 Argument::IDENTIFIER,
386 Argument::MD_PREFIX
387 );
388 $writer = $this->getWriter('2018-08-21T02:30:35Z');
389 $xml = $writer->writeErrorResponse($request, $content1_doc, $content2_doc);
390
391 $this->assertXmlStringEqualsXmlString($expected_xml, $xml->saveXML());
392 }
393
394
395
396 public function testWriteErrorResponseNoVerb(): void
397 {
398 $content_xml = <<<XML
399 <some>
400 <con>tent</con>
401 </some>
402 XML;
403
404 $expected_xml_start = <<<XML
405 <?xml version="1.0" encoding="UTF-8" ?>
406 <OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/"
407 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
408 xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
409 <responseDate>2018-08-21T02:30:35Z</responseDate>
410 <request identifier="identifier_val" metadataPrefix="metadataPrefix_val">http://www.my.org/test/repository</request>
411 XML;
412
413 $expected_xml_end = <<<XML
414 </OAI-PMH>
415 XML;
416
417 $expected_xml = $expected_xml_start . $content_xml . $expected_xml_end;
418 $content_doc = new \DomDocument();
419 $content_doc->loadXML($content_xml);
420 $request = $this->getRequest(
421 'http://www.my.org/test/repository',
423 Argument::IDENTIFIER,
424 Argument::MD_PREFIX
425 );
426 $writer = $this->getWriter('2018-08-21T02:30:35Z');
427 $xml = $writer->writeErrorResponse($request, $content_doc);
428
429 $this->assertXmlStringEqualsXmlString($expected_xml, $xml->saveXML());
430 }
431}
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