packages/ztd-query-pdo-adapter/tests/Unit/Driver/PdoConnectionTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Driver;
6
7use PDO;
8use PHPUnit\Framework\Attributes\CoversClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Adapter\Pdo\Driver\PdoConnection;
11use ZtdQuery\Adapter\Pdo\Driver\PdoStatement;
12use ZtdQuery\Connection\ConnectionInterface;
13use ZtdQuery\Connection\StatementInterface;
14
15#[CoversClass(PdoConnection::class)]
16#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Adapter\Pdo\ZtdPdoException::class)]
17#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Adapter\Pdo\ZtdPdoStatement::class)]
18#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Adapter\Pdo\ZtdPdo::class)]
19#[\PHPUnit\Framework\Attributes\UsesClass(PdoStatement::class)]
20#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Adapter\Pdo\Session\StatementExecution::class)]
21#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Adapter\Pdo\Session\Bindings::class)]
22#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Adapter\Pdo\Session\BufferedRow::class)]
23#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Adapter\Pdo\Session\DriverSessionFactory::class)]
24#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Adapter\Pdo\Session\ParameterKind::class)]
25#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Adapter\Pdo\Session\ParameterBinder::class)]
26#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Adapter\Pdo\Session\PreparedQuery::class)]
27#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Adapter\Pdo\Session\ConnectionExecution::class)]
28final class PdoConnectionTest extends TestCase
29{
30 public function testItIsTheConnectionZtdReadsAndWritesThrough(): void
31 {
32 $pdo = new PDO('sqlite::memory:');
33
34 self::assertContains(ConnectionInterface::class, class_implements(new PdoConnection($pdo)));
35 }
36
37 public function testQueryReturnsStatementOnSuccess(): void
38 {
39 $pdo = new PDO('sqlite::memory:');
40 $pdo->exec('CREATE TABLE t (id INTEGER)');
41 $connection = new PdoConnection($pdo);
42
43 $result = $connection->query('SELECT * FROM t');
44
45 self::assertInstanceOf(StatementInterface::class, $result);
46 }
47
48 public function testQueryReturnsFalseOnFailureInSilentMode(): void
49 {
50 $pdo = new PDO('sqlite::memory:');
51 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
52 $connection = new PdoConnection($pdo);
53
54 $result = $connection->query('SELECT * FROM nonexistent_table');
55
56 self::assertFalse($result);
57 }
58
59 public function testQueryThrowsDatabaseExceptionInExceptionMode(): void
60 {
61 $pdo = new PDO('sqlite::memory:');
62 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
63 $connection = new PdoConnection($pdo);
64
65 $this->expectException(\ZtdQuery\Connection\Exception\DatabaseException::class);
66
67 $connection->query('SELECT * FROM nonexistent_table');
68 }
69
70 public function testQueryThrowsDatabaseExceptionWithDriverErrorCode(): void
71 {
72 $pdo = new PDO('sqlite::memory:');
73 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
74 $connection = new PdoConnection($pdo);
75
76 try {
77 $connection->query('SELECT * FROM nonexistent_table');
78 self::fail('Expected DatabaseException');
79 } catch (\ZtdQuery\Connection\Exception\DatabaseException $e) {
80 self::assertSame(1, $e->getDriverErrorCode());
81 }
82 }
83}
84