19declare(strict_types=1);
23use PHPUnit\Framework\TestCase;
28 int $current_datestamp,
29 array $returns_on_query
32 public array $exposed_queries = [];
35 protected int $current_datestamp,
36 protected array $returns_on_query
40 protected function query(
string $query): \Generator
42 $this->exposed_queries[] = $query;
43 yield
from $this->returns_on_query;
46 protected function manipulate(
string $query): void
48 $this->exposed_queries[] = $query;
51 protected function quoteInteger(
int $integer): string
53 return '~int:' . $integer .
'~';
56 protected function quoteString(
string $string): string
58 return '~string:' . $string .
'~';
61 protected function quoteClob(
string $string): string
63 return '~clob:' . $string .
'~';
66 protected function getCurrentDatestamp():
int
68 return $this->current_datestamp;
75 $this->assertRecordInfosMatchesArray($record->
infos(),
$data);
76 if (
$data[
'metadata'] !==
'') {
77 $this->assertXmlStringEqualsXmlString(
79 $record->
metadata()?->saveXML() ??
''
82 $this->assertNull($record->
metadata());
88 $this->assertSame((
int)
$data[
'obj_id'], $infos->
objID());
90 $this->assertSame((
int)
$data[
'datestamp'], $infos->
datestamp()->getTimestamp());
97 'identifier' =>
'id32',
98 'datestamp' =>
'123456',
100 'metadata' =>
'<content>something</content>'
104 'identifier' =>
'id456',
105 'datestamp' =>
'9345653',
107 'metadata' =>
'<content><sub1>hello</sub1><sub2>world</sub2></content>'
111 'identifier' =>
'id1',
112 'datestamp' =>
'65656565',
114 'metadata' =>
'<content>something else</content>'
118 'identifier' =>
'id17',
119 'datestamp' =>
'283462843',
123 $repo = $this->getRepository(0, [$record_1, $record_2, $record_3, $record_4]);
125 $records = iterator_to_array($repo->getRecords());
128 [
'SELECT * FROM il_meta_oer_exposed ORDER BY obj_id'],
129 $repo->exposed_queries
131 $this->assertCount(4, $records);
132 $this->assertRecordMatchesArray($records[0], $record_1);
133 $this->assertRecordMatchesArray($records[1], $record_2);
134 $this->assertRecordMatchesArray($records[2], $record_3);
135 $this->assertRecordMatchesArray($records[3], $record_4);
142 'identifier' =>
'id32',
143 'datestamp' =>
'123456',
145 'metadata' =>
'<content>something</content>'
149 'identifier' =>
'id456',
150 'datestamp' =>
'9345653',
152 'metadata' =>
'<content><sub1>hello</sub1><sub2>world</sub2></content>'
154 $repo = $this->getRepository(0, [$record_1, $record_2]);
156 $records = iterator_to_array($repo->getRecords(
157 new \DateTimeImmutable(
'@1723994')
161 [
'SELECT *' .
' FROM il_meta_oer_exposed WHERE datestamp >= ~int:1723994~ ORDER BY obj_id'],
162 $repo->exposed_queries
164 $this->assertCount(2, $records);
165 $this->assertRecordMatchesArray($records[0], $record_1);
166 $this->assertRecordMatchesArray($records[1], $record_2);
173 'identifier' =>
'id456',
174 'datestamp' =>
'9345653',
176 'metadata' =>
'<content><sub1>hello</sub1><sub2>world</sub2></content>'
180 'identifier' =>
'id1',
181 'datestamp' =>
'65656565',
183 'metadata' =>
'<content>something else</content>'
185 $repo = $this->getRepository(0, [$record_2, $record_3]);
187 $records = iterator_to_array($repo->getRecords(
189 new \DateTimeImmutable(
'@1763994')
193 [
'SELECT *' .
' FROM il_meta_oer_exposed WHERE datestamp <= ~int:1763994~ ORDER BY obj_id'],
194 $repo->exposed_queries
196 $this->assertCount(2, $records);
197 $this->assertRecordMatchesArray($records[0], $record_2);
198 $this->assertRecordMatchesArray($records[1], $record_3);
205 'identifier' =>
'id456',
206 'datestamp' =>
'9345653',
208 'metadata' =>
'<content><sub1>hello</sub1><sub2>world</sub2></content>'
210 $repo = $this->getRepository(0, [$record_2]);
212 $records = iterator_to_array($repo->getRecords(
213 new \DateTimeImmutable(
'@1723994'),
214 new \DateTimeImmutable(
'@1763994')
218 [
'SELECT *' .
' FROM il_meta_oer_exposed WHERE datestamp >= ~int:1723994~ AND datestamp <= ~int:1763994~ ORDER BY obj_id'],
219 $repo->exposed_queries
221 $this->assertCount(1, $records);
222 $this->assertRecordMatchesArray($records[0], $record_2);
229 'identifier' =>
'id456',
230 'datestamp' =>
'9345653',
232 'metadata' =>
'<content><sub1>hello</sub1><sub2>world</sub2></content>'
234 $repo = $this->getRepository(0, [$record]);
236 $records = iterator_to_array($repo->getRecords(
243 [
'SELECT *' .
' FROM il_meta_oer_exposed ORDER BY obj_id LIMIT ~int:5~'],
244 $repo->exposed_queries
246 $this->assertCount(1, $records);
247 $this->assertRecordMatchesArray($records[0], $record);
254 'identifier' =>
'id456',
255 'datestamp' =>
'9345653',
257 'metadata' =>
'<content><sub1>hello</sub1><sub2>world</sub2></content>'
259 $repo = $this->getRepository(0, [$record]);
261 $records = iterator_to_array($repo->getRecords(
269 [
'SELECT *' .
' FROM il_meta_oer_exposed ORDER BY obj_id LIMIT ~int:' . PHP_INT_MAX .
'~ OFFSET ~int:5~'],
270 $repo->exposed_queries
272 $this->assertCount(1, $records);
273 $this->assertRecordMatchesArray($records[0], $record);
280 'identifier' =>
'id456',
281 'datestamp' =>
'9345653',
283 'metadata' =>
'<content><sub1>hello</sub1><sub2>world</sub2></content>'
285 $repo = $this->getRepository(0, [$record]);
287 $records = iterator_to_array($repo->getRecords(
295 [
'SELECT *' .
' FROM il_meta_oer_exposed ORDER BY obj_id LIMIT ~int:5~ OFFSET ~int:10~'],
296 $repo->exposed_queries
298 $this->assertCount(1, $records);
299 $this->assertRecordMatchesArray($records[0], $record);
306 'identifier' =>
'id32',
307 'datestamp' =>
'123456',
312 'identifier' =>
'id456',
313 'datestamp' =>
'9345653',
318 'identifier' =>
'id1',
319 'datestamp' =>
'65656565',
324 'identifier' =>
'id17',
325 'datestamp' =>
'283462843',
328 $repo = $this->getRepository(0, [$record_1, $record_2, $record_3, $record_4]);
330 $records = iterator_to_array($repo->getRecordInfos());
333 [
'SELECT obj_id, identifier, datestamp, deleted FROM il_meta_oer_exposed ORDER BY obj_id'],
334 $repo->exposed_queries
336 $this->assertCount(4, $records);
337 $this->assertRecordInfosMatchesArray($records[0], $record_1);
338 $this->assertRecordInfosMatchesArray($records[1], $record_2);
339 $this->assertRecordInfosMatchesArray($records[2], $record_3);
340 $this->assertRecordInfosMatchesArray($records[3], $record_4);
347 'identifier' =>
'id32',
348 'datestamp' =>
'123456',
353 'identifier' =>
'id456',
354 'datestamp' =>
'9345653',
357 $repo = $this->getRepository(0, [$record_1, $record_2]);
359 $records = iterator_to_array($repo->getRecordInfos(
360 new \DateTimeImmutable(
'@1723994')
364 [
'SELECT obj_id, identifier, datestamp, deleted' .
' FROM il_meta_oer_exposed WHERE datestamp >= ~int:1723994~ ORDER BY obj_id'],
365 $repo->exposed_queries
367 $this->assertCount(2, $records);
368 $this->assertRecordInfosMatchesArray($records[0], $record_1);
369 $this->assertRecordInfosMatchesArray($records[1], $record_2);
376 'identifier' =>
'id456',
377 'datestamp' =>
'9345653',
382 'identifier' =>
'id1',
383 'datestamp' =>
'65656565',
386 $repo = $this->getRepository(0, [$record_2, $record_3]);
388 $records = iterator_to_array($repo->getRecordInfos(
390 new \DateTimeImmutable(
'@1763994')
394 [
'SELECT obj_id, identifier, datestamp, deleted' .
' FROM il_meta_oer_exposed WHERE datestamp <= ~int:1763994~ ORDER BY obj_id'],
395 $repo->exposed_queries
397 $this->assertCount(2, $records);
398 $this->assertRecordInfosMatchesArray($records[0], $record_2);
399 $this->assertRecordInfosMatchesArray($records[1], $record_3);
406 'identifier' =>
'id456',
407 'datestamp' =>
'9345653',
410 $repo = $this->getRepository(0, [$record_2]);
412 $records = iterator_to_array($repo->getRecordInfos(
413 new \DateTimeImmutable(
'@1723994'),
414 new \DateTimeImmutable(
'@1763994')
418 [
'SELECT obj_id, identifier, datestamp, deleted' .
' FROM il_meta_oer_exposed WHERE datestamp >= ~int:1723994~ AND datestamp <= ~int:1763994~ ORDER BY obj_id'],
419 $repo->exposed_queries
421 $this->assertCount(1, $records);
422 $this->assertRecordInfosMatchesArray($records[0], $record_2);
429 'identifier' =>
'id456',
430 'datestamp' =>
'9345653',
433 $repo = $this->getRepository(0, [$record]);
435 $records = iterator_to_array($repo->getRecordInfos(
442 [
'SELECT obj_id, identifier, datestamp, deleted' .
' FROM il_meta_oer_exposed ORDER BY obj_id LIMIT ~int:5~'],
443 $repo->exposed_queries
445 $this->assertCount(1, $records);
446 $this->assertRecordInfosMatchesArray($records[0], $record);
453 'identifier' =>
'id456',
454 'datestamp' =>
'9345653',
457 $repo = $this->getRepository(0, [$record]);
459 $records = iterator_to_array($repo->getRecordInfos(
467 [
'SELECT obj_id, identifier, datestamp, deleted' .
' FROM il_meta_oer_exposed ORDER BY obj_id LIMIT ~int:' . PHP_INT_MAX .
'~ OFFSET ~int:5~'],
468 $repo->exposed_queries
470 $this->assertCount(1, $records);
471 $this->assertRecordInfosMatchesArray($records[0], $record);
478 'identifier' =>
'id456',
479 'datestamp' =>
'9345653',
482 $repo = $this->getRepository(0, [$record]);
484 $records = iterator_to_array($repo->getRecordInfos(
492 [
'SELECT obj_id, identifier, datestamp, deleted' .
' FROM il_meta_oer_exposed ORDER BY obj_id LIMIT ~int:5~ OFFSET ~int:10~'],
493 $repo->exposed_queries
495 $this->assertCount(1, $records);
496 $this->assertRecordInfosMatchesArray($records[0], $record);
501 $repo = $this->getRepository(0, [[
'num' => 4]]);
503 $count = $repo->getRecordCount();
506 [
'SELECT COUNT(*) AS num FROM il_meta_oer_exposed'],
507 $repo->exposed_queries
509 $this->assertSame(4, $count);
514 $repo = $this->getRepository(0, [[
'num' => 3]]);
516 $count = $repo->getRecordCount(
517 new \DateTimeImmutable(
'@1723994')
521 [
'SELECT' .
' COUNT(*) AS num FROM il_meta_oer_exposed WHERE datestamp >= ~int:1723994~'],
522 $repo->exposed_queries
524 $this->assertSame(3, $count);
529 $repo = $this->getRepository(0, [[
'num' => 3]]);
531 $count = $repo->getRecordCount(
533 new \DateTimeImmutable(
'@1763994')
537 [
'SELECT' .
' COUNT(*) AS num FROM il_meta_oer_exposed WHERE datestamp <= ~int:1763994~'],
538 $repo->exposed_queries
540 $this->assertSame(3, $count);
545 $repo = $this->getRepository(0, [[
'num' => 2]]);
547 $count = $repo->getRecordCount(
548 new \DateTimeImmutable(
'@1723994'),
549 new \DateTimeImmutable(
'@1763994')
553 [
'SELECT' .
' COUNT(*) AS num FROM il_meta_oer_exposed WHERE datestamp >= ~int:1723994~ AND datestamp <= ~int:1763994~'],
554 $repo->exposed_queries
556 $this->assertSame(2, $count);
561 $repo = $this->getRepository(0, [[
'earliest' =>
'1795857']]);
563 $earliest = $repo->getEarliestDatestamp();
566 [
'SELECT MIN(datestamp) AS earliest FROM il_meta_oer_exposed'],
567 $repo->exposed_queries
569 $this->assertSame(1795857, $earliest->getTimestamp());
576 'identifier' =>
'id456',
577 'datestamp' =>
'9345653',
579 'metadata' =>
'<content><sub1>hello</sub1><sub2>world</sub2></content>'
581 $repo = $this->getRepository(0, [$record]);
583 $res = $repo->getRecordByIdentifier(
'id456');
586 [
'SELECT * FROM il_meta_oer_exposed WHERE identifier = ~string:id456~'],
587 $repo->exposed_queries
589 $this->assertNotNull(
$res);
590 $this->assertRecordMatchesArray(
$res, $record);
597 'identifier' =>
'id456',
598 'datestamp' =>
'9345653',
602 $repo = $this->getRepository(0, [$record]);
604 $res = $repo->getRecordByIdentifier(
'id456');
607 [
'SELECT * FROM il_meta_oer_exposed WHERE identifier = ~string:id456~'],
608 $repo->exposed_queries
610 $this->assertNotNull(
$res);
611 $this->assertRecordMatchesArray(
$res, $record);
616 $repo = $this->getRepository(0, []);
618 $res = $repo->getRecordByIdentifier(
'id456');
621 [
'SELECT * FROM il_meta_oer_exposed WHERE identifier = ~string:id456~'],
622 $repo->exposed_queries
624 $this->assertNull(
$res);
629 $repo = $this->getRepository(0, [[
'num' => 1]]);
631 $exists = $repo->doesRecordWithIdentifierExist(
'some id');
634 [
'SELECT COUNT(*) AS num FROM il_meta_oer_exposed WHERE identifier = ~string:some id~'],
635 $repo->exposed_queries
637 $this->assertTrue($exists);
642 $repo = $this->getRepository(0, [[
'num' => 0]]);
644 $exists = $repo->doesRecordWithIdentifierExist(
'some id');
647 [
'SELECT COUNT(*) AS num FROM il_meta_oer_exposed WHERE identifier = ~string:some id~'],
648 $repo->exposed_queries
650 $this->assertFalse($exists);
655 $repo = $this->getRepository(0, [[
'num' => 1]]);
657 $exists = $repo->doesRecordExistForObjID(43);
660 [
'SELECT ' .
'COUNT(*) AS num FROM il_meta_oer_exposed WHERE obj_id = ~int:43~'],
661 $repo->exposed_queries
663 $this->assertTrue($exists);
668 $repo = $this->getRepository(0, [[
'num' => 0]]);
670 $exists = $repo->doesRecordExistForObjID(43);
673 [
'SELECT ' .
'COUNT(*) AS num FROM il_meta_oer_exposed WHERE obj_id = ~int:43~'],
674 $repo->exposed_queries
676 $this->assertFalse($exists);
681 $xml = new \DOMDocument();
682 $xml->loadXML(
'<content><sub1>hello</sub1><sub2>world</sub2></content>');
684 $repo = $this->getRepository(17646362, []);
694 'INSERT INTO il_meta_oer_exposed (obj_id, identifier, datestamp, metadata, deleted) VALUES (' .
695 '~int:32~, ~string:id32~, ~int:17646362~, ~clob:' . $xml->saveXML() .
'~, ~int:0~)'
697 $repo->exposed_queries
703 $xml = new \DOMDocument();
704 $xml->loadXML(
'<content><sub1>hello</sub1><sub2>world</sub2></content>');
706 $repo = $this->getRepository(17646362, []);
716 'UPDATE il_meta_oer_exposed SET metadata = ~clob:' . $xml->saveXML() .
'~, ' .
717 'deleted = ~int:0~, ' .
718 'datestamp = ~int:17646362~ WHERE obj_id = ~int:32~'
720 $repo->exposed_queries
726 $repo = $this->getRepository(17646362, []);
736 'UPDATE il_meta_oer_exposed ' .
'SET metadata = ~clob:~, ' .
737 'deleted = ~int:1~, ' .
738 'datestamp = ~int:17646362~ WHERE obj_id = ~int:32~'
740 $repo->exposed_queries
746 $current = new \DateTimeImmutable(
'2025-10-31');
747 $thirty_days_ago = new \DateTimeImmutable(
'2025-10-01');
748 $repo = $this->getRepository($current->getTimestamp(), []);
750 $repo->deleteRecordsMarkedAsDeletedOlderThan(
new \DateInterval(
'P30D'));
754 'DELETE FROM il_meta_oer_exposed WHERE deleted = 1 AND ' .
755 'datestamp <= ~int:' . $thirty_days_ago->getTimestamp() .
'~'
757 $repo->exposed_queries
763 $repo = $this->getRepository(0, []);
765 $repo->deleteRecord(32);
768 [
'DELETE ' .
'FROM il_meta_oer_exposed WHERE obj_id = ~int:32~'],
769 $repo->exposed_queries
__construct()
Constructor setup ILIAS global object @access public.
return['delivery_method'=> 'php',]
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...