1 layout.test LayoutBlockTest::testHeroBlocks()

Test Hero blocks.

File

core/modules/layout/tests/layout.test, line 2167
Tests for the Layout module.

Class

LayoutBlockTest
Tests the blocks title, content, and display settings.

Code

function testHeroBlocks() {
  $hero_title_1 = 'Wonder Woman';
  $hero_content_1 = 'Youth is your greatest weapon, your greatest tool.';
  $hero_title_2 = 'Black Widow';
  $hero_content_2 = "Whatever it takes.";

  // Create some sample images.
  $good_image = imagecreate(2400, 400);
  $good_filename = 'good.jpg';
  $good_realpath_filename = backdrop_realpath('temporary://' . $good_filename);
  imagejpeg($good_image, $good_realpath_filename);

  $bad_image = imagecreate(1024, 260);
  imagecolorallocate($bad_image, 255, 0, 0); // Red image.
  $bad_filename = 'bad.jpg';
  $bad_realpath_filename = backdrop_realpath('temporary://' . $bad_filename);
  imagejpeg($bad_image, $bad_realpath_filename);

  $good_image2 = imagecreate(2400, 400);
  $good_filename2 = 'good2.jpg';
  $good_realpath_filename2 = backdrop_realpath('temporary://' . $good_filename2);
  imagejpeg($good_image2, $good_realpath_filename2);

  $this->backdropGet('admin/structure/layouts/manage/default');

  // Block 1: Add a hero block with no image to the content area.
  $this->clickLink(t('Add block'), 2);
  $this->clickLink(t('Hero block'));
  $edit = array(
    'title' => $hero_title_1,
    'content[value]' => $hero_content_1,
  );
  $this->backdropPost(NULL, $edit, t('Add block'));

  // Block 2: Add a hero block with only content and an image.
  $this->clickLink(t('Add block'), 2);
  $this->clickLink(t('Hero block'));
  $edit = array(
    'content[value]' => $hero_content_2,
    'files[image]' => $good_realpath_filename,
  );
  $this->backdropPost(NULL, $edit, t('Add block'));

  // Block 3: Add a hero block with only an image.
  $this->clickLink(t('Add block'), 2);
  $this->clickLink(t('Hero block'));

  // Confirm a too-small background image fails validation.
  $edit = array(
    'files[image]' => $bad_realpath_filename,
  );
  $this->backdropPost(NULL, $edit, t('Add block'));
  $error_message = t('The specified file %name could not be uploaded.', array('%name' => $bad_filename));
  $error_message .= ' ' . t('The image is too small; the minimum dimensions are %dimensions pixels.', array('%dimensions' => '1200x300'));
  $this->assertRaw($error_message);

  // Resubmit using the good image.
  $edit['files[image]'] = $good_realpath_filename2;
  $this->backdropPost(NULL, $edit, t('Add block'));

  // Save the layout.
  $this->backdropPost(NULL, array(), t('Save layout'));

  // Go to the user page and check for all hero blocks.
  $this->backdropGet('user');

  // Get all hero blocks on the user page and confirm the correct number.
  $elements = $this->xpath('//*[contains(@class,:region)]//*[contains(@class,:block)]', array(
    ':region' => 'l-content',
    ':block' => 'block-layout-hero',
  ));
  $this->assertEqual(count($elements), 3, 'Three hero blocks were found in the content area.');

  // Get all the hero block elements for testing. Order matters here.
  $elements = $this->xpath('(//div[contains(@class, "block-layout-hero")])');

  // Block 1: Confirm both title and content are visible.
  $this->assertText($hero_title_1);
  $this->assertText($hero_content_1);
  // Block 1: Confirm handy `block-hero-no-image` class is present.
  $classes_1 = (string) $elements[0]['class'];
  $this->assertTrue(strstr($classes_1, 'block-hero-no-image'));
  // Block 1: Confirm that no background image is present.
  $this->assertNull($elements[0]['style'], 'No image present for 1st hero block.');

  // Block 2: no title present.
  $title_2 = $elements[1]->xpath('.//h2');
  $this->assertIdentical($title_2, array(), 'No title present for 2nd hero block.');
  // Block 2: content is visible.
  $this->assertText($hero_content_2);
  // Block 2: Confirm handy `block-hero-image` class is present.
  $classes_2 = (string) $elements[1]['class'];
  $this->assertTrue(strstr($classes_2, 'block-hero-image'));
  // Block 2: Background image present.
  $style_2 = (string) $elements[1]['style'];
  $this->assertTrue(strstr($style_2, $good_filename), 'Image present for 2nd hero block.');

  // Block 3: no title present.
  $title_3 = $elements[2]->xpath('.//h2');
  $this->assertIdentical($title_3, array(), 'No title present for 3rd hero block.');
  // Block 3: no content present.
  $content_3_element = $elements[2]->xpath('.//div[contains(@class, "block-content")]');
  $this->assertEqual(count($content_3_element), 1, '3rd hero block content found.');
  // Extract the content.
  $content_3 = (string) $content_3_element[0];

  // We inserted an HTML non-breaking space, but SimpleXML will return a
  // unicode non-breaking space (\u00a0). PHP <7.0.0 does not have native
  // unicode strings, so we encode as JSON which will encode the character.
  // In PHP 7 this could be represented as $content_3 === "\u00a0".
  $unicode_nbsp = trim(json_encode(trim($content_3)), '"');
  $this->assertEqual($unicode_nbsp, '\u00a0', '3rd hero block contains only a non-breaking space.');

  // Background image present for block three.
  $style_3 = (string) $elements[2]['style'];
  $this->assertTrue(strstr($style_3, $good_filename2), 'Image present for 3rd hero block.');
}