Tests for the JavaScript system.
Hierarchy
- class \AdvAggJavaScriptTestCase extends \DrupalWebTestCase
Expanded class hierarchy of AdvAggJavaScriptTestCase
Sujets associés
Fichier
-
tests/
advagg.test, line 749
View source
class AdvAggJavaScriptTestCase extends DrupalWebTestCase {
/**
* Store configured value for JavaScript preprocessing.
*
* @var bool
*/
protected $preprocessJs = NULL;
/**
* Provide information to the UI for this test.
*/
public static function getInfo() {
return array(
'name' => 'JavaScript',
'description' => 'Tests the JavaScript system.',
'group' => 'AdvAgg',
);
}
/**
* Install the advagg module and include needed files.
*/
public function setUp() {
// Enable Locale and SimpleTest in the test environment.
parent::setUp(array(
'locale',
'locale_test',
'simpletest',
'common_test',
'form_test',
'advagg',
'color',
));
// Include the advagg.module file.
drupal_load('module', 'advagg');
module_load_include('inc', 'advagg', 'advagg');
// Disable preprocessing.
$this->preprocessJs = variable_get('preprocess_js', 0);
variable_set('preprocess_js', 0);
// Reset before each test.
advagg_test_reset_statics();
// Set settings for testing.
$GLOBALS['conf']['advagg_convert_absolute_to_relative_path'] = FALSE;
$GLOBALS['conf']['advagg_convert_absolute_to_protocol_relative_path'] = FALSE;
$GLOBALS['conf']['advagg_force_https_path'] = FALSE;
$GLOBALS['conf']['advagg_mod_js_footer'] = 0;
}
/**
* Restore any variables we set.
*/
public function tearDown() {
// Restore configured value for JavaScript preprocessing.
variable_set('preprocess_js', $this->preprocessJs);
parent::tearDown();
}
/**
* Test the 'javascript_always_use_jquery' variable.
*/
public function testJavaScriptAlwaysUsejQuery() {
// The default front page of the site should use jQuery and other standard
// scripts and settings.
advagg_test_reset_statics();
$GLOBALS['conf']['advagg_convert_absolute_to_relative_path'] = FALSE;
$GLOBALS['conf']['advagg_convert_absolute_to_protocol_relative_path'] = FALSE;
$GLOBALS['conf']['advagg_force_https_path'] = FALSE;
$GLOBALS['conf']['advagg_mod_js_footer'] = 0;
$this->drupalGet('');
$this->assertRaw('misc/jquery.js', 'Default behavior: The front page of the site includes jquery.js.');
$this->assertRaw('misc/drupal.js', 'Default behavior: The front page of the site includes drupal.js.');
$this->assertRaw('Drupal.settings', 'Default behavior: The front page of the site includes Drupal settings.');
$this->assertRaw('basePath', 'Default behavior: The front page of the site includes the basePath Drupal setting.');
//
// The default front page should not use jQuery and other standard scripts
// and settings when the 'javascript_always_use_jquery' variable is set to
// FALSE.
advagg_test_reset_statics();
variable_set('javascript_always_use_jquery', FALSE);
$render_array = advagg_get_js();
$javascript = drupal_render($render_array);
$this->drupalGet('');
$this->assertNoRaw('misc/jquery.js', 'When "javascript_always_use_jquery" is FALSE: The front page of the site does not include jquery.js.');
$this->assertNoRaw('misc/drupal.js', 'When "javascript_always_use_jquery" is FALSE: The front page of the site does not include drupal.js.');
$this->assertNoRaw('Drupal.settings', 'When "javascript_always_use_jquery" is FALSE: The front page of the site does not include Drupal settings.');
$this->assertNoRaw('basePath', 'When "javascript_always_use_jquery" is FALSE: The front page of the site does not include the basePath Drupal setting.');
variable_del('javascript_always_use_jquery');
//
// When only settings have been added via drupal_add_js(), drupal_get_js()
// should still return jQuery and other standard scripts and settings.
advagg_test_reset_statics();
drupal_add_js(array(
'testJavaScriptSetting' => 'test',
), 'setting');
$render_array = advagg_get_js();
$javascript = drupal_render($render_array);
$this->assertTrue(strpos($javascript, 'misc/jquery.js') !== FALSE, 'Default behavior: The JavaScript returned by drupal_get_js() when only settings have been added includes jquery.js.');
$this->assertTrue(strpos($javascript, 'misc/drupal.js') !== FALSE, 'Default behavior: The JavaScript returned by drupal_get_js() when only settings have been added includes drupal.js.');
$this->assertTrue(strpos($javascript, 'Drupal.settings') !== FALSE, 'Default behavior: The JavaScript returned by drupal_get_js() when only settings have been added includes Drupal.settings.');
$this->assertTrue(strpos($javascript, 'basePath') !== FALSE, 'Default behavior: The JavaScript returned by drupal_get_js() when only settings have been added includes the basePath Drupal setting.');
$this->assertTrue(strpos($javascript, 'testJavaScriptSetting') !== FALSE, 'Default behavior: The JavaScript returned by drupal_get_js() when only settings have been added includes the added Drupal settings.');
//
// When only settings have been added via drupal_add_js() and the
// 'javascript_always_use_jquery' variable is set to FALSE, drupal_get_js()
// should not return jQuery and other standard scripts and settings, nor
// should it return the requested settings (since they cannot actually be
// added to the page without jQuery).
advagg_test_reset_statics();
variable_set('javascript_always_use_jquery', FALSE);
drupal_add_js(array(
'testJavaScriptSetting' => 'test',
), 'setting');
$render_array = advagg_get_js();
$javascript = drupal_render($render_array);
$this->assertTrue(strpos($javascript, 'misc/jquery.js') === FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when only settings have been added does not include jquery.js.');
$this->assertTrue(strpos($javascript, 'misc/drupal.js') === FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when only settings have been added does not include drupal.js.');
$this->assertTrue(strpos($javascript, 'Drupal.settings') === FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when only settings have been added does not include Drupal.settings.');
$this->assertTrue(strpos($javascript, 'basePath') === FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when only settings have been added does not include the basePath Drupal setting.');
$this->assertTrue(strpos($javascript, 'testJavaScriptSetting') === FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when only settings have been added does not include the added Drupal settings.');
variable_del('javascript_always_use_jquery');
//
// When a regular file has been added via drupal_add_js(), drupal_get_js()
// should return jQuery and other standard scripts and settings.
advagg_test_reset_statics();
drupal_add_js('misc/collapse.js');
$render_array = advagg_get_js();
$javascript = drupal_render($render_array);
$this->assertTrue(strpos($javascript, 'misc/jquery.js') !== FALSE, 'Default behavior: The JavaScript returned by drupal_get_js() when a custom JavaScript file has been added includes jquery.js.');
$this->assertTrue(strpos($javascript, 'misc/drupal.js') !== FALSE, 'Default behavior: The JavaScript returned by drupal_get_js() when a custom JavaScript file has been added includes drupal.js.');
$this->assertTrue(strpos($javascript, 'Drupal.settings') !== FALSE, 'Default behavior: The JavaScript returned by drupal_get_js() when a custom JavaScript file has been added includes Drupal.settings.');
$this->assertTrue(strpos($javascript, 'basePath') !== FALSE, 'Default behavior: The JavaScript returned by drupal_get_js() when a custom JavaScript file has been added includes the basePath Drupal setting.');
$this->assertTrue(strpos($javascript, 'misc/collapse.js') !== FALSE, 'Default behavior: The JavaScript returned by drupal_get_js() when a custom JavaScript file has been added includes the custom file.');
//
// When a regular file has been added via drupal_add_js() and the
// 'javascript_always_use_jquery' variable is set to FALSE, drupal_get_js()
// should still return jQuery and other standard scripts and settings
// (since the file is assumed to require jQuery by default).
advagg_test_reset_statics();
variable_set('javascript_always_use_jquery', FALSE);
drupal_add_js('misc/collapse.js');
$render_array = advagg_get_js();
$javascript = drupal_render($render_array);
$this->assertTrue(strpos($javascript, 'misc/jquery.js') !== FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when a custom JavaScript file has been added includes jquery.js.');
$this->assertTrue(strpos($javascript, 'misc/drupal.js') !== FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when a custom JavaScript file has been added includes drupal.js.');
$this->assertTrue(strpos($javascript, 'Drupal.settings') !== FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when a custom JavaScript file has been added includes Drupal.settings.');
$this->assertTrue(strpos($javascript, 'basePath') !== FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when a custom JavaScript file has been added includes the basePath Drupal setting.');
$this->assertTrue(strpos($javascript, 'misc/collapse.js') !== FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when a custom JavaScript file has been added includes the custom file.');
variable_del('javascript_always_use_jquery');
//
// When a file that does not require jQuery has been added via
// drupal_add_js(), drupal_get_js() should still return jQuery and other
// standard scripts and settings by default.
advagg_test_reset_statics();
drupal_add_js('misc/collapse.js', array(
'requires_jquery' => FALSE,
));
$render_array = advagg_get_js();
$javascript = drupal_render($render_array);
$this->assertTrue(strpos($javascript, 'misc/jquery.js') !== FALSE, 'Default behavior: The JavaScript returned by drupal_get_js() when a custom JavaScript file that does not require jQuery has been added includes jquery.js.');
$this->assertTrue(strpos($javascript, 'misc/drupal.js') !== FALSE, 'Default behavior: The JavaScript returned by drupal_get_js() when a custom JavaScript file that does not require jQuery has been added includes drupal.js.');
$this->assertTrue(strpos($javascript, 'Drupal.settings') !== FALSE, 'Default behavior: The JavaScript returned by drupal_get_js() when a custom JavaScript file that does not require jQuery has been added includes Drupal.settings.');
$this->assertTrue(strpos($javascript, 'basePath') !== FALSE, 'Default behavior: The JavaScript returned by drupal_get_js() when a custom JavaScript file that does not require jQuery has been added includes the basePath Drupal setting.');
$this->assertTrue(strpos($javascript, 'misc/collapse.js') !== FALSE, 'Default behavior: The JavaScript returned by drupal_get_js() when a custom JavaScript file that does not require jQuery has been added includes the custom file.');
//
// When a file that does not require jQuery has been added via
// drupal_add_js() and the 'javascript_always_use_jquery' variable is set
// to FALSE, drupal_get_js() should not return jQuery and other standard
// scripts and setting, but it should still return the requested file.
advagg_test_reset_statics();
variable_set('javascript_always_use_jquery', FALSE);
drupal_add_js('misc/collapse.js', array(
'requires_jquery' => FALSE,
));
$render_array = advagg_get_js();
$javascript = drupal_render($render_array);
$this->assertTrue(strpos($javascript, 'misc/jquery.js') === FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when a custom JavaScript file that does not require jQuery has been added does not include jquery.js.');
$this->assertTrue(strpos($javascript, 'misc/drupal.js') === FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when a custom JavaScript file that does not require jQuery has been added does not include drupal.js.');
$this->assertTrue(strpos($javascript, 'Drupal.settings') === FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when a custom JavaScript file that does not require jQuery has been added does not include Drupal.settings.');
$this->assertTrue(strpos($javascript, 'basePath') === FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when a custom JavaScript file that does not require jQuery has been added does not include the basePath Drupal setting.');
$this->assertTrue(strpos($javascript, 'misc/collapse.js') !== FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when a custom JavaScript file that does not require jQuery has been added includes the custom file.');
variable_del('javascript_always_use_jquery');
//
// When 'javascript_always_use_jquery' is set to FALSE and a file that does
// not require jQuery is added, followed by one that does, drupal_get_js()
// should return jQuery and other standard scripts and settings, in
// addition to both of the requested files.
advagg_test_reset_statics();
variable_set('javascript_always_use_jquery', FALSE);
drupal_add_js('misc/collapse.js', array(
'requires_jquery' => FALSE,
));
drupal_add_js('misc/ajax.js');
$render_array = advagg_get_js();
$javascript = drupal_render($render_array);
$this->assertTrue(strpos($javascript, 'misc/jquery.js') !== FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when at least one custom JavaScript file that requires jQuery has been added includes jquery.js.');
$this->assertTrue(strpos($javascript, 'misc/drupal.js') !== FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when at least one custom JavaScript file that requires jQuery has been added includes drupal.js.');
$this->assertTrue(strpos($javascript, 'Drupal.settings') !== FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when at least one custom JavaScript file that requires jQuery has been added includes Drupal.settings.');
$this->assertTrue(strpos($javascript, 'basePath') !== FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when at least one custom JavaScript file that requires jQuery has been added includes the basePath Drupal setting.');
$this->assertTrue(strpos($javascript, 'misc/collapse.js') !== FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when at least one custom JavaScript file that requires jQuery has been added includes the first custom file.');
$this->assertTrue(strpos($javascript, 'misc/ajax.js') !== FALSE, 'When "javascript_always_use_jquery" is FALSE: The JavaScript returned by drupal_get_js() when at least one custom JavaScript file that requires jQuery has been added includes the second custom file.');
variable_del('javascript_always_use_jquery');
//
// Tests JavaScript aggregation when files are added to a different scope.
advagg_test_reset_statics();
// Enable JavaScript aggregation.
variable_set('preprocess_js', 1);
// Add two JavaScript files to the current request and build the cache.
drupal_add_js('misc/ajax.js');
drupal_add_js('misc/autocomplete.js');
$js_items = drupal_add_js();
drupal_build_js_cache(array(
'misc/ajax.js' => $js_items['misc/ajax.js'],
'misc/autocomplete.js' => $js_items['misc/autocomplete.js'],
));
// Store the expected key for the first item in the cache.
$cache = array_keys(variable_get('drupal_js_cache_files', array()));
$expected_key = $cache[0];
// Reset variables and add a file in a different scope first.
variable_del('drupal_js_cache_files');
advagg_test_reset_statics();
drupal_add_js('some/custom/javascript_file.js', array(
'scope' => 'footer',
));
drupal_add_js('misc/ajax.js');
drupal_add_js('misc/autocomplete.js');
// Rebuild the cache.
$js_items = drupal_add_js();
drupal_build_js_cache(array(
'misc/ajax.js' => $js_items['misc/ajax.js'],
'misc/autocomplete.js' => $js_items['misc/autocomplete.js'],
));
// Compare the expected key for the first file to the current one.
$cache = array_keys(variable_get('drupal_js_cache_files', array()));
$key = $cache[0];
$this->assertEqual($key, $expected_key, 'JavaScript aggregation is not affected by ordering in different scopes.');
variable_set('preprocess_js', 0);
//
// Test JavaScript ordering.
advagg_test_reset_statics();
// Add a bunch of JavaScript in strange ordering.
drupal_add_js('(function($){alert("Weight 5 #1");})(jQuery);', array(
'type' => 'inline',
'scope' => 'footer',
'weight' => 5,
));
drupal_add_js('(function($){alert("Weight 0 #1");})(jQuery);', array(
'type' => 'inline',
'scope' => 'footer',
));
drupal_add_js('(function($){alert("Weight 0 #2");})(jQuery);', array(
'type' => 'inline',
'scope' => 'footer',
));
drupal_add_js('(function($){alert("Weight -8 #1");})(jQuery);', array(
'type' => 'inline',
'scope' => 'footer',
'weight' => -8,
));
drupal_add_js('(function($){alert("Weight -8 #2");})(jQuery);', array(
'type' => 'inline',
'scope' => 'footer',
'weight' => -8,
));
drupal_add_js('(function($){alert("Weight -8 #3");})(jQuery);', array(
'type' => 'inline',
'scope' => 'footer',
'weight' => -8,
));
drupal_add_js('http://example.com/example.js?Weight -5 #1', array(
'type' => 'external',
'scope' => 'footer',
'weight' => -5,
));
drupal_add_js('(function($){alert("Weight -8 #4");})(jQuery);', array(
'type' => 'inline',
'scope' => 'footer',
'weight' => -8,
));
drupal_add_js('(function($){alert("Weight 5 #2");})(jQuery);', array(
'type' => 'inline',
'scope' => 'footer',
'weight' => 5,
));
drupal_add_js('(function($){alert("Weight 0 #3");})(jQuery);', array(
'type' => 'inline',
'scope' => 'footer',
));
// Construct the expected result from the regex.
$expected = array(
"-8 #1",
"-8 #2",
"-8 #3",
"-8 #4",
// -5 #1: The external script.
"-5 #1",
"0 #1",
"0 #2",
"0 #3",
"5 #1",
"5 #2",
);
// Retrieve the rendered JavaScript and test against the regex.
$render_array = advagg_get_js('footer');
$js = drupal_render($render_array);
$matches = array();
if (preg_match_all('/Weight\\s([-0-9]+\\s[#0-9]+)/', $js, $matches)) {
$result = $matches[1];
}
else {
$result = array();
}
$this->assertIdentical($result, $expected, 'JavaScript is added in the expected weight order.');
//
// Test default JavaScript is empty.
advagg_test_reset_statics();
$this->assertEqual(array(), drupal_add_js(), 'Default JavaScript is empty.');
//
// Test drupal_get_js() for JavaScript settings.
advagg_test_reset_statics();
// Only the second of these two entries should appear in Drupal.settings.
drupal_add_js(array(
'commonTest' => 'commonTestShouldNotAppear',
), 'setting');
drupal_add_js(array(
'commonTest' => 'commonTestShouldAppear',
), 'setting');
// All three of these entries should appear in Drupal.settings.
drupal_add_js(array(
'commonTestArray' => array(
'commonTestValue0',
),
), 'setting');
drupal_add_js(array(
'commonTestArray' => array(
'commonTestValue1',
),
), 'setting');
drupal_add_js(array(
'commonTestArray' => array(
'commonTestValue2',
),
), 'setting');
// Only the second of these two entries should appear in Drupal.settings.
drupal_add_js(array(
'commonTestArray' => array(
'key' => 'commonTestOldValue',
),
), 'setting');
drupal_add_js(array(
'commonTestArray' => array(
'key' => 'commonTestNewValue',
),
), 'setting');
$render_array = advagg_get_js('header');
$javascript = drupal_render($render_array);
$this->assertTrue(strpos($javascript, 'basePath') > 0, 'Rendered JavaScript header returns basePath setting.');
$this->assertTrue(strpos($javascript, 'misc/jquery.js') > 0, 'Rendered JavaScript header includes jQuery.');
$this->assertTrue(strpos($javascript, 'pathPrefix') > 0, 'Rendered JavaScript header returns pathPrefix setting.');
// Test whether drupal_add_js can be used to override a previous setting.
$this->assertTrue(strpos($javascript, 'commonTestShouldAppear') > 0, 'Rendered JavaScript header returns custom setting.');
$this->assertTrue(strpos($javascript, 'commonTestShouldNotAppear') === FALSE, 'drupal_add_js() correctly overrides a custom setting.');
// Test whether drupal_add_js can be used to add numerically indexed values
// to an array.
$array_values_appear = strpos($javascript, 'commonTestValue0') > 0 && strpos($javascript, 'commonTestValue1') > 0 && strpos($javascript, 'commonTestValue2') > 0;
$this->assertTrue($array_values_appear, 'drupal_add_js() correctly adds settings to the end of an indexed array.');
// Test whether drupal_add_js can be used to override the entry for an
// existing key in an associative array.
$associative_array_override = strpos($javascript, 'commonTestNewValue') > 0 && strpos($javascript, 'commonTestOldValue') === FALSE;
$this->assertTrue($associative_array_override, 'drupal_add_js() correctly overrides settings within an associative array.');
//
// Test rendering an external JavaScript file.
advagg_test_reset_statics();
$GLOBALS['conf']['advagg_convert_absolute_to_relative_path'] = FALSE;
$GLOBALS['conf']['advagg_convert_absolute_to_protocol_relative_path'] = FALSE;
$GLOBALS['conf']['advagg_force_https_path'] = FALSE;
$external = 'http://example.com/example.js';
drupal_add_js($external, 'external');
$render_array = advagg_get_js();
$javascript = drupal_render($render_array);
// Local files have a base_path() prefix, external files should not.
$this->assertTrue(strpos($javascript, 'src="' . $external) > 0, 'Rendering an external JavaScript file.');
//
// Test drupal_get_js() with a footer scope.
advagg_test_reset_statics();
$inline = 'jQuery(function () { });';
drupal_add_js($inline, array(
'type' => 'inline',
'scope' => 'footer',
));
$render_array = advagg_get_js('footer');
$javascript = drupal_render($render_array);
$this->assertTrue(strpos($javascript, $inline) > 0, 'Rendered JavaScript footer returns the inline code.');
//
// Ensures that vertical-tabs.js is included before collapse.js.
advagg_test_reset_statics();
$this->drupalGet('form_test/vertical-tabs');
$position1 = strpos($this->content, 'misc/vertical-tabs.js');
$position2 = strpos($this->content, 'misc/collapse.js');
$this->assertTrue($position1 !== FALSE && $position2 !== FALSE && $position1 < $position2, 'vertical-tabs.js is included before collapse.js');
//
// Test rendering the JavaScript with a file's weight above jQuery's.
advagg_test_reset_statics();
// JavaScript files are sorted first by group, then by the 'every_page'
// flag, then by weight (see drupal_sort_css_js()), so to test the effect of
// weight, we need the other two options to be the same.
drupal_add_js('misc/collapse.js', array(
'group' => JS_LIBRARY,
'every_page' => TRUE,
'weight' => -21,
));
$render_array = advagg_get_js();
$javascript = drupal_render($render_array);
$this->assertTrue(strpos($javascript, 'misc/collapse.js') < strpos($javascript, 'misc/jquery.js'), 'Rendering a JavaScript file above jQuery.');
//
// Test altering a JavaScript's weight via hook_js_alter().
advagg_test_reset_statics();
// Add both tableselect.js and simpletest.js, with a larger weight on
// SimpleTest.
drupal_add_js('misc/tableselect.js');
drupal_add_js(drupal_get_path('module', 'simpletest') . '/simpletest.js', array(
'weight' => 9999,
));
// Render the JavaScript, testing if simpletest.js was altered to be before
// tableselect.js. See simpletest_js_alter() to see where this alteration
// takes place.
$render_array = advagg_get_js();
$javascript = drupal_render($render_array);
$this->assertTrue(strpos($javascript, 'simpletest.js') < strpos($javascript, 'misc/tableselect.js'), 'Altering JavaScript weight through the alter hook.');
//
// Adds a library to the page and tests for both its JavaScript and its CSS.
advagg_test_reset_statics();
$result = drupal_add_library('system', 'farbtastic');
$this->assertTrue($result !== FALSE, 'Library was added without errors.');
$render_array = advagg_get_js();
$scripts = drupal_render($render_array);
$render_array = advagg_get_css();
$styles = drupal_render($render_array);
$this->assertTrue(strpos($scripts, 'misc/farbtastic/farbtastic.js'), 'JavaScript of library was added to the page.');
$this->assertTrue(strpos($styles, 'misc/farbtastic/farbtastic.css'), 'Stylesheet of library was added to the page.');
//
// Adds a JavaScript library to the page and alters it.
advagg_test_reset_statics();
// Verify that common_test altered the title of Farbtastic.
$library = drupal_get_library('system', 'farbtastic');
$this->assertEqual($library['title'], 'Farbtastic: Altered Library', 'Registered libraries were altered.');
// common_test_library_alter() also added a dependency on jQuery Form.
drupal_add_library('system', 'farbtastic');
$render_array = advagg_get_js();
$scripts = drupal_render($render_array);
$this->assertTrue(strpos($scripts, 'misc/jquery.form.js'), 'Altered library dependencies are added to the page.');
//
// Tests non-existing libraries.
advagg_test_reset_statics();
$result = drupal_get_library('unknown', 'unknown');
$this->assertFalse($result, 'Unknown library returned FALSE.');
advagg_test_reset_statics();
$result = drupal_add_library('unknown', 'unknown');
$this->assertFalse($result, 'Unknown library returned FALSE.');
$render_array = advagg_get_js();
$scripts = drupal_render($render_array);
$this->assertTrue(strpos($scripts, 'unknown') === FALSE, 'Unknown library was not added to the page.');
//
// Tests the addition of libraries through the #attached['library']
// property.
advagg_test_reset_statics();
$element['#attached']['library'][] = array(
'system',
'farbtastic',
);
drupal_render($element);
$render_array = advagg_get_js();
$scripts = drupal_render($render_array);
$this->assertTrue(strpos($scripts, 'misc/farbtastic/farbtastic.js'), 'The attached_library property adds the additional libraries.');
//
// Test #attached functionality in children elements.
advagg_test_reset_statics();
// The cache system is turned off for POST requests.
$request_method = $_SERVER['REQUEST_METHOD'];
$_SERVER['REQUEST_METHOD'] = 'GET';
// Create an element with a child and subchild. Each element loads a
// different JavaScript file using #attached.
$parent_js = drupal_get_path('module', 'user') . '/user.js';
$child_js = drupal_get_path('module', 'color') . '/color.js';
$subchild_js = drupal_get_path('module', 'book') . '/book.js';
$element = array(
'#type' => 'fieldset',
'#cache' => array(
'keys' => array(
'simpletest',
'drupal_render',
'children_attached',
),
),
'#attached' => array(
'js' => array(
$parent_js,
),
),
'#title' => 'Parent',
);
$element['child'] = array(
'#type' => 'fieldset',
'#attached' => array(
'js' => array(
$child_js,
),
),
'#title' => 'Child',
);
$element['child']['subchild'] = array(
'#attached' => array(
'js' => array(
$subchild_js,
),
),
'#markup' => 'Subchild',
);
// Render the element and verify the presence of #attached JavaScript.
drupal_render($element);
$render_array = advagg_get_js();
$scripts = drupal_render($render_array);
$this->assertTrue(strpos($scripts, $parent_js), 'The element #attached JavaScript was included.');
$this->assertTrue(strpos($scripts, $child_js), 'The child #attached JavaScript was included.');
$this->assertTrue(strpos($scripts, $subchild_js), 'The subchild #attached JavaScript was included.');
// Load the element from cache and verify the presence of the #attached
// JavaScript.
advagg_test_reset_statics();
$this->assertTrue(drupal_render_cache_get($element), 'The element was retrieved from cache.');
$render_array = advagg_get_js();
$scripts = drupal_render($render_array);
$this->assertTrue(strpos($scripts, $parent_js), 'The element #attached JavaScript was included when loading from cache.');
$this->assertTrue(strpos($scripts, $child_js), 'The child #attached JavaScript was included when loading from cache.');
$this->assertTrue(strpos($scripts, $subchild_js), 'The subchild #attached JavaScript was included when loading from cache.');
$_SERVER['REQUEST_METHOD'] = $request_method;
//
// Tests the localisation of JavaScript libraries. Verifies that the
// datepicker can be localized.
advagg_test_reset_statics();
drupal_add_library('system', 'ui.datepicker');
$GLOBALS['conf']['advagg_mod_js_footer'] = 0;
$render_array = advagg_get_js();
$javascript = drupal_render($render_array);
$this->assertTrue(strpos($javascript, 'locale.datepicker.js'), 'locale.datepicker.js added to scripts.');
//
// Functional tests for JavaScript parsing for translatable strings.
// Tests parsing js files for translatable strings.
advagg_test_reset_statics();
$filename = drupal_get_path('module', 'locale_test') . '/locale_test.js';
// Parse the file to look for source strings.
_locale_parse_js_file($filename);
// Get all of the source strings that were found.
$source_strings = db_select('locales_source', 's')->fields('s', array(
'source',
'context',
))
->condition('s.location', $filename)
->execute()
->fetchAllKeyed();
// List of all strings that should be in the file.
$test_strings = array(
"Standard Call t" => '',
"Whitespace Call t" => '',
"Single Quote t" => '',
"Single Quote \\'Escaped\\' t" => '',
"Single Quote Concat strings t" => '',
"Double Quote t" => '',
"Double Quote \\\"Escaped\\\" t" => '',
"Double Quote Concat strings t" => '',
"Context !key Args t" => "Context string",
"Context Unquoted t" => "Context string unquoted",
"Context Single Quoted t" => "Context string single quoted",
"Context Double Quoted t" => "Context string double quoted",
"Standard Call plural" => '',
"Standard Call @count plural" => '',
"Whitespace Call plural" => '',
"Whitespace Call @count plural" => '',
"Single Quote plural" => '',
"Single Quote @count plural" => '',
"Single Quote \\'Escaped\\' plural" => '',
"Single Quote \\'Escaped\\' @count plural" => '',
"Double Quote plural" => '',
"Double Quote @count plural" => '',
"Double Quote \\\"Escaped\\\" plural" => '',
"Double Quote \\\"Escaped\\\" @count plural" => '',
"Context !key Args plural" => "Context string",
"Context !key Args @count plural" => "Context string",
"Context Unquoted plural" => "Context string unquoted",
"Context Unquoted @count plural" => "Context string unquoted",
"Context Single Quoted plural" => "Context string single quoted",
"Context Single Quoted @count plural" => "Context string single quoted",
"Context Double Quoted plural" => "Context string double quoted",
"Context Double Quoted @count plural" => "Context string double quoted",
);
// Assert that all strings were found properly.
foreach ($test_strings as $str => $context) {
$args = array(
'%source' => $str,
'%context' => $context,
);
// Make sure that the string was found in the file.
$this->assertTrue(isset($source_strings[$str]), format_string('Found source string: %source', $args));
// Make sure that the proper context was matched.
$this->assertTrue(isset($source_strings[$str]) && $source_strings[$str] === $context, strlen($context) > 0 ? format_string('Context for %source is %context', $args) : format_string('Context for %source is blank', $args));
}
$this->assertEqual(count($source_strings), count($test_strings), 'Found correct number of source strings.');
//
// Adds a language and checks that the JavaScript translation files are
// properly created and rebuilt on deletion.
$user = $this->drupalCreateUser(array(
'translate interface',
'administer languages',
'access administration pages',
));
$this->drupalLogin($user);
$langcode = 'xx';
// The English name for the language. This will be translated.
$name = $this->randomName(16);
// The native name for the language.
$native = $this->randomName(16);
// The domain prefix.
$prefix = $langcode;
// Add custom language.
$edit = array(
'langcode' => $langcode,
'name' => $name,
'native' => $native,
'prefix' => $prefix,
'direction' => '0',
);
$this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
drupal_static_reset('language_list');
// Build the JavaScript translation file.
$this->drupalGet('admin/config/regional/translate/translate');
// Retrieve the id of the first string available in the {locales_source}
// table and translate it.
$query = db_select('locales_source', 'l');
$query->addExpression('min(l.lid)', 'lid');
$result = $query->condition('l.location', '%.js%', 'LIKE')
->condition('l.textgroup', 'default')
->execute();
$url = 'admin/config/regional/translate/edit/' . $result->fetchObject()->lid;
$edit = array(
'translations[' . $langcode . ']' => $this->randomName(),
);
$this->drupalPost($url, $edit, t('Save translations'));
// Trigger JavaScript translation parsing and building.
require_once DRUPAL_ROOT . '/includes/locale.inc';
_locale_rebuild_js($langcode);
// Retrieve the JavaScript translation hash code for the custom language to
// check that the translation file has been properly built.
$file = db_select('languages', 'l')->fields('l', array(
'javascript',
))
->condition('language', $langcode)
->execute()
->fetchObject();
$js_file = 'public://' . variable_get('locale_js_directory', 'languages') . '/' . $langcode . '_' . $file->javascript . '.js';
$this->assertTrue($result = file_exists($js_file), format_string('JavaScript file created: %file', array(
'%file' => $result ? $js_file : 'not found',
)));
// Test JavaScript translation rebuilding.
file_unmanaged_delete($js_file);
$this->assertTrue($result = !file_exists($js_file), format_string('JavaScript file deleted: %file', array(
'%file' => $result ? $js_file : 'found',
)));
cache_clear_all();
_locale_rebuild_js($langcode);
$this->assertTrue($result = file_exists($js_file), format_string('JavaScript file rebuilt: %file', array(
'%file' => $result ? $js_file : 'not found',
)));
}
}
Members
Titre Trier par ordre décroissant | Modifiers | Object type | Résumé |
---|---|---|---|
AdvAggJavaScriptTestCase::$preprocessJs | protected | property | Store configured value for JavaScript preprocessing. |
AdvAggJavaScriptTestCase::getInfo | public static | function | Provide information to the UI for this test. |
AdvAggJavaScriptTestCase::setUp | public | function | Install the advagg module and include needed files. |
AdvAggJavaScriptTestCase::tearDown | public | function | Restore any variables we set. |
AdvAggJavaScriptTestCase::testJavaScriptAlwaysUsejQuery | public | function | Test the 'javascript_always_use_jquery' variable. |