packages/ztd-query-pdo-adapter/tests/Integration/Sqlite/MultiStatementExecTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Integration\Sqlite;
6
7use PDO;
8use PHPUnit\Framework\Attributes\CoversNothing;
9use PHPUnit\Framework\Attributes\Large;
10use PHPUnit\Framework\TestCase;
11use ZtdQuery\Adapter\Pdo\ZtdPdo;
12
13/**
14 * @requires extension pdo_sqlite
15 * @group integration
16 * @group sqlite
17 */
18#[CoversNothing]
19#[Large]
20final class MultiStatementExecTest extends TestCase
21{
22 public function testExecProcessesStatementsAgainstEachPrecedingShadowState(): void
23 {
24 $rawPdo = new PDO('sqlite::memory:', null, null, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
25 $rawPdo->exec('CREATE TABLE items (id INTEGER PRIMARY KEY, name TEXT NOT NULL)');
26 $ztdPdo = ZtdPdo::fromPdo($rawPdo);
27
28 self::assertSame(2, $ztdPdo->exec(
29 "INSERT INTO items VALUES (1, 'a'); INSERT INTO items VALUES (2, 'b'), (3, 'c')",
30 ));
31 self::assertSame(1, $ztdPdo->exec(
32 "INSERT INTO items VALUES (4, 'before'); UPDATE items SET name = 'after' WHERE id = 4",
33 ));
34 self::assertSame(2, $ztdPdo->exec(
35 'DELETE FROM items WHERE id = 1; DELETE FROM items WHERE id IN (2, 3)',
36 ));
37 self::assertSame(1, $ztdPdo->exec(
38 "UPDATE items SET name = 'semi;colon' WHERE id = 4; -- not a ; statement\n"
39 . "UPDATE items SET name = name || ';done' WHERE id = 4",
40 ));
41
42 $shadow = $ztdPdo->query('SELECT id, name FROM items');
43 self::assertNotFalse($shadow);
44 self::assertSame([['id' => 4, 'name' => 'semi;colon;done']], $shadow->fetchAll(PDO::FETCH_ASSOC));
45 $physical = $rawPdo->query('SELECT COUNT(*) FROM items');
46 self::assertNotFalse($physical);
47 self::assertSame(0, (int) $physical->fetchColumn());
48 }
49
50 public function testTransactionStatementsInBatchControlShadowRollback(): void
51 {
52 $rawPdo = new PDO('sqlite::memory:', null, null, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
53 $rawPdo->exec('CREATE TABLE items (id INTEGER PRIMARY KEY, name TEXT NOT NULL)');
54 $ztdPdo = ZtdPdo::fromPdo($rawPdo);
55
56 self::assertSame(0, $ztdPdo->exec(
57 "BEGIN; INSERT INTO items VALUES (1, 'rolled back'); ROLLBACK",
58 ));
59
60 $shadow = $ztdPdo->query('SELECT COUNT(*) FROM items');
61 self::assertNotFalse($shadow);
62 self::assertSame(0, (int) $shadow->fetchColumn());
63 }
64}
65