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