packages/sql-fixture/tests/Unit/Platform/PostgreSql/PostgreSqlSchemaFetcherTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Platform\PostgreSql;
6
7use PDO;
8use PHPUnit\Framework\Attributes\CoversClass;
9use PHPUnit\Framework\TestCase;
10use SqlFixture\Platform\PostgreSql\PostgreSqlSchemaFetcher as Subject;
11
12#[CoversClass(Subject::class)]
13#[\PHPUnit\Framework\Attributes\Medium]
14#[CoversClass(\SqlFixture\Platform\PostgreSql\Schema\CatalogColumn::class)]
15#[CoversClass(\SqlFixture\Platform\PostgreSql\Schema\CatalogDdl::class)]
16#[CoversClass(\SqlFixture\Platform\PostgreSql\Schema\CatalogQuery::class)]
17#[CoversClass(\SqlFixture\Platform\PostgreSql\Schema\CatalogSchema::class)]
18#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\PostgreSql\PostgreSqlSchemaParser::class)]
19#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\ColumnDefinition::class)]
20#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\SchemaFetcherInterface::class)]
21#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\SchemaParseException::class)]
22#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\SchemaParserInterface::class)]
23#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\TableSchema::class)]
24#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\PostgreSql\Schema\ColumnParser::class)]
25#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\PostgreSql\Schema\DefaultExpression::class)]
26#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\PostgreSql\Schema\DefinitionList::class)]
27#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\PostgreSql\Schema\TableSyntax::class)]
28#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\PostgreSql\Schema\TypeDeclaration::class)]
29#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\DefinitionSegments::class)]
30#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\TypeShape::class)]
31#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\Exception\InvalidSqlException::class)]
32#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\Exception\ExpectedCreateTableException::class)]
33#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\Exception\MissingColumnDefinitionsException::class)]
34final class PostgreSqlSchemaFetcherTest extends TestCase
35{
36 public function testFetchSchemaCombinesLiveCatalogMetadata(): void
37 {
38 $pdo = new PDO(
39 (string) getenv('SQL_FIXTURE_PGSQL_DSN'),
40 (string) getenv('SQL_FIXTURE_PGSQL_USER'),
41 (string) getenv('SQL_FIXTURE_PGSQL_PASSWORD'),
42 [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false],
43 );
44 $pdo->exec('CREATE TEMPORARY TABLE users (id INTEGER PRIMARY KEY, name VARCHAR(30) NOT NULL DEFAULT \'ready\')');
45 $statement = $pdo->query('SELECT pg_my_temp_schema()::regnamespace::text');
46 self::assertNotFalse($statement);
47 $namespace = $statement->fetchColumn();
48 self::assertIsString($namespace);
49 $schema = (new Subject())->fetchSchema($pdo, $namespace . '.users');
50 self::assertSame('users', $schema->tableName);
51 self::assertSame(['id'], $schema->primaryKeys);
52 self::assertSame('INTEGER', $schema->columns['id']->type);
53 self::assertSame(30, $schema->columns['name']->length);
54 }
55}
56