| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517 | <?php/** * @file * Tests for text.module. */class TextFieldTestCase extends DrupalWebTestCase {  protected $instance;  protected $admin_user;  protected $web_user;  public static function getInfo() {    return array(      'name'  => 'Text field',      'description'  => "Test the creation of text fields.",      'group' => 'Field types'    );  }  function setUp() {    parent::setUp('field_test');    $this->admin_user = $this->drupalCreateUser(array('administer filters'));    $this->web_user = $this->drupalCreateUser(array('access field_test content', 'administer field_test content'));    $this->drupalLogin($this->web_user);  }  // Test fields.  /**   * Test text field validation.   */  function testTextFieldValidation() {    // Create a field with settings to validate.    $max_length = 3;    $this->field = array(      'field_name' => drupal_strtolower($this->randomName()),      'type' => 'text',      'settings' => array(        'max_length' => $max_length,      )    );    field_create_field($this->field);    $this->instance = array(      'field_name' => $this->field['field_name'],      'entity_type' => 'test_entity',      'bundle' => 'test_bundle',      'widget' => array(        'type' => 'text_textfield',      ),      'display' => array(        'default' => array(          'type' => 'text_default',        ),      ),    );    field_create_instance($this->instance);    // Test valid and invalid values with field_attach_validate().    $entity = field_test_create_stub_entity();    $langcode = LANGUAGE_NONE;    for ($i = 0; $i <= $max_length + 2; $i++) {      $entity->{$this->field['field_name']}[$langcode][0]['value'] = str_repeat('x', $i);      try {        field_attach_validate('test_entity', $entity);        $this->assertTrue($i <= $max_length, "Length $i does not cause validation error when max_length is $max_length");      }      catch (FieldValidationException $e) {        $this->assertTrue($i > $max_length, "Length $i causes validation error when max_length is $max_length");      }    }  }  /**   * Test widgets.   */  function testTextfieldWidgets() {    $this->_testTextfieldWidgets('text', 'text_textfield');    $this->_testTextfieldWidgets('text_long', 'text_textarea');  }  /**   * Helper function for testTextfieldWidgets().   */  function _testTextfieldWidgets($field_type, $widget_type) {    // Setup a field and instance    $entity_type = 'test_entity';    $this->field_name = drupal_strtolower($this->randomName());    $this->field = array('field_name' => $this->field_name, 'type' => $field_type);    field_create_field($this->field);    $this->instance = array(      'field_name' => $this->field_name,      'entity_type' => 'test_entity',      'bundle' => 'test_bundle',      'label' => $this->randomName() . '_label',      'settings' => array(        'text_processing' => TRUE,      ),      'widget' => array(        'type' => $widget_type,      ),      'display' => array(        'full' => array(          'type' => 'text_default',        ),      ),    );    field_create_instance($this->instance);    $langcode = LANGUAGE_NONE;    // Display creation form.    $this->drupalGet('test-entity/add/test-bundle');    $this->assertFieldByName("{$this->field_name}[$langcode][0][value]", '', 'Widget is displayed');    $this->assertNoFieldByName("{$this->field_name}[$langcode][0][format]", '1', 'Format selector is not displayed');    // Submit with some value.    $value = $this->randomName();    $edit = array(      "{$this->field_name}[$langcode][0][value]" => $value,    );    $this->drupalPost(NULL, $edit, t('Save'));    preg_match('|test-entity/manage/(\d+)/edit|', $this->url, $match);    $id = $match[1];    $this->assertRaw(t('test_entity @id has been created.', array('@id' => $id)), 'Entity was created');    // Display the entity.    $entity = field_test_entity_test_load($id);    $entity->content = field_attach_view($entity_type, $entity, 'full');    $this->content = drupal_render($entity->content);    $this->assertText($value, 'Filtered tags are not displayed');  }  /**   * Test widgets + 'formatted_text' setting.   */  function testTextfieldWidgetsFormatted() {    $this->_testTextfieldWidgetsFormatted('text', 'text_textfield');    $this->_testTextfieldWidgetsFormatted('text_long', 'text_textarea');  }  /**   * Helper function for testTextfieldWidgetsFormatted().   */  function _testTextfieldWidgetsFormatted($field_type, $widget_type) {    // Setup a field and instance    $entity_type = 'test_entity';    $this->field_name = drupal_strtolower($this->randomName());    $this->field = array('field_name' => $this->field_name, 'type' => $field_type);    field_create_field($this->field);    $this->instance = array(      'field_name' => $this->field_name,      'entity_type' => 'test_entity',      'bundle' => 'test_bundle',      'label' => $this->randomName() . '_label',      'settings' => array(        'text_processing' => TRUE,      ),      'widget' => array(        'type' => $widget_type,      ),      'display' => array(        'full' => array(          'type' => 'text_default',        ),      ),    );    field_create_instance($this->instance);    $langcode = LANGUAGE_NONE;    // Disable all text formats besides the plain text fallback format.    $this->drupalLogin($this->admin_user);    foreach (filter_formats() as $format) {      if ($format->format != filter_fallback_format()) {        $this->drupalPost('admin/config/content/formats/' . $format->format . '/disable', array(), t('Disable'));      }    }    $this->drupalLogin($this->web_user);    // Display the creation form. Since the user only has access to one format,    // no format selector will be displayed.    $this->drupalGet('test-entity/add/test-bundle');    $this->assertFieldByName("{$this->field_name}[$langcode][0][value]", '', 'Widget is displayed');    $this->assertNoFieldByName("{$this->field_name}[$langcode][0][format]", '', 'Format selector is not displayed');    // Submit with data that should be filtered.    $value = '<em>' . $this->randomName() . '</em>';    $edit = array(      "{$this->field_name}[$langcode][0][value]" => $value,    );    $this->drupalPost(NULL, $edit, t('Save'));    preg_match('|test-entity/manage/(\d+)/edit|', $this->url, $match);    $id = $match[1];    $this->assertRaw(t('test_entity @id has been created.', array('@id' => $id)), 'Entity was created');    // Display the entity.    $entity = field_test_entity_test_load($id);    $entity->content = field_attach_view($entity_type, $entity, 'full');    $this->content = drupal_render($entity->content);    $this->assertNoRaw($value, 'HTML tags are not displayed.');    $this->assertRaw(check_plain($value), 'Escaped HTML is displayed correctly.');    // Create a new text format that does not escape HTML, and grant the user    // access to it.    $this->drupalLogin($this->admin_user);    $edit = array(      'format' => drupal_strtolower($this->randomName()),      'name' => $this->randomName(),    );    $this->drupalPost('admin/config/content/formats/add', $edit, t('Save configuration'));    filter_formats_reset();    $this->checkPermissions(array(), TRUE);    $format = filter_format_load($edit['format']);    $format_id = $format->format;    $permission = filter_permission_name($format);    $rid = max(array_keys($this->web_user->roles));    user_role_grant_permissions($rid, array($permission));    $this->drupalLogin($this->web_user);    // 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]", NULL, 'Widget is displayed');    $this->assertFieldByName("{$this->field_name}[$langcode][0][format]", NULL, 'Format selector is displayed');    // Edit and change the text format to the new one that was created.    $edit = array(      "{$this->field_name}[$langcode][0][format]" => $format_id,    );    $this->drupalPost(NULL, $edit, t('Save'));    $this->assertRaw(t('test_entity @id has been updated.', array('@id' => $id)), 'Entity was updated');    // Display the entity.    $entity = field_test_entity_test_load($id);    $entity->content = field_attach_view($entity_type, $entity, 'full');    $this->content = drupal_render($entity->content);    $this->assertRaw($value, 'Value is displayed unfiltered');  }}class TextSummaryTestCase extends DrupalWebTestCase {  public static function getInfo() {    return array(      'name' => 'Text summary',      'description' => 'Test text_summary() with different strings and lengths.',      'group' => 'Field types',    );  }  function setUp() {    parent::setUp();    $this->article_creator = $this->drupalCreateUser(array('create article content', 'edit own article content'));  }  /**   * Tests an edge case where the first sentence is a question and   * subsequent sentences are not. This edge case is documented at   * http://drupal.org/node/180425.   */  function testFirstSentenceQuestion() {    $text = 'A question? A sentence. Another sentence.';    $expected = 'A question? A sentence.';    $this->callTextSummary($text, $expected, NULL, 30);  }  /**   * Test summary with long example.   */  function testLongSentence() {    $text = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ' . // 125            'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ' . // 108            'Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. ' . // 103            'Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'; // 110    $expected = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ' .                'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ' .                'Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.';    // First three sentences add up to: 336, so add one for space and then 3 to get half-way into next word.    $this->callTextSummary($text, $expected, NULL, 340);  }  /**   * Test various summary length edge cases.   */  function testLength() {    // This string tests a number of edge cases.    $text = "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>";    // The summaries we expect text_summary() to return when $size is the index    // of each array item.    // Using no text format:    $expected = array(      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",      "<",      "<p",      "<p>",      "<p>\n",      "<p>\nH",      "<p>\nHi",      "<p>\nHi\n",      "<p>\nHi\n<",      "<p>\nHi\n</",      "<p>\nHi\n</p",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",    );    // And using a text format WITH the line-break and htmlcorrector filters.    $expected_lb = array(      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",      "",      "<p></p>",      "<p></p>",      "<p></p>",      "<p></p>",      "<p></p>",      "<p>\nHi</p>",      "<p>\nHi</p>",      "<p>\nHi</p>",      "<p>\nHi</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>",      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",    );    // Test text_summary() for different sizes.    for ($i = 0; $i <= 37; $i++) {      $this->callTextSummary($text, $expected[$i],    NULL, $i);      $this->callTextSummary($text, $expected_lb[$i], 'plain_text', $i);      $this->callTextSummary($text, $expected_lb[$i], 'filtered_html', $i);    }  }  /**   * Calls text_summary() and asserts that the expected teaser is returned.   */  function callTextSummary($text, $expected, $format = NULL, $size = NULL) {    $summary = text_summary($text, $format, $size);    $this->assertIdentical($summary, $expected, format_string('Generated summary "@summary" matches expected "@expected".', array('@summary' => $summary, '@expected' => $expected)));  }  /**   * Test sending only summary.   */  function testOnlyTextSummary() {    // Login as article creator.    $this->drupalLogin($this->article_creator);    // Create article with summary but empty body.    $summary = $this->randomName();    $edit = array(      "title" => $this->randomName(),      "body[und][0][summary]" => $summary,    );    $this->drupalPost('node/add/article', $edit, t('Save'));    $node = $this->drupalGetNodeByTitle($edit['title']);    $this->assertIdentical($node->body['und'][0]['summary'], $summary, 'Article with with summary and no body has been submitted.');  }}class TextTranslationTestCase extends DrupalWebTestCase {  public static function getInfo() {    return array(      'name' => 'Text translation',      'description' => 'Check if the text field is correctly prepared for translation.',      'group' => 'Field types',    );  }  function setUp() {    parent::setUp('locale', 'translation');    $full_html_format = filter_format_load('full_html');    $this->format = $full_html_format->format;    $this->admin = $this->drupalCreateUser(array(      'administer languages',      'administer content types',      'access administration pages',      'bypass node access',      filter_permission_name($full_html_format),    ));    $this->translator = $this->drupalCreateUser(array('create article content', 'edit own article content', 'translate content'));    // Enable an additional language.    $this->drupalLogin($this->admin);    $edit = array('langcode' => 'fr');    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));    // Set "Article" content type to use multilingual support with translation.    $edit = array('language_content_type' => 2);    $this->drupalPost('admin/structure/types/manage/article', $edit, t('Save content type'));    $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Article')), 'Article content type has been updated.');  }  /**   * Test that a plaintext textfield widget is correctly populated.   */  function testTextField() {    // Disable text processing for body.    $edit = array('instance[settings][text_processing]' => 0);    $this->drupalPost('admin/structure/types/manage/article/fields/body', $edit, t('Save settings'));    // Login as translator.    $this->drupalLogin($this->translator);    // Create content.    $langcode = LANGUAGE_NONE;    $body = $this->randomName();    $edit = array(      "title" => $this->randomName(),      "language" => 'en',      "body[$langcode][0][value]" => $body,    );    // Translate the article in french.    $this->drupalPost('node/add/article', $edit, t('Save'));    $node = $this->drupalGetNodeByTitle($edit['title']);    $this->drupalGet("node/$node->nid/translate");    $this->clickLink(t('add translation'));    $this->assertFieldByXPath("//textarea[@name='body[$langcode][0][value]']", $body, 'The textfield widget is populated.');  }  /**   * Check that user that does not have access the field format cannot see the   * source value when creating a translation.   */  function testTextFieldFormatted() {    // Make node body multiple.    $edit = array('field[cardinality]' => -1);    $this->drupalPost('admin/structure/types/manage/article/fields/body', $edit, t('Save settings'));    $this->drupalGet('node/add/article');    $this->assertFieldByXPath("//input[@name='body_add_more']", t('Add another item'), 'Body field cardinality set to multiple.');    $body = array(      $this->randomName(),      $this->randomName(),    );    // Create an article with the first body input format set to "Full HTML".    $title = $this->randomName();    $edit = array(      'title' => $title,      'language' => 'en',    );    $this->drupalPost('node/add/article', $edit, t('Save'));    // Populate the body field: the first item gets the "Full HTML" input    // format, the second one "Filtered HTML".    $formats = array('full_html', 'filtered_html');    $langcode = LANGUAGE_NONE;    foreach ($body as $delta => $value) {      $edit = array(        "body[$langcode][$delta][value]" => $value,        "body[$langcode][$delta][format]" => array_shift($formats),      );      $this->drupalPost('node/1/edit', $edit, t('Save'));      $this->assertText($body[$delta], format_string('The body field with delta @delta has been saved.', array('@delta' => $delta)));    }    // Login as translator.    $this->drupalLogin($this->translator);    // Translate the article in french.    $node = $this->drupalGetNodeByTitle($title);    $this->drupalGet("node/$node->nid/translate");    $this->clickLink(t('add translation'));    $this->assertNoText($body[0], format_string('The body field with delta @delta is hidden.', array('@delta' => 0)));    $this->assertText($body[1], format_string('The body field with delta @delta is shown.', array('@delta' => 1)));  }}
 |