Browse Source

Integration tests for ingest steps plus some fixes.

Tests ingest forms by using a shared variable 'models'.

Additional stuff:

'models' is no longer a required config for ingest steps, now
its set from the given objects.

No longer need to rebuild steps from within a form step when the
shared_storage gets changed, we now detect if changes have been
made then we rebuild if necessary.

Fixed POST requests in WebTestCases previously the user was always
anonymous so interactions with fedora would fail via post requests.
pull/346/head
Nigel Banks 11 years ago
parent
commit
722e4f1cad
  1. 14
      includes/ingest.form.inc
  2. 1
      islandora.info
  3. 117
      tests/ingest.test
  4. 7
      tests/islandora_ingest_test.info
  5. 166
      tests/islandora_ingest_test.module
  6. 21
      tests/islandora_web_test_case.inc

14
includes/ingest.form.inc

@ -78,6 +78,7 @@ function islandora_ingest_form_init_form_state_storage(array &$form_state, array
if (empty($objects)) { if (empty($objects)) {
$objects[] = islandora_ingest_form_prepare_new_object($configuration); $objects[] = islandora_ingest_form_prepare_new_object($configuration);
} }
$configuration['models'] = isset($configuration['models']) ? $configuration['models'] : array();
// Make sure the models actually exist. // Make sure the models actually exist.
foreach ($configuration['models'] as $key => $model) { foreach ($configuration['models'] as $key => $model) {
if (!islandora_object_load($model)) { if (!islandora_object_load($model)) {
@ -87,7 +88,6 @@ function islandora_ingest_form_init_form_state_storage(array &$form_state, array
// No need to persist the 'objects' within the configuration. // No need to persist the 'objects' within the configuration.
unset($configuration['objects']); unset($configuration['objects']);
// Required for step hooks. // Required for step hooks.
$configuration['models'] = isset($configuration['models']) ? $configuration['models'] : array();
$form_state['islandora'] = array( $form_state['islandora'] = array(
'step_id' => NULL, 'step_id' => NULL,
'objects' => $objects, 'objects' => $objects,
@ -370,7 +370,15 @@ function islandora_ingest_form_execute_step(array $form, array &$form_state, $st
function islandora_ingest_form_execute_form_step(array $form, array &$form_state, array $step) { function islandora_ingest_form_execute_form_step(array $form, array &$form_state, array $step) {
$args = array($form, &$form_state); $args = array($form, &$form_state);
$args = isset($step['args']) ? array_merge($args, $step['args']) : $args; $args = isset($step['args']) ? array_merge($args, $step['args']) : $args;
$shared_storage = islandora_ingest_form_get_shared_storage($form_state);
// Build the form step.
$form = call_user_func_array($step['form_id'], $args); $form = call_user_func_array($step['form_id'], $args);
// Since the list of steps depends on the shared storage we will rebuild the
// list of steps if the shared storage has changed. This must be done before
// stepifying, so the prev/next buttons get updated.
if ($shared_storage != islandora_ingest_form_get_shared_storage($form_state)) {
drupal_static_reset('islandora_ingest_form_get_steps');
}
return islandora_ingest_form_stepify($form, $form_state, $step); return islandora_ingest_form_stepify($form, $form_state, $step);
} }
@ -456,6 +464,10 @@ function islandora_ingest_form_undo_callback_step(array $form, array &$form_stat
function islandora_ingest_form_stepify(array $form, array &$form_state, $step) { function islandora_ingest_form_stepify(array $form, array &$form_state, $step) {
$first_form_step = islandora_ingest_form_on_first_form_step($form_state); $first_form_step = islandora_ingest_form_on_first_form_step($form_state);
$last_form_step = islandora_ingest_form_on_last_form_step($form_state); $last_form_step = islandora_ingest_form_on_last_form_step($form_state);
$form['form_step_id'] = array(
'#type' => 'hidden',
'#value' => islandora_ingest_form_get_current_step_id($form_state),
);
$form['prev'] = $first_form_step ? NULL : islandora_ingest_form_previous_button($form_state); $form['prev'] = $first_form_step ? NULL : islandora_ingest_form_previous_button($form_state);
$form['next'] = $last_form_step ? islandora_ingest_form_ingest_button($form_state) : islandora_ingest_form_next_button($form_state); $form['next'] = $last_form_step ? islandora_ingest_form_ingest_button($form_state) : islandora_ingest_form_next_button($form_state);
// Allow for a hook_form_FORM_ID_alter(). // Allow for a hook_form_FORM_ID_alter().

1
islandora.info

@ -14,5 +14,6 @@ files[] = includes/object.entity_controller.inc
files[] = tests/islandora_web_test_case.inc files[] = tests/islandora_web_test_case.inc
files[] = tests/authtokens.test files[] = tests/authtokens.test
files[] = tests/hooks.test files[] = tests/hooks.test
files[] = tests/ingest.test
files[] = tests/islandora_manage_permissions.test files[] = tests/islandora_manage_permissions.test
php = 5.3 php = 5.3

117
tests/ingest.test

@ -0,0 +1,117 @@
<?php
/**
* @file
* Tests to see if the hooks get called when appropriate.
*
* In the test module 'islandora_hooks_test' there are implementations
* of hooks being tested. These implementations modifies the session, and
* that's how we test if the hook gets called.
*
* To make sense of these tests reference islandora_hooks_test.module.
*/
class IslandoraIngestsTestCase extends IslandoraWebTestCase {
/**
* Gets info to display to describe this test.
*
* @see IslandoraWebTestCase::getInfo()
*/
public static function getInfo() {
return array(
'name' => 'Islandora Ingestion',
'description' => 'Ensure that the ingest forms function correctly.',
'group' => 'Islandora',
);
}
/**
* Creates an admin user and a connection to a fedora repository.
*
* @see IslandoraWebTestCase::setUp()
*/
public function setUp() {
parent::setUp('islandora_ingest_test');
$this->repository = $this->admin->repository;
$this->purgeTestObjects();
}
/**
* Free any objects/resources created for this test.
*
* @see IslandoraWebTestCase::tearDown()
*/
public function tearDown() {
$this->purgeTestObjects();
unset($this->repository);
parent::tearDown();
}
/**
* Purge any objects created by the test's in this class.
*/
public function purgeTestObjects() {
$objects = array(
'test:test',
);
foreach ($objects as $object) {
try {
$object = $this->repository->getObject($object);
$this->repository->purgeObject($object->id);
}
catch (Exception $e) {
// Meh... Either it didn't exist or the purge failed.
}
}
}
/**
* Test Ingest Steps.
*/
public function testIngest() {
global $user;
// First step in form.
$this->drupalGet('test/ingest');
// Default model selected, has no additional steps.
$this->assertFieldByName('ingest', 'Ingest');
// Select a model with additional steps.
$edit = array(
'model' => 'test:testcmodel',
);
$this->drupalPostAJAX(NULL, $edit, 'model');
// Form now reflexts multiple steps.
$this->assertFieldByName('label', '');
$this->assertFieldByName('next', 'Next');
// Move to next step.
$edit = array(
'label' => 'foobar',
'model' => 'test:testcmodel',
);
$this->drupalPost(NULL, $edit, t('Next'));
$this->assertFieldByName('form_step_id', 'islandora_ingest_test_testcmodel');
$this->assertFieldByName('ingest', 'Ingest');
// Move back to first step.
$this->drupalPost(NULL, array(), t('Previous'));
// Try a different model that has an additional step.
$edit = array(
'model' => 'test:testcmodel2',
);
$this->drupalPostAJAX(NULL, $edit, 'model');
$edit = array(
'label' => 'foobar',
'model' => 'test:testcmodel2',
);
$this->drupalPost(NULL, $edit, t('Next'));
$this->assertFieldByName('form_step_id', 'islandora_ingest_test_testcmodel2');
$this->assertFieldByName('ingest', 'Ingest');
// Ingest the thing.
$this->drupalPost(NULL, array(), t('Ingest'));
// Test that the thing got made.
$object = islandora_object_load('test:test');
$this->assertEqual($object->label, 'foobar', 'Ingest Object matches submitted form values.');
$this->assertEqual($object->models, array('test:testcmodel2', 'fedora-system:FedoraObject-3.0'), 'Ingest Object matches submitted form values.');
}
}

7
tests/islandora_ingest_test.info

@ -0,0 +1,7 @@
name = Islandora Testing
description = Required for testing islandora web-test case.
core = 7.x
package = Testing
hidden = TRUE
dependencies[] = islandora
files[] = islandora_test.module

166
tests/islandora_ingest_test.module

@ -0,0 +1,166 @@
<?php
/**
* @file
* Implements hooks that get tested by islandora_hooks.test
*/
/**
* Implements hook menu.
*/
function islandora_ingest_test_menu() {
return array(
'test/ingest' => array(
'title' => 'Ingest Form',
'page callback' => 'islandora_ingest_test_ingest',
'type' => MENU_LOCAL_ACTION,
'access callback' => TRUE,
),
);
}
/**
* Render the ingest form.
*/
function islandora_ingest_test_ingest() {
$connection = islandora_get_tuque_connection();
$object = $connection->repository->constructObject('test:test');
$object->label = 'New Object';
$configuration = array(
'objects' => array($object),
);
module_load_include('inc', 'islandora', 'includes/ingest.form');
return drupal_get_form('islandora_ingest_form', $configuration);
}
/**
* Implements hook_islandora_ingest_steps().
*/
function islandora_ingest_test_islandora_ingest_steps(array &$form_state) {
return array(
'islandora_ingest_test' => array(
'type' => 'form',
'form_id' => 'islandora_ingest_test_set_label_form',
'weight' => -50,
'module' => 'islandora_ingest_test',
),
);
}
/**
* Implements hook_MODEL_PID_islandora_ingest_steps().
*/
function islandora_ingest_test_test_testcmodel_islandora_ingest_steps(array &$form_state) {
return array(
'islandora_ingest_test_testcmodel' => array(
'type' => 'form',
'form_id' => 'islandora_ingest_test_testcmodel_form',
'weight' => -30,
'module' => 'islandora_ingest_test',
),
);
}
/**
* Implements hook_MODEL_PID_islandora_ingest_steps().
*/
function islandora_ingest_test_test_testcmodel2_islandora_ingest_steps(array &$form_state) {
return array(
'islandora_ingest_test_testcmodel2' => array(
'type' => 'form',
'form_id' => 'islandora_ingest_test_testcmodel2_form',
'weight' => -40,
'module' => 'islandora_ingest_test',
),
);
}
/**
* Sets the label of the ingestable object.
*
* @param array $form
* The Drupal form.
* @param array $form_state
* The Drupal form state.
*
* @return array
* The Drupal form definition.
*/
function islandora_ingest_test_set_label_form(array $form, array &$form_state) {
$models = array('test:nomorestepscmodel', 'test:testcmodel', 'test:testcmodel2');
$model = isset($form_state['values']['model']) ? $form_state['values']['model'] : reset($models);
$shared_storage = &islandora_ingest_form_get_shared_storage($form_state);
$shared_storage['models'] = array($model);
return array(
'#prefix' => '<div id="islandora-select-content-model-wrapper">',
'#suffix' => '</div>',
'label' => array(
'#type' => 'textfield',
'#title' => t('Label'),
),
'model' => array(
'#type' => 'select',
'#title' => t('Select a Content Model to Ingest'),
'#options' => array_combine($models, $models),
'#default' => $model,
'#ajax' => array(
'callback' => 'islandora_ingest_test_model_ajax_callback',
'wrapper' => 'islandora-select-content-model-wrapper',
'method' => 'replace',
'effect' => 'fade',
),
),
);
}
/**
* Updates the model field.
*/
function islandora_ingest_test_model_ajax_callback(array $form, array &$form_state) {
return $form;
}
/**
* Sets the label of the ingestable object.
*
* @param array $form
* The Drupal form.
* @param array $form_state
* The Drupal form state.
*/
function islandora_ingest_test_set_label_form_submit(array $form, array &$form_state) {
$object = islandora_ingest_form_get_object($form_state);
$object->label = $form_state['values']['label'];
unset($object->models);
$object->models = array($form_state['values']['model']);
}
/**
* Test the First content model.
*/
function islandora_ingest_test_testcmodel_form(array $form, array &$form_state) {
return array(
);
}
/**
* Test the CModel submit.
*/
function islandora_ingest_test_testcmodel_form_submit(array $form, array &$form_state) {
}
/**
* Test the second content model.
*/
function islandora_ingest_test_testcmodel2_form(array $form, array &$form_state) {
return array(
);
}
/**
* Test the CModel submit.
*/
function islandora_ingest_test_testcmodel2_form_submit(array $form, array &$form_state) {
}

21
tests/islandora_web_test_case.inc

@ -28,7 +28,7 @@ class IslandoraWebTestCase extends DrupalWebTestCase {
$this->backUpDrupalFilter(); $this->backUpDrupalFilter();
$this->setUpDrupalFilter(); $this->setUpDrupalFilter();
} }
$this->createAdminUser(); $this->admin = $this->createAdminUser();
} }
/** /**
@ -90,15 +90,20 @@ class IslandoraWebTestCase extends DrupalWebTestCase {
* Creates the a full fedora admin user with a repository connection. * Creates the a full fedora admin user with a repository connection.
*/ */
protected function createAdminUser() { protected function createAdminUser() {
$this->admin = new stdClass(); $roles = user_roles();
$this->admin->uid = 1; $index = array_search('administrator', $roles);
$this->admin->name = $this->configuration['admin_user']; $user = $this->drupalCreateUser();
$this->admin->pass = $this->configuration['admin_pass']; $this->drupalLogin($user);
$user->roles[$index] = 'administrator';
$user->name = $this->configuration['admin_user'];
$user->pass = $this->configuration['admin_pass'];
$user = user_save($user);
$url = variable_get('islandora_base_url', $this->configuration['fedora_url']); $url = variable_get('islandora_base_url', $this->configuration['fedora_url']);
$connection = islandora_get_tuque_connection($this->admin, $url); $connection = islandora_get_tuque_connection($user, $url);
$this->admin->repository = $connection->repository; $user->repository = $connection->repository;
return $this->admin; return $user;
} }
/** /**
* Stores the content of the Drupal Filter for later restoration. * Stores the content of the Drupal Filter for later restoration.
*/ */

Loading…
Cancel
Save