packages/ztd-query-pdo-adapter/tests/Integration/Sqlite/StrictTableTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Integration\Sqlite;
6
7use PDO;
8use PHPUnit\Framework\Attributes\CoversNothing;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Adapter\Pdo\ZtdPdo;
11
12#[CoversNothing]
13final class StrictTableTest extends TestCase
14{
15 public function testStrictTableSupportsPreparedAndLiteralDml(): void
16 {
17 $rawPdo = new PDO('sqlite::memory:', null, null, [
18 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
19 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
20 ]);
21 $rawPdo->exec('CREATE TABLE measurements (id INTEGER PRIMARY KEY, sensor TEXT NOT NULL, reading REAL NOT NULL, count INTEGER NOT NULL) STRICT');
22 $ztdPdo = ZtdPdo::fromPdo($rawPdo);
23
24 $insert = $ztdPdo->prepare('INSERT INTO measurements VALUES (?, ?, ?, ?)');
25 self::assertNotFalse($insert);
26 self::assertTrue($insert->execute([1, 'temp', 23.5, 100]));
27 self::assertTrue($insert->execute([2, 'humidity', 60.0, 50]));
28
29 self::assertSame(1, $ztdPdo->exec('UPDATE measurements SET count = count + 1 WHERE id = 1'));
30 $delete = $ztdPdo->prepare('DELETE FROM measurements WHERE reading > ?');
31 self::assertNotFalse($delete);
32 self::assertTrue($delete->execute([50]));
33
34 $statement = $ztdPdo->query('SELECT * FROM measurements ORDER BY id');
35 self::assertNotFalse($statement);
36 self::assertSame([
37 ['id' => 1, 'sensor' => 'temp', 'reading' => 23.5, 'count' => 101],
38 ], $statement->fetchAll());
39 }
40}
41