* @license MIT */ declare(strict_types=1); namespace Test\Integration\PostgreSQL; use BitBadger\PDODocument\{DocumentException, DocumentList, Query}; use BitBadger\PDODocument\Mapper\DocumentMapper; use PHPUnit\Framework\Attributes\TestDox; use PHPUnit\Framework\TestCase; use Test\Integration\TestDocument; /** * PostgreSQL integration tests for the DocumentList class */ #[TestDox('DocumentList (PostgreSQL integration)')] class DocumentListTest extends TestCase { /** @var string Database name for throwaway database */ private string $dbName; protected function setUp(): void { parent::setUp(); $this->dbName = ThrowawayDb::create(); } protected function tearDown(): void { ThrowawayDb::destroy($this->dbName); parent::tearDown(); } public function testCreateSucceeds(): void { $list = DocumentList::create(Query::selectFromTable(ThrowawayDb::TABLE), [], new DocumentMapper(TestDocument::class)); $this->assertNotNull($list, 'There should have been a document list created'); $list = null; } public function testItemsSucceeds(): void { $list = DocumentList::create(Query::selectFromTable(ThrowawayDb::TABLE), [], new DocumentMapper(TestDocument::class)); $this->assertNotNull($list, 'There should have been a document list created'); $count = 0; foreach ($list->items() as $item) { $this->assertContains($item->id, ['one', 'two', 'three', 'four', 'five'], 'An unexpected document ID was returned'); $count++; } $this->assertEquals(5, $count, 'There should have been 5 documents returned'); } public function testItemsFailsWhenAlreadyConsumed(): void { $list = DocumentList::create(Query::selectFromTable(ThrowawayDb::TABLE), [], new DocumentMapper(TestDocument::class)); $this->assertNotNull($list, 'There should have been a document list created'); $this->assertTrue($list->hasItems(), 'There should be items in the list'); $ignored = iterator_to_array($list->items()); $this->assertFalse($list->hasItems(), 'The list should no longer have items'); $this->expectException(DocumentException::class); iterator_to_array($list->items()); } public function testHasItemsSucceedsWithEmptyResults(): void { $list = DocumentList::create( Query::selectFromTable(ThrowawayDb::TABLE) . " WHERE (data->>'num_value')::numeric < 0", [], new DocumentMapper(TestDocument::class)); $this->assertNotNull($list, 'There should have been a document list created'); $this->assertFalse($list->hasItems(), 'There should be no items in the list'); } public function testHasItemsSucceedsWithNonEmptyResults(): void { $list = DocumentList::create(Query::selectFromTable(ThrowawayDb::TABLE), [], new DocumentMapper(TestDocument::class)); $this->assertNotNull($list, 'There should have been a document list created'); $this->assertTrue($list->hasItems(), 'There should be items in the list'); foreach ($list->items() as $ignored) { $this->assertTrue($list->hasItems(), 'There should be items remaining in the list'); } $this->assertFalse($list->hasItems(), 'There should be no remaining items in the list'); } public function testMapSucceeds(): void { $list = DocumentList::create(Query::selectFromTable(ThrowawayDb::TABLE), [], new DocumentMapper(TestDocument::class)); $this->assertNotNull($list, 'There should have been a document list created'); $this->assertTrue($list->hasItems(), 'There should be items in the list'); foreach ($list->map(fn($doc) => strrev($doc->id)) as $mapped) { $this->assertContains($mapped, ['eno', 'owt', 'eerht', 'ruof', 'evif'], 'An unexpected mapped value was returned'); } } public function testIterSucceeds(): void { $list = DocumentList::create(Query::selectFromTable(ThrowawayDb::TABLE), [], new DocumentMapper(TestDocument::class)); $this->assertNotNull($list, 'There should have been a document list created'); $this->assertTrue($list->hasItems(), 'There should be items in the list'); $splats = []; $list->iter(function ($doc) use (&$splats) { $splats[] = str_repeat('*', strlen($doc->id)); }); $this->assertEquals('*** *** ***** **** ****', implode(' ', $splats), 'Iteration did not have the expected result'); } public function testMapToArraySucceeds(): void { $list = DocumentList::create(Query::selectFromTable(ThrowawayDb::TABLE), [], new DocumentMapper(TestDocument::class)); $this->assertNotNull($list, 'There should have been a document list created'); $this->assertTrue($list->hasItems(), 'There should be items in the list'); $lookup = $list->mapToArray(fn($it) => $it->id, fn($it) => $it->value); $expected = ['one' => 'FIRST!', 'two' => 'another', 'three' => '', 'four' => 'purple', 'five' => 'purple']; $this->assertEquals($expected, $lookup, 'The array was not mapped correctly'); } }