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