packages/ztd-query-postgres/tests/Unit/Connection/PgSqlErrorClassifierTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Connection;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Connection\Exception\DatabaseException;
10use ZtdQuery\Platform\Postgres\Connection\PgSqlErrorClassifier;
11
12#[CoversClass(PgSqlErrorClassifier::class)]
13final class PgSqlErrorClassifierTest extends TestCase
14{
15    public function testIsUnknownSchemaErrorUndefinedColumnError(): void
16    {
17        $classifier = new PgSqlErrorClassifier();
18        $e = new DatabaseException('ERROR: column "unknown_col" does not exist (42703)', 7);
19        self::assertTrue($classifier->isUnknownSchemaError($e));
20    }
21
22    public function testUndefinedTableError(): void
23    {
24        $classifier = new PgSqlErrorClassifier();
25        $e = new DatabaseException('ERROR: relation "unknown_table" does not exist (42P01)', 7);
26        self::assertTrue($classifier->isUnknownSchemaError($e));
27    }
28
29    public function testColumnDoesNotExistPattern(): void
30    {
31        $classifier = new PgSqlErrorClassifier();
32        $e = new DatabaseException('column "foo" does not exist', null);
33        self::assertTrue($classifier->isUnknownSchemaError($e));
34    }
35
36    public function testRelationDoesNotExistPattern(): void
37    {
38        $classifier = new PgSqlErrorClassifier();
39        $e = new DatabaseException('relation "bar" does not exist', null);
40        self::assertTrue($classifier->isUnknownSchemaError($e));
41    }
42
43    public function testSyntaxErrorNotSchemaError(): void
44    {
45        $classifier = new PgSqlErrorClassifier();
46        $e = new DatabaseException('ERROR: syntax error at or near "SELEC" (42601)', null);
47        self::assertFalse($classifier->isUnknownSchemaError($e));
48    }
49
50    public function testConstraintViolationNotSchemaError(): void
51    {
52        $classifier = new PgSqlErrorClassifier();
53        $e = new DatabaseException('ERROR: duplicate key value violates unique constraint (23505)', null);
54        self::assertFalse($classifier->isUnknownSchemaError($e));
55    }
56
57    public function testNullCodeNonSchemaMessage(): void
58    {
59        $classifier = new PgSqlErrorClassifier();
60        $e = new DatabaseException('Connection refused', null);
61        self::assertFalse($classifier->isUnknownSchemaError($e));
62    }
63
64    public function testColumnDoesNotExistUpperCase(): void
65    {
66        $classifier = new PgSqlErrorClassifier();
67        $e = new DatabaseException('COLUMN "foo" DOES NOT EXIST', null);
68        self::assertTrue($classifier->isUnknownSchemaError($e));
69    }
70
71    public function testRelationDoesNotExistUpperCase(): void
72    {
73        $classifier = new PgSqlErrorClassifier();
74        $e = new DatabaseException('RELATION "bar" DOES NOT EXIST', null);
75        self::assertTrue($classifier->isUnknownSchemaError($e));
76    }
77
78    public function testTableDoesNotExistPattern(): void
79    {
80        $classifier = new PgSqlErrorClassifier();
81        $e = new DatabaseException('table "baz" does not exist', null);
82        self::assertTrue($classifier->isUnknownSchemaError($e));
83    }
84
85    public function testTableDoesNotExistUpperCase(): void
86    {
87        $classifier = new PgSqlErrorClassifier();
88        $e = new DatabaseException('TABLE "baz" DOES NOT EXIST', null);
89        self::assertTrue($classifier->isUnknownSchemaError($e));
90    }
91
92    public function testSqlstateOnlyWithoutPatternMatch(): void
93    {
94        $classifier = new PgSqlErrorClassifier();
95        $e = new DatabaseException('42703', null);
96        self::assertTrue($classifier->isUnknownSchemaError($e));
97    }
98
99    public function testSqlstate42P01OnlyWithoutPatternMatch(): void
100    {
101        $classifier = new PgSqlErrorClassifier();
102        $e = new DatabaseException('42P01', null);
103        self::assertTrue($classifier->isUnknownSchemaError($e));
104    }
105
106    public function testSqlstate42P02OnlyWithoutPatternMatch(): void
107    {
108        $classifier = new PgSqlErrorClassifier();
109        $e = new DatabaseException('Error 42P02', null);
110        self::assertTrue($classifier->isUnknownSchemaError($e));
111    }
112
113    public function testSqlstate42P10OnlyWithoutPatternMatch(): void
114    {
115        $classifier = new PgSqlErrorClassifier();
116        $e = new DatabaseException('Error 42P10', null);
117        self::assertTrue($classifier->isUnknownSchemaError($e));
118    }
119
120    public function testSqlstate42704OnlyWithoutPatternMatch(): void
121    {
122        $classifier = new PgSqlErrorClassifier();
123        $e = new DatabaseException('Error 42704', null);
124        self::assertTrue($classifier->isUnknownSchemaError($e));
125    }
126
127    public function testDriverCodeOnlyWithoutMessageMatch(): void
128    {
129        $classifier = new PgSqlErrorClassifier();
130        $e = new DatabaseException('Some generic error', 7);
131        self::assertTrue($classifier->isUnknownSchemaError($e));
132    }
133
134    public function testNullCodeAndNoPatternReturnsFalse(): void
135    {
136        $classifier = new PgSqlErrorClassifier();
137        $e = new DatabaseException('Some other error', null);
138        self::assertFalse($classifier->isUnknownSchemaError($e));
139    }
140
141    public function testNonSchemaDriverCodeReturnsFalse(): void
142    {
143        $classifier = new PgSqlErrorClassifier();
144        $e = new DatabaseException('Some error without schema code', 99);
145        self::assertFalse($classifier->isUnknownSchemaError($e));
146    }
147
148    public function testDriverCodeZeroIsNotSchemaError(): void
149    {
150        $classifier = new PgSqlErrorClassifier();
151        $e = new DatabaseException('General failure', 0);
152        self::assertFalse($classifier->isUnknownSchemaError($e));
153    }
154}
155