danielebarchiesi@4: t('Component tests'), danielebarchiesi@4: 'description' => t('Run tests for components of Features.') , danielebarchiesi@4: 'group' => t('Features'), danielebarchiesi@4: ); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Set up test. danielebarchiesi@4: */ danielebarchiesi@4: public function setUp() { danielebarchiesi@4: parent::setUp(array( danielebarchiesi@4: 'field', danielebarchiesi@4: 'filter', danielebarchiesi@4: 'image', danielebarchiesi@4: 'taxonomy', danielebarchiesi@4: 'views', danielebarchiesi@4: 'features', danielebarchiesi@4: 'features_test' danielebarchiesi@4: )); danielebarchiesi@4: danielebarchiesi@4: // Run a features rebuild to ensure our feature is fully installed. danielebarchiesi@4: features_rebuild(); danielebarchiesi@4: danielebarchiesi@4: $admin_user = $this->drupalCreateUser(array('administer features')); danielebarchiesi@4: $this->drupalLogin($admin_user); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Run test. danielebarchiesi@4: */ danielebarchiesi@4: public function test() { danielebarchiesi@4: module_load_include('inc', 'features', 'features.export'); danielebarchiesi@4: danielebarchiesi@4: $components = array_filter(array( danielebarchiesi@4: 'field_instance' => 'field', danielebarchiesi@4: 'filter' => 'filter', danielebarchiesi@4: 'image' => 'image', danielebarchiesi@4: 'node' => 'node', danielebarchiesi@4: 'user_permission' => 'user', danielebarchiesi@4: 'views_view' => 'views', danielebarchiesi@4: ), 'module_exists'); danielebarchiesi@4: danielebarchiesi@4: foreach (array_keys($components) as $component) { danielebarchiesi@4: $callback = "_test_{$component}"; danielebarchiesi@4: danielebarchiesi@4: // Ensure that the component/default is properly available. danielebarchiesi@4: $object = $this->$callback('load'); danielebarchiesi@4: $this->assertTrue(!empty($object), t('@component present.', array('@component' => $component))); danielebarchiesi@4: danielebarchiesi@4: // Ensure that the component is defaulted. danielebarchiesi@4: $states = features_get_component_states(array('features_test'), FALSE, TRUE); danielebarchiesi@4: $this->assertTrue($states['features_test'][$component] === FEATURES_DEFAULT, t('@component state: Default.', array('@component' => $component))); danielebarchiesi@4: danielebarchiesi@4: // Override component and test that Features detects the override. danielebarchiesi@4: $this->$callback('override', $this); danielebarchiesi@4: $states = features_get_component_states(array('features_test'), FALSE, TRUE); danielebarchiesi@4: $this->assertTrue($states['features_test'][$component] === FEATURES_OVERRIDDEN, t('@component state: Overridden.', array('@component' => $component))); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // Revert component and ensure that component has reverted. danielebarchiesi@4: // Do this in separate loops so we only have to run danielebarchiesi@4: // drupal_flush_all_caches() once. danielebarchiesi@4: foreach (array_keys($components) as $component) { danielebarchiesi@4: features_revert(array('features_test' => array($component))); danielebarchiesi@4: } danielebarchiesi@4: drupal_flush_all_caches(); danielebarchiesi@4: foreach (array_keys($components) as $component) { danielebarchiesi@4: // Reload so things like Views can clear it's cache danielebarchiesi@4: $this->$callback('load'); danielebarchiesi@4: $states = features_get_component_states(array('features_test'), FALSE, TRUE); danielebarchiesi@4: $this->assertTrue($states['features_test'][$component] === FEATURES_DEFAULT, t('@component reverted.', array('@component' => $component))); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: protected function _test_field_instance($op = 'load') { danielebarchiesi@4: switch ($op) { danielebarchiesi@4: case 'load': danielebarchiesi@4: return field_info_instance('node', 'field_features_test', 'features_test'); danielebarchiesi@4: case 'override': danielebarchiesi@4: $field_instance = field_info_instance('node', 'field_features_test', 'features_test'); danielebarchiesi@4: $field_instance['label'] = 'Foo bar'; danielebarchiesi@4: field_update_instance($field_instance); danielebarchiesi@4: break; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: protected function _test_filter($op = 'load') { danielebarchiesi@4: // So... relying on our own API functions to test is pretty lame. danielebarchiesi@4: // But these modules don't have APIs either. So might as well use danielebarchiesi@4: // the ones we've written for them... danielebarchiesi@4: features_include(); danielebarchiesi@4: switch ($op) { danielebarchiesi@4: case 'load': danielebarchiesi@4: return features_filter_format_load('features_test'); danielebarchiesi@4: case 'override': danielebarchiesi@4: $format = features_filter_format_load('features_test'); danielebarchiesi@4: unset($format->filters['filter_url']); danielebarchiesi@4: filter_format_save($format); danielebarchiesi@4: break; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: protected function _test_image($op = 'load') { danielebarchiesi@4: switch ($op) { danielebarchiesi@4: case 'load': danielebarchiesi@4: return image_style_load('features_test'); danielebarchiesi@4: case 'override': danielebarchiesi@4: $style = image_style_load('features_test'); danielebarchiesi@4: $style = image_style_save($style); danielebarchiesi@4: foreach ($style['effects'] as $effect) { danielebarchiesi@4: $effect['data']['width'] = '120'; danielebarchiesi@4: image_effect_save($effect); danielebarchiesi@4: } danielebarchiesi@4: break; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: protected function _test_node($op = 'load') { danielebarchiesi@4: switch ($op) { danielebarchiesi@4: case 'load': danielebarchiesi@4: return node_type_get_type('features_test'); danielebarchiesi@4: case 'override': danielebarchiesi@4: $type = node_type_get_type('features_test'); danielebarchiesi@4: $type->description = 'Foo bar baz.'; danielebarchiesi@4: $type->modified = TRUE; danielebarchiesi@4: node_type_save($type); danielebarchiesi@4: break; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: protected function _test_views_view($op = 'load') { danielebarchiesi@4: switch ($op) { danielebarchiesi@4: case 'load': danielebarchiesi@4: return views_get_view('features_test', TRUE); danielebarchiesi@4: case 'override': danielebarchiesi@4: $view = views_get_view('features_test', TRUE); danielebarchiesi@4: $view->set_display('default'); danielebarchiesi@4: $view->display_handler->override_option('title', 'Foo bar'); danielebarchiesi@4: $view->save(); danielebarchiesi@4: // Clear the load cache from above danielebarchiesi@4: views_get_view('features_test', TRUE); danielebarchiesi@4: break; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: protected function _test_user_permission($op = 'load') { danielebarchiesi@4: switch ($op) { danielebarchiesi@4: case 'load': danielebarchiesi@4: $permissions = user_role_permissions(array(DRUPAL_AUTHENTICATED_RID => 'authenticated user')); danielebarchiesi@4: return !empty($permissions[DRUPAL_AUTHENTICATED_RID]['create features_test content']); danielebarchiesi@4: case 'override': danielebarchiesi@4: user_role_change_permissions(DRUPAL_AUTHENTICATED_RID, array('create features_test content' => 0)); danielebarchiesi@4: break; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Tests enabling of feature modules. danielebarchiesi@4: */ danielebarchiesi@4: class FeaturesEnableTestCase extends DrupalWebTestCase { danielebarchiesi@4: protected $profile = 'testing'; danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Test info. danielebarchiesi@4: */ danielebarchiesi@4: public static function getInfo() { danielebarchiesi@4: return array( danielebarchiesi@4: 'name' => t('Features enable tests'), danielebarchiesi@4: 'description' => t('Run tests for enabling of features.') , danielebarchiesi@4: 'group' => t('Features'), danielebarchiesi@4: ); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Run test for features_get_components on enable. danielebarchiesi@4: */ danielebarchiesi@4: public function testFeaturesGetComponents() { danielebarchiesi@4: danielebarchiesi@4: // Testing that features_get_components returns correct after enable. danielebarchiesi@4: $modules = array( danielebarchiesi@4: 'features', danielebarchiesi@4: 'taxonomy', danielebarchiesi@4: 'features_test', danielebarchiesi@4: ); danielebarchiesi@4: danielebarchiesi@4: // Make sure features_get_components is cached if features already enabled. danielebarchiesi@4: if (!module_exists('features')) { danielebarchiesi@4: drupal_load('module', 'features'); danielebarchiesi@4: } danielebarchiesi@4: features_get_components(); danielebarchiesi@4: danielebarchiesi@4: module_enable($modules); danielebarchiesi@4: danielebarchiesi@4: // Make sure correct information for enabled modules is now cached. danielebarchiesi@4: $components = features_get_components(); danielebarchiesi@4: $taxonomy_component_info = taxonomy_features_api(); danielebarchiesi@4: $this->assertTrue(!empty($components['taxonomy']) && $components['taxonomy'] == $taxonomy_component_info['taxonomy'], 'features_get_components returns correct taxonomy information on enable'); danielebarchiesi@4: danielebarchiesi@4: features_rebuild(); danielebarchiesi@4: $this->assertNotNull(taxonomy_vocabulary_machine_name_load('taxonomy_features_test'), 'Taxonomy vocabulary correctly enabled on enable.'); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Tests intergration of ctools for features. danielebarchiesi@4: */ danielebarchiesi@4: class FeaturesCtoolsIntegrationTest extends DrupalWebTestCase { danielebarchiesi@4: protected $profile = 'testing'; danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Test info. danielebarchiesi@4: */ danielebarchiesi@4: public static function getInfo() { danielebarchiesi@4: return array( danielebarchiesi@4: 'name' => t('Features Chaos Tools integration'), danielebarchiesi@4: 'description' => t('Run tests for ctool integration of features.') , danielebarchiesi@4: 'group' => t('Features'), danielebarchiesi@4: ); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Set up test. danielebarchiesi@4: */ danielebarchiesi@4: public function setUp() { danielebarchiesi@4: parent::setUp(array( danielebarchiesi@4: 'features', danielebarchiesi@4: 'ctools', danielebarchiesi@4: )); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Run test. danielebarchiesi@4: */ danielebarchiesi@4: public function testModuleEnable() { danielebarchiesi@4: $try = array( danielebarchiesi@4: 'strongarm', danielebarchiesi@4: 'views', danielebarchiesi@4: ); danielebarchiesi@4: danielebarchiesi@4: // Trigger the first includes and the static to be set. danielebarchiesi@4: features_include(); danielebarchiesi@4: $function_ends = array( danielebarchiesi@4: 'features_export', danielebarchiesi@4: 'features_export_options', danielebarchiesi@4: 'features_export_render', danielebarchiesi@4: 'features_revert', danielebarchiesi@4: ); danielebarchiesi@4: foreach ($try as $module) { danielebarchiesi@4: $function = $module . '_features_api'; danielebarchiesi@4: $this->assertFalse(function_exists($function), 'Chaos tools functions for ' . $module . ' do not exist while it is disabled.'); danielebarchiesi@4: // Module enable will trigger declaring the new functions. danielebarchiesi@4: module_enable(array($module)); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // CTools hooks only created when there is an actual feature exportable danielebarchiesi@4: // enabled. danielebarchiesi@4: module_enable(array('features_test')); danielebarchiesi@4: danielebarchiesi@4: foreach ($try as $module) { danielebarchiesi@4: if (module_exists($module)) { danielebarchiesi@4: $function_exists = function_exists($function); danielebarchiesi@4: if ($function_exists) { danielebarchiesi@4: foreach ($function() as $component_type => $component_info) { danielebarchiesi@4: foreach ($function_ends as $function_end) { danielebarchiesi@4: $function_exists = $function_exists && function_exists($component_type . '_' . $function_end); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: $this->assertTrue($function_exists, 'Chaos tools functions for ' . $module . ' exist when it is enabled.'); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: }