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