Skip to content

Commit

Permalink
add tests for mapped union discriminators
Browse files Browse the repository at this point in the history
  • Loading branch information
idbentley committed Jul 17, 2024
1 parent 75c2aff commit f92f276
Show file tree
Hide file tree
Showing 4 changed files with 132 additions and 0 deletions.
40 changes: 40 additions & 0 deletions tests/Fixtures/MappedDiscriminatedAuthor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

declare(strict_types=1);

namespace JMS\Serializer\Tests\Fixtures;

use JMS\Serializer\Annotation\SerializedName;
use JMS\Serializer\Annotation\Type;

class DiscriminatedAuthor
{
/**
* @Type("string")
* @SerializedName("full_name")
*/
#[Type(name: 'string')]
#[SerializedName(name: 'full_name')]
private $name;

/**
* @Type("string")
*/
#[Type(name: 'string')]
private $objectType = 'author';

public function __construct($name)
{
$this->name = $name;
}

public function getName()
{
return $this->name;
}

public function getObjectType()
{
return $this->objectType;
}
}
45 changes: 45 additions & 0 deletions tests/Fixtures/MappedDiscriminatedComment.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

declare(strict_types=1);

namespace JMS\Serializer\Tests\Fixtures;

use JMS\Serializer\Annotation\Type;

class MappedDiscriminatedComment
{
/**
* @Type("JMS\Serializer\Tests\Fixtures\Author")
*/
#[Type(name: 'JMS\Serializer\Tests\Fixtures\Author')]
private $author;

/**
* @Type("string")
*/
#[Type(name: 'string')]
private $text;

/**
* @Type("string")
*/
#[Type(name: 'string')]
private $objectType = 'comment';


public function __construct(?Author $author, $text)

Check failure on line 30 in tests/Fixtures/MappedDiscriminatedComment.php

View workflow job for this annotation

GitHub Actions / Coding Standards (7.4)

Expected 1 blank line before function; 2 found
{
$this->author = $author;
$this->text = $text;
}

public function getAuthor()
{
return $this->author;
}

public function getObjectType()
{
return $this->objectType;
}
}
26 changes: 26 additions & 0 deletions tests/Fixtures/TypedProperties/MappedComplexDiscriminatedUnion.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

declare(strict_types=1);

namespace JMS\Serializer\Tests\Fixtures\TypedProperties;

use JMS\Serializer\Tests\Fixtures\DiscriminatedAuthor;
use JMS\Serializer\Tests\Fixtures\DiscriminatedComment;
use JMS\Serializer\Annotation\UnionDiscriminator;

Check failure on line 9 in tests/Fixtures/TypedProperties/MappedComplexDiscriminatedUnion.php

View workflow job for this annotation

GitHub Actions / Coding Standards (7.4)

Use statements should be sorted alphabetically. The first wrong one is JMS\Serializer\Annotation\UnionDiscriminator.

class ComplexDiscriminatedUnion
{
#[UnionDiscriminator(field: 'objectType', map: ['author' => 'JMS\Serializer\Tests\Fixtures\DiscriminatedAuthor', 'comment' => 'JMS\Serializer\Tests\Fixtures\DiscriminatedComment'])]
private DiscriminatedAuthor|DiscriminatedComment $data;

public function __construct($data)
{
$this->data = $data;
}

public function getData(): Author|Comment

Check failure on line 21 in tests/Fixtures/TypedProperties/MappedComplexDiscriminatedUnion.php

View workflow job for this annotation

GitHub Actions / Static Analysis with PHPStan (8.0)

Method JMS\Serializer\Tests\Fixtures\TypedProperties\ComplexDiscriminatedUnion::getData() has invalid return type JMS\Serializer\Tests\Fixtures\TypedProperties\Author.

Check failure on line 21 in tests/Fixtures/TypedProperties/MappedComplexDiscriminatedUnion.php

View workflow job for this annotation

GitHub Actions / Static Analysis with PHPStan (8.0)

Method JMS\Serializer\Tests\Fixtures\TypedProperties\ComplexDiscriminatedUnion::getData() has invalid return type JMS\Serializer\Tests\Fixtures\TypedProperties\Comment.

Check failure on line 21 in tests/Fixtures/TypedProperties/MappedComplexDiscriminatedUnion.php

View workflow job for this annotation

GitHub Actions / Static Analysis with PHPStan (7.4)

Method JMS\Serializer\Tests\Fixtures\TypedProperties\ComplexDiscriminatedUnion::getData() has invalid return type JMS\Serializer\Tests\Fixtures\TypedProperties\Author.

Check failure on line 21 in tests/Fixtures/TypedProperties/MappedComplexDiscriminatedUnion.php

View workflow job for this annotation

GitHub Actions / Static Analysis with PHPStan (7.4)

Method JMS\Serializer\Tests\Fixtures\TypedProperties\ComplexDiscriminatedUnion::getData() has invalid return type JMS\Serializer\Tests\Fixtures\TypedProperties\Comment.

Check failure on line 21 in tests/Fixtures/TypedProperties/MappedComplexDiscriminatedUnion.php

View workflow job for this annotation

GitHub Actions / Static Analysis with PHPStan (7.4)

Method JMS\Serializer\Tests\Fixtures\TypedProperties\ComplexDiscriminatedUnion::getData() uses native union types but they're supported only on PHP 8.0 and later.

Check failure on line 21 in tests/Fixtures/TypedProperties/MappedComplexDiscriminatedUnion.php

View workflow job for this annotation

GitHub Actions / Static Analysis with PHPStan (8.1)

Method JMS\Serializer\Tests\Fixtures\TypedProperties\ComplexDiscriminatedUnion::getData() has invalid return type JMS\Serializer\Tests\Fixtures\TypedProperties\Author.
{
return $this->data;

Check failure on line 23 in tests/Fixtures/TypedProperties/MappedComplexDiscriminatedUnion.php

View workflow job for this annotation

GitHub Actions / Static Analysis with PHPStan (8.0)

Method JMS\Serializer\Tests\Fixtures\TypedProperties\ComplexDiscriminatedUnion::getData() should return JMS\Serializer\Tests\Fixtures\TypedProperties\Author|JMS\Serializer\Tests\Fixtures\TypedProperties\Comment but returns JMS\Serializer\Tests\Fixtures\DiscriminatedAuthor|JMS\Serializer\Tests\Fixtures\DiscriminatedComment.

Check failure on line 23 in tests/Fixtures/TypedProperties/MappedComplexDiscriminatedUnion.php

View workflow job for this annotation

GitHub Actions / Static Analysis with PHPStan (7.4)

Method JMS\Serializer\Tests\Fixtures\TypedProperties\ComplexDiscriminatedUnion::getData() should return JMS\Serializer\Tests\Fixtures\TypedProperties\Author|JMS\Serializer\Tests\Fixtures\TypedProperties\Comment but returns JMS\Serializer\Tests\Fixtures\DiscriminatedAuthor|JMS\Serializer\Tests\Fixtures\DiscriminatedComment.
}
}

Check failure on line 25 in tests/Fixtures/TypedProperties/MappedComplexDiscriminatedUnion.php

View workflow job for this annotation

GitHub Actions / Coding Standards (7.4)

Expected 1 blank line at end of file; 2 found

21 changes: 21 additions & 0 deletions tests/Serializer/JsonSerializationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,12 @@
use JMS\Serializer\Tests\Fixtures\Tag;
use JMS\Serializer\Tests\Fixtures\DiscriminatedAuthor;
use JMS\Serializer\Tests\Fixtures\DiscriminatedComment;
use JMS\Serializer\Tests\Fixtures\MappedDiscriminatedAuthor;
use JMS\Serializer\Tests\Fixtures\MappedDiscriminatedComment;
use JMS\Serializer\Tests\Fixtures\TypedProperties\UnionTypedProperties;
use JMS\Serializer\Tests\Fixtures\TypedProperties\ComplexUnionTypedProperties;
use JMS\Serializer\Tests\Fixtures\TypedProperties\ComplexDiscriminatedUnion;
use JMS\Serializer\Tests\Fixtures\TypedProperties\MappedComplexDiscriminatedUnion;
use JMS\Serializer\Visitor\Factory\JsonSerializationVisitorFactory;
use JMS\Serializer\Visitor\SerializationVisitorInterface;
use PHPUnit\Framework\Attributes\DataProvider;
Expand Down Expand Up @@ -158,6 +161,8 @@ protected static function getContent($key)
$outputs['data_comment'] = '{"data":{"author":{"full_name":"foo"},"text":"bar"}}';
$outputs['data_discriminated_author'] = '{"data":{"full_name":"foo","type":"JMS\\\Serializer\\\Tests\\\Fixtures\\\DiscriminatedAuthor"}}';
$outputs['data_discriminated_comment'] = '{"data":{"author":{"full_name":"foo"},"text":"bar","type":"JMS\\\Serializer\\\Tests\\\Fixtures\\\DiscriminatedComment"}}';
$outputs['data_mapped_discriminated_author'] = '{"data":{"full_name":"foo","type":"author"}}';
$outputs['data_mapped_discriminated_comment'] = '{"data":{"author":{"full_name":"foo"},"text":"bar","type":"comment"}}';
$outputs['uid'] = '"66b3177c-e03b-4a22-9dee-ddd7d37a04d5"';
$outputs['object_with_enums'] = '{"ordinary":"Clubs","backed_value":"C","backed_without_param":"C","ordinary_array":["Clubs","Spades"],"backed_array":["C","H"],"backed_array_without_param":["C","H"],"ordinary_auto_detect":"Clubs","backed_auto_detect":"C","backed_int_auto_detect":3,"backed_int":3,"backed_name":"C","backed_int_forced_str":3}';
$outputs['object_with_autodetect_enums'] = '{"ordinary_array_auto_detect":["Clubs","Spades"],"backed_array_auto_detect":["C","H"],"mixed_array_auto_detect":["Clubs","H"]}';
Expand Down Expand Up @@ -529,6 +534,22 @@ public function testDeserializingComplexDiscriminatedUnionProperties()
self::assertEquals($commentUnion, $this->deserialize(static::getContent('data_discriminated_comment'), ComplexDiscriminatedUnion::class));
}

public function testDeserializingMappedComplexDiscriminatedUnionProperties()
{
if (PHP_VERSION_ID < 80000) {
$this->markTestSkipped(sprintf('%s requires PHP 8.0', TypedPropertiesDriver::class));

return;
}

$authorUnion = new MappedComplexDiscriminatedUnion(new MappedDiscriminatedAuthor('foo'));

Check failure on line 545 in tests/Serializer/JsonSerializationTest.php

View workflow job for this annotation

GitHub Actions / Static Analysis with PHPStan (8.0)

Instantiated class JMS\Serializer\Tests\Fixtures\MappedDiscriminatedAuthor not found.

Check failure on line 545 in tests/Serializer/JsonSerializationTest.php

View workflow job for this annotation

GitHub Actions / Static Analysis with PHPStan (8.0)

Instantiated class JMS\Serializer\Tests\Fixtures\TypedProperties\MappedComplexDiscriminatedUnion not found.
self::assertEquals($authorUnion, $this->deserialize(static::getContent('data_mapped_discriminated_author'), MappedComplexDiscriminatedUnion::class));

$commentUnion = new MappedComplexDiscriminatedUnion(new MappedDiscriminatedComment(new Author('foo'), 'bar'));

self::assertEquals($commentUnion, $this->deserialize(static::getContent('data_mapped_discriminated_comment'), MappedComplexDiscriminatedUnion::class));
}

public function testSerializeingComplexDiscriminatedUnionProperties()
{
if (PHP_VERSION_ID < 80000) {
Expand Down

0 comments on commit f92f276

Please sign in to comment.