'Base tests', 'description' => 'Test the creation of a number of fields and the responses found when looking for the Read more link on node entities.', 'group' => 'Read More Control', ); } /** * Implements DrupalWebTestCase::setUp(). */ function setUp() { parent::setUp(array('field_test', 'readmorecontrol')); $this->webUser = $this->drupalCreateUser(array( 'access field_test content', 'administer field_test content', 'administer content types', 'administer nodes', 'bypass node access', )); $this->drupalLogin($this->webUser); } /** * Test that settings are saved against the node entity type and that these * are updated if the content type is renamed. */ function testNodeTypeSettings() { // See if our option shows up on the edit pages. $this->drupalGet('admin/structure/types/manage/page'); $this->assertFieldChecked('edit-readmorecontrol-node-default'); $this->assertNoFieldChecked('edit-readmorecontrol-node-when-required'); $this->assertNoFieldChecked('edit-readmorecontrol-node-never'); $edit = array('readmorecontrol_behaviour__node_' => 'when_required'); $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type')); $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page'))); // Check that there is no strange interaction with other types. $this->drupalGet('admin/structure/types/manage/article'); $this->assertFieldChecked('edit-readmorecontrol-node-default'); $this->drupalGet('admin/structure/types/manage/page'); $this->assertFieldChecked('edit-readmorecontrol-node-when-required'); // Change type and test. $edit = array('type' => 'pp'); $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type')); $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page'))); $this->drupalGet('admin/structure/types/manage/pp'); $this->assertFieldChecked('edit-readmorecontrol-node-when-required'); // Check that there is no strange interaction with other types. $this->drupalGet('admin/structure/types/manage/article'); $this->assertFieldChecked('edit-readmorecontrol-node-default'); $edit = array('readmorecontrol_behaviour__node_' => 'never'); $this->drupalPost('admin/structure/types/manage/pp', $edit, t('Save content type')); $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page'))); $this->drupalGet('admin/structure/types/manage/pp'); $this->assertFieldChecked('edit-readmorecontrol-node-never'); // Revert type settings and test. $edit = array('type' => 'page'); $this->drupalPost('admin/structure/types/manage/pp', $edit, t('Save content type')); $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page'))); $this->drupalGet('admin/structure/types/manage/page'); $this->assertFieldChecked('edit-readmorecontrol-node-never'); $this->drupalGet('admin/structure/types/manage/article'); $this->assertFieldChecked('edit-readmorecontrol-node-default'); } /** * Tests three node content types and fields. * * The node bundles used are: * - page * - article * - test * * We add one content type, test, and add fields to each: * - long_text: A long text field with summary. (@todo) * - number: An integer field. * - short_text: An inline text field. (@todo) * - options: A list field. (@todo) */ function testNodeEntities() { // Add the third content type 'test'. $this->drupalGet('admin/structure/types/add'); $edit = array('name' => 'Test', 'type' => 'test'); $this->drupalPost(NULL, $edit, t('Save and add fields')); // Configure the settings for each type. // Set the article type to always display. $edit = array('readmorecontrol_behaviour__node_' => 'always'); $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type')); $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page'))); // Set the article type to never display. $edit = array('readmorecontrol_behaviour__node_' => 'never'); $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'))); // Set the test type to conditionally display. $edit = array('readmorecontrol_behaviour__node_' => 'when_required'); $this->drupalPost('admin/structure/types/manage/test', $edit, t('Save content type')); $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Test'))); // Creates the number field 'field_number' with display set to // 'number_unformatted'. $this->addNumberIntegerField('node', 'page'); $this->addNumberIntegerField('node', 'article'); $this->addNumberIntegerField('node', 'test'); // Normalise the defaults formatter settings to be equal. // Update all teaser displays to have the same settings as the full display. $edit = array( 'fields[body][type]' => 'text_default', 'fields[field_number][type]' => 'number_integer', ); $this->drupalPost('admin/structure/types/manage/page/display', $edit, t('Save')); $this->drupalPost('admin/structure/types/manage/test/display', $edit, t('Save')); $this->drupalPost('admin/structure/types/manage/page/display/teaser', $edit, t('Save')); $this->drupalPost('admin/structure/types/manage/test/display/teaser', $edit, t('Save')); // Article has tags and image too. $edit = array( 'fields[body][type]' => 'text_default', 'fields[field_number][type]' => 'number_integer', 'fields[field_tags][type]' => 'taxonomy_term_reference_link', 'fields[field_image][type]' => 'hidden', ); $this->drupalPost('admin/structure/types/manage/article/display', $edit, t('Save')); $this->drupalPost('admin/structure/types/manage/article/display/teaser', $edit, t('Save')); // Test empty fields. If all fields are empty, no read more should appear. $langcode = LANGUAGE_NONE; $edit = array(); $edit['status'] = 1; $edit['promote'] = 1; $node_page = $this->createNode('page', $edit); $page_more_link = t('Read more about @title', array('@title' => strip_tags($node_page->title))); $node_article = $this->createNode('article', $edit); $article_more_link = t('Read more about @title', array('@title' => strip_tags($node_article->title))); $node_test = $this->createNode('test', $edit); $test_more_link = t('Read more about @title', array('@title' => strip_tags($node_test->title))); // Page always displays, article never does and test is conditional. $this->drupalGet('node'); $this->assertText($node_page->title); $this->assertText($node_article->title); $this->assertText($node_test->title); $this->assertRaw($page_more_link); $this->assertNoRaw($article_more_link); // The empty fields should never trigger a read more link. $this->assertNoRaw($test_more_link); // Create a large text chunk. $text = $this->randomName(10000); $node_page->body[$langcode][0]['value'] = $text; node_save($node_page); $node_article->body[$langcode][0]['value'] = $text; node_save($node_article); $node_test->body[$langcode][0]['value'] = $text; node_save($node_test); $this->drupalGet('node'); $this->assertText($node_page->title); $this->assertText($node_article->title); $this->assertText($node_test->title); $this->assertRaw($page_more_link); $this->assertNoRaw($article_more_link); // The body field shouldn't trigger a read more link as the displays are // now the same. $this->assertNoRaw($test_more_link); // Update all teaser displays to show reduced size, 600 by default. $edit = array('fields[body][type]' => 'text_summary_or_trimmed'); $this->drupalPost('admin/structure/types/manage/page/display/teaser', $edit, t('Save')); $this->drupalPost('admin/structure/types/manage/test/display/teaser', $edit, t('Save')); $this->drupalPost('admin/structure/types/manage/article/display/teaser', $edit, t('Save')); // The body field should trigger a read more link. $this->drupalGet('node'); $this->assertText($node_page->title); $this->assertText($node_article->title); $this->assertText($node_test->title); $this->assertRaw($page_more_link); $this->assertNoRaw($article_more_link); $this->assertRaw($test_more_link); // Short text should not trigger it. $text = $this->randomName(10); $node_page->body[$langcode][0]['value'] = $text; node_save($node_page); $node_article->body[$langcode][0]['value'] = $text; node_save($node_article); $node_test->body[$langcode][0]['value'] = $text; node_save($node_test); $this->drupalGet('node'); $this->assertRaw($page_more_link); $this->assertNoRaw($article_more_link); $this->assertNoRaw($test_more_link); // Set an integer value. $node_page->field_number[$langcode][0]['value'] = 123; $node_page->body[$langcode][0]['value'] = ''; node_save($node_page); $node_article->body[$langcode][0]['value'] = ''; $node_article->field_number[$langcode][0]['value'] = 123; node_save($node_article); $node_test->body[$langcode][0]['value'] = ''; $node_test->field_number[$langcode][0]['value'] = 123; node_save($node_test); $this->drupalGet('node'); $this->assertRaw($page_more_link); $this->assertNoRaw($article_more_link); $this->assertNoRaw($test_more_link); // Update all teaser displays to have the same settings as the full display. $edit = array( 'fields[field_number][type]' => 'hidden', ); $this->drupalPost('admin/structure/types/manage/page/display/teaser', $edit, t('Save')); $this->drupalPost('admin/structure/types/manage/test/display/teaser', $edit, t('Save')); $this->drupalPost('admin/structure/types/manage/article/display/teaser', $edit, t('Save')); $this->drupalGet('node'); $this->assertRaw($page_more_link); $this->assertNoRaw($article_more_link); $this->assertRaw($test_more_link); // A different display will trigger a read-more link. $edit = array( 'fields[field_number][type]' => 'number_unformatted', ); $this->drupalPost('admin/structure/types/manage/page/display/teaser', $edit, t('Save')); $this->drupalPost('admin/structure/types/manage/test/display/teaser', $edit, t('Save')); $this->drupalPost('admin/structure/types/manage/article/display/teaser', $edit, t('Save')); $this->drupalGet('node'); $this->assertRaw($page_more_link); $this->assertNoRaw($article_more_link); $this->assertRaw($test_more_link); // The same display will not trigger a read-more link. $edit = array( 'fields[field_number][type]' => 'number_integer', ); $this->drupalPost('admin/structure/types/manage/article/display/teaser', $edit, t('Save')); $this->drupalGet('node'); // Conditional. $this->assertRaw($test_more_link); } /** * Adds a number_integer field and sets the default formatter options. */ function addNumberIntegerField($entity_type, $entity_bundle, $field_name = 'field_number', $display = 'number_unformatted') { // Create a field with settings to validate. $field = field_info_field($field_name); if (empty($field)) { $field = array( 'field_name' => $field_name, 'type' => 'number_integer', 'settings' => array(), ); field_create_field($field); } $instance = field_info_instance($entity_type, $field_name, $entity_bundle); if (!$instance) { $instance = array( 'field_name' => $field_name, 'entity_type' => $entity_type, 'bundle' => $entity_bundle, 'widget' => array( 'type' => 'number', ), 'display' => array( 'default' => array( 'type' => $display, ), ), ); field_create_instance($instance); } else { // Updates the formatter if required. $this->setNodeFieldDisplay($entity_type, $field_name, $display); } } /** * Helper method to set a node field display. */ function setNodeFieldDisplay($entity_type, $field_name, $display) { $this->drupalGet("admin/structure/types/manage/$entity_type/display"); $edit = array( "fields[{$field_name}][type]" => $display, ); $this->drupalPost(NULL, $edit, t('Save')); } /** * Helper method to create a new node. */ function createNode($bundle, $edit = array()) { $edit['title'] = $this->randomName(8); $this->drupalPost("node/add/$bundle", $edit, t('Save')); // Check that the node exists in the database. return $this->drupalGetNodeByTitle($edit['title']); } /** * Helper method to load a node from a title. */ function drupalGetNodeByTitle($title, $reset = FALSE) { // Load the first node returned from the database. $nodes = node_load_multiple(array(), array('title' => $title), $reset); $node = reset($nodes); return $node; } }