Probar el perfil de instalación con tareas personalizadas

9

Para un proyecto grande, estamos utilizando un flujo de trabajo de desarrollo basado en código . Estamos utilizando un perfil de instalación personalizado para instalar y configurar los módulos contrib y personalizados utilizados en el proyecto. Para garantizar la corrección de este perfil, debemos probarlo como cualquier otro módulo.

Actualmente, utilizamos un caso de prueba SimpleTest que se parece a esto y que funcionó bien hasta ahora.

class FooTestCase extends DrupalWebTestCase {

  protected $admin_user = null;

  public function getInfo() {
    return array(
      'name' => 'Foo Profile',
      'description' => 'Ensure that the Foo profile configure the site.',
      'group' => 'Foo',
    );
  }

  public function setUp() {
    $this->profile = 'foo';
    parent::setUp();
  }

  //Test methods ...
}

El sitio debe ser multilingüe, por lo que para instalar y habilitar todo el idioma requerido, agregué una tarea de perfil personalizada usando hook_install_tasks. La tarea funciona bien cuando se ejecuta desde el navegador. Pero no se ejecuta cuando se ejecuta DrupalWebTestCase :: setUp`. Por lo tanto, no podemos probar su efecto para garantizar que no se pierdan, independientemente de la refactorización de nuestro perfil en el futuro.

Dado que la instalación de idiomas requiere la carga de traducciones, la tarea en sí misma utiliza el procesamiento por lotes.

Estoy buscando una manera de ejecutar esta tarea en particular FooTestCase:setUpy, en general, tener todas las (tareas no interactivas) en mi perfil ejecutadas.

Como referencia, aquí está el código para la tarea

function foo_install_tasks($install_state) {
  return array(on
    'foo_install_import_locales' => array(
      'display_name' => 'Install additional languages',
      'display' => TRUE,
      'type' => 'batch',
      'run' => INSTALL_TASK_RUN_IF_NOT_COMPLETED,
    )
  );
}

function foo_install_import_locales(&$install_state) {
  include_once DRUPAL_ROOT . '/includes/locale.inc';
  include_once DRUPAL_ROOT . '/includes/iso.inc';
  $batch = array();
  $predefined = _locale_get_predefined_list();
  foreach (array('nl', 'de') as $install_locale) {
    if (!isset($predefined[$install_locale])) {
      // Drupal does not know about this language, so we prefill its values with
      // our best guess. The user will be able to edit afterwards.
      locale_add_language($install_locale, $install_locale, $install_locale, LANGUAGE_LTR, '', '', TRUE, FALSE);
    }
    else {
      // A known predefined language, details will be filled in properly.
      locale_add_language($install_locale, NULL, NULL, NULL, '', '', TRUE, FALSE);
    }

    // Collect files to import for this language.
    $batch = array_merge($batch, locale_batch_by_language($install_locale, NULL));

  }
  if (!empty($batch)) {
      // Remember components we cover in this batch set.
      variable_set('foo_install_import_locales', $batch['#components']);
      return $batch;
  }
}
Pierre Buyle
fuente

Respuestas:

6

Por lo general, me parece mejor dejar su perfil de instalación lo más básico posible y poner tareas como esta en hook_enable de un módulo específico del sitio. Del mismo modo, cualquier actualización que deba realizarse debe ponerse en hook_update_Nfunciones en el mismo módulo, mientras se actualiza la hook_enableimplementación.

Esto hace que la prueba sea mucho más simple y tiene el beneficio adicional de mantener toda la configuración y las actualizaciones en un solo lugar.

zroger
fuente