packages/ztd-query-pdo-adapter/tests/Integration/Sqlite/InMemoryAttachTest.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 RuntimeException;
12use ZtdQuery\Adapter\Pdo\ZtdPdo;
13
14/**
15 * @requires extension pdo_sqlite
16 */
17#[CoversNothing]
18#[Large]
19final class InMemoryAttachTest extends TestCase
20{
21    public function testInMemoryDatabaseIsAttachedToPhysicalConnection(): void
22    {
23        $rawPdo = new PDO('sqlite::memory:', null, null, [
24            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
25            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
26        ]);
27        $ztdPdo = ZtdPdo::fromPdo($rawPdo);
28
29        $ztdPdo->exec("ATTACH DATABASE ':memory:' AS db2");
30        $statement = $rawPdo->query('PRAGMA database_list');
31
32        self::assertNotFalse($statement);
33        self::assertContains('db2', array_column($statement->fetchAll(), 'name'));
34    }
35
36    public function testPersistentDatabaseAttachIsRejected(): void
37    {
38        $rawPdo = new PDO('sqlite::memory:', null, null, [
39            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
40        ]);
41        $ztdPdo = ZtdPdo::fromPdo($rawPdo);
42
43        $this->expectException(RuntimeException::class);
44
45        $ztdPdo->exec("ATTACH 'test.sqlite' AS db2");
46    }
47}
48