packages/ztd-query-mysqli-adapter/tests/Unit/Native/MysqliPropertyReaderTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Native;
6
7use Container\MySql80Container;
8use Container\MySql84Container;
9use mysqli;
10use PHPUnit\Framework\Attributes\CoversClass;
11use PHPUnit\Framework\Attributes\Large;
12use PHPUnit\Framework\TestCase;
13use Testcontainers\Testcontainers;
14use ZtdQuery\Adapter\Mysqli\Native\MysqliPropertyReader;
15
16#[CoversClass(MysqliPropertyReader::class)]
17#[Large]
18final class MysqliPropertyReaderTest extends TestCase
19{
20    public function testReadReturnsNativePropertiesAndNullForUnknownNames(): void
21    {
22        $container = Testcontainers::run(getenv('MYSQL_VERSION') === '8.4.7' ? MySql84Container::class : MySql80Container::class);
23        try {
24            $connection = new mysqli(str_replace('localhost', '127.0.0.1', $container->getHost()), 'root', 'root', 'test', $container->getMappedPort(3306));
25            $connection->set_charset('utf8mb4');
26            $reader = new MysqliPropertyReader();
27            self::assertSame($connection->affected_rows, $reader->read($connection, 'affected_rows'));
28            self::assertSame($connection->client_info, $reader->read($connection, 'client_info'));
29            self::assertSame($connection->client_version, $reader->read($connection, 'client_version'));
30            self::assertSame($connection->connect_errno, $reader->read($connection, 'connect_errno'));
31            self::assertSame($connection->connect_error, $reader->read($connection, 'connect_error'));
32            self::assertSame($connection->errno, $reader->read($connection, 'errno'));
33            self::assertSame($connection->error, $reader->read($connection, 'error'));
34            self::assertSame($connection->error_list, $reader->read($connection, 'error_list'));
35            self::assertSame($connection->field_count, $reader->read($connection, 'field_count'));
36            self::assertSame($connection->host_info, $reader->read($connection, 'host_info'));
37            self::assertSame($connection->info, $reader->read($connection, 'info'));
38            self::assertSame($connection->insert_id, $reader->read($connection, 'insert_id'));
39            self::assertSame($connection->server_info, $reader->read($connection, 'server_info'));
40            self::assertSame($connection->server_version, $reader->read($connection, 'server_version'));
41            self::assertSame($connection->sqlstate, $reader->read($connection, 'sqlstate'));
42            self::assertSame($connection->protocol_version, $reader->read($connection, 'protocol_version'));
43            self::assertSame($connection->thread_id, $reader->read($connection, 'thread_id'));
44            self::assertSame($connection->warning_count, $reader->read($connection, 'warning_count'));
45            self::assertNull($reader->read($connection, 'unsupported'));
46            $connection->close();
47        } finally {
48            $container->stop();
49        }
50    }
51
52    public function testReadPreservesFailedConnectionDetails(): void
53    {
54        $container = Testcontainers::run(getenv('MYSQL_VERSION') === '8.4.7' ? MySql84Container::class : MySql80Container::class);
55        try {
56            $host = str_replace('localhost', '127.0.0.1', $container->getHost());
57            $port = $container->getMappedPort(3306);
58            self::assertNotNull($port);
59            mysqli_report(MYSQLI_REPORT_OFF);
60            try {
61                $connection = new mysqli($host, 'missing_' . bin2hex(random_bytes(8)), 'invalid', 'test', $port);
62                $reader = new MysqliPropertyReader();
63                $error = $connection->connect_error;
64                self::assertIsString($error);
65                self::assertNotSame('', $error);
66                self::assertGreaterThan(0, $connection->connect_errno);
67                self::assertSame($connection->connect_errno, $reader->read($connection, 'connect_errno'));
68                self::assertSame($error, $reader->read($connection, 'connect_error'));
69            } finally {
70                mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
71            }
72        } finally {
73            $container->stop();
74        }
75    }
76
77    public function testReadPreservesInformationFromMultipleWrites(): void
78    {
79        $container = Testcontainers::run(getenv('MYSQL_VERSION') === '8.4.7' ? MySql84Container::class : MySql80Container::class);
80        try {
81            $connection = new mysqli(str_replace('localhost', '127.0.0.1', $container->getHost()), 'root', 'root', 'test', $container->getMappedPort(3306));
82            $connection->set_charset('utf8mb4');
83            $connection->query('CREATE TEMPORARY TABLE info_rows (id INT PRIMARY KEY)');
84            $connection->query('INSERT INTO info_rows VALUES (1), (2)');
85            $reader = new MysqliPropertyReader();
86            $info = $connection->info;
87            self::assertIsString($info);
88            self::assertNotSame('', $info);
89            self::assertSame($info, $reader->read($connection, 'info'));
90            self::assertSame(2, $reader->read($connection, 'affected_rows'));
91            $connection->close();
92        } finally {
93            $container->stop();
94        }
95    }
96
97}
98