Skip to content

Commit 03c58ac

Browse files
Added tests for ULID identifier
1 parent d05956e commit 03c58ac

15 files changed

Lines changed: 549 additions & 0 deletions

File tree

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Cycle\ORM\Entity\Behavior\Identifier\Tests\Fixtures\Ulid;
6+
7+
use Cycle\Annotated\Annotation\Column;
8+
use Cycle\Annotated\Annotation\Entity;
9+
use Cycle\ORM\Entity\Behavior\Identifier\Ulid;
10+
use Ramsey\Identifier\Ulid as UlidInterface;
11+
12+
/**
13+
* @Entity
14+
* @Ulid
15+
* @Ulid(field="fooUlid", column="foo_ulid")
16+
* @Ulid(field="bar")
17+
*/
18+
#[Entity]
19+
#[Ulid]
20+
#[Ulid(field: 'fooUlid', column: 'foo_ulid')]
21+
#[Ulid(field: 'bar')]
22+
final class MultipleUlid
23+
{
24+
/**
25+
* @Column(type="ulid", primary=true)
26+
*/
27+
#[Column(type: 'ulid', primary: true)]
28+
public UlidInterface $ulid;
29+
30+
/**
31+
* @Column(type="ulid", name="foo_ulid")
32+
*/
33+
#[Column(type: 'ulid', name: 'foo_ulid')]
34+
public UlidInterface $fooUlid;
35+
36+
/**
37+
* @Column(type="ulid")
38+
*/
39+
#[Column(type: 'ulid')]
40+
public UlidInterface $bar;
41+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Cycle\ORM\Entity\Behavior\Identifier\Tests\Fixtures\Ulid;
6+
7+
use Cycle\Annotated\Annotation\Column;
8+
use Cycle\Annotated\Annotation\Entity;
9+
use Cycle\ORM\Entity\Behavior\Identifier\Ulid;
10+
use Ramsey\Identifier\Ulid as UlidInterface;
11+
12+
/**
13+
* @Entity
14+
* @Ulid
15+
* @Ulid(field="notDefinedUlid", column="not_defined_ulid", nullable=true)
16+
*/
17+
#[Entity]
18+
#[Ulid]
19+
#[Ulid(field: 'notDefinedUlid', column: 'not_defined_ulid', nullable: true)]
20+
final class NullableUlid
21+
{
22+
/**
23+
* @Column(type="ulid", primary=true)
24+
*/
25+
#[Column(type: 'ulid', primary: true)]
26+
public UlidInterface $ulid;
27+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Cycle\ORM\Entity\Behavior\Identifier\Tests\Fixtures\Ulid;
6+
7+
use Cycle\Annotated\Annotation\Column;
8+
use Cycle\Annotated\Annotation\Entity;
9+
use Cycle\ORM\Entity\Behavior\Identifier\Ulid;
10+
11+
/**
12+
* @Entity
13+
* @Ulid(field="customUlid", column="custom_ulid")
14+
*/
15+
#[Entity]
16+
#[Ulid(field: 'customUlid', column: 'custom_ulid')]
17+
class Post
18+
{
19+
/**
20+
* @Column(type="primary")
21+
*/
22+
#[Column(type: 'primary')]
23+
public int $id;
24+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Cycle\ORM\Entity\Behavior\Identifier\Tests\Fixtures\Ulid;
6+
7+
use Cycle\Annotated\Annotation\Column;
8+
use Cycle\Annotated\Annotation\Entity;
9+
use Cycle\ORM\Entity\Behavior\Identifier\Ulid;
10+
use Ramsey\Identifier\Ulid as UlidInterface;
11+
12+
/**
13+
* @Entity
14+
* @Ulid
15+
*/
16+
#[Entity]
17+
#[Ulid]
18+
class User
19+
{
20+
/**
21+
* @Column(type="ulid", primary=true)
22+
*/
23+
#[Column(type: 'ulid', primary: true)]
24+
public UlidInterface $ulid;
25+
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Cycle\ORM\Entity\Behavior\Identifier\Tests\Functional\Driver\Common\Ulid;
6+
7+
use Cycle\ORM\Entity\Behavior\Identifier\Tests\Fixtures\Ulid\User;
8+
use Cycle\ORM\Entity\Behavior\Identifier\Tests\Functional\Driver\Common\BaseTest;
9+
use Cycle\ORM\Entity\Behavior\Identifier\Tests\Traits\TableTrait;
10+
use Cycle\ORM\Entity\Behavior\Identifier\Listener\Ulid as UlidListener;
11+
use Cycle\ORM\Entity\Behavior\Identifier\Ulid;
12+
use Cycle\ORM\Heap\Heap;
13+
use Cycle\ORM\Schema;
14+
use Cycle\ORM\SchemaInterface;
15+
use Cycle\ORM\Select;
16+
use Ramsey\Identifier\Ulid as UlidInterface;
17+
use Ramsey\Identifier\Ulid\UlidFactory;
18+
19+
abstract class ListenerTest extends BaseTest
20+
{
21+
use TableTrait;
22+
23+
public function testAssignManually(): void
24+
{
25+
$this->withListeners(UlidListener::class);
26+
27+
$user = new User();
28+
$user->ulid = (new UlidFactory())->create();
29+
$bytes = $user->ulid->toBytes();
30+
31+
$this->save($user);
32+
33+
$select = new Select($this->orm->with(heap: new Heap()), User::class);
34+
$data = $select->fetchOne();
35+
36+
$this->assertSame($bytes, $data->ulid->toBytes());
37+
}
38+
39+
public function testWithNullableTrue(): void
40+
{
41+
$this->withListeners([
42+
UlidListener::class,
43+
[
44+
'field' => 'foo_ulid',
45+
'nullable' => true,
46+
],
47+
]);
48+
49+
$user = new User();
50+
$user->ulid = (new UlidFactory())->create();
51+
52+
$this->save($user);
53+
54+
$select = new Select($this->orm->with(heap: new Heap()), User::class);
55+
$data = $select->fetchData();
56+
57+
$this->assertNull($data[0]['foo_ulid']);
58+
}
59+
60+
public function testUlid(): void
61+
{
62+
$this->withListeners(UlidListener::class);
63+
64+
$user = new User();
65+
$this->save($user);
66+
67+
$select = new Select($this->orm->with(heap: new Heap()), User::class);
68+
$data = $select->fetchOne();
69+
70+
$this->assertInstanceOf(UlidInterface::class, $data->ulid);
71+
$this->assertIsString($data->ulid->toBytes());
72+
$this->assertIsString($data->ulid->toString());
73+
}
74+
75+
public function withListeners(array|string $listeners): void
76+
{
77+
$this->withSchema(new Schema([
78+
User::class => [
79+
SchemaInterface::ROLE => 'user',
80+
SchemaInterface::DATABASE => 'default',
81+
SchemaInterface::TABLE => 'users',
82+
SchemaInterface::PRIMARY_KEY => 'ulid',
83+
SchemaInterface::COLUMNS => ['ulid', 'foo_ulid'],
84+
SchemaInterface::LISTENERS => [$listeners],
85+
SchemaInterface::SCHEMA => [],
86+
SchemaInterface::RELATIONS => [],
87+
SchemaInterface::TYPECAST => [
88+
'ulid' => [Ulid::class, 'fromString'],
89+
'foo_ulid' => [Ulid::class, 'fromString'],
90+
],
91+
],
92+
]));
93+
}
94+
95+
public function setUp(): void
96+
{
97+
parent::setUp();
98+
99+
$this->makeTable(
100+
'users',
101+
[
102+
'ulid' => 'string',
103+
'foo_ulid' => 'string,nullable',
104+
],
105+
);
106+
}
107+
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Cycle\ORM\Entity\Behavior\Identifier\Tests\Functional\Driver\Common\Ulid;
6+
7+
use Cycle\Annotated\Locator\TokenizerEntityLocator;
8+
use Cycle\ORM\Entity\Behavior\Identifier\Tests\Fixtures\Ulid\MultipleUlid;
9+
use Cycle\ORM\Entity\Behavior\Identifier\Tests\Fixtures\Ulid\NullableUlid;
10+
use Cycle\ORM\Entity\Behavior\Identifier\Tests\Fixtures\Ulid\Post;
11+
use Cycle\ORM\Entity\Behavior\Identifier\Tests\Fixtures\Ulid\User;
12+
use Cycle\ORM\Entity\Behavior\Identifier\Tests\Functional\Driver\Common\BaseTest;
13+
use Cycle\ORM\Entity\Behavior\Identifier\Ulid;
14+
use Cycle\ORM\Schema\GeneratedField;
15+
use Cycle\Schema\Registry;
16+
use Spiral\Attributes\AttributeReader;
17+
use Spiral\Attributes\ReaderInterface;
18+
use Spiral\Tokenizer\ClassLocator;
19+
use Symfony\Component\Finder\Finder;
20+
21+
abstract class UlidTest extends BaseTest
22+
{
23+
protected Registry $registry;
24+
protected TokenizerEntityLocator $tokenizer;
25+
26+
/**
27+
* @dataProvider readersDataProvider
28+
*/
29+
public function testColumnExist(ReaderInterface $reader): void
30+
{
31+
$this->compileWithTokenizer($this->tokenizer, $reader);
32+
33+
$fields = $this->registry->getEntity(User::class)->getFields();
34+
35+
$this->assertTrue($fields->has('ulid'));
36+
$this->assertTrue($fields->hasColumn('ulid'));
37+
$this->assertSame('ulid', $fields->get('ulid')->getType());
38+
$this->assertSame([Ulid::class, 'fromString'], $fields->get('ulid')->getTypecast());
39+
$this->assertSame(GeneratedField::BEFORE_INSERT, $fields->get('ulid')->getGenerated());
40+
$this->assertSame(1, $fields->count());
41+
}
42+
43+
/**
44+
* @dataProvider readersDataProvider
45+
*/
46+
public function testAddColumn(ReaderInterface $reader): void
47+
{
48+
$this->compileWithTokenizer($this->tokenizer, $reader);
49+
50+
$fields = $this->registry->getEntity(Post::class)->getFields();
51+
52+
$this->assertTrue($fields->has('customUlid'));
53+
$this->assertTrue($fields->hasColumn('custom_ulid'));
54+
$this->assertSame('ulid', $fields->get('customUlid')->getType());
55+
$this->assertSame([Ulid::class, 'fromString'], $fields->get('customUlid')->getTypecast());
56+
$this->assertSame(GeneratedField::BEFORE_INSERT, $fields->get('customUlid')->getGenerated());
57+
}
58+
59+
/**
60+
* @dataProvider readersDataProvider
61+
*/
62+
public function testMultipleUlid(ReaderInterface $reader): void
63+
{
64+
$this->compileWithTokenizer($this->tokenizer, $reader);
65+
66+
$fields = $this->registry->getEntity(MultipleUlid::class)->getFields();
67+
68+
$this->assertTrue($fields->has('ulid'));
69+
$this->assertTrue($fields->hasColumn('ulid'));
70+
$this->assertSame('ulid', $fields->get('ulid')->getType());
71+
$this->assertSame([Ulid::class, 'fromString'], $fields->get('ulid')->getTypecast());
72+
$this->assertSame(GeneratedField::BEFORE_INSERT, $fields->get('ulid')->getGenerated());
73+
74+
$this->assertTrue($fields->has('fooUlid'));
75+
$this->assertTrue($fields->hasColumn('foo_ulid'));
76+
$this->assertSame('ulid', $fields->get('fooUlid')->getType());
77+
$this->assertSame([Ulid::class, 'fromString'], $fields->get('fooUlid')->getTypecast());
78+
$this->assertSame(GeneratedField::BEFORE_INSERT, $fields->get('fooUlid')->getGenerated());
79+
80+
$this->assertTrue($fields->has('bar'));
81+
$this->assertTrue($fields->hasColumn('bar'));
82+
$this->assertSame('ulid', $fields->get('bar')->getType());
83+
$this->assertSame([Ulid::class, 'fromString'], $fields->get('bar')->getTypecast());
84+
$this->assertSame(GeneratedField::BEFORE_INSERT, $fields->get('bar')->getGenerated());
85+
}
86+
87+
/**
88+
* @dataProvider readersDataProvider
89+
*/
90+
public function testAddNullableColumn(ReaderInterface $reader): void
91+
{
92+
$this->compileWithTokenizer($this->tokenizer, $reader);
93+
94+
$fields = $this->registry->getEntity(NullableUlid::class)->getFields();
95+
96+
$this->assertTrue($fields->has('notDefinedUlid'));
97+
$this->assertTrue($fields->hasColumn('not_defined_ulid'));
98+
$this->assertSame('ulid', $fields->get('notDefinedUlid')->getType());
99+
$this->assertSame([Ulid::class, 'fromString'], $fields->get('notDefinedUlid')->getTypecast());
100+
$this->assertTrue(
101+
$this->registry
102+
->getTableSchema($this->registry->getEntity(NullableUlid::class))
103+
->column('not_defined_ulid')
104+
->isNullable(),
105+
);
106+
$this->assertNull($fields->get('notDefinedUlid')->getGenerated());
107+
}
108+
109+
public function setUp(): void
110+
{
111+
parent::setUp();
112+
113+
$locator = new ClassLocator((new Finder())->files()->in([\dirname(__DIR__, 4) . '/Fixtures/Ulid']));
114+
$reader = new AttributeReader();
115+
$this->tokenizer = new TokenizerEntityLocator($locator, $reader);
116+
}
117+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Cycle\ORM\Entity\Behavior\Identifier\Tests\Functional\Driver\MySQL\Ulid;
6+
7+
// phpcs:ignore
8+
use Cycle\ORM\Entity\Behavior\Identifier\Tests\Functional\Driver\Common\Ulid\ListenerTest as CommonClass;
9+
10+
/**
11+
* @group driver
12+
* @group driver-mysql
13+
*/
14+
class ListenerTest extends CommonClass
15+
{
16+
public const DRIVER = 'mysql';
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Cycle\ORM\Entity\Behavior\Identifier\Tests\Functional\Driver\MySQL\Ulid;
6+
7+
// phpcs:ignore
8+
use Cycle\ORM\Entity\Behavior\Identifier\Tests\Functional\Driver\Common\Ulid\UlidTest as CommonClass;
9+
10+
/**
11+
* @group driver
12+
* @group driver-mysql
13+
*/
14+
class UlidTest extends CommonClass
15+
{
16+
public const DRIVER = 'mysql';
17+
}

0 commit comments

Comments
 (0)