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