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