<?php declare(strict_types=1); namespace Test\Unit\Mapper; use BitBadger\PDODocument\{DocumentException, Field}; use BitBadger\PDODocument\Mapper\DocumentMapper; use PHPUnit\Framework\Attributes\TestDox; use PHPUnit\Framework\TestCase; // ** Test class hierarchy for serialization ** class SubDocument { public function __construct(public int $id = 0, public string $name = '') { } } class TestDocument { public function __construct(public int $id = 0, public SubDocument $subDoc = new SubDocument()) { } } /** * Unit tests for the DocumentMapper class */ class DocumentMapperTest extends TestCase { public function testConstructorSucceedsWithDefaultField(): void { $mapper = new DocumentMapper(Field::class); $this->assertEquals('data', $mapper->fieldName, 'Default field name should have been "data"'); } public function testConstructorSucceedsWithSpecifiedField(): void { $mapper = new DocumentMapper(Field::class, 'json'); $this->assertEquals('json', $mapper->fieldName, 'Field name not recorded correctly'); } #[TestDox('Map succeeds with valid JSON')] public function testMapSucceedsWithValidJSON(): void { $doc = (new DocumentMapper(TestDocument::class))->map(['data' => '{"id":7,"subDoc":{"id":22,"name":"tester"}}']); $this->assertNotNull($doc, 'The document should not have been null'); $this->assertEquals(7, $doc->id, 'ID not filled correctly'); $this->assertNotNull($doc->subDoc, 'The sub-document should not have been null'); $this->assertEquals(22, $doc->subDoc->id, 'Sub-document ID not filled correctly'); $this->assertEquals('tester', $doc->subDoc->name, 'Sub-document name not filled correctly'); } #[TestDox('Map fails with invalid JSON')] public function testMapFailsWithInvalidJSON(): void { $this->expectException(DocumentException::class); (new DocumentMapper(TestDocument::class))->map(['data' => 'this is not valid']); } }