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