packages/ztd-query-sqlite/tests/Unit/Connection/SqliteErrorClassifierTest.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\Sqlite\Connection\SqliteErrorClassifier;
11
12#[CoversClass(SqliteErrorClassifier::class)]
13final class SqliteErrorClassifierTest extends TestCase
14{
15    public function testIsUnknownSchemaErrorNoSuchTableIsUnknownSchemaError(): void
16    {
17        $classifier = new SqliteErrorClassifier();
18        $e = new DatabaseException('no such table: users', 1);
19        self::assertTrue($classifier->isUnknownSchemaError($e));
20    }
21
22    public function testNoSuchColumnIsUnknownSchemaError(): void
23    {
24        $classifier = new SqliteErrorClassifier();
25        $e = new DatabaseException('no such column: name', 1);
26        self::assertTrue($classifier->isUnknownSchemaError($e));
27    }
28
29    public function testHasNoColumnNamedIsUnknownSchemaError(): void
30    {
31        $classifier = new SqliteErrorClassifier();
32        $e = new DatabaseException('table users has no column named foo', 1);
33        self::assertTrue($classifier->isUnknownSchemaError($e));
34    }
35
36    public function testSyntaxErrorIsNotUnknownSchemaError(): void
37    {
38        $classifier = new SqliteErrorClassifier();
39        $e = new DatabaseException('near "SELCT": syntax error', 1);
40        self::assertFalse($classifier->isUnknownSchemaError($e));
41    }
42
43    public function testConstraintViolationIsNotUnknownSchemaError(): void
44    {
45        $classifier = new SqliteErrorClassifier();
46        $e = new DatabaseException('UNIQUE constraint failed: users.email', 19);
47        self::assertFalse($classifier->isUnknownSchemaError($e));
48    }
49
50    public function testNullDriverCodeIsNotUnknownSchemaError(): void
51    {
52        $classifier = new SqliteErrorClassifier();
53        $e = new DatabaseException('some error', null);
54        self::assertFalse($classifier->isUnknownSchemaError($e));
55    }
56
57    public function testNonSqliteErrorCodeIsNotUnknownSchemaError(): void
58    {
59        $classifier = new SqliteErrorClassifier();
60        $e = new DatabaseException('some error', 999);
61        self::assertFalse($classifier->isUnknownSchemaError($e));
62    }
63
64    public function testUppercaseNoSuchTableIsUnknownSchemaError(): void
65    {
66        $classifier = new SqliteErrorClassifier();
67        $e = new DatabaseException('No Such Table: users', 1);
68        self::assertTrue($classifier->isUnknownSchemaError($e));
69    }
70
71    public function testUppercaseNoSuchColumnIsUnknownSchemaError(): void
72    {
73        $classifier = new SqliteErrorClassifier();
74        $e = new DatabaseException('No Such Column: name', 1);
75        self::assertTrue($classifier->isUnknownSchemaError($e));
76    }
77
78    public function testUppercaseHasNoColumnNamedIsUnknownSchemaError(): void
79    {
80        $classifier = new SqliteErrorClassifier();
81        $e = new DatabaseException('Table users Has No Column Named foo', 1);
82        self::assertTrue($classifier->isUnknownSchemaError($e));
83    }
84
85    public function testNullDriverCodeReturnsFalseNotNull(): void
86    {
87        $classifier = new SqliteErrorClassifier();
88        $e = new DatabaseException('no such table: users', null);
89        $result = $classifier->isUnknownSchemaError($e);
90        self::assertFalse($result);
91    }
92}
93