-
-
Notifications
You must be signed in to change notification settings - Fork 113
Expand file tree
/
Copy pathReflection.postgre.phpt
More file actions
107 lines (80 loc) · 3.73 KB
/
Reflection.postgre.phpt
File metadata and controls
107 lines (80 loc) · 3.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<?php declare(strict_types=1);
/**
* Test: PostgreSQL specific reflection
* @dataProvider? databases.ini postgresql
*/
use Tester\Assert;
require __DIR__ . '/../bootstrap.php';
$connection = connectToDB()->getConnection();
function names($columns): array
{
$names = array_column($columns, 'name');
sort($names);
return $names;
}
test('Tables in schema', function () use ($connection) {
Nette\Database\Helpers::loadFromFile($connection, Tester\FileMock::create('
DROP SCHEMA IF EXISTS "one" CASCADE;
DROP SCHEMA IF EXISTS "two" CASCADE;
CREATE SCHEMA "one";
CREATE SCHEMA "two";
CREATE TABLE "one"."master" ("one_id" integer NOT NULL, PRIMARY KEY ("one_id"));
CREATE TABLE "two"."master" ("two_id" integer NOT NULL, PRIMARY KEY ("two_id"));
ALTER INDEX "one"."master_pkey" RENAME TO "one_master_pkey";
ALTER INDEX "two"."master_pkey" RENAME TO "two_master_pkey";
CREATE TABLE "one"."slave" ("one_id" integer NULL);
CREATE TABLE "two"."slave" ("two_id" integer NULL);
ALTER TABLE "one"."slave" ADD CONSTRAINT "one_slave_fk" FOREIGN KEY ("one_id") REFERENCES "one"."master"("one_id");
ALTER TABLE "two"."slave" ADD CONSTRAINT "two_slave_fk" FOREIGN KEY ("two_id") REFERENCES "two"."master"("two_id");
'));
$driver = $connection->getDriver();
// Reflection for tables with the same name but different schema
$connection->query('SET search_path TO one, two');
Assert::same(['master', 'slave'], names($driver->getTables()));
Assert::same(['one_id'], names($driver->getColumns('master')));
Assert::same(['one_master_pkey'], names($driver->getIndexes('master')));
Assert::same(['one_slave_fk'], names($driver->getForeignKeys('slave')));
$connection->query('SET search_path TO two, one');
Assert::same(['master', 'slave'], names($driver->getTables()));
Assert::same(['two_id'], names($driver->getColumns('master')));
Assert::same(['two_master_pkey'], names($driver->getIndexes('master')));
Assert::same(['two_slave_fk'], names($driver->getForeignKeys('slave')));
// Reflection for FQN
Assert::same(['one_id'], names($driver->getColumns('one.master')));
Assert::same(['one_master_pkey'], names($driver->getIndexes('one.master')));
$foreign = $driver->getForeignKeys('one.slave');
Assert::same([
'name' => 'one_slave_fk',
'local' => 'one_id',
'table' => 'one.master',
'foreign' => 'one_id',
], (array) $foreign[0]);
// Limit foreign keys for current schemas only
$connection->query('ALTER TABLE "one"."slave" ADD CONSTRAINT "one_two_fk" FOREIGN KEY ("one_id") REFERENCES "two"."master"("two_id")');
$connection->query('SET search_path TO one');
Assert::same(['one_slave_fk'], names($driver->getForeignKeys('slave')));
$connection->query('SET search_path TO one, two');
Assert::same(['one_slave_fk', 'one_two_fk'], names($driver->getForeignKeys('slave')));
});
test('Table with GENERATED ALWAYS AS stored columns', function () use ($connection) {
$ver = $connection->query('SHOW server_version')->fetchField();
if (version_compare($ver, '12') < 0) {
Tester\Environment::skip("GENERATED ALWAYS AS requires PostgreSQL 12+, running $ver.");
}
Nette\Database\Helpers::loadFromFile($connection, Tester\FileMock::create('
DROP TABLE IF EXISTS "generated_test";
CREATE TABLE "generated_test" (
"id" serial PRIMARY KEY,
"first_name" varchar(50) NOT NULL,
"last_name" varchar(50) NOT NULL,
"full_name" text GENERATED ALWAYS AS ("first_name" || \' \' || "last_name") STORED
);
'));
$driver = $connection->getDriver();
$columns = $driver->getColumns('generated_test');
$columnNames = array_column($columns, 'name');
Assert::same(['id', 'first_name', 'last_name', 'full_name'], $columnNames);
$fullNameCol = $columns[3];
Assert::same('full_name', $fullNameCol['name']);
Assert::same('TEXT', $fullNameCol['nativetype']);
});