Skip to content

Commit 0b6ea3b

Browse files
test(serializer): reproduce hal bug in test
1 parent 4171d5f commit 0b6ea3b

File tree

4 files changed

+130
-1
lines changed

4 files changed

+130
-1
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
namespace ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\Issue4358;
4+
5+
6+
use ApiPlatform\Metadata\ApiProperty;
7+
use ApiPlatform\Metadata\Get;
8+
use Symfony\Component\Serializer\Annotation\Groups;
9+
use Symfony\Component\Serializer\Annotation\MaxDepth;
10+
11+
#[Get(uriTemplate: 'resource_a',
12+
formats: ['jsonhal'],
13+
outputFormats: ['jsonhal'],
14+
normalizationContext: ['groups' => ['ResourceA:read'], 'enable_max_depth' => true],
15+
provider: [self::class, 'provide'])]
16+
final class ResourceA
17+
{
18+
private static ?ResourceA $resourceA = null;
19+
20+
#[ApiProperty(readableLink: true)]
21+
#[Groups(['ResourceA:read', 'ResourceB:read'])]
22+
#[MaxDepth(3)]
23+
public ResourceB $b;
24+
public function __construct(?ResourceB $b = null)
25+
{
26+
if ($b !== null) {
27+
$this->b = $b;
28+
}
29+
}
30+
31+
public static function provide(): ResourceA
32+
{
33+
return self::provideWithResource();
34+
}
35+
36+
public static function provideWithResource(?ResourceB $b = null): ResourceA {
37+
if(!isset(self::$resourceA)) {
38+
self::$resourceA = new ResourceA($b);
39+
40+
if(ResourceB::getInstance() === null) {
41+
self::$resourceA->b = ResourceB::provideWithResource(self::$resourceA);
42+
}
43+
}
44+
return self::$resourceA;
45+
}
46+
47+
public static function getInstance(): ?ResourceA {
48+
return self::$resourceA;
49+
}
50+
51+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
namespace ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\Issue4358;
4+
5+
use ApiPlatform\Metadata\ApiProperty;
6+
use ApiPlatform\Metadata\Get;
7+
use Symfony\Component\Serializer\Annotation\Groups;
8+
use Symfony\Component\Serializer\Annotation\MaxDepth;
9+
10+
#[Get(uriTemplate: 'resource_b',
11+
formats: ['jsonhal'],
12+
outputFormats: ['jsonhal'],
13+
normalizationContext: ['groups' => ['ResourceB:read'], 'enable_max_depth' => true],
14+
provider: [self::class, 'provide'])]
15+
final class ResourceB
16+
{
17+
private static ?ResourceB $resourceB = null;
18+
19+
#[ApiProperty(readableLink: true)]
20+
#[Groups(['ResourceA:read', 'ResourceB:read'])]
21+
#[MaxDepth(3)]
22+
public ResourceA $a;
23+
24+
public function __construct(?ResourceA $a = null)
25+
{
26+
if ($a !== null) {
27+
$this->a = $a;
28+
}
29+
}
30+
31+
public static function provide(): ResourceB
32+
{
33+
return self::provideWithResource();
34+
}
35+
36+
public static function provideWithResource(?ResourceA $a = null): ResourceB
37+
{
38+
if(!isset(self::$resourceB)) {
39+
self::$resourceB = new ResourceB($a);
40+
41+
if(ResourceA::getInstance() === null) {
42+
self::$resourceB->a = ResourceA::provideWithResource(self::$resourceB);
43+
}
44+
}
45+
return self::$resourceB;
46+
}
47+
48+
public static function getInstance(): ?ResourceB
49+
{
50+
return self::$resourceB;
51+
}
52+
53+
}

tests/Fixtures/app/AppKernel.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public function registerBundles(): array
8181
}
8282

8383
if (class_exists(DoctrineMongoDBBundle::class)) {
84-
$bundles[] = new DoctrineMongoDBBundle();
84+
//$bundles[] = new DoctrineMongoDBBundle();
8585
}
8686

8787
$bundles[] = new TestBundle();
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace ApiPlatform\Tests\Functional;
4+
5+
use ApiPlatform\Symfony\Bundle\Test\ApiTestCase;
6+
use ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\Issue4358\ResourceA;
7+
use ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\Issue4358\ResourceB;
8+
use ApiPlatform\Tests\SetupClassResourcesTrait;
9+
10+
class HALCircularReference extends ApiTestCase
11+
{
12+
use SetupClassResourcesTrait;
13+
14+
public function testIssue4358()
15+
{
16+
$r1 = self::createClient()->request('GET', '/resource_a', ['headers' => ['Accept' => 'application/hal+json']]);
17+
$this->assertResponseIsSuccessful();
18+
echo $r1->getContent();
19+
}
20+
21+
public static function getResources(): array
22+
{
23+
return [ResourceA::class, ResourceB::class];
24+
}
25+
}

0 commit comments

Comments
 (0)