mirror of
https://github.com/silverstripe/silverstripe-postgresql
synced 2024-06-16 17:51:35 +02:00
BUG Add unit tests to cover requireTable and renameTable
This commit is contained in:
parent
86ba38b048
commit
74a20c0cb0
|
@ -543,8 +543,8 @@ class PostgreSQLSchemaManager extends DBSchemaManager
|
||||||
if ($this->hasTable("{$tableName}_Live")) {
|
if ($this->hasTable("{$tableName}_Live")) {
|
||||||
$updateConstraint .= "UPDATE \"{$tableName}_Live\" SET \"$colName\"='$default' WHERE \"$colName\" NOT IN ($constraint_values);";
|
$updateConstraint .= "UPDATE \"{$tableName}_Live\" SET \"$colName\"='$default' WHERE \"$colName\" NOT IN ($constraint_values);";
|
||||||
}
|
}
|
||||||
if ($this->hasTable("{$tableName}_versions")) {
|
if ($this->hasTable("{$tableName}_Versions")) {
|
||||||
$updateConstraint .= "UPDATE \"{$tableName}_versions\" SET \"$colName\"='$default' WHERE \"$colName\" NOT IN ($constraint_values);";
|
$updateConstraint .= "UPDATE \"{$tableName}_Versions\" SET \"$colName\"='$default' WHERE \"$colName\" NOT IN ($constraint_values);";
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->query($updateConstraint);
|
$this->query($updateConstraint);
|
||||||
|
|
138
tests/PostgreSQLSchemaManagerTest.php
Normal file
138
tests/PostgreSQLSchemaManagerTest.php
Normal file
|
@ -0,0 +1,138 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace SilverStripe\PostgreSQL\Tests;
|
||||||
|
|
||||||
|
use SilverStripe\Core\ClassInfo;
|
||||||
|
use SilverStripe\Dev\SapphireTest;
|
||||||
|
use SilverStripe\ORM\Connect\Database;
|
||||||
|
use SilverStripe\ORM\Connect\DatabaseException;
|
||||||
|
use SilverStripe\ORM\DB;
|
||||||
|
use SilverStripe\PostgreSQL\PostgreSQLConnector;
|
||||||
|
use SilverStripe\PostgreSQL\PostgreSQLSchemaManager;
|
||||||
|
|
||||||
|
class PostgreSQLSchemaManagerTest extends SapphireTest
|
||||||
|
{
|
||||||
|
|
||||||
|
protected $usesTransactions = false;
|
||||||
|
|
||||||
|
public function testAlterTable()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
/** @var PostgreSQLSchemaManager $dbSchema */
|
||||||
|
$dbSchema = DB::get_schema();
|
||||||
|
$dbSchema->quiet();
|
||||||
|
|
||||||
|
$this->createSS3Table();
|
||||||
|
|
||||||
|
try {
|
||||||
|
DB::query('INSERT INTO "ClassNamesUpgrade" ("ClassName") VALUES (\'App\MySite\FooBar\')');
|
||||||
|
$this->assertFalse(true, 'SS3 Constaint should have blocked the previous insert.');
|
||||||
|
} catch (DatabaseException $ex) { }
|
||||||
|
|
||||||
|
$dbSchema->schemaUpdate(function () use ($dbSchema) {
|
||||||
|
$dbSchema->requireTable(
|
||||||
|
'ClassNamesUpgrade',
|
||||||
|
[
|
||||||
|
'ID' => 'PrimaryKey',
|
||||||
|
'ClassName' => 'Enum(array("App\\\\MySite\\\\FooBar"))',
|
||||||
|
]
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
DB::query('INSERT INTO "ClassNamesUpgrade" ("ClassName") VALUES (\'App\MySite\FooBar\')');
|
||||||
|
$count = DB::query('SELECT count(*) FROM "ClassNamesUpgrade" WHERE "ClassName" = \'App\MySite\FooBar\'')
|
||||||
|
->value();
|
||||||
|
|
||||||
|
$this->assertEquals(1, $count);
|
||||||
|
} finally {
|
||||||
|
DB::query('DROP TABLE IF EXISTS "ClassNamesUpgrade"');
|
||||||
|
DB::query('DROP SEQUENCE IF EXISTS "ClassNamesUpgrade_ID_seq"');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private function createSS3Table()
|
||||||
|
{
|
||||||
|
DB::query(<<<SQL
|
||||||
|
CREATE SEQUENCE "ClassNamesUpgrade_ID_seq" start 1 increment 1;
|
||||||
|
CREATE TABLE "ClassNamesUpgrade"
|
||||||
|
(
|
||||||
|
"ID" bigint NOT NULL DEFAULT nextval('"ClassNamesUpgrade_ID_seq"'::regclass),
|
||||||
|
"ClassName" character varying(255) DEFAULT 'ClassNamesUpgrade'::character varying,
|
||||||
|
CONSTRAINT "ClassNamesUpgrade_pkey" PRIMARY KEY ("ID"),
|
||||||
|
CONSTRAINT "ClassNamesUpgrade_ClassName_check" CHECK ("ClassName"::text = ANY (ARRAY['FooBar'::character varying::text]))
|
||||||
|
)
|
||||||
|
WITH (
|
||||||
|
OIDS=FALSE
|
||||||
|
);
|
||||||
|
SQL
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRenameTable()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
/** @var PostgreSQLSchemaManager $dbSchema */
|
||||||
|
$dbSchema = DB::get_schema();
|
||||||
|
$dbSchema->quiet();
|
||||||
|
|
||||||
|
$this->createSS3VersionedTable();
|
||||||
|
|
||||||
|
$this->assertConstraintCount(1, 'ClassNamesUpgrade_versioned_ClassName_check');
|
||||||
|
|
||||||
|
$dbSchema->schemaUpdate(function () use ($dbSchema) {
|
||||||
|
$dbSchema->renameTable(
|
||||||
|
'ClassNamesUpgrade_versioned',
|
||||||
|
'ClassNamesUpgrade_Versioned'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->assertTableCount(0, 'ClassNamesUpgrade_versioned');
|
||||||
|
$this->assertTableCount(1, 'ClassNamesUpgrade_Versioned');
|
||||||
|
$this->assertConstraintCount(0, 'ClassNamesUpgrade_versioned_ClassName_check');
|
||||||
|
$this->assertConstraintCount(1, 'ClassNamesUpgrade_Versioned_ClassName_check');
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
DB::query('DROP TABLE IF EXISTS "ClassNamesUpgrade_Versioned"');
|
||||||
|
DB::query('DROP TABLE IF EXISTS "ClassNamesUpgrade_versioned"');
|
||||||
|
DB::query('DROP SEQUENCE IF EXISTS "ClassNamesUpgrade_versioned_ID_seq"');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private function assertConstraintCount($expected, $constraintName) {
|
||||||
|
$count = DB::prepared_query(
|
||||||
|
'SELECT count(*) FROM pg_catalog.pg_constraint WHERE conname like ?',
|
||||||
|
[$constraintName]
|
||||||
|
)->value();
|
||||||
|
|
||||||
|
$this->assertEquals($expected, $count);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function assertTableCount($expected, $tableName) {
|
||||||
|
$count = DB::prepared_query(
|
||||||
|
'SELECT count(*) FROM pg_catalog.pg_tables WHERE "tablename" like ?',
|
||||||
|
[$tableName]
|
||||||
|
)->value();
|
||||||
|
|
||||||
|
$this->assertEquals($expected, $count);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function createSS3VersionedTable()
|
||||||
|
{
|
||||||
|
DB::query(<<<SQL
|
||||||
|
CREATE SEQUENCE "ClassNamesUpgrade_versioned_ID_seq" start 1 increment 1;
|
||||||
|
CREATE TABLE "ClassNamesUpgrade_versioned"
|
||||||
|
(
|
||||||
|
"ID" bigint NOT NULL DEFAULT nextval('"ClassNamesUpgrade_versioned_ID_seq"'::regclass),
|
||||||
|
"ClassName" character varying(255) DEFAULT 'ClassNamesUpgrade'::character varying,
|
||||||
|
CONSTRAINT "ClassNamesUpgrade_pkey" PRIMARY KEY ("ID"),
|
||||||
|
CONSTRAINT "ClassNamesUpgrade_versioned_ClassName_check" CHECK ("ClassName"::text = ANY (ARRAY['FooBar'::character varying::text]))
|
||||||
|
)
|
||||||
|
WITH (
|
||||||
|
OIDS=FALSE
|
||||||
|
);
|
||||||
|
SQL
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user