packages/ztd-query-core/tests/Unit/Exception/ForeignKeyViolationExceptionTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Exception;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Exception\ForeignKeyViolationException;
10
11#[CoversClass(ForeignKeyViolationException::class)]
12final class ForeignKeyViolationExceptionTest extends TestCase
13{
14 public function testGetMessageReturnsFormattedMessage(): void
15 {
16 $exception = new ForeignKeyViolationException(
17 'INSERT INTO orders (user_id) VALUES (999)',
18 'orders',
19 'fk_orders_users',
20 'users',
21 'id'
22 );
23
24 self::assertSame(
25 "Foreign key constraint 'fk_orders_users' violated: referenced row not found in 'users.id'.",
26 $exception->getMessage()
27 );
28 }
29
30 public function testGetSqlReturnsOriginalSql(): void
31 {
32 $sql = 'INSERT INTO orders (user_id) VALUES (999)';
33 $exception = new ForeignKeyViolationException($sql, 'orders', 'fk_orders_users', 'users', 'id');
34
35 self::assertSame($sql, $exception->getSql());
36 }
37
38 public function testGetTableNameReturnsTableName(): void
39 {
40 $exception = new ForeignKeyViolationException('sql', 'orders', 'fk_orders_users', 'users', 'id');
41
42 self::assertSame('orders', $exception->getTableName());
43 }
44
45 public function testGetConstraintNameReturnsConstraintName(): void
46 {
47 $exception = new ForeignKeyViolationException('sql', 'orders', 'fk_orders_users', 'users', 'id');
48
49 self::assertSame('fk_orders_users', $exception->getConstraintName());
50 }
51
52 public function testGetReferencedTableReturnsReferencedTable(): void
53 {
54 $exception = new ForeignKeyViolationException('sql', 'orders', 'fk_orders_users', 'users', 'id');
55
56 self::assertSame('users', $exception->getReferencedTable());
57 }
58
59 public function testGetReferencedColumnReturnsReferencedColumn(): void
60 {
61 $exception = new ForeignKeyViolationException('sql', 'orders', 'fk_orders_users', 'users', 'id');
62
63 self::assertSame('id', $exception->getReferencedColumn());
64 }
65
66 public function testOfNamesTheFirstColumnTheKeyPointsAt(): void
67 {
68 $exception = ForeignKeyViolationException::of('DELETE', 'children', 'fk', 'parents', ['id', 'other']);
69
70 self::assertSame('id', $exception->getReferencedColumn());
71 self::assertSame('children', $exception->getTableName());
72 }
73
74 public function testOfNamesNoColumnWhereTheKeyPointsAtNone(): void
75 {
76 $exception = ForeignKeyViolationException::of('DELETE', 'children', 'fk', 'parents', []);
77
78 self::assertSame('', $exception->getReferencedColumn());
79 }
80}
81