ILIAS  trunk Revision v11.0_alpha-1866-gfa368f7776e
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
WriterTest.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
24 use ILIAS\Data\URI;
30 
31 class 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',
422  Verb::NULL,
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 }
repository()
description: > Example for rendering a repository card
Definition: repository.php:33
$url
Definition: shib_logout.php:66
if($request_wrapper->has('ui_mainbar')) getURI()
Definition: ui_mainbar.php:301
static http()
Fetches the global http state from ILIAS.
__construct()
Constructor setup ILIAS global object public.
Definition: class.ilias.php:76
header()
expected output: > ILIAS shows the rendered Component.
Definition: header.php:29