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\Endpoint;
8use Container\MySqlRelease;
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(MySqlRelease::fromEnvironment());
27        $endpoint = $container->getData(Endpoint::class);
28        try {
29            $mysqli = new mysqli($endpoint->host, $endpoint->username, $endpoint->password, $endpoint->database, $endpoint->port);
30            $mysqli->set_charset('utf8mb4');
31            $result = (new MysqliConnection($mysqli))->query('SELECT 7 AS id');
32            self::assertInstanceOf(MysqliResultStatement::class, $result);
33            self::assertSame([['id' => '7']], $result->fetchAll());
34            self::assertSame(1, $result->rowCount());
35        } finally {
36            $container->stop();
37        }
38    }
39
40    public function testQueryWrapsAnExecutedWrite(): void
41    {
42        $container = Testcontainers::run(MySqlRelease::fromEnvironment());
43        $endpoint = $container->getData(Endpoint::class);
44        try {
45            $mysqli = new mysqli($endpoint->host, $endpoint->username, $endpoint->password, $endpoint->database, $endpoint->port);
46            $mysqli->set_charset('utf8mb4');
47            $mysqli->query('CREATE TABLE users (id INT)');
48            $result = (new MysqliConnection($mysqli))->query('INSERT INTO users VALUES (1), (2)');
49            self::assertInstanceOf(MysqliResultStatement::class, $result);
50            self::assertSame([], $result->fetchAll());
51            self::assertSame(2, $result->rowCount());
52        } finally {
53            $container->stop();
54        }
55    }
56
57    public function testQueryTranslatesNativeFailureWhenReportingIsDisabled(): void
58    {
59        $container = Testcontainers::run(MySqlRelease::fromEnvironment());
60        $endpoint = $container->getData(Endpoint::class);
61        try {
62            $mysqli = new mysqli($endpoint->host, $endpoint->username, $endpoint->password, $endpoint->database, $endpoint->port);
63            $mysqli->set_charset('utf8mb4');
64            mysqli_report(MYSQLI_REPORT_OFF);
65            try {
66                $this->expectException(DatabaseException::class);
67                $this->expectExceptionMessage('doesn\'t exist');
68                (new MysqliConnection($mysqli))->query('SELECT * FROM missing');
69            } finally {
70                mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
71            }
72        } finally {
73            $container->stop();
74        }
75    }
76}
77