packages/sql-fixture/tests/Unit/Platform/PostgreSql/Schema/CatalogQueryTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Platform\PostgreSql\Schema;
6
7use PDO;
8use PHPUnit\Framework\Attributes\CoversClass;
9use PHPUnit\Framework\TestCase;
10use SqlFixture\Platform\PostgreSql\Schema\CatalogQuery as Subject;
11
12#[CoversClass(Subject::class)]
13#[\PHPUnit\Framework\Attributes\Medium]
14final class CatalogQueryTest extends TestCase
15{
16    public function testColumnsRetainsDatabaseOrdinalOrder(): void
17    {
18        $pdo = new PDO(
19            (string) getenv('SQL_FIXTURE_PGSQL_DSN'),
20            (string) getenv('SQL_FIXTURE_PGSQL_USER'),
21            (string) getenv('SQL_FIXTURE_PGSQL_PASSWORD'),
22            [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false],
23        );
24        $pdo->exec('CREATE TEMPORARY TABLE users (id INTEGER PRIMARY KEY, name VARCHAR(30) NOT NULL DEFAULT \'ready\')');
25        $statement = $pdo->query('SELECT pg_my_temp_schema()::regnamespace::text');
26        self::assertNotFalse($statement);
27        $namespace = $statement->fetchColumn();
28        self::assertIsString($namespace);
29        $columns = (new Subject())->columns($pdo, $namespace, 'users');
30        self::assertSame(['id', 'name'], array_column($columns, 'column_name'));
31        self::assertSame('NO', $columns[1]['is_nullable']);
32        self::assertSame('30', (string) $columns[1]['character_maximum_length']);
33    }
34
35    public function testPrimaryKeysReadsAQualifiedTemporarySchema(): void
36    {
37        $pdo = new PDO(
38            (string) getenv('SQL_FIXTURE_PGSQL_DSN'),
39            (string) getenv('SQL_FIXTURE_PGSQL_USER'),
40            (string) getenv('SQL_FIXTURE_PGSQL_PASSWORD'),
41            [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false],
42        );
43        $pdo->exec('CREATE TEMPORARY TABLE users (id INTEGER PRIMARY KEY, name VARCHAR(30) NOT NULL DEFAULT \'ready\')');
44        $statement = $pdo->query('SELECT pg_my_temp_schema()::regnamespace::text');
45        self::assertNotFalse($statement);
46        $namespace = $statement->fetchColumn();
47        self::assertIsString($namespace);
48        self::assertSame(['id'], (new Subject())->primaryKeys($pdo, $namespace, 'users'));
49    }
50}
51