Commit 2f76c696 authored by webchick's avatar webchick
Browse files

#445736 by sun: Fixed Poll does not respect weight in Preview or More button.

parent e0276999
......@@ -603,11 +603,11 @@ class ImportOPMLTestCase extends AggregatorTestCase {
->execute();
$this->drupalGet('admin/config/services/aggregator/add/opml');
$this->assertText('A single OPML document may contain a collection of many feeds.', t('Looking for help text.'));
$this->assertFieldByName('files[upload]', '', t('Looking for file upload field.'));
$this->assertFieldByName('remote', '', t('Looking for remote URL field.'));
$this->assertFieldByName('refresh', '', t('Looking for refresh field.'));
$this->assertFieldByName("category[$cid]", $cid, t('Looking for category field.'));
$this->assertText('A single OPML document may contain a collection of many feeds.', t('Found OPML help text.'));
$this->assertField('files[upload]', t('Found file upload field.'));
$this->assertField('remote', t('Found Remote URL field.'));
$this->assertField('refresh', '', t('Found Refresh field.'));
$this->assertFieldByName("category[$cid]", $cid, t('Found category field.'));
}
/**
......
......@@ -254,7 +254,7 @@ class BlockTestCase extends DrupalWebTestCase {
':region-class' => 'region region-' . str_replace('_', '-', $region),
':block-id' => 'block-' . $block['module'] . '-' . $block['delta'],
));
$this->assertFieldByXPath($xpath, FALSE, t('Custom block found in %region_name region.', array('%region_name' => $region)));
$this->assertFieldByXPath($xpath, NULL, t('Custom block found in %region_name region.', array('%region_name' => $region)));
}
/**
......
......@@ -215,8 +215,8 @@ class TextFieldTestCase extends DrupalWebTestCase {
// Display edition form.
// We should now have a 'text format' selector.
$this->drupalGet('test-entity/manage/' . $id . '/edit');
$this->assertFieldByName("{$this->field_name}[$langcode][0][value]", '', t('Widget is displayed'));
$this->assertFieldByName("{$this->field_name}[$langcode][0][format]", '', t('Format selector is displayed'));
$this->assertFieldByName("{$this->field_name}[$langcode][0][value]", NULL, t('Widget is displayed'));
$this->assertFieldByName("{$this->field_name}[$langcode][0][format]", NULL, t('Format selector is displayed'));
// Edit and change the text format to the new one that was created.
$edit = array(
......
......@@ -1581,12 +1581,12 @@ class LocaleContentFunctionalTest extends DrupalWebTestCase {
$this->drupalLogin($web_user);
$this->drupalGet('node/add/article');
// Verify language select list is not present.
$this->assertNoFieldByName('language', '', t('Language select not present on add article form.'));
$this->assertNoFieldByName('language', NULL, t('Language select not present on add article form.'));
// Verify language selection appears on add "Basic page" form.
$this->drupalGet('node/add/page');
// Verify language select list is present.
$this->assertFieldByName('language', '', t('Language select present on add Basic page form.'));
$this->assertFieldByName('language', NULL, t('Language select present on add Basic page form.'));
// Ensure enabled language appears.
$this->assertText($name, t('Enabled language present.'));
// Ensure disabled language doesn't appear.
......
......@@ -279,16 +279,16 @@ function poll_form($node, &$form_state) {
$weight = 0;
if (isset($node->choice)) {
$delta = count($node->choice);
$weight = -$delta;
foreach ($node->choice as $chid => $choice) {
$key = 'chid:' . $chid;
$form['choice_wrapper']['choice'][$key] = _poll_choice_form($key, $choice['chid'], $choice['chtext'], $choice['chvotes'], $choice['weight'], $choice_count);
$weight = ($choice['weight'] > $weight) ? $choice['weight'] : $weight;
$weight = max($choice['weight'], $weight);
}
}
// Add initial or additional choices.
$existing_delta = $delta;
$weight++;
for ($delta; $delta < $choice_count; $delta++) {
$key = 'new:' . ($delta - $existing_delta);
$form['choice_wrapper']['choice'][$key] = _poll_choice_form($key, NULL, '', 0, $weight, $choice_count);
......@@ -378,6 +378,7 @@ function poll_more_choices_submit($form, &$form_state) {
function _poll_choice_form($key, $chid = NULL, $value = '', $votes = 0, $weight = 0, $size = 10) {
$form = array(
'#tree' => TRUE,
'#weight' => $weight,
);
// We'll manually set the #parents property of these fields so that
......@@ -790,6 +791,9 @@ function template_preprocess_poll_vote(&$variables) {
* Generates a graphical representation of the results of a poll.
*/
function poll_view_results($node, $view_mode, $block = FALSE) {
// Make sure that choices are ordered by their weight.
uasort($node->choice, 'drupal_sort_weight');
// Count the votes and find the maximum
$total_votes = 0;
$max_votes = 0;
......@@ -826,14 +830,14 @@ function theme_poll_choices($variables) {
drupal_add_tabledrag('poll-choice-table', 'order', 'sibling', 'poll-weight');
$is_admin= user_access('administer nodes');
$delta = 0;
$rows = array();
$headers = array(
'',
t('Choice'),
t('Vote count'),
t('Weight'),
);
$headers = array('', t('Choice'));
if ($is_admin) {
$headers[] = t('Vote count');
}
$headers[] = t('Weight');
foreach (element_children($form) as $key) {
$delta++;
......@@ -845,11 +849,13 @@ function theme_poll_choices($variables) {
'data' => array(
array('class' => array('choice-flag')),
drupal_render($form[$key]['chtext']),
drupal_render($form[$key]['chvotes']),
drupal_render($form[$key]['weight']),
),
'class' => array('draggable'),
);
if ($is_admin) {
$row['data'][] = drupal_render($form[$key]['chvotes']);
}
$row['data'][] = drupal_render($form[$key]['weight']);
// Add any additional classes set on the row.
if (!empty($form[$key]['#attributes']['class'])) {
......
......@@ -11,36 +11,41 @@ class PollTestCase extends DrupalWebTestCase {
/**
* Creates a poll.
*
* @param string $title The title of the poll.
* @param array $choices Choices.
* @param boolean $test_preview Whether to test if the preview is working or not.
* @return integer The nid of the created poll, or FALSE on error.
* @param string $title
* The title of the poll.
* @param array $choices
* A list of choice labels.
* @param boolean $preview
* (optional) Whether to test if the preview is working or not. Defaults to
* TRUE.
*
* @return
* The node id of the created poll, or FALSE on error.
*/
function pollCreate($title, $choices, $test_preview = TRUE) {
function pollCreate($title, $choices, $preview = TRUE) {
$this->assertTrue(TRUE, 'Create a poll');
$web_user = $this->drupalCreateUser(array('create poll content', 'access content', 'edit own poll content'));
$this->drupalLogin($web_user);
// Get the form first to initialize the state of the internal browser
// Get the form first to initialize the state of the internal browser.
$this->drupalGet('node/add/poll');
// Prepare a form with two choices
// Prepare a form with two choices.
list($edit, $index) = $this->_pollGenerateEdit($title, $choices);
// Re-submit the form until all choices are filled in.
if (count($choices) > 2) {
// Re-submit the form while the choices are all in
while ($index < count($choices)) {
$this->drupalPost(NULL, $edit, t('More choices'));
$this->assertPollChoiceOrder($choices, $index);
list($edit, $index) = $this->_pollGenerateEdit($title, $choices, $index);
}
}
if ($test_preview) {
if ($preview) {
$this->drupalPost(NULL, $edit, t('Preview'));
foreach ($choices as $k => $choice_text) {
$this->assertRaw($choice_text, t('Choice @choice found was in preview.', array('@choice' => $k)));
}
$this->assertPollChoiceOrder($choices, $index, TRUE);
list($edit, $index) = $this->_pollGenerateEdit($title, $choices, $index);
}
......@@ -52,20 +57,42 @@ class PollTestCase extends DrupalWebTestCase {
return isset($node->nid) ? $node->nid : FALSE;
}
function _pollGenerateEdit($title, $choices, $index = 0) {
$max_new_choices = $index == 0 ? 2 : 5;
/**
* Generates POST values for the poll node form, specifically poll choices.
*
* @param $title
* The title for the poll node.
* @param $choices
* An array containing poll choices, as generated by
* PollTestCase::_generateChoices().
* @param $index
* (optional) The amount/number of already submitted poll choices. Defaults
* to 0.
*
* @return
* An indexed array containing:
* - The generated POST values, suitable for
* DrupalWebTestCase::drupalPost().
* - The number of poll choices contained in 'edit', for potential re-usage
* in subsequent invocations of this function.
*/
function _pollGenerateEdit($title, array $choices, $index = 0) {
$max_new_choices = ($index == 0 ? 2 : 5);
$already_submitted_choices = array_slice($choices, 0, $index);
$new_choices = array_values(array_slice($choices, $index, $max_new_choices));
$langcode = LANGUAGE_NONE;
$edit = array(
"title" => $title
'title' => $title,
);
foreach ($already_submitted_choices as $k => $text) {
$edit['choice[chid:' . $k . '][chtext]'] = $text;
}
foreach ($new_choices as $k => $text) {
$edit['choice[new:' . $k . '][chtext]'] = $text;
// To test poll choice weights, every new choice is sorted in front of
// existing choices. Existing/already submitted choices should keep their
// weight.
$edit['choice[new:' . $k . '][weight]'] = (- $index - $k);
}
return array($edit, count($already_submitted_choices) + count($new_choices));
}
......@@ -78,6 +105,67 @@ class PollTestCase extends DrupalWebTestCase {
return $choices;
}
/**
* Assert correct poll choice order in the node form after submission.
*
* Verifies both the order in the DOM and in the 'weight' form elements.
*
* @param $choices
* An array containing poll choices, as generated by
* PollTestCase::_generateChoices().
* @param $index
* (optional) The amount/number of already submitted poll choices. Defaults
* to 0.
* @param $preview
* (optional) Whether to also check the poll preview.
*
* @see PollTestCase::_pollGenerateEdit()
*/
function assertPollChoiceOrder(array $choices, $index = 0, $preview = FALSE) {
$expected = array();
foreach ($choices as $id => $label) {
if ($id < $index) {
// The expected weight of each choice is exactly the negated id.
// @see PollTestCase::_pollGenerateEdit()
$weight = -$id;
// Directly assert the weight form element value for this choice.
$this->assertFieldByName('choice[chid:' . $id . '][weight]', $weight, t('Found choice @id with weight @weight.', array(
'@id' => $id,
'@weight' => $weight,
)));
// Append to our (to be reversed) stack of labels.
$expected[$weight] = $label;
}
}
ksort($expected);
// Verify DOM order of poll choices (i.e., #weight of form elements).
$elements = $this->xpath('//input[starts-with(@name, :prefix) and contains(@name, :suffix)]', array(
':prefix' => 'choice[chid:',
':suffix' => '][chtext]',
));
$expected_order = $expected;
foreach ($elements as $element) {
$next_label = array_shift($expected_order);
$this->assertEqual((string) $element['value'], $next_label);
}
// If requested, also verify DOM order in preview.
if ($preview) {
$elements = $this->xpath('//div[contains(@class, :teaser)]/descendant::div[@class=:text]', array(
':teaser' => 'node-teaser',
':text' => 'text',
));
$expected_order = $expected;
foreach ($elements as $element) {
$next_label = array_shift($expected_order);
$this->assertEqual((string) $element, $next_label, t('Found choice @label in preview.', array(
'@label' => $next_label,
)));
}
}
}
function pollUpdate($nid, $title, $edit) {
// Edit the poll node.
$this->drupalPost('node/' . $nid . '/edit', $edit, t('Save'));
......@@ -332,7 +420,6 @@ class PollJSAddChoice extends DrupalWebTestCase {
$web_user = $this->drupalCreateUser(array('create poll content', 'access content'));
$this->drupalLogin($web_user);
$this->drupalGet('node/add/poll');
$langcode = LANGUAGE_NONE;
$edit = array(
"title" => $this->randomName(),
'choice[new:0][chtext]' => $this->randomName(),
......@@ -597,33 +684,33 @@ class PollExpirationTestCase extends PollTestCase {
$title = $this->randomName();
$choices = $this->_generateChoices(2);
$poll_nid = $this->pollCreate($title, $choices, FALSE);
$this->assertTrue($poll_nid, t('Poll for auto-expire test created.'), t('Poll'));
$this->assertTrue($poll_nid, t('Poll for auto-expire test created.'));
// Visit the poll edit page and verify that by default, expiration
// is set to unlimited.
$this->drupalGet("node/$poll_nid/edit");
$this->assertField('runtime', t('Poll expiration setting found.'), t('Poll'));
$this->assertField('runtime', t('Poll expiration setting found.'));
$elements = $this->xpath('//select[@id="edit-runtime"]/option[@selected="selected"]');
$this->assertTrue(isset($elements[0]['value']) && $elements[0]['value'] == 0, t('Poll expiration set to unlimited.'), t('Poll'));
$this->assertTrue(isset($elements[0]['value']) && $elements[0]['value'] == 0, t('Poll expiration set to unlimited.'));
// Set the expiration to one week.
$edit = array();
$poll_expiration = 604800; // One week.
$edit['runtime'] = $poll_expiration;
$this->drupalPost(NULL, $edit, t('Save'));
$this->assertRaw(t('Poll %title has been updated.', array('%title' => $title)), t('Poll expiration settings saved.'), t('Poll'));
$this->assertRaw(t('Poll %title has been updated.', array('%title' => $title)), t('Poll expiration settings saved.'));
// Make sure that the changed expiration settings is kept.
$this->drupalGet("node/$poll_nid/edit");
$elements = $this->xpath('//select[@id="edit-runtime"]/option[@selected="selected"]');
$this->assertTrue(isset($elements[0]['value']) && $elements[0]['value'] == $poll_expiration, t('Poll expiration set to unlimited.'), t('Poll'));
$this->assertTrue(isset($elements[0]['value']) && $elements[0]['value'] == $poll_expiration, t('Poll expiration set to unlimited.'));
// Force a cron run. Since the expiration date has not yet been reached,
// the poll should remain active.
drupal_cron_run();
$this->drupalGet("node/$poll_nid/edit");
$elements = $this->xpath('//input[@id="edit-active-1"]');
$this->assertTrue(isset($elements[0]) && !empty($elements[0]['checked']), t('Poll is still active.'), t('Poll'));
$this->assertTrue(isset($elements[0]) && !empty($elements[0]['checked']), t('Poll is still active.'));
// Test expiration. Since REQUEST_TIME is a constant and we don't
// want to keep SimpleTest waiting until the moment of expiration arrives,
......@@ -638,6 +725,6 @@ class PollExpirationTestCase extends PollTestCase {
drupal_cron_run();
$this->drupalGet("node/$poll_nid/edit");
$elements = $this->xpath('//input[@id="edit-active-0"]');
$this->assertTrue(isset($elements[0]) && !empty($elements[0]['checked']), t('Poll has expired.'), t('Poll'));
$this->assertTrue(isset($elements[0]) && !empty($elements[0]['checked']), t('Poll has expired.'));
}
}
\ No newline at end of file
}
......@@ -2810,20 +2810,21 @@ protected function assertNoTitle($title, $message = '', $group = 'Other') {
* @param $xpath
* XPath used to find the field.
* @param $value
* Value of the field to assert.
* (optional) Value of the field to assert.
* @param $message
* Message to display.
* (optional) Message to display.
* @param $group
* The group this message belongs to.
* (optional) The group this message belongs to.
*
* @return
* TRUE on pass, FALSE on fail.
*/
protected function assertFieldByXPath($xpath, $value, $message = '', $group = 'Other') {
protected function assertFieldByXPath($xpath, $value = NULL, $message = '', $group = 'Other') {
$fields = $this->xpath($xpath);
// If value specified then check array for match.
$found = TRUE;
if ($value) {
if (isset($value)) {
$found = FALSE;
if ($fields) {
foreach ($fields as $field) {
......@@ -2882,20 +2883,21 @@ protected function getSelectedItem(SimpleXMLElement $element) {
* @param $xpath
* XPath used to find the field.
* @param $value
* Value of the field to assert.
* (optional) Value of the field to assert.
* @param $message
* Message to display.
* (optional) Message to display.
* @param $group
* The group this message belongs to.
* (optional) The group this message belongs to.
*
* @return
* TRUE on pass, FALSE on fail.
*/
protected function assertNoFieldByXPath($xpath, $value, $message = '', $group = 'Other') {
protected function assertNoFieldByXPath($xpath, $value = NULL, $message = '', $group = 'Other') {
$fields = $this->xpath($xpath);
// If value specified then check array for match.
$found = TRUE;
if ($value) {
if (isset($value)) {
$found = FALSE;
if ($fields) {
foreach ($fields as $field) {
......@@ -3059,7 +3061,7 @@ protected function assertNoOptionSelected($id, $option, $message = '') {
* TRUE on pass, FALSE on fail.
*/
protected function assertField($field, $message = '', $group = 'Other') {
return $this->assertFieldByXPath($this->constructFieldXpath('name', $field) . '|' . $this->constructFieldXpath('id', $field), '', $message, $group);
return $this->assertFieldByXPath($this->constructFieldXpath('name', $field) . '|' . $this->constructFieldXpath('id', $field), NULL, $message, $group);
}
/**
......@@ -3075,7 +3077,7 @@ protected function assertField($field, $message = '', $group = 'Other') {
* TRUE on pass, FALSE on fail.
*/
protected function assertNoField($field, $message = '', $group = 'Other') {
return $this->assertNoFieldByXPath($this->constructFieldXpath('name', $field) . '|' . $this->constructFieldXpath('id', $field), '', $message, $group);
return $this->assertNoFieldByXPath($this->constructFieldXpath('name', $field) . '|' . $this->constructFieldXpath('id', $field), NULL, $message, $group);
}
/**
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment