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