packages/ztd-query-pdo-adapter/tests/Integration/Sqlite/UpdateScopeTest.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 */
16#[CoversNothing]
17#[Large]
18final class UpdateScopeTest extends TestCase
19{
20 public function testUpdateFromReadsJoinedShadowRows(): void
21 {
22 $rawPdo = new PDO('sqlite::memory:', null, null, [
23 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
24 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
25 ]);
26 $rawPdo->exec('CREATE TABLE native_inventory (id INTEGER PRIMARY KEY, quantity INTEGER)');
27 $rawPdo->exec('CREATE TABLE native_incoming (id INTEGER PRIMARY KEY, delta INTEGER)');
28 $rawPdo->exec('CREATE TABLE shadow_inventory (id INTEGER PRIMARY KEY, quantity INTEGER)');
29 $rawPdo->exec('CREATE TABLE shadow_incoming (id INTEGER PRIMARY KEY, delta INTEGER)');
30 $ztdPdo = ZtdPdo::fromPdo($rawPdo);
31 $rawPdo->exec('INSERT INTO native_inventory VALUES (1, 10), (2, 20)');
32 $rawPdo->exec('INSERT INTO native_incoming VALUES (1, 5), (2, -3)');
33 $ztdPdo->exec('INSERT INTO shadow_inventory VALUES (1, 10), (2, 20)');
34 $ztdPdo->exec('INSERT INTO shadow_incoming VALUES (1, 5), (2, -3)');
35
36 $rawPdo->exec('UPDATE native_inventory SET quantity = quantity + native_incoming.delta FROM native_incoming WHERE native_inventory.id = native_incoming.id');
37 $ztdPdo->exec('UPDATE shadow_inventory SET quantity = quantity + shadow_incoming.delta FROM shadow_incoming WHERE shadow_inventory.id = shadow_incoming.id');
38 $native = $rawPdo->query('SELECT * FROM native_inventory ORDER BY id');
39 $shadow = $ztdPdo->query('SELECT * FROM shadow_inventory ORDER BY id');
40
41 self::assertNotFalse($native);
42 self::assertNotFalse($shadow);
43 self::assertSame($native->fetchAll(), $shadow->fetchAll());
44 }
45
46 public function testUpdateTargetAliasQualifiesSelectionScope(): void
47 {
48 $rawPdo = new PDO('sqlite::memory:', null, null, [
49 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
50 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
51 ]);
52 $rawPdo->exec('CREATE TABLE native_items (id INTEGER PRIMARY KEY, quantity INTEGER)');
53 $rawPdo->exec('CREATE TABLE shadow_items (id INTEGER PRIMARY KEY, quantity INTEGER)');
54 $ztdPdo = ZtdPdo::fromPdo($rawPdo);
55 $rawPdo->exec('INSERT INTO native_items VALUES (1, 10), (2, 20)');
56 $ztdPdo->exec('INSERT INTO shadow_items VALUES (1, 10), (2, 20)');
57
58 $rawPdo->exec('UPDATE native_items AS target SET quantity = quantity + 1 WHERE target.id = 1');
59 $ztdPdo->exec('UPDATE shadow_items AS target SET quantity = quantity + 1 WHERE target.id = 1');
60 $native = $rawPdo->query('SELECT * FROM native_items ORDER BY id');
61 $shadow = $ztdPdo->query('SELECT * FROM shadow_items ORDER BY id');
62
63 self::assertNotFalse($native);
64 self::assertNotFalse($shadow);
65 self::assertSame($native->fetchAll(), $shadow->fetchAll());
66 }
67}
68