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