packages/ztd-query-postgres/tests/Unit/Schema/Reflection/Catalog/TableQueriesTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Schema\Reflection\Catalog;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9
10#[CoversClass(\ZtdQuery\Platform\Postgres\Schema\Reflection\Catalog\TableQueries::class)]
11final class TableQueriesTest extends TestCase
12{
13 public function testColumnsQueriesTheCurrentSchemaAndEscapesTheTableName(): void
14 {
15 $statement2 = self::createStub(\ZtdQuery\Connection\StatementInterface::class);
16 $statement2->method('fetchAll')->willReturn([['column_name' => 'id']]);
17 $queries = [];
18 $connection = self::createMock(\ZtdQuery\Connection\ConnectionInterface::class);
19 $connection->method('query')->willReturnCallback(static function (string $sql) use ($statement2, &$queries): \ZtdQuery\Connection\StatementInterface {
20 $queries[] = $sql;
21 return $statement2;
22 });
23 $statement = (new \ZtdQuery\Platform\Postgres\Schema\Reflection\Catalog\TableQueries($connection))->columns("O'Brien");
24 self::assertNotFalse($statement);
25 self::assertSame([['column_name' => 'id']], $statement->fetchAll());
26 self::assertCount(1, $queries);
27 self::assertStringContainsString('FROM information_schema.columns', $queries[0]);
28 self::assertStringContainsString("'O''Brien'", $queries[0]);
29 self::assertStringContainsString('current_schema()', $queries[0]);
30 }
31 public function testPrimaryKeyQueriesTheCurrentSchemaAndEscapesTheTableName(): void
32 {
33 $statement2 = self::createStub(\ZtdQuery\Connection\StatementInterface::class);
34 $statement2->method('fetchAll')->willReturn([['column_name' => 'id']]);
35 $queries = [];
36 $connection = self::createMock(\ZtdQuery\Connection\ConnectionInterface::class);
37 $connection->method('query')->willReturnCallback(static function (string $sql) use ($statement2, &$queries): \ZtdQuery\Connection\StatementInterface {
38 $queries[] = $sql;
39 return $statement2;
40 });
41 $statement = (new \ZtdQuery\Platform\Postgres\Schema\Reflection\Catalog\TableQueries($connection))->primaryKey("O'Brien");
42 self::assertNotFalse($statement);
43 self::assertSame([['column_name' => 'id']], $statement->fetchAll());
44 self::assertCount(1, $queries);
45 self::assertStringContainsString('tc.constraint_type = \'PRIMARY KEY\'', $queries[0]);
46 self::assertStringContainsString("'O''Brien'", $queries[0]);
47 self::assertStringContainsString('current_schema()', $queries[0]);
48 }
49 public function testUniqueIndexesQueriesTheCurrentSchemaAndEscapesTheTableName(): void
50 {
51 $statement2 = self::createStub(\ZtdQuery\Connection\StatementInterface::class);
52 $statement2->method('fetchAll')->willReturn([['column_name' => 'id']]);
53 $queries = [];
54 $connection = self::createMock(\ZtdQuery\Connection\ConnectionInterface::class);
55 $connection->method('query')->willReturnCallback(static function (string $sql) use ($statement2, &$queries): \ZtdQuery\Connection\StatementInterface {
56 $queries[] = $sql;
57 return $statement2;
58 });
59 $statement = (new \ZtdQuery\Platform\Postgres\Schema\Reflection\Catalog\TableQueries($connection))->uniqueIndexes("O'Brien");
60 self::assertNotFalse($statement);
61 self::assertSame([['column_name' => 'id']], $statement->fetchAll());
62 self::assertCount(1, $queries);
63 self::assertStringContainsString('AND NOT index_metadata.indisprimary', $queries[0]);
64 self::assertStringContainsString("'O''Brien'", $queries[0]);
65 self::assertStringContainsString('current_schema()', $queries[0]);
66 }
67 public function testForeignKeysQueriesTheCurrentSchemaAndEscapesTheTableName(): void
68 {
69 $statement2 = self::createStub(\ZtdQuery\Connection\StatementInterface::class);
70 $statement2->method('fetchAll')->willReturn([['column_name' => 'id']]);
71 $queries = [];
72 $connection = self::createMock(\ZtdQuery\Connection\ConnectionInterface::class);
73 $connection->method('query')->willReturnCallback(static function (string $sql) use ($statement2, &$queries): \ZtdQuery\Connection\StatementInterface {
74 $queries[] = $sql;
75 return $statement2;
76 });
77 $statement = (new \ZtdQuery\Platform\Postgres\Schema\Reflection\Catalog\TableQueries($connection))->foreignKeys("O'Brien");
78 self::assertNotFalse($statement);
79 self::assertSame([['column_name' => 'id']], $statement->fetchAll());
80 self::assertCount(1, $queries);
81 self::assertStringContainsString('pk.ordinal_position = fk.position_in_unique_constraint', $queries[0]);
82 self::assertStringContainsString("'O''Brien'", $queries[0]);
83 self::assertStringContainsString('current_schema()', $queries[0]);
84 }
85}
86