예제 #1
0
 public function testAddAndDropForeignKey()
 {
     $referencedTableName = 'phpunit_foreign';
     $referencedTableXml = "\n            <table>\n                <name>{$referencedTableName}</name>\n                <version>1</version>\n                <declaration>\n                    <field>\n                        <name>id</name>\n                        <type>integer</type>\n                        <autoincrement>true</autoincrement>\n                    </field>\n                    <field>\n                        <name>name</name>\n                        <type>text</type>\n                        <length>128</length>\n                        <notnull>true</notnull>\n                    </field>\n                    <index>\n                        <name>id</name>\n                        <primary>true</primary>\n                        <field>\n                            <name>id</name>\n                        </field>\n                    </index>\n                </declaration>\n            </table>";
     $referencedTable = Setup_Backend_Schema_Table_Factory::factory('Xml', $referencedTableXml);
     $this->_tableNames[] = $referencedTableName;
     $this->_backend->createTable($referencedTable);
     $fieldString = "\n            <field>\n                <name>foreign_id</name>\n                <type>integer</type>\n            </field>";
     $field = Setup_Backend_Schema_Field_Factory::factory('Xml', $fieldString);
     $this->_backend->addCol($this->_table->name, $field);
     $string = "\n                <index>\n                    <field>\n                        <name>foreign_id</name>\n                    </field>\n                    <foreign>true</foreign>\n                    <reference>\n                        <table>{$referencedTableName}</table>\n                        <field>id</field>\n                    </reference>\n                </index>";
     $foreignKey = Setup_Backend_Schema_Index_Factory::factory('Xml', $string);
     $this->_backend->addForeignKey($this->_table->name, $foreignKey);
     $schema = $this->_backend->getExistingSchema($this->_table->name);
     $this->assertEquals(2, count($schema->indices));
     $index = $schema->indices[1];
     $this->assertEquals('true', $index->foreign);
     $this->assertEquals('false', $index->primary);
     //        $this->assertFalse(empty($index->referencetable));
     //        $this->assertFalse(empty($index->referencefield));
     $db = Tinebase_Core::getDb();
     $db->insert(SQL_TABLE_PREFIX . $referencedTableName, array('name' => 'test'));
     $db->insert(SQL_TABLE_PREFIX . $this->_table->name, array('name' => 'test', 'foreign_id' => 1));
     try {
         $db->insert(SQL_TABLE_PREFIX . $this->_table->name, array('name' => 'test', 'foreign_id' => 999));
         $this->fail('Expected Zend_Db_Statement_Exception not thrown');
     } catch (Zend_Db_Statement_Exception $e) {
         //we expected this exception, everything is alright
     }
     $this->_backend->dropForeignKey($this->_table->name, $index->name);
     //now this should work without throwing an Exception
     $db->insert(SQL_TABLE_PREFIX . $this->_table->name, array('name' => 'test', 'foreign_id' => 999));
 }