You are here

public function ResponsivePreviewAdminTest::testDeviceConfiguration in Responsive Theme Preview 8

Tests configuring devices.

File

tests/src/Functional/ResponsivePreviewAdminTest.php, line 25

Class

ResponsivePreviewAdminTest
Tests the Crud operation on responsive preview device.

Namespace

Drupal\Tests\responsive_preview\Functional

Code

public function testDeviceConfiguration() {
  $this
    ->placeBlock('local_actions_block');

  // Ensures that the responsive admin preview is accessible only for user
  // with the adequate permissions.
  $this
    ->drupalGet('admin/config/user-interface/responsive-preview');
  $this
    ->assertSession()
    ->statusCodeEquals(403);

  // Login as administrative user.
  $admin_user = $this
    ->drupalCreateUser([
    'administer responsive preview',
  ]);
  $this
    ->drupalLogin($admin_user);

  // Ensures that the responsive admin preview is accessible only for user
  // with the adequate permissions.
  $this
    ->drupalGet('admin/config/user-interface/responsive-preview');
  $this
    ->assertSession()
    ->statusCodeEquals(200);

  // Test for the page title.
  $this
    ->assertSession()
    ->titleEquals('Responsive preview device | Drupal');

  // Test for the table.
  $element = $this
    ->xpath('//div[@class="layout-content"]//table');
  $this
    ->assertNotEmpty($element, 'Device entity list table found.');

  // Test the table header.
  $elements = $this
    ->xpath('//div[@class="layout-content"]//table/thead/tr/th');
  $this
    ->assertEquals(count($elements), 5, 'Correct number of table header cells found.');

  // Test the contents of each th cell.
  $expected_items = [
    'Name',
    'Show in list',
    'Dimensions',
    'Weight',
    'Operations',
  ];
  foreach ($elements as $key => $element) {
    $this
      ->assertSame($element
      ->getText(), $expected_items[$key]);
  }

  // Ensures that all default devices are listed in the table.
  $default_devices = $this
    ->getDefaultDevices();
  foreach ($default_devices as $label) {
    $xpath = $this
      ->assertSession()
      ->buildXPathQuery('//table//tr//td[text()=:text]', [
      ':text' => $label,
    ]);
    $this
      ->assertSession()
      ->elementExists('xpath', $xpath);
  }

  // Test for the add action button.
  $this
    ->assertSession()
    ->linkExists('Add Device');
  $this
    ->assertSession()
    ->linkByHrefExists('admin/config/user-interface/responsive-preview/add');

  // Test the insert of a new device.
  $edit = [
    'label' => 'Smartwatch',
    'id' => 'smartwatch',
    'status' => '1',
    'dimensions[width]' => '200',
    'dimensions[height]' => '350',
    'dimensions[dppx]' => '3',
    'orientation' => 'portrait',
  ];
  $this
    ->drupalPostForm('admin/config/user-interface/responsive-preview/add', $edit, $this
    ->t('Save'));
  $this
    ->assertSession()
    ->responseContains($this
    ->t('Device %name has been added.', [
    '%name' => 'Smartwatch',
  ]));
  $this
    ->assertSession()
    ->elementExists('xpath', '//table//tr//td[text()="Smartwatch"]');

  // Ensures that is not possible to insert a non-unique device id.
  $this
    ->drupalPostForm('admin/config/user-interface/responsive-preview/add', $edit, $this
    ->t('Save'));
  $this
    ->assertSession()
    ->responseContains($this
    ->t('The machine-readable name is already in use. It must be unique.'));

  // Tests the update of an existing device.
  $edit = [
    'label' => 'Smart phone updated',
    'status' => '1',
    'dimensions[width]' => '1600',
    'dimensions[height]' => '2850',
    'dimensions[dppx]' => '2.5',
    'orientation' => 'landscape',
  ];
  $this
    ->drupalPostForm('admin/config/user-interface/responsive-preview/small/edit', $edit, $this
    ->t('Save'));
  $this
    ->assertSession()
    ->responseContains($this
    ->t('Device %name has been updated.', [
    '%name' => 'Smart phone updated',
  ]));
  $this
    ->assertSession()
    ->elementExists('xpath', '//table//tr//td[text()="Smart phone updated"]');
  $this
    ->assertSession()
    ->checkboxChecked('entities[small][status]');

  // Tests the delete of a predefined devices.
  $this
    ->drupalPostForm('admin/config/user-interface/responsive-preview/large/delete', [], $this
    ->t('Delete'));
  $this
    ->assertSession()
    ->responseContains($this
    ->t('Device %name has been deleted.', [
    '%name' => 'Typical desktop',
  ]));
  $this
    ->assertSession()
    ->elementNotExists('xpath', '//table//tr//td[text()="Typical desktop"]');

  // Tests the update of the status from the listing page.
  $edit = [
    'entities[medium][status]' => 1,
    'entities[small][status]' => 0,
    'entities[smartwatch][status]' => 0,
  ];
  $this
    ->drupalPostForm('admin/config/user-interface/responsive-preview', $edit, $this
    ->t('Save'));
  $this
    ->assertSession()
    ->responseContains($this
    ->t('The device settings have been updated.'));
  $this
    ->assertSession()
    ->checkboxChecked('entities[medium][status]');
  $this
    ->assertSession()
    ->checkboxNotChecked('entities[small][status]');
  $this
    ->assertSession()
    ->checkboxNotChecked('entities[smartwatch][status]');

  // Tests the listing page when no devices are present.
  $device_storage = \Drupal::entityTypeManager()
    ->getStorage('responsive_preview_device');
  $device_storage
    ->delete($device_storage
    ->loadMultiple());
  $this
    ->drupalGet('admin/config/user-interface/responsive-preview');
  $this
    ->assertSession()
    ->elementNotExists('xpath', '//input[type="submit" and text="Save"]');
  $this
    ->assertSession()
    ->responseContains($this
    ->t('No devices available. <a href=":link">Add devices</a>.', [
    ':link' => Url::fromRoute('entity.responsive_preview_device.add_form')
      ->toString(),
  ]));
}