blob: c8a7f28010e97d86937a967ce30acabc5a1ae1b1 [file] [log] [blame]
<?php
/**
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @version //autogentag//
* @filesource
* @package DatabaseSchema
* @subpackage Tests
*/
/**
* @package DatabaseSchema
* @subpackage Tests
*/
class ezcDatabaseSchemaGenericTest extends ezcTestCase
{
public function tearDown()
{
$optionsWithoutPrefix = new ezcDbSchemaOptions;
$optionsWithoutPrefix->tableNamePrefix = '';
ezcDbSchema::setOptions( $optionsWithoutPrefix );
$this->removeTempDir();
}
private static function getSchema()
{
$tables = array(
'bugdb' => new ezcDbSchemaTable(
array (
'id' => new ezcDbSchemaField( 'integer', false, true, null, true ),
'bug_type' => new ezcDbSchemaField( 'text', 32, true ),
'severity' => new ezcDbSchemaField( 'integer', false, true, 0 ),
'sdesc' => new ezcDbSchemaField( 'text', 80, true ),
'ldesc' => new ezcDbSchemaField( 'clob', false, true ),
'php_version' => new ezcDbSchemaField( 'text', 100, true ),
),
array (
'bug_type' => new ezcDbSchemaIndex( array ( 'bug_type' => new ezcDbSchemaIndexField() ), false, false ),
'php_version' => new ezcDbSchemaIndex( array ( 'php_version' => new ezcDbSchemaIndexField() ) ),
'primary' => new ezcDbSchemaIndex( array ( 'id' => new ezcDbSchemaIndexField() ), true ),
)
),
'bugdb_comments' => new ezcDbSchemaTable(
array (
'bug_id' => new ezcDbSchemaField( 'integer', false, true, 0 ),
'comment' => new ezcDbSchemaField( 'clob', false, true ),
'email' => new ezcDbSchemaField( 'text', 32 ),
),
array (
'email' => new ezcDbSchemaIndex( array ( 'email' => new ezcDbSchemaIndexField() ) ),
)
),
);
return $tables;
}
private static function getSchemaWithPrefixedTableNames()
{
$tables = array(
'prefix_bugdb' => new ezcDbSchemaTable(
array (
'id' => new ezcDbSchemaField( 'integer', false, true, null, true ),
'bug_type' => new ezcDbSchemaField( 'text', 32, true ),
'severity' => new ezcDbSchemaField( 'integer', false, true, 0 ),
'sdesc' => new ezcDbSchemaField( 'text', 80, true ),
'ldesc' => new ezcDbSchemaField( 'clob', false, true ),
'php_version' => new ezcDbSchemaField( 'text', 100, true ),
),
array (
'bug_type' => new ezcDbSchemaIndex( array ( 'bug_type' => new ezcDbSchemaIndexField() ), false, false ),
'php_version' => new ezcDbSchemaIndex( array ( 'php_version' => new ezcDbSchemaIndexField() ) ),
'primary' => new ezcDbSchemaIndex( array ( 'id' => new ezcDbSchemaIndexField() ), true ),
)
),
'prefix_bugdb_comments' => new ezcDbSchemaTable(
array (
'bug_id' => new ezcDbSchemaField( 'integer', false, true, 0 ),
'comment' => new ezcDbSchemaField( 'clob', false, true ),
'email' => new ezcDbSchemaField( 'text', 32 ),
),
array (
'email' => new ezcDbSchemaIndex( array ( 'email' => new ezcDbSchemaIndexField() ) ),
)
),
);
return $tables;
}
public function testSimple()
{
$schema = new ezcDbSchema( self::getSchema() );
$schema->writeToDb( $this->db );
$newSchema = ezcDbSchema::createFromDb( $this->db );
self::assertEquals( $schema, $newSchema );
}
public function testXmlRoundTrip()
{
$fileNameOrig = realpath( $this->testFilesDir . 'webbuilder.schema.xml' );
$schema = ezcDbSchema::createFromFile( 'xml', $fileNameOrig );
$schema->writeToDb( $this->db );
$newSchema = ezcDbSchema::createFromDb( $this->db );
$newDDL1 = $newSchema->convertToDDL( $this->db );
// setup an empty schema to wipe out the db
$emptySchema = new ezcDbSchema( array() );
$diffToEmptySchema = ezcDbSchemaComparator::compareSchemas( $newSchema, $emptySchema );
$diffToEmptySchema->applyToDb( $this->db );
$newSchema->writeToDb( $this->db );
$newSchema = ezcDbSchema::createFromDb( $this->db );
$newDDL2 = $newSchema->convertToDDL( $this->db );
self::assertEquals( $newDDL1, $newDDL2 );
}
public function testXmlRoundTripWithDbName()
{
$fileNameOrig = realpath( $this->testFilesDir . 'webbuilder.schema.xml' );
$schema = ezcDbSchema::createFromFile( 'xml', $fileNameOrig );
$schema->writeToDb( $this->db );
$newSchema = ezcDbSchema::createFromDb( $this->db );
$newDDL1 = $newSchema->convertToDDL( $this->db->getName() );
// setup an empty schema to wipe out the db
$emptySchema = new ezcDbSchema( array() );
$diffToEmptySchema = ezcDbSchemaComparator::compareSchemas( $newSchema, $emptySchema );
$diffToEmptySchema->applyToDb( $this->db );
$newSchema->writeToDb( $this->db );
$newSchema = ezcDbSchema::createFromDb( $this->db );
$newDDL2 = $newSchema->convertToDDL( $this->db->getName() );
self::assertEquals( $newDDL1, $newDDL2 );
}
public function testConvertToDDLWithUnknownDbName()
{
$fileNameOrig = realpath( $this->testFilesDir . 'webbuilder.schema.xml' );
$schema = ezcDbSchema::createFromFile( 'xml', $fileNameOrig );
$schema->writeToDb( $this->db );
$newSchema = ezcDbSchema::createFromDb( $this->db );
try
{
$newDDL1 = $newSchema->convertToDDL( 'hottentottententententoonstellingsterrijnen' );
self::fail( "Expected exception not thrown." );
}
catch ( ezcDbSchemaUnknownFormatException $e )
{
self::assertEquals( "There is no 'difference write' handler available for the 'hottentottententententoonstellingsterrijnen' format.", $e->getMessage() );
}
}
public function testConvertToDDLWithBrokenDbName()
{
$fileNameOrig = realpath( $this->testFilesDir . 'webbuilder.schema.xml' );
$schema = ezcDbSchema::createFromFile( 'xml', $fileNameOrig );
$schema->writeToDb( $this->db );
$newSchema = ezcDbSchema::createFromDb( $this->db );
try
{
$newDDL1 = $newSchema->convertToDDL( 42);
self::fail( "Expected exception not thrown." );
}
catch ( ezcDbSchemaUnknownFormatException $e )
{
self::assertEquals( "There is no 'difference write' handler available for the '42' format.", $e->getMessage() );
}
}
public function testXmlInternal1()
{
$fileNameOrig = realpath( $this->testFilesDir . 'webbuilder.schema.xml' );
$schema = ezcDbSchema::createFromFile( 'xml', $fileNameOrig );
$schema->writeToDb( $this->db );
$newSchema = ezcDbSchema::createFromDb( $this->db );
$tables = $newSchema->getSchema();
$tableCeBadWord = $tables['ce_bad_word'];
$expected = new ezcDbSchemaTable(
array(
'badword_id' => new ezcDbSchemaField( 'integer', null, true, null, true ),
'word' => new ezcDbSchemaField( 'text', 255, true, 'Hello' ),
'substitution' => new ezcDbSchemaField( 'text', 255, true, 'world' ),
),
array(
'primary' => new ezcDbSchemaIndex(
array( 'badword_id' => new ezcDbSchemaIndexField() ), true
)
)
);
self::assertEquals( $expected, $tableCeBadWord );
}
public function testXmlInternal2()
{
$fileNameOrig = realpath( $this->testFilesDir . 'webbuilder.schema.xml' );
$schema = ezcDbSchema::createFromFile( 'xml', $fileNameOrig );
$schema->writeToDb( $this->db );
$newSchema = ezcDbSchema::createFromDb( $this->db );
$tables = $newSchema->getSchema();
$tableCeMessageCategoryRel = $tables['ce_message_category_rel'];
$expected = new ezcDbSchemaTable(
array(
'category_id' => new ezcDbSchemaField( 'integer', null, true, 0 ),
'is_shadow' => new ezcDbSchemaField( 'boolean', null, true, 'false' ),
'message_id' => new ezcDbSchemaField( 'integer', null, true, 0 )
),
array(
'message_category_rel' => new ezcDbSchemaIndex(
array(
'category_id' => new ezcDbSchemaIndexField(),
'message_id' => new ezcDbSchemaIndexField()
),
false, true
)
)
);
self::assertEquals( $expected, $tableCeMessageCategoryRel );
}
public function testXmlInternal3()
{
$fileNameOrig = realpath( $this->testFilesDir . 'webbuilder.schema.xml' );
$schema = ezcDbSchema::createFromFile( 'xml', $fileNameOrig );
$schema->writeToDb( $this->db );
$newSchema = ezcDbSchema::createFromDb( $this->db );
$tables = $newSchema->getSchema();
$tableDebugger = $tables['debugger'];
$expected = new ezcDbSchemaTable(
array(
'session_id' => new ezcDbSchemaField( 'text', 32, true, 'test' ),
),
array(
'session_id' => new ezcDbSchemaIndex(
array(
'session_id' => new ezcDbSchemaIndexField()
),
false, true
)
)
);
self::assertEquals( $expected, $tableDebugger );
}
public function testXmlInternal4()
{
$fileNameOrig = realpath( $this->testFilesDir . 'webbuilder.schema.xml' );
$schema = ezcDbSchema::createFromFile( 'xml', $fileNameOrig );
$schema->writeToDb( $this->db );
$newSchema = ezcDbSchema::createFromDb( $this->db );
$tables = $newSchema->getSchema();
$tableLiveuserTranslations = $tables['liveuser_translations'];
$expected = new ezcDbSchemaTable(
array(
'translation_id' => new ezcDbSchemaField( 'integer', null, true, null, true ),
'section_id' => new ezcDbSchemaField( 'integer', null, true, 0 ),
'section_type' => new ezcDbSchemaField( 'integer', null, false, 0 ),
'language_id' => new ezcDbSchemaField( 'text', 2, false ),
'name' => new ezcDbSchemaField( 'text', 50, false ),
'description' => new ezcDbSchemaField( 'text', 255, false ),
),
array(
'primary' => new ezcDbSchemaIndex(
array(
'translation_id' => new ezcDbSchemaIndexField()
),
true
),
'section_id' => new ezcDbSchemaIndex(
array(
'section_id' => new ezcDbSchemaIndexField(),
'section_type' => new ezcDbSchemaIndexField(),
'language_id' => new ezcDbSchemaIndexField(),
),
false, true
)
)
);
self::assertEquals( $expected, $tableLiveuserTranslations );
}
// bug #8900
public function testTwoTablesPrimaryKey()
{
$fileNameOrig = realpath( $this->testFilesDir . 'bug8900.xml' );
$schema = ezcDbSchema::createFromFile( 'xml', $fileNameOrig );
$text = '';
foreach ( $schema->convertToDDL( $this->db ) as $statement )
{
$text .= $statement . ";\n";
}
$name = strtolower( $this->db->getName() );
$sql = file_get_contents( $this->testFilesDir . "bug8900_{$name}.sql" );
self::assertEquals( $sql, $text );
}
// bug #10115
public function testSchemaWithKeywords()
{
$table = $this->db->quoteIdentifier( 'table' );
$from = $this->db->quoteIdentifier( 'from' );
$select = $this->db->quoteIdentifier( 'select' );
$this->db->query("CREATE TABLE $table
(
$from integer not null,
$select integer,
PRIMARY KEY ($from)
)");
$schema = ezcDbSchema::createFromDb( $this->db );
}
public function testDatatypes()
{
$fileNameOrig = realpath( $this->testFilesDir . 'DataTypesTest.xml' );
$schema = ezcDbSchema::createFromFile( 'xml', $fileNameOrig );
$schema->writeToDb( $this->db );
$schema = ezcDbSchema::createFromDb( $this->db );
$schema->writeToFile( 'xml', $this->getTempDir() . '/' . 'DataTypesTest.dump.xml' );
$file_orig = file_get_contents( $fileNameOrig );
$file_dump = file_get_contents( $this->getTempDir() . '/' . 'DataTypesTest.dump.xml' );
self::assertEquals( $file_orig, $file_dump );
}
public function testWriteWithPrefixReadWithPrefix()
{
$optionsWithPrefix = new ezcDbSchemaOptions;
$optionsWithPrefix->tableNamePrefix = 'prefix_';
$schema = new ezcDbSchema( self::getSchema() );
ezcDbSchema::setOptions( $optionsWithPrefix );
$schema->writeToDb( $this->db );
ezcDbSchema::setOptions( $optionsWithPrefix );
$newSchema = ezcDbSchema::createFromDb( $this->db );
self::assertEquals( $schema, $newSchema );
}
public function testWriteWithPrefixReadWithoutPrefix()
{
$optionsWithoutPrefix = new ezcDbSchemaOptions;
$optionsWithoutPrefix->tableNamePrefix = '';
$optionsWithPrefix = new ezcDbSchemaOptions;
$optionsWithPrefix->tableNamePrefix = 'prefix_';
$schema = new ezcDbSchema( self::getSchema() );
$schemaWithPrefix = new ezcDbSchema( self::getSchemaWithPrefixedTableNames() );
ezcDbSchema::setOptions( $optionsWithPrefix );
$schema->writeToDb( $this->db );
ezcDbSchema::setOptions( $optionsWithoutPrefix );
$newSchema = ezcDbSchema::createFromDb( $this->db );
self::assertEquals( $schemaWithPrefix, $newSchema );
}
public function testWriteWithoutPrefixReadWithPrefix()
{
$optionsWithoutPrefix = new ezcDbSchemaOptions;
$optionsWithoutPrefix->tableNamePrefix = '';
$optionsWithPrefix = new ezcDbSchemaOptions;
$optionsWithPrefix->tableNamePrefix = 'prefix_';
$schema = new ezcDbSchema( self::getSchema() );
$schemaWithPrefix = new ezcDbSchema( self::getSchemaWithPrefixedTableNames() );
ezcDbSchema::setOptions( $optionsWithoutPrefix );
$schemaWithPrefix->writeToDb( $this->db );
ezcDbSchema::setOptions( $optionsWithPrefix );
$newSchema = ezcDbSchema::createFromDb( $this->db );
self::assertEquals( $schema, $newSchema );
}
// bug #12538: Bad DDL Output from schema comparator
public function testWriteWithUnsupportedType()
{
$tables = array(
'prefix_bugdb_comments' => new ezcDbSchemaTable(
array (
'email' => new ezcDbSchemaField( 'slartibartfast', 32 ),
),
array ()
),
);
$schema = new ezcDbSchema( $tables );
try
{
$schema->writeToDb( $this->db );
self::fail( "Expected exception is not thrown." );
}
catch ( ezcDbSchemaUnsupportedTypeException $e )
{
self::assertRegexp( "@The field type 'slartibartfast' is not supported with the '(.*)' handler.@", $e->getMessage() );
}
}
}
?>