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