You are here

breakpoints.test in Breakpoints 7

Tests for breakpoints.module

File

breakpoints.test
View source
<?php

/**
 * @file
 * Tests for breakpoints.module
 */

/**
 * Base class for Breakpoint tests.
 */
abstract class BreakpointsTestCase extends DrupalWebTestCase {
  function setUp() {
    $modules = func_get_args();
    if (isset($modules[0]) && is_array($modules[0])) {
      $modules = $modules[0];
    }
    array_unshift($modules, 'breakpoints');
    parent::setUp($modules);
  }

  /**
   * Verify that a breakpoint is properly stored.
   */
  function verifyBreakpoint($breakpoint, $in_database = TRUE) {
    $t_args = array(
      '%breakpoint' => $breakpoint->name,
    );
    $properties = array(
      'name',
      'breakpoint',
      'source',
      'source_type',
      'status',
      'weight',
      'multipliers',
    );
    if ($in_database) {
      $properties[] = 'id';
    }
    $assert_group = t('Breakpoints API');

    // Verify text format database record.
    $db_breakpoint = db_select('breakpoints', 'b')
      ->fields('b')
      ->condition('machine_name', $breakpoint->machine_name)
      ->execute()
      ->fetchObject();
    $db_breakpoint->multipliers = unserialize($db_breakpoint->multipliers);
    foreach ($properties as $property) {
      $this
        ->assertEqual($db_breakpoint->{$property}, $breakpoint->{$property}, t('Database: Proper ' . $property . ' for breakpoint %breakpoint.', $t_args), $assert_group);
    }

    // Verify breakpoints_breakpoint_load_by_fullkey().
    $load_breakpoint = breakpoints_breakpoint_load_by_fullkey($breakpoint->machine_name);
    foreach ($properties as $property) {
      $this
        ->assertEqual($load_breakpoint->{$property}, $breakpoint->{$property}, t('breakpoints_breakpoint_load_by_fullkey: Proper ' . $property . ' for breakpoint %breakpoint.', $t_args), $assert_group);
    }
  }

}

/**
 * Tests for breakpoints CRUD operations.
 */
class BreakpointsCRUDTestCase extends BreakpointsTestCase {
  public static function getInfo() {
    return array(
      'name' => 'Breakpoints CRUD operations',
      'description' => 'Test creation, loading, updating, deleting of breakpoints.',
      'group' => 'Breakpoints',
    );
  }

  /**
   * Test CRUD operations for breakpoints.
   */
  function testBreakpointsCRUD() {

    // Add a breakpoint with minimum data only.
    $breakpoint = new stdClass();
    $breakpoint->disabled = FALSE;
    $breakpoint->api_version = 1;
    $breakpoint->name = 'Custom';
    $breakpoint->breakpoint = '(min-width: 600px)';
    $breakpoint->source = 'user';
    $breakpoint->source_type = 'custom';
    $breakpoint->status = 1;
    $breakpoint->weight = 0;
    $breakpoint->multipliers = array(
      '1.5x' => 0,
      '2x' => 0,
    );
    breakpoints_breakpoint_save($breakpoint);
    $this
      ->verifyBreakpoint($breakpoint);

    // Update the breakpoint.
    $breakpoint->weight = 1;
    $breakpoint->multipliers['2x'] = 1;
    breakpoints_breakpoint_save($breakpoint);
    $this
      ->verifyBreakpoint($breakpoint);

    // Disable the breakpoint.
    $breakpoint->status = 0;
    breakpoints_breakpoint_save($breakpoint);
    $this
      ->verifyBreakpoint($breakpoint);
    $breakpoints = breakpoints_breakpoint_load_all_active();
    $this
      ->assertFalse(isset($breakpoints[$breakpoint->machine_name]), t('breakpoints_breakpoint_load_all_active: Disabled breakpoints aren\'t loaded.'), t('Breakpoints API'));

    // Delete the breakpoint.
    breakpoints_breakpoint_delete($breakpoint);
    $db_breakpoint = db_select('breakpoints', 'b')
      ->fields('b')
      ->condition('machine_name', $breakpoint->machine_name)
      ->execute()
      ->fetchObject();
    $this
      ->assertFalse($db_breakpoint, t('Database: Deleted breakpoint no longer exists'), t('Breakpoints API'));
    $this
      ->assertFalse(breakpoints_breakpoint_load_by_fullkey($breakpoint->machine_name), t('breakpoints_breakpoint_load_by_fullkey: Loading a deleted breakpoint returns false.'), t('Breakpoints API'));
  }

}

/**
 * Tests for breakpoints admin interface.
 */
class BreakpointsAdminTestCase extends BreakpointsTestCase {
  public static function getInfo() {
    return array(
      'name' => 'Breakpoints administration functionality',
      'description' => 'Thoroughly test the administrative interface of the breakpoints module.',
      'group' => 'Breakpoints',
    );
  }
  function setUp() {
    parent::setUp();

    // Create user.
    $this->admin_user = $this
      ->drupalCreateUser(array(
      'administer breakpoints',
    ));
    $this
      ->drupalLogin($this->admin_user);
  }

  /**
   * Test breakpoint administration functionality
   */
  function testBreakpointAdmin() {

    // Add breakpoint.
    $this
      ->drupalGet('admin/config/media/breakpoints');
    $name = $this
      ->randomName();
    $mediaquery = '(min-width: 600px)';
    $edit = array(
      'breakpoints[new][name]' => $name,
      'breakpoints[new][machine_name]' => drupal_strtolower($name),
      'breakpoints[new][breakpoint]' => $mediaquery,
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    $machine_name = BREAKPOINTS_SOURCE_TYPE_CUSTOM . '.user.' . drupal_strtolower($name);

    // Verify the breakpoint was saved and verify default weight of the breakpoint.
    $this
      ->drupalGet('admin/config/media/breakpoints');
    $this
      ->assertFieldByName("breakpoints[{$machine_name}][weight]", 0, t('Breakpoint weight was saved.'));

    // Change the weight of the breakpoint.
    $edit = array(
      "breakpoints[{$machine_name}][weight]" => 5,
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    $this
      ->assertFieldByName("breakpoints[{$machine_name}][weight]", 5, t('Breakpoint weight was saved.'));

    // Submit the form.
    $this
      ->drupalGet('admin/config/media/breakpoints');
    $this
      ->drupalPost(NULL, array(), t('Save'));

    // Verify that the custom weight of the breakpoint has been retained.
    $this
      ->drupalGet('admin/config/media/breakpoints');
    $this
      ->assertFieldByName("breakpoints[{$machine_name}][weight]", 5, t('Breakpoint weight was retained.'));

    // Change the multipliers of the breakpoint.
    $edit = array(
      "breakpoints[{$machine_name}][multipliers][1.5x]" => "1.5x",
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    $id = drupal_clean_css_identifier('edit-breakpoints-' . $machine_name . '-multipliers-');
    $this
      ->assertFieldChecked($id . '15x', t('Breakpoint multipliers were saved.'));
    $this
      ->assertNoFieldChecked($id . '2x', t('Breakpoint multipliers were saved.'));

    // Submit the form.
    $this
      ->drupalGet('admin/config/media/breakpoints');
    $this
      ->drupalPost(NULL, array(), t('Save'));

    // Verify that the custom weight of the breakpoint has been retained.
    $this
      ->drupalGet('admin/config/media/breakpoints');
    $this
      ->assertFieldChecked($id . '15x', t('Breakpoint multipliers were retained.'));
    $this
      ->assertNoFieldChecked($id . '2x', t('Breakpoint multipliers were retained.'));

    // Disable breakpoint.
    $this
      ->assertLinkByHref('admin/config/media/breakpoints/disable/' . $machine_name);
    $this
      ->drupalGet('admin/config/media/breakpoints/disable/' . $machine_name);
    $this
      ->drupalPost(NULL, array(), t('Confirm'));

    // Verify that the breakpoint is disabled.
    $this
      ->assertLinkByHref('admin/config/media/breakpoints/enable/' . $machine_name, 0, t('Breakpoint was disabled.'));

    // Attempt to create a breakpoint with the same machine name as the disabled
    // breakpoint but with a different human readable name.
    $edit = array(
      'breakpoints[new][name]' => 'New Breakpoint',
      'breakpoints[new][machine_name]' => drupal_strtolower($name),
      'breakpoints[new][breakpoint]' => $mediaquery,
      'breakpoints[new][multipliers][1.5x]' => 0,
      'breakpoints[new][multipliers][2x]' => 0,
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    $this
      ->assertText('The machine-readable name is already in use. It must be unique.');

    // Delete breakpoint.
    $this
      ->assertLinkByHref('admin/config/media/breakpoints/delete/' . $machine_name);
    $this
      ->drupalGet('admin/config/media/breakpoints/delete/' . $machine_name);
    $this
      ->drupalPost(NULL, array(), t('Confirm'));

    // Verify that deleted breakpoint no longer exists.
    $this
      ->drupalGet('admin/config/media/breakpoints');
    $this
      ->assertNoFieldByName('breakpoints[' . $machine_name . '][name]', '', t('Deleted breakpoint no longer exists'));
  }

  /**
   * Test breakpoint export/import functionality.
   */
  function testBreakpointExportImport() {
    $breakpoint = new stdClass();
    $breakpoint->disabled = FALSE;
    $breakpoint->api_version = 1;
    $breakpoint->machine_name = 'custom.user.test';
    $breakpoint->name = 'test';
    $breakpoint->breakpoint = '(min-width: 600px)';
    $breakpoint->source = 'user';
    $breakpoint->source_type = 'custom';
    $breakpoint->status = 1;
    $breakpoint->weight = 0;
    $breakpoint->multipliers = array(
      '1.5x' => 0,
      '2x' => 0,
    );

    // Import a breakpoint;
    $importstring = array();
    $importstring[] = '$breakpoint = new stdClass();';
    $importstring[] = '$breakpoint->disabled = FALSE; /* Edit this to true to make a default breakpoint disabled initially */';
    $importstring[] = '$breakpoint->api_version = 1;';
    $importstring[] = '$breakpoint->machine_name = \'custom.user.test\';';
    $importstring[] = '$breakpoint->name = \'test\';';
    $importstring[] = '$breakpoint->breakpoint = \'(min-width: 600px)\';';
    $importstring[] = '$breakpoint->source = \'user\';';
    $importstring[] = '$breakpoint->source_type = \'custom\';';
    $importstring[] = '$breakpoint->status = 1;';
    $importstring[] = '$breakpoint->weight = 0;';
    $importstring[] = '$breakpoint->multipliers = array(';
    $importstring[] = '  \'1.5x\' => 0,';
    $importstring[] = '  \'2x\' => 0,';
    $importstring[] = ');';
    $this
      ->drupalGet('admin/config/media/breakpoints/groups/import-breakpoint');
    $edit = array(
      "import" => implode("\n", $importstring),
    );
    $this
      ->drupalPost(NULL, $edit, t('Import'));

    // Verify the breakpoint was imported.
    $this
      ->drupalGet('admin/config/media/breakpoints');
    $this
      ->assertField('breakpoints[' . $breakpoint->machine_name . '][name]', t('Breakpoint imported correctly.'));

    // Verify the breakpoint is in the database, is loadable and has the correct data.
    $this
      ->verifyBreakpoint($breakpoint, FALSE);

    // Verify the breakpoint exports correctly.
    $this
      ->drupalGet('admin/config/media/breakpoints/export/' . $breakpoint->machine_name);
    foreach ($importstring as $importline) {
      $importline = trim($importline);
      if (!empty($importline)) {

        // Text in a textarea is htmlencoded.
        $this
          ->assertRaw(check_plain($importline));
      }
    }
  }

}

/**
 * Base class for Breakpoint Group tests.
 */
abstract class BreakpointGroupTestCase extends DrupalWebTestCase {
  function setUp() {
    $modules = func_get_args();
    if (isset($modules[0]) && is_array($modules[0])) {
      $modules = $modules[0];
    }
    array_unshift($modules, 'breakpoints');
    parent::setUp($modules);
  }

  /**
   * Verify that a breakpoint is properly stored.
   */
  function verifyBreakpointGroup($group, $in_database = TRUE) {
    $t_args = array(
      '%group' => $group->name,
    );
    $properties = array(
      'name',
      'machine_name',
      'breakpoints',
    );
    if ($in_database) {
      $properties[] = 'id';
    }
    $assert_group = t('Breakpoints API');

    // Verify text format database record.
    $db_group = db_select('breakpoint_group', 'bg')
      ->fields('bg')
      ->condition('machine_name', $group->machine_name)
      ->execute()
      ->fetchObject();
    $db_group->breakpoints = unserialize($db_group->breakpoints);
    foreach ($properties as $property) {
      $this
        ->assertEqual($db_group->{$property}, $group->{$property}, t('Database: Proper ' . $property . ' for breakpoint group %group.', $t_args), $assert_group);
    }

    // Verify breakpoints_breakpoint_group_load().
    $load_group = breakpoints_breakpoint_group_load($group->machine_name);
    foreach ($properties as $property) {
      $this
        ->assertEqual($load_group->{$property}, $group->{$property}, t('breakpoints_breakpoint_group_load: Proper ' . $property . ' for breakpoint group %group.', $t_args), $assert_group);
    }
  }

}

/**
 * Tests for breakpoint group CRUD operations.
 */
class BreakpointGroupCRUDTestCase extends BreakpointGroupTestCase {
  public static function getInfo() {
    return array(
      'name' => 'Breakpoint Group CRUD operations',
      'description' => 'Test creation, loading, updating, deleting of breakpoint groups.',
      'group' => 'Breakpoints',
    );
  }

  /**
   * Test CRUD operations for breakpoint groups.
   */
  function testBreakpointGroupCRUD() {

    // Add breakpoints.
    $breakpoints = array();
    for ($i = 0; $i <= 3; $i++) {
      $breakpoint = new stdClass();
      $breakpoint->disabled = FALSE;
      $breakpoint->api_version = 1;
      $breakpoint->name = $this
        ->randomName();
      $width = ($i + 1) * 200;
      $breakpoint->breakpoint = "(min-width: {$width}px)";
      $breakpoint->source = 'user';
      $breakpoint->source_type = 'custom';
      $breakpoint->status = 1;
      $breakpoint->weight = $i;
      $breakpoint->multipliers = array(
        '1.5x' => 0,
        '2x' => 0,
      );
      breakpoints_breakpoint_save($breakpoint);
      $breakpoints[$breakpoint->machine_name] = $breakpoint;
    }

    // Add a breakpoint group with minimum data only.
    $group = new stdClass();
    $group->name = $this
      ->randomName();
    $group->machine_name = drupal_strtolower($group->name);
    $group->breakpoints = array();
    breakpoints_breakpoint_group_save($group);
    $this
      ->verifyBreakpointGroup($group);

    // Update the breakpoint group.
    $group->breakpoints = array_keys($breakpoints);
    breakpoints_breakpoint_group_save($group);
    $this
      ->verifyBreakpointGroup($group);

    // Delete the breakpoint group.
    breakpoints_breakpoint_group_delete($group);
    $db_group = db_select('breakpoint_group', 'bg')
      ->fields('bg')
      ->condition('machine_name', $group->machine_name)
      ->execute()
      ->fetchObject();
    $this
      ->assertFalse($db_group, t('Database: Deleted breakpoint group no longer exists'), t('Breakpoints API'));
    $this
      ->assertFalse(breakpoints_breakpoint_group_load($group->machine_name), t('breakpoints_breakpoint_group_load: Loading a deleted breakpoint group returns false.'), t('Breakpoints API'));
  }

}

/**
 * Tests for breakpoint groups admin interface.
 */
class BreakpointGroupAdminTestCase extends BreakpointGroupTestCase {
  public static function getInfo() {
    return array(
      'name' => 'Breakpoint Group administration functionality',
      'description' => 'Thoroughly test the administrative interface of the breakpoints module.',
      'group' => 'Breakpoints',
    );
  }
  function setUp() {
    parent::setUp();

    // Create user.
    $this->admin_user = $this
      ->drupalCreateUser(array(
      'administer breakpoints',
    ));
    $this
      ->drupalLogin($this->admin_user);
  }

  /**
   * Test breakpoint administration functionality
   */
  function testBreakpointGroupAdmin() {

    // Add breakpoints.
    $breakpoints = array();
    for ($i = 0; $i <= 3; $i++) {
      $breakpoint = new stdClass();
      $breakpoint->disabled = FALSE;
      $breakpoint->api_version = 1;
      $breakpoint->name = $this
        ->randomName();
      $width = ($i + 1) * 200;
      $breakpoint->breakpoint = "(min-width: {$width}px)";
      $breakpoint->source = 'user';
      $breakpoint->source_type = 'custom';
      $breakpoint->status = 1;
      $breakpoint->weight = $i;
      $breakpoint->multipliers = array(
        '1.5x' => 0,
        '2x' => 0,
      );
      breakpoints_breakpoint_save($breakpoint);
      $breakpoints[$breakpoint->machine_name] = $breakpoint;
    }

    // Add breakpoint group.
    $this
      ->drupalGet('admin/config/media/breakpoints/groups/add');
    $name = $this
      ->randomName();
    $machine_name = drupal_strtolower($name);
    $breakpoint = reset($breakpoints);
    $edit = array(
      'name' => $name,
      'machine_name' => $machine_name,
      'breakpoints[' . $breakpoint->machine_name . ']' => $breakpoint->machine_name,
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));

    // Verify the breakpoint was saved.
    $this
      ->drupalGet('admin/config/media/breakpoints/groups/' . $machine_name);
    $this
      ->assertResponse(200, t('Breakpoint group was saved.'));

    // Verify the breakpoint was attached to the group.
    $this
      ->assertField('breakpoints[' . $breakpoint->machine_name . '][name]', t('The Breakpoint was added.'));

    // Add breakpoints to the breakpoint group.
    $this
      ->drupalGet('admin/config/media/breakpoints/groups/' . $machine_name . '/edit');
    $edit = array();
    foreach ($breakpoints as $key => $breakpoint) {
      $edit['breakpoints[' . $key . ']'] = $key;
    }
    $this
      ->drupalPost(NULL, $edit, t('Save'));

    // Verify the breakpoints were attached to the group.
    $this
      ->drupalGet('admin/config/media/breakpoints/groups/' . $machine_name);
    foreach ($breakpoints as $key => $breakpoint) {
      $this
        ->assertField('breakpoints[' . $key . '][name]', t('The Breakpoint was added.'));
    }

    // Change the order breakpoints of the breakpoints within the breakpoint group.
    $breakpoint = end($breakpoints);
    $edit = array(
      "breakpoints[{$breakpoint->machine_name}][weight]" => 0,
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    $this
      ->assertFieldByName("breakpoints[{$breakpoint->machine_name}][weight]", 0, t('Breakpoint weight was saved.'));

    // Submit the form.
    $this
      ->drupalGet('admin/config/media/breakpoints');
    $this
      ->drupalPost(NULL, array(), t('Save'));

    // Verify that the custom weight of the breakpoint has been retained.
    $this
      ->drupalGet('admin/config/media/breakpoints/groups/' . $machine_name);
    $this
      ->assertFieldByName("breakpoints[{$breakpoint->machine_name}][weight]", 0, t('Breakpoint weight was retained.'));

    // Verify that the weight has only changed within the group.
    $this
      ->drupalGet('admin/config/media/breakpoints');
    $this
      ->assertFieldByName("breakpoints[{$breakpoint->machine_name}][weight]", $breakpoint->weight, t('Breakpoint weight has only changed within the group.'));

    // Change the multipliers of the breakpoint within the group.
    $edit = array(
      "breakpoints[{$breakpoint->machine_name}][multipliers][1.5x]" => "1.5x",
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    $id = drupal_clean_css_identifier('edit-breakpoints-' . $breakpoint->machine_name . '-multipliers-');
    $this
      ->assertFieldChecked($id . '15x', t('Breakpoint multipliers were saved.'));
    $this
      ->assertNoFieldChecked($id . '2x', t('Breakpoint multipliers were saved.'));

    // Submit the form.
    $this
      ->drupalGet('admin/config/media/breakpoints/groups/' . $machine_name);
    $this
      ->drupalPost(NULL, array(), t('Save'));

    // Verify that the multipliers of the breakpoint has been retained.
    $this
      ->drupalGet('admin/config/media/breakpoints/groups/' . $machine_name);
    $this
      ->assertFieldChecked($id . '15x', t('Breakpoint multipliers were retained.'));
    $this
      ->assertNoFieldChecked($id . '2x', t('Breakpoint multipliers were retained.'));

    // Verify that the multipliers only changed within the group.
    $this
      ->drupalGet('admin/config/media/breakpoints');
    $this
      ->assertFieldChecked($id . '15x', t('Breakpoint multipliers were retained.'));
    $this
      ->assertNoFieldChecked($id . '2x', t('Breakpoint multipliers were retained.'));

    // Attempt to create a breakpoint group of the same machine name as the disabled
    // breakpoint but with a different human readable name.
    // Add breakpoint group.
    $this
      ->drupalGet('admin/config/media/breakpoints/groups/add');
    $breakpoint = reset($breakpoints);
    $edit = array(
      'name' => $this
        ->randomName(),
      'machine_name' => $machine_name,
      'breakpoints[' . $breakpoint->machine_name . ']' => $breakpoint->machine_name,
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    $this
      ->assertText('The machine-readable name is already in use. It must be unique.');

    // Delete breakpoint.
    $this
      ->drupalGet('admin/config/media/breakpoints/groups/' . $machine_name . '/delete');
    $this
      ->drupalPost(NULL, array(), t('Confirm'));

    // Verify that deleted breakpoint no longer exists.
    $this
      ->drupalGet('admin/config/media/breakpoints/groups/' . $machine_name);
    $this
      ->assertResponse(404, t('Breakpoint group was deleted.'));
  }

  /**
   * Test breakpoint group export/import functionality.
   */
  function testBreakpointGroupExportImport() {

    /**
     * Breakpoints.
     */
    $breakpoints = array();
    $breakpoint = new stdClass();
    $breakpoint->disabled = FALSE;
    $breakpoint->api_version = 1;
    $breakpoint->machine_name = 'custom.user.mobile';
    $breakpoint->name = 'mobile';
    $breakpoint->breakpoint = '(min-width: 0px)';
    $breakpoint->source = 'user';
    $breakpoint->source_type = 'custom';
    $breakpoint->status = 1;
    $breakpoint->weight = 4;
    $breakpoint->multipliers = array(
      '1.5x' => 0,
      '2x' => 0,
    );
    $breakpoints[$breakpoint->machine_name] = $breakpoint;
    $breakpoint = new stdClass();
    $breakpoint->disabled = FALSE;
    $breakpoint->api_version = 1;
    $breakpoint->machine_name = 'custom.user.narrow';
    $breakpoint->name = 'narrow';
    $breakpoint->breakpoint = '(min-width: 560px)';
    $breakpoint->source = 'user';
    $breakpoint->source_type = 'custom';
    $breakpoint->status = 1;
    $breakpoint->weight = 5;
    $breakpoint->multipliers = array(
      '1.5x' => 0,
      '2x' => 0,
    );
    $breakpoints[$breakpoint->machine_name] = $breakpoint;
    $breakpoint = new stdClass();
    $breakpoint->disabled = FALSE;
    $breakpoint->api_version = 1;
    $breakpoint->machine_name = 'custom.user.wide';
    $breakpoint->name = 'wide';
    $breakpoint->breakpoint = '(min-width: 851px)';
    $breakpoint->source = 'user';
    $breakpoint->source_type = 'custom';
    $breakpoint->status = 1;
    $breakpoint->weight = 6;
    $breakpoint->multipliers = array(
      '1.5x' => 0,
      '2x' => 0,
    );
    $breakpoints[$breakpoint->machine_name] = $breakpoint;
    $breakpoint = new stdClass();
    $breakpoint->disabled = FALSE;
    $breakpoint->api_version = 1;
    $breakpoint->machine_name = 'custom.user.tv';
    $breakpoint->name = 'tv';
    $breakpoint->breakpoint = 'only screen and (min-width: 3456px)';
    $breakpoint->source = 'user';
    $breakpoint->source_type = 'custom';
    $breakpoint->status = 1;
    $breakpoint->weight = 7;
    $breakpoint->multipliers = array(
      '1.5x' => 0,
      '2x' => 0,
    );
    $breakpoints[$breakpoint->machine_name] = $breakpoint;

    /**
     * Breakpoint group.
     */
    $breakpoint_group = new stdClass();
    $breakpoint_group->disabled = FALSE;

    /* Edit this to true to make a default breakpoint_group disabled initially */
    $breakpoint_group->api_version = 1;
    $breakpoint_group->machine_name = 'customgroup';
    $breakpoint_group->name = 'Customgroup';
    $breakpoint_group->breakpoints = array_keys($breakpoints);
    $breakpoint_group->type = 'custom';
    $breakpoint_group->overridden = 0;
    $importstring = array();
    $importstring[] = '/**';
    $importstring[] = ' * Breakpoints.';
    $importstring[] = ' */';
    $importstring[] = '$breakpoints = array();';
    $importstring[] = '$breakpoint = new stdClass();';
    $importstring[] = '$breakpoint->disabled = FALSE; /* Edit this to true to make a default breakpoint disabled initially */';
    $importstring[] = '$breakpoint->api_version = 1;';
    $importstring[] = '$breakpoint->machine_name = \'custom.user.mobile\';';
    $importstring[] = '$breakpoint->name = \'mobile\';';
    $importstring[] = '$breakpoint->breakpoint = \'(min-width: 0px)\';';
    $importstring[] = '$breakpoint->source = \'user\';';
    $importstring[] = '$breakpoint->source_type = \'custom\';';
    $importstring[] = '$breakpoint->status = 1;';
    $importstring[] = '$breakpoint->weight = 4;';
    $importstring[] = '$breakpoint->multipliers = array(';
    $importstring[] = '  \'1.5x\' => 0,';
    $importstring[] = '  \'2x\' => 0,';
    $importstring[] = ');';
    $importstring[] = '';
    $importstring[] = '$breakpoints[] = $breakpoint;';
    $importstring[] = '';
    $importstring[] = '$breakpoint = new stdClass();';
    $importstring[] = '$breakpoint->disabled = FALSE; /* Edit this to true to make a default breakpoint disabled initially */';
    $importstring[] = '$breakpoint->api_version = 1;';
    $importstring[] = '$breakpoint->machine_name = \'custom.user.narrow\';';
    $importstring[] = '$breakpoint->name = \'narrow\';';
    $importstring[] = '$breakpoint->breakpoint = \'(min-width: 560px)\';';
    $importstring[] = '$breakpoint->source = \'user\';';
    $importstring[] = '$breakpoint->source_type = \'custom\';';
    $importstring[] = '$breakpoint->status = 1;';
    $importstring[] = '$breakpoint->weight = 5;';
    $importstring[] = '$breakpoint->multipliers = array(';
    $importstring[] = '  \'1.5x\' => 0,';
    $importstring[] = '  \'2x\' => 0,';
    $importstring[] = ');';
    $importstring[] = '';
    $importstring[] = '$breakpoints[] = $breakpoint;';
    $importstring[] = '';
    $importstring[] = '$breakpoint = new stdClass();';
    $importstring[] = '$breakpoint->disabled = FALSE; /* Edit this to true to make a default breakpoint disabled initially */';
    $importstring[] = '$breakpoint->api_version = 1;';
    $importstring[] = '$breakpoint->machine_name = \'custom.user.wide\';';
    $importstring[] = '$breakpoint->name = \'wide\';';
    $importstring[] = '$breakpoint->breakpoint = \'(min-width: 851px)\';';
    $importstring[] = '$breakpoint->source = \'user\';';
    $importstring[] = '$breakpoint->source_type = \'custom\';';
    $importstring[] = '$breakpoint->status = 1;';
    $importstring[] = '$breakpoint->weight = 6;';
    $importstring[] = '$breakpoint->multipliers = array(';
    $importstring[] = '  \'1.5x\' => 0,';
    $importstring[] = '  \'2x\' => 0,';
    $importstring[] = ');';
    $importstring[] = '';
    $importstring[] = '$breakpoints[] = $breakpoint;';
    $importstring[] = '';
    $importstring[] = '$breakpoint = new stdClass();';
    $importstring[] = '$breakpoint->disabled = FALSE; /* Edit this to true to make a default breakpoint disabled initially */';
    $importstring[] = '$breakpoint->api_version = 1;';
    $importstring[] = '$breakpoint->machine_name = \'custom.user.tv\';';
    $importstring[] = '$breakpoint->name = \'tv\';';
    $importstring[] = '$breakpoint->breakpoint = \'only screen and (min-width: 3456px)\';';
    $importstring[] = '$breakpoint->source = \'user\';';
    $importstring[] = '$breakpoint->source_type = \'custom\';';
    $importstring[] = '$breakpoint->status = 1;';
    $importstring[] = '$breakpoint->weight = 7;';
    $importstring[] = '$breakpoint->multipliers = array(';
    $importstring[] = '  \'1.5x\' => 0,';
    $importstring[] = '  \'2x\' => 0,';
    $importstring[] = ');';
    $importstring[] = '';
    $importstring[] = '$breakpoints[] = $breakpoint;';
    $importstring[] = '';
    $importstring[] = '/**';
    $importstring[] = ' * Breakpoint group.';
    $importstring[] = ' */';
    $importstring[] = '$breakpoint_group = new stdClass();';
    $importstring[] = '$breakpoint_group->disabled = FALSE; /* Edit this to true to make a default breakpoint_group disabled initially */';
    $importstring[] = '$breakpoint_group->api_version = 1;';
    $importstring[] = '$breakpoint_group->machine_name = \'customgroup\';';
    $importstring[] = '$breakpoint_group->name = \'Customgroup\';';
    $importstring[] = '$breakpoint_group->breakpoints = $breakpoints;';
    $importstring[] = '$breakpoint_group->type = \'custom\';';
    $importstring[] = '$breakpoint_group->overridden = 0;';
    $this
      ->drupalGet('admin/config/media/breakpoints/groups/import');
    $edit = array(
      "import" => implode("\n", $importstring),
    );
    $this
      ->drupalPost(NULL, $edit, t('Import'));

    // Verify the breakpoint group was imported.
    $this
      ->drupalGet('admin/config/media/breakpoints/groups/' . $breakpoint_group->machine_name);
    $this
      ->assertResponse(200, t('Breakpoint group imported correctly'));

    // Verify the breakpoint group is in the database, is loadable and has the correct data.
    $this
      ->verifyBreakpointGroup($breakpoint_group, FALSE);

    // Verify the breakpoint group exports correctly.
    $this
      ->drupalGet('admin/config/media/breakpoints/groups/' . $breakpoint_group->machine_name . '/export');
    foreach ($importstring as $importline) {
      $importline = trim($importline);
      if (!empty($importline)) {

        // Text in a textarea is htmlencoded.
        $this
          ->assertRaw(check_plain($importline));
      }
    }
  }

}

/**
 * Test breakpoints provided by themes.
 */
class BreakpointsThemeTestCase extends BreakpointGroupTestCase {
  public static function getInfo() {
    return array(
      'name' => 'Breakpoint Theme functionality',
      'description' => 'Thoroughly test the breakpoints provided by a theme.',
      'group' => 'Breakpoints',
    );
  }
  public function setUp() {
    parent::setUp('breakpoints_theme_test');
    theme_enable(array(
      'breakpoints_test_theme',
    ));

    // Create user.
    $this->admin_user = $this
      ->drupalCreateUser(array(
      'administer breakpoints',
    ));
    $this
      ->drupalLogin($this->admin_user);
  }

  /**
   * Test the breakpoints provided by a theme.
   */
  public function testThemeBreakpoints() {

    // Verify the breakpoint group for breakpoints_test_theme was created.
    $breakpoint_group = new stdClass();
    $breakpoint_group->disabled = FALSE;

    /* Edit this to true to make a default breakpoint_group disabled initially */
    $breakpoint_group->api_version = 1;
    $breakpoint_group->machine_name = 'breakpoints_test_theme';
    $breakpoint_group->name = 'Breakpoints test theme';
    $breakpoint_group->breakpoints = array(
      'breakpoints.theme.breakpoints_test_theme.mobile',
      'breakpoints.theme.breakpoints_test_theme.narrow',
      'breakpoints.theme.breakpoints_test_theme.wide',
      'breakpoints.theme.breakpoints_test_theme.tv',
    );
    $breakpoint_group->type = 'theme';
    $breakpoint_group->overridden = 0;
    $this
      ->verifyBreakpointGroup($breakpoint_group, FALSE);

    // Override the breakpoints.
    $this
      ->drupalGet('admin/config/media/breakpoints/groups/' . $breakpoint_group->machine_name);
    $this
      ->drupalPost(NULL, array(), t('Override theme breakpoints'));

    // Clear CTools cache, since drupalGet and drupalPost are different requests than the request
    // this test is running in, the group object is still in the static cache, so we need to clear
    // it manually.
    ctools_export_load_object_reset('breakpoint_group');

    // Verify the group is overridden.
    $breakpoint_group->breakpoints = array(
      'custom.breakpoints_test_theme.mobile',
      'custom.breakpoints_test_theme.narrow',
      'custom.breakpoints_test_theme.wide',
      'custom.breakpoints_test_theme.tv',
    );
    $breakpoint_group->overridden = 1;
    $this
      ->verifyBreakpointGroup($breakpoint_group, FALSE);

    // Verify there is no override button for this group anymore.
    $this
      ->drupalGet('admin/config/media/breakpoints/groups/' . $breakpoint_group->machine_name);
    $this
      ->assertNoFieldById('edit-override');
  }

}

/**
 * Test breakpoint multipliers.
 */
class BreakpointMultipliersTestCase extends DrupalWebTestCase {
  public static function getInfo() {
    return array(
      'name' => 'Breakpoint Multiplier functionality',
      'description' => 'Thoroughly test the breakpoint multiplier functionality (CRUD).',
      'group' => 'Breakpoints',
    );
  }
  public function setUp() {
    parent::setUp('breakpoints', 'breakpoints_theme_test');

    // Enable our test theme so we have breakpoints to test on.
    theme_enable(array(
      'breakpoints_test_theme',
    ));

    // Create user.
    $this->admin_user = $this
      ->drupalCreateUser(array(
      'administer breakpoints',
    ));
    $this
      ->drupalLogin($this->admin_user);
  }

  /**
   * Test breakpoints multipliers functionality.
   */
  public function testBreakpointMultipliers() {

    // Verify the default multipliers are visible.
    $this
      ->drupalGet('admin/config/media/breakpoints/multipliers');
    $settings = breakpoints_settings();
    foreach ($settings->multipliers as $multiplier) {
      $this
        ->assertRaw($multiplier, t('Default multiplier %multiplier found', array(
        '%multiplier' => $multiplier,
      )));
      if ($multiplier != '1x') {
        $this
          ->assertFieldByName('multipliers[' . $multiplier . ']', $multiplier);
      }
    }

    // Verify the '1x' multiplier can't be deleted.
    $this
      ->drupalGet('admin/config/media/breakpoints/multipliers/1x/delete');
    $this
      ->assertText(t('Multiplier 1x can not be deleted!'), t('Multiplier 1x can not be deleted'));
    $this
      ->assertNoFieldById('edit-submit');

    // Add a multiplier.
    $new_multiplier = drupal_strtolower($this
      ->randomName());
    $this
      ->drupalGet('admin/config/media/breakpoints/multipliers');
    $edit = array(
      'multipliers[new]' => $new_multiplier,
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));

    // Verify the multiplier was added to the database.
    $settings = breakpoints_settings();
    $this
      ->assertTrue(in_array($new_multiplier, $settings->multipliers), t('Multiplier %multiplier was added.', array(
      '%multiplier' => $new_multiplier,
    )));

    // Verify the new multiplier is visible on the multiplier overview page.
    $this
      ->assertFieldByName('multipliers[' . $new_multiplier . ']', $new_multiplier);

    // Update a multiplier.
    $updated_multiplier = drupal_strtolower($this
      ->randomName());
    $edit = array(
      'multipliers[' . $new_multiplier . ']' => $updated_multiplier,
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));

    // Verify the multiplier was updated in the database.
    $settings = breakpoints_settings();
    $this
      ->assertFalse(in_array($new_multiplier, $settings->multipliers), t('Multiplier %multiplier was updated.', array(
      '%multiplier' => $updated_multiplier,
    )));
    $this
      ->assertTrue(in_array($updated_multiplier, $settings->multipliers), t('Multiplier %multiplier was updated.', array(
      '%multiplier' => $updated_multiplier,
    )));

    // Verify the updated multiplier is visible on the multiplier overview page.
    $this
      ->assertNoFieldByName('multipliers[' . $new_multiplier . ']');
    $this
      ->assertFieldByName('multipliers[' . $updated_multiplier . ']', $updated_multiplier);
    $new_multiplier = $updated_multiplier;

    // Verify the default multipliers are visible on the global breakpoints page.
    $this
      ->drupalGet('admin/config/media/breakpoints');
    foreach (breakpoints_breakpoint_load_all() as $breakpoint) {
      foreach ($settings->multipliers as $multiplier) {
        if ($multiplier != '1x') {
          $this
            ->assertFieldByName('breakpoints[' . $breakpoint->machine_name . '][multipliers][' . $multiplier . ']');
        }
        else {

          // Multiplier 1x can not be disabled for any breakpoint.
          $this
            ->assertNoFieldByName('breakpoints[' . $breakpoint->machine_name . '][multipliers][' . $multiplier . ']');
        }
      }
    }

    // Enable a multiplier for a breakpoint and verify if it's enabled on all pages.
    $edit = array(
      'breakpoints[breakpoints.theme.breakpoints_test_theme.narrow][multipliers][1.5x]' => 1,
      'breakpoints[breakpoints.theme.breakpoints_test_theme.narrow][multipliers][' . $new_multiplier . ']' => 1,
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));

    // Verify the checkbox for the enabled multipliers is checked on the global breakpoints page.
    $this
      ->assertFieldChecked('edit-breakpoints-breakpointsthemebreakpoints-test-themenarrow-multipliers-15x');
    $this
      ->assertFieldChecked('edit-breakpoints-breakpointsthemebreakpoints-test-themenarrow-multipliers-' . drupal_clean_css_identifier($new_multiplier));

    // Verify the checkbox for the enabled multipliers is checked on the breakpoints page of a group.
    $this
      ->drupalGet('admin/config/media/breakpoints/groups/breakpoints_test_theme');
    $this
      ->assertFieldChecked('edit-breakpoints-breakpointsthemebreakpoints-test-themenarrow-multipliers-15x');
    $this
      ->assertFieldChecked('edit-breakpoints-breakpointsthemebreakpoints-test-themenarrow-multipliers-' . drupal_clean_css_identifier($new_multiplier));

    // Delete a multiplier.
    $this
      ->drupalGet('admin/config/media/breakpoints/multipliers/' . $new_multiplier . '/delete');
    $this
      ->drupalPost(NULL, array(), t('Confirm'));
    $this
      ->assertText('Multiplier ' . $new_multiplier . ' was deleted');

    // Verify the deleted multiplier is no longer visible on the multiplier overview page.
    $this
      ->drupalGet('admin/config/media/breakpoints/multipliers');
    $this
      ->assertNoFieldByName('multipliers[' . $new_multiplier . ']');

    // Verify the deleted multiplier is deleted from the database.
    $settings = breakpoints_settings();
    $this
      ->assertFalse(in_array($new_multiplier, $settings->multipliers), t('Multiplier %multiplier was deleted.', array(
      '%multiplier' => $new_multiplier,
    )));

    // Verify the deleted multiplier is no longer visible on the breakpoints page.
    $this
      ->drupalGet('admin/config/media/breakpoints');
    foreach (breakpoints_breakpoint_load_all() as $breakpoint) {
      $this
        ->assertNoFieldByName('breakpoints[' . $breakpoint->machine_name . '][multipliers][' . $new_multiplier . ']');
    }
  }

}

Classes

Namesort descending Description
BreakpointGroupAdminTestCase Tests for breakpoint groups admin interface.
BreakpointGroupCRUDTestCase Tests for breakpoint group CRUD operations.
BreakpointGroupTestCase Base class for Breakpoint Group tests.
BreakpointMultipliersTestCase Test breakpoint multipliers.
BreakpointsAdminTestCase Tests for breakpoints admin interface.
BreakpointsCRUDTestCase Tests for breakpoints CRUD operations.
BreakpointsTestCase Base class for Breakpoint tests.
BreakpointsThemeTestCase Test breakpoints provided by themes.