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