commit a320dfb62343214fb488fa94119e78a264558bb2 Author: Damien Tournoud Date: Wed Jan 25 14:54:39 2012 +0100 Test for: Field foreign key support is totally broken. diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.test b/modules/field/modules/field_sql_storage/field_sql_storage.test index 773de3d..ec7e1cb 100644 --- a/modules/field/modules/field_sql_storage/field_sql_storage.test +++ b/modules/field/modules/field_sql_storage/field_sql_storage.test @@ -407,21 +407,35 @@ class FieldSqlStorageTestCase extends DrupalWebTestCase { * Test foreign key support. */ function testFieldSqlStorageForeignKeys() { - // Create a decimal field. $field_name = 'testfield'; - $field = array('field_name' => $field_name, 'type' => 'text'); + $foreign_key_name = 'shape'; + $field = array('field_name' => $field_name, 'type' => 'shape', 'settings' => array('foreign_key_name' => $foreign_key_name)); $field = field_create_field($field); + + // Retrieve the field and instance with field_info and verify the foreign + // keys are in place. + $field = field_info_field($field_name); + $this->assertEqual($field['foreign keys'][$foreign_key_name]['table'], $foreign_key_name, t('Foreign key table name preserved through CRUD')); + $this->assertEqual($field['foreign keys'][$foreign_key_name]['columns'][$foreign_key_name], 'id', t('Foreign key column name preserved through CRUD')); + + // Update the field settings, it should update the foreign key definition too. + $foreign_key_name = 'color'; + $field['settings']['foreign_key_name'] = $foreign_key_name; + field_update_field($field); + // Retrieve the field and instance with field_info and verify the foreign // keys are in place. $field = field_info_field($field_name); - $this->assertEqual($field['foreign keys']['format']['table'], 'filter_format', t('Foreign key table name preserved through CRUD')); - $this->assertEqual($field['foreign keys']['format']['columns']['format'], 'format', t('Foreign key column name preserved through CRUD')); + $this->assertEqual($field['foreign keys'][$foreign_key_name]['table'], $foreign_key_name, t('Foreign key table name modified after update')); + $this->assertEqual($field['foreign keys'][$foreign_key_name]['columns'][$foreign_key_name], 'id', t('Foreign key column name modified after update')); + // Now grab the SQL schema and verify that too. $schema = drupal_get_schema(_field_sql_storage_tablename($field)); $this->assertEqual(count($schema['foreign keys']), 1, t("There is 1 foreign key in the schema")); $foreign_key = reset($schema['foreign keys']); - $filter_column = _field_sql_storage_columnname($field['field_name'], 'format'); - $this->assertEqual($foreign_key['table'], 'filter_format', t('Foreign key table name preserved in the schema')); - $this->assertEqual($foreign_key['columns'][$filter_column], 'format', t('Foreign key column name preserved in the schema')); + debug($foreign_key); + $foreign_key_column = _field_sql_storage_columnname($field['field_name'], $foreign_key_name); + $this->assertEqual($foreign_key['table'], $foreign_key_name, t('Foreign key table name preserved in the schema')); + $this->assertEqual($foreign_key['columns'][$foreign_key_column], 'id', t('Foreign key column name preserved in the schema')); } } diff --git a/modules/field/tests/field_test.field.inc b/modules/field/tests/field_test.field.inc index b8a2939..e2dc666 100644 --- a/modules/field/tests/field_test.field.inc +++ b/modules/field/tests/field_test.field.inc @@ -28,7 +28,9 @@ function field_test_field_info() { 'shape' => array( 'label' => t('Shape'), 'description' => t('Another dummy field type.'), - 'settings' => array(), + 'settings' => array( + 'foreign_key_name' => 'shape', + ), 'instance_settings' => array(), 'default_widget' => 'test_field_widget', 'default_formatter' => 'field_test_default', diff --git a/modules/field/tests/field_test.install b/modules/field/tests/field_test.install index 5957561..b6b7d51 100644 --- a/modules/field/tests/field_test.install +++ b/modules/field/tests/field_test.install @@ -145,6 +145,14 @@ function field_test_field_schema($field) { 'not null' => FALSE, ), ), + 'foreign keys' => array( + // This is a dummy foreign key definition, references a table that + // doesn't exist, but that's not a problem. + $field['settings']['foreign_key_name'] => array( + 'table' => $field['settings']['foreign_key_name'], + 'columns' => array( $field['settings']['foreign_key_name'] => 'id' ), + ), + ), ); } } commit d52e13be06f19556e6dbc54d96db59e17851c4b0 Author: Damien Tournoud Date: Wed Jan 25 14:54:54 2012 +0100 Fix for field foreign key support is totally broken. diff --git a/modules/field/field.crud.inc b/modules/field/field.crud.inc index ff39f22..5712ea5 100644 --- a/modules/field/field.crud.inc +++ b/modules/field/field.crud.inc @@ -246,6 +246,8 @@ function field_update_field($field) { $schema += array('columns' => array(), 'indexes' => array()); // 'columns' are hardcoded in the field type. $field['columns'] = $schema['columns']; + // 'foreign keys' are hardcoded in the field type. + $field['foreign keys'] = $schema['foreign keys']; // 'indexes' can be both hardcoded in the field type, and specified in the // incoming $field definition. $field += array( diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.module b/modules/field/modules/field_sql_storage/field_sql_storage.module index 2ed7835..f45ea0a 100644 --- a/modules/field/modules/field_sql_storage/field_sql_storage.module +++ b/modules/field/modules/field_sql_storage/field_sql_storage.module @@ -188,7 +188,7 @@ function _field_sql_storage_schema($field) { foreach ($field['foreign keys'] as $specifier => $specification) { $real_name = _field_sql_storage_indexname($field['field_name'], $specifier); $current['foreign keys'][$real_name]['table'] = $specification['table']; - foreach ($specification['columns'] as $column => $referenced) { + foreach ($specification['columns'] as $column_name => $referenced) { $sql_storage_column = _field_sql_storage_columnname($field['field_name'], $column_name); $current['foreign keys'][$real_name]['columns'][$sql_storage_column] = $referenced; }