packages/ztd-query-mysqli-adapter/tests/Unit/Driver/MysqliConnectionTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Driver;
6
7use Container\MySql80Container;
8use Container\MySql84Container;
9use mysqli;
10use PHPUnit\Framework\Attributes\CoversClass;
11use PHPUnit\Framework\Attributes\Large;
12use PHPUnit\Framework\Attributes\UsesClass;
13use PHPUnit\Framework\TestCase;
14use Testcontainers\Testcontainers;
15use ZtdQuery\Adapter\Mysqli\Driver\MysqliConnection;
16use ZtdQuery\Adapter\Mysqli\Driver\MysqliResultStatement;
17use ZtdQuery\Connection\Exception\DatabaseException;
18
19#[CoversClass(MysqliConnection::class)]
20#[UsesClass(MysqliResultStatement::class)]
21#[Large]
22final class MysqliConnectionTest extends TestCase
23{
24 public function testQueryReturnsTheNativeRows(): void
25 {
26 $container = Testcontainers::run(getenv('MYSQL_VERSION') === '8.4.7' ? MySql84Container::class : MySql80Container::class);
27 try {
28 $mysqli = new mysqli(str_replace('localhost', '127.0.0.1', $container->getHost()), 'root', 'root', 'test', $container->getMappedPort(3306));
29 $mysqli->set_charset('utf8mb4');
30 $result = (new MysqliConnection($mysqli))->query('SELECT 7 AS id');
31 self::assertInstanceOf(MysqliResultStatement::class, $result);
32 self::assertSame([['id' => '7']], $result->fetchAll());
33 self::assertSame(1, $result->rowCount());
34 } finally {
35 $container->stop();
36 }
37 }
38
39 public function testQueryWrapsAnExecutedWrite(): void
40 {
41 $container = Testcontainers::run(getenv('MYSQL_VERSION') === '8.4.7' ? MySql84Container::class : MySql80Container::class);
42 try {
43 $mysqli = new mysqli(str_replace('localhost', '127.0.0.1', $container->getHost()), 'root', 'root', 'test', $container->getMappedPort(3306));
44 $mysqli->set_charset('utf8mb4');
45 $mysqli->query('CREATE TABLE users (id INT)');
46 $result = (new MysqliConnection($mysqli))->query('INSERT INTO users VALUES (1), (2)');
47 self::assertInstanceOf(MysqliResultStatement::class, $result);
48 self::assertSame([], $result->fetchAll());
49 self::assertSame(2, $result->rowCount());
50 } finally {
51 $container->stop();
52 }
53 }
54
55 public function testQueryTranslatesNativeFailureWhenReportingIsDisabled(): void
56 {
57 $container = Testcontainers::run(getenv('MYSQL_VERSION') === '8.4.7' ? MySql84Container::class : MySql80Container::class);
58 try {
59 $mysqli = new mysqli(str_replace('localhost', '127.0.0.1', $container->getHost()), 'root', 'root', 'test', $container->getMappedPort(3306));
60 $mysqli->set_charset('utf8mb4');
61 mysqli_report(MYSQLI_REPORT_OFF);
62 try {
63 $this->expectException(DatabaseException::class);
64 $this->expectExceptionMessage('doesn\'t exist');
65 (new MysqliConnection($mysqli))->query('SELECT * FROM missing');
66 } finally {
67 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
68 }
69 } finally {
70 $container->stop();
71 }
72 }
73}
74