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