packages/ztd-query-mysqli-adapter/tests/Unit/Native/MysqliStatementBindingBridgeTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Native;
6
7use Container\Endpoint;
8use Container\MySqlRelease;
9use mysqli;
10use mysqli_result;
11use mysqli_stmt;
12use PHPUnit\Framework\Attributes\CoversClass;
13use PHPUnit\Framework\Attributes\Large;
14use PHPUnit\Framework\TestCase;
15use Testcontainers\Testcontainers;
16use ZtdQuery\Adapter\Mysqli\Native\MysqliStatementBindingBridge;
17
18#[CoversClass(MysqliStatementBindingBridge::class)]
19#[Large]
20final class MysqliStatementBindingBridgeTest extends TestCase
21{
22    public function testBind_paramRetainsReferencesAcrossExecutions(): void
23    {
24        $container = Testcontainers::run(MySqlRelease::fromEnvironment());
25        $endpoint = $container->getData(Endpoint::class);
26        try {
27            $connection = new mysqli($endpoint->host, $endpoint->username, $endpoint->password, $endpoint->database, $endpoint->port);
28            $connection->set_charset('utf8mb4');
29            $statement = $connection->prepare('SELECT ? AS value');
30            self::assertInstanceOf(mysqli_stmt::class, $statement);
31            $bridge = new class ($statement) extends MysqliStatementBindingBridge {};
32            $value = 7;
33            self::assertTrue($bridge->bind_param('i', $value));
34            $value = 42;
35            self::assertTrue($statement->execute());
36            $result = $statement->get_result();
37            self::assertInstanceOf(mysqli_result::class, $result);
38            self::assertSame([['value' => 42]], $result->fetch_all(MYSQLI_ASSOC));
39            $statement->close();
40        } finally {
41            $container->stop();
42        }
43    }
44
45    public function testBind_resultWritesBackToCallerVariables(): void
46    {
47        $container = Testcontainers::run(MySqlRelease::fromEnvironment());
48        $endpoint = $container->getData(Endpoint::class);
49        try {
50            $connection = new mysqli($endpoint->host, $endpoint->username, $endpoint->password, $endpoint->database, $endpoint->port);
51            $connection->set_charset('utf8mb4');
52            $statement = $connection->prepare("SELECT 7 AS id, 'Alice' AS name");
53            self::assertInstanceOf(mysqli_stmt::class, $statement);
54            $bridge = new class ($statement) extends MysqliStatementBindingBridge {};
55            $id = null;
56            $name = null;
57            self::assertTrue($statement->execute());
58            self::assertTrue($bridge->bind_result($id, $name));
59            self::assertTrue($statement->fetch());
60            self::assertSame(7, $id);
61            self::assertSame('Alice', $name);
62            self::assertNull($statement->fetch());
63            $statement->close();
64        } finally {
65            $container->stop();
66        }
67    }
68}
69