Skip to content

Commit 047ea91

Browse files
committed
Introduce UnionBuilder
1 parent 9dd9f8e commit 047ea91

File tree

2 files changed

+110
-0
lines changed

2 files changed

+110
-0
lines changed

src/Builder/UnionBuilder.php

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace SimPod\GraphQLUtils\Builder;
6+
7+
use GraphQL\Type\Definition\ObjectType;
8+
use GraphQL\Type\Definition\ResolveInfo;
9+
10+
class UnionBuilder extends TypeBuilder
11+
{
12+
/** @var callable(object, mixed, ResolveInfo)|null */
13+
private $resolveType;
14+
15+
/** @var ObjectType[] */
16+
private $types;
17+
18+
/**
19+
* @return static
20+
*/
21+
public static function create(string $name) : self
22+
{
23+
return new static($name);
24+
}
25+
26+
/**
27+
* @see ResolveInfo Force Jetbrains IDE use
28+
*
29+
* @param callable(mixed):ObjectType $resolveType
30+
*
31+
* @return static
32+
*/
33+
public function setResolveType(callable $resolveType) : self
34+
{
35+
$this->resolveType = $resolveType;
36+
37+
return $this;
38+
}
39+
40+
/**
41+
* @param ObjectType[] $types
42+
*
43+
* @return static
44+
*/
45+
public function setTypes(array $types) : self
46+
{
47+
$this->types = $types;
48+
49+
return $this;
50+
}
51+
52+
/**
53+
* @return mixed[]
54+
*/
55+
public function build() : array
56+
{
57+
$parameters = parent::build();
58+
$parameters['types'] = $this->types;
59+
$parameters['resolveType'] = $this->resolveType;
60+
61+
return $parameters;
62+
}
63+
}

tests/Builder/UnionBuilderTest.php

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace SimPod\GraphQLUtils\Tests\Builder;
6+
7+
use GraphQL\Type\Definition\ObjectType;
8+
use PHPUnit\Framework\TestCase;
9+
use SimPod\GraphQLUtils\Builder\ObjectBuilder;
10+
use SimPod\GraphQLUtils\Builder\UnionBuilder;
11+
12+
final class UnionBuilderTest extends TestCase
13+
{
14+
public function testCreate() : void
15+
{
16+
$name = 'InterfaceA';
17+
18+
$builder = UnionBuilder::create($name);
19+
$description = 'Description';
20+
21+
$typeA = new ObjectType(ObjectBuilder::create('TypeA')->build());
22+
$typeB = new ObjectType(ObjectBuilder::create('TypeB')->build());
23+
24+
$union = $builder
25+
->setDescription($description)
26+
->setTypes(
27+
[$typeA, $typeB]
28+
)
29+
->setResolveType(
30+
static function (bool $value) use ($typeA, $typeB) : ObjectType {
31+
return $value ? $typeA : $typeB;
32+
}
33+
)
34+
->build();
35+
36+
self::assertSame($name, $union['name']);
37+
self::assertSame($description, $union['description']);
38+
39+
self::assertArrayHasKey('types', $union);
40+
self::assertIsArray($union['types']);
41+
self::assertCount(2, $union['types']);
42+
43+
self::assertArrayHasKey('resolveType', $union);
44+
self::assertSame($typeA, $union['resolveType'](true));
45+
self::assertSame($typeB, $union['resolveType'](false));
46+
}
47+
}

0 commit comments

Comments
 (0)