diff --git a/includes/ingest.form.inc b/includes/ingest.form.inc index 3ef3f847..00783934 100644 --- a/includes/ingest.form.inc +++ b/includes/ingest.form.inc @@ -78,6 +78,7 @@ function islandora_ingest_form_init_form_state_storage(array &$form_state, array if (empty($objects)) { $objects[] = islandora_ingest_form_prepare_new_object($configuration); } + $configuration['models'] = isset($configuration['models']) ? $configuration['models'] : array(); // Make sure the models actually exist. foreach ($configuration['models'] as $key => $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. unset($configuration['objects']); // Required for step hooks. - $configuration['models'] = isset($configuration['models']) ? $configuration['models'] : array(); $form_state['islandora'] = array( 'step_id' => NULL, 'objects' => $objects, @@ -142,8 +142,8 @@ function islandora_ingest_form_get_last_step_id(array &$form_state) { function islandora_ingest_form_prepare_new_object(array $configuration) { module_load_include('inc', 'islandora', 'includes/utilities'); if (empty($configuration['object'])) { - $message = islandora_deprecated('Please use "objects" as the default ingest form configuration property.'); - trigger_error(check_plain($message), E_USER_DEPRECATED); + $message = islandora_deprecated('7.x-1.2', t('Please use "objects" as the default ingest form configuration property.')); + trigger_error(filter_xss($message), E_USER_DEPRECATED); // ID is more specific than namespace so it will take precedence. $id = isset($configuration['namespace']) ? $configuration['namespace'] : 'islandora'; $id = isset($configuration['id']) ? $configuration['id'] : $id; @@ -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) { $args = array($form, &$form_state); $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); + // 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); } @@ -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) { $first_form_step = islandora_ingest_form_on_first_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['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(). diff --git a/includes/utilities.inc b/includes/utilities.inc index 3cbe2a06..cdbf8daa 100644 --- a/includes/utilities.inc +++ b/includes/utilities.inc @@ -636,6 +636,9 @@ function islandora_system_settings_form_default_value($name, $default_value, arr * is optional. */ function islandora_get_comp_ds_mappings($pid) { + $message = islandora_deprecated('7.x-1.2', t('Refactor to use the more flexible islandora_get_datastreams_requirements_from_content_model().')); + trigger_error(filter_xss($message), E_USER_DEPRECATED); + $cm_object = islandora_object_load($pid); if (!isset($cm_object) || !isset($cm_object['DS-COMPOSITE-MODEL'])) { return FALSE; @@ -825,7 +828,7 @@ function islandora_content_model_select_table_form_element($drupal_variable, $de * * @code * $message = islandora_deprecated('7.x-1.1', t('Use more cowbell.')) - * trigger_error(check_plain($message), E_USER_DEPRECATED) + * trigger_error(filter_xss($message), E_USER_DEPRECATED) * @endcode * * @param string $release diff --git a/islandora.info b/islandora.info index 54f62c05..4f6a5858 100644 --- a/islandora.info +++ b/islandora.info @@ -14,5 +14,6 @@ files[] = includes/object.entity_controller.inc files[] = tests/islandora_web_test_case.inc files[] = tests/authtokens.test files[] = tests/hooks.test +files[] = tests/ingest.test files[] = tests/islandora_manage_permissions.test php = 5.3 diff --git a/tests/README.txt b/tests/README.md similarity index 54% rename from tests/README.txt rename to tests/README.md index c03004ae..c4a0ae1a 100644 --- a/tests/README.txt +++ b/tests/README.md @@ -1,4 +1,4 @@ You can define your own configurations specific to your enviroment by copying default.test_config.ini to test_config.ini, making your changes in the copied -file. These test need write access to the system's $FEDORA_HOME/server/config -directory as well as the filter-drupal.xml file. \ No newline at end of file +file. These test need write access to the system's $FEDORA_HOME/server/config +directory as well as the filter-drupal.xml file. diff --git a/tests/ingest.test b/tests/ingest.test new file mode 100644 index 00000000..173b926f --- /dev/null +++ b/tests/ingest.test @@ -0,0 +1,118 @@ + '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() { + // Login the Admin user. + $this->drupalLogin($this->admin); + // 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.'); + } + +} diff --git a/tests/islandora_ingest_test.info b/tests/islandora_ingest_test.info new file mode 100644 index 00000000..974a60f2 --- /dev/null +++ b/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 diff --git a/tests/islandora_ingest_test.module b/tests/islandora_ingest_test.module new file mode 100644 index 00000000..d414c717 --- /dev/null +++ b/tests/islandora_ingest_test.module @@ -0,0 +1,166 @@ + 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' => '