Issue #1757232 by peximo, plach: Improve test coverage for the entity form controller.

8.0.x
webchick 2012-09-12 23:14:51 -07:00
parent 12100bab40
commit 3d2aad9e0a
3 changed files with 236 additions and 0 deletions

View File

@ -0,0 +1,79 @@
<?php
/**
* @file
* Definition of Drupal\system\Tests\Entity\EntityFormTest.
*/
namespace Drupal\system\Tests\Entity;
use Drupal\simpletest\WebTestBase;
/**
* Tests the Entity Form Controller.
*/
class EntityFormTest extends WebTestBase {
/**
* Modules to enable.
*
* @var array
*/
public static $modules = array('entity_test', 'language');
public static function getInfo() {
return array(
'name' => 'Entity form',
'description' => 'Tests the entity form controller.',
'group' => 'Entity API',
);
}
function setUp() {
parent::setUp();
$web_user = $this->drupalCreateUser(array('administer entity_test content'));
$this->drupalLogin($web_user);
}
/**
* Tests basic form CRUD functionality.
*/
function testFormCRUD() {
$langcode = LANGUAGE_NOT_SPECIFIED;
$name1 = $this->randomName(8);
$name2 = $this->randomName(8);
$edit = array(
'name' => $name1,
'uid' => mt_rand(0, 128),
"field_test_text[$langcode][0][value]" => $this->randomName(16),
);
$this->drupalPost('entity-test/add', $edit, t('Save'));
$entity = $this->loadEntityByName($name1);
$this->assertTrue($entity, t('Entity found in the database.'));
$edit['name'] = $name2;
$this->drupalPost('entity-test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
$entity = $this->loadEntityByName($name1);
$this->assertFalse($entity, 'The entity has been modified.');
$entity = $this->loadEntityByName($name2);
$this->assertTrue($entity, 'Modified entity found in the database.');
$this->assertNotEqual($entity->get('name'), $name1, 'The entity name has been modified.');
$this->drupalPost('entity-test/manage/' . $entity->id() . '/edit', array(), t('Delete'));
$entity = $this->loadEntityByName($name2);
$this->assertFalse($entity, t('Entity not found in the database.'));
}
/**
* Loads a test entity by name always resetting the storage controller cache.
*/
protected function loadEntityByName($name) {
$entity_type = 'entity_test';
// Always load the entity from the database to ensure that changes are
// correctly picked up.
entity_get_controller($entity_type)->resetCache();
return current(entity_load_multiple_by_properties($entity_type, array('name' => $name)));
}
}

View File

@ -13,6 +13,9 @@ function entity_test_entity_info() {
'label' => t('Test entity'),
'entity class' => 'Drupal\entity_test\EntityTest',
'controller class' => 'Drupal\entity_test\EntityTestStorageController',
'form controller class' => array(
'default' => 'Drupal\entity_test\EntityTestFormController',
),
'base table' => 'entity_test',
'fieldable' => TRUE,
'entity keys' => array(
@ -27,6 +30,65 @@ function entity_test_entity_info() {
return $items;
}
/**
* Implements hook_permission().
*/
function entity_test_permission() {
$permissions = array(
'administer entity_test content' => array(
'title' => t('Administer entity_test content'),
'description' => t('Manage entity_test content'),
),
);
return $permissions;
}
/**
* Implements hook_menu().
*/
function entity_test_menu() {
$items = array();
$items['entity-test/add'] = array(
'title' => 'Add an entity_test',
'page callback' => 'entity_test_add',
'access arguments' => array('administer entity_test content'),
'type' => MENU_NORMAL_ITEM,
);
$items['entity-test/manage/%entity_test'] = array(
'title' => 'Edit test entity',
'page callback' => 'entity_test_edit',
'page arguments' => array(2),
'access arguments' => array('administer entity_test content'),
'type' => MENU_NORMAL_ITEM,
);
$items['entity-test/manage/%entity_test/edit'] = array(
'title' => 'Edit',
'type' => MENU_DEFAULT_LOCAL_TASK,
);
return $items;
}
/**
* Menu callback: displays the 'Add new entity_test' form.
*/
function entity_test_add() {
drupal_set_title(t('Create an entity_test'));
$entity = entity_create('entity_test', array());
return entity_get_form($entity);
}
/**
* Menu callback: displays the 'Edit existing entity_test' form.
*/
function entity_test_edit($entity) {
drupal_set_title(t('entity_test @id', array('@id' => $entity->id)), PASS_THROUGH);
return entity_get_form($entity);
}
/**
* Loads a test entity.
*

View File

@ -0,0 +1,95 @@
<?php
/**
* @file
* Definition of Drupal\entity_test\EntityTestFormController.
*/
namespace Drupal\entity_test;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityFormController;
/**
* Form controller for the test entity edit forms.
*/
class EntityTestFormController extends EntityFormController {
/**
* Overrides Drupal\Core\Entity\EntityFormController::form().
*/
public function form(array $form, array &$form_state, EntityInterface $entity) {
$form = parent::form($form, $form_state, $entity);
$langcode = $this->getFormLangcode($form_state);
$name = $entity->get('name', $langcode);
$uid = $entity->get('uid', $langcode);
$form['name'] = array(
'#type' => 'textfield',
'#title' => t('Name'),
'#default_value' => !empty($name) ? $name : '',
'#size' => 60,
'#maxlength' => 128,
'#required' => TRUE,
'#weight' => -10,
);
$form['uid'] = array(
'#type' => 'textfield',
'#title' => 'UID',
'#default_value' => !empty($uid) ? $uid : '',
'#size' => 60,
'#maxlength' => 128,
'#required' => TRUE,
'#weight' => -10,
);
return $form;
}
/**
* Overrides Drupal\Core\Entity\EntityFormController::submit().
*/
public function submit(array $form, array &$form_state) {
$entity = parent::submit($form, $form_state);
$langcode = $this->getFormLangcode($form_state);
// Updates multilingual properties.
foreach (array('name', 'uid') as $property) {
$entity->set($property, $form_state['values'][$property], $langcode);
}
return $entity;
}
/**
* Overrides Drupal\Core\Entity\EntityFormController::save().
*/
public function save(array $form, array &$form_state) {
$entity = $this->getEntity($form_state);
$is_new = $entity->isNew();
$entity->save();
$message = $is_new ? t('entity_test @id has been created.', array('@id' => $entity->id())) : t('entity_test @id has been updated.', array('@id' => $entity->id()));
drupal_set_message($message);
if ($entity->id()) {
$form_state['redirect'] = 'entity-test/manage/' . $entity->id() . '/edit';
}
else {
// Error on save.
drupal_set_message(t('The entity could not be saved.'), 'error');
$form_state['rebuild'] = TRUE;
}
}
/**
* Overrides Drupal\Core\Entity\EntityFormController::delete().
*/
public function delete(array $form, array &$form_state) {
$entity = $this->getEntity($form_state);
$entity->delete();
drupal_set_message(t('entity_test @id has been deleted.', array('@id' => $entity->id())));
$form_state['redirect'] = '<front>';
}
}