66 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * @author Daniel J. Summers <daniel@bitbadger.solutions>
 | |
|  * @license MIT
 | |
|  */
 | |
| 
 | |
| declare(strict_types=1);
 | |
| 
 | |
| use BitBadger\PDODocument\{DocumentException, Field};
 | |
| use BitBadger\PDODocument\Mapper\DocumentMapper;
 | |
| use Test\{PjsonDocument, PjsonId};
 | |
| 
 | |
| // ** Test class hierarchy for serialization **
 | |
| 
 | |
| class DocMapSubDoc
 | |
| {
 | |
|     public function __construct(public int $id = 0, public string $name = '') { }
 | |
| }
 | |
| 
 | |
| class DocMapTestDoc
 | |
| {
 | |
|     public function __construct(public int $id = 0, public DocMapSubDoc $subDoc = new DocMapSubDoc()) { }
 | |
| }
 | |
| 
 | |
| pest()->group('unit');
 | |
| 
 | |
| describe('Constructor', function () {
 | |
|     test('uses "data" as the default field name', function () {
 | |
|         expect(new DocumentMapper(Field::class))->fieldName->toBe('data');
 | |
|     });
 | |
|     test('uses the provided field name', function () {
 | |
|         expect(new DocumentMapper(Field::class, 'json'))->fieldName->toBe('json');
 | |
|     });
 | |
| });
 | |
| 
 | |
| describe('->map()', function () {
 | |
|     test('deserializes valid JSON', function () {
 | |
|         $doc = (new DocumentMapper(DocMapTestDoc::class))
 | |
|             ->map(['data' => '{"id":7,"subDoc":{"id":22,"name":"tester"}}']);
 | |
|         expect($doc)
 | |
|             ->not->toBeNull()
 | |
|             ->id->toBe(7)
 | |
|             ->and($doc->subDoc)
 | |
|             ->not->toBeNull()
 | |
|             ->id->toBe(22)
 | |
|             ->name->toBe('tester');
 | |
|     });
 | |
|     test('deserializes valid JSON [Pjson]', function () {
 | |
|         $doc = (new DocumentMapper(PjsonDocument::class))->map(['data' => '{"id":"seven","name":"bob","num_value":8}']);
 | |
|         expect($doc)
 | |
|             ->not->toBeNull()
 | |
|             ->id->toEqual(new PjsonId('seven'))
 | |
|             ->name->toBe('bob')
 | |
|             ->numValue->toBe(8)
 | |
|             ->skipped->toBeEmpty();
 | |
|     });
 | |
|     test('throws for invalid JSON', function () {
 | |
|         expect(fn() => (new DocumentMapper(DocMapTestDoc::class))->map(['data' => 'this is not valid']))
 | |
|             ->toThrow(DocumentException::class);
 | |
|     });
 | |
|     test('throws for invalid JSON [Pjson]', function () {
 | |
|         expect(fn() => (new DocumentMapper(PjsonDocument::class))->map(['data' => 'not even close']))
 | |
|             ->toThrow(DocumentException::class);
 | |
|     });
 | |
| });
 |