You are here

uc_product_power_tools.test in Ubercart Product Power Tools 7

Ubercart Product Power Tools Tests

File

tests/uc_product_power_tools.test
View source
<?php

/**
 * @file
 * Ubercart Product Power Tools Tests
 */
class UbercartProductPowerToolsTestCase extends UbercartTestHelper {
  public static function getInfo() {
    return array(
      'name' => 'Product Power Tools',
      'description' => 'Ensure Product Power Tools module functions properly.',
      'group' => 'Ubercart',
    );
  }

  /**
   * Overrides DrupalWebTestCase::setUp().
   */
  public function setUp($modules = array(), $permissions = array()) {
    parent::setUp(array(
      'uc_stock',
      'uc_shipping',
      'uc_product_power_tools',
      'token',
    ), array(
      'administer content types',
      'administer product power tools settings',
    ));
    $this
      ->drupalLogin($this->adminUser);
    $edit = array(
      'classes[product]' => 1,
    );
    $this
      ->drupalPost('admin/store/products/power-tools', $edit, t('Update'));
    $this
      ->assertText('Power Tools Class Settings updated.', 'Product Power Tools enabled for Product content type.');

    // Allow the default quantity to be set.
    variable_set('uc_product_add_to_cart_qty', TRUE);
  }
  public function testProductPowerToolsNodeForm() {

    // Default settings
    $edit = array(
      'asku' => '0',
      'asku_pattern' => '',
      'cost_settings' => '0.000',
      'costonoff' => '0',
      'dq_settings' => '1',
      'dqonoff' => '0',
      'height' => '0.000',
      'length' => '0',
      'length_units' => 'in',
      'lp_settings' => '0.000',
      'lponoff' => '0',
      'lpos_settings' => '0',
      'lposonoff' => '0',
      'pq_settings' => '1',
      'pqonoff' => '0',
      'product_class' => 'product',
      'ship_settings' => '0',
      'sp_settings' => '0.000',
      'sponoff' => '0',
      'stock_settings' => '0',
      'stock_threshold' => '0',
      'stockonoff' => '0',
      'weight' => '0',
      'weight_units' => 'lb',
      'width' => '0',
    );
    $this
      ->validateSettings($edit);

    // Begin "Show Auto SKU Generation" tests.
    // Disable (show but do not allow editing) SKU field and Automatically Generate from replacement pattern below:
    $edit = array(
      'asku' => 3,
      'asku_pattern' => '[node:title]-test',
    );
    $title = $this
      ->randomName(32);
    $overrides = array(
      'title' => $title,
    );
    $expected = array(
      'model' => $title . '-test',
    );
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->assertEqual(1, 1, '1 is equal');
    $this
      ->drupalGet('node/add/product');
    $disabled_field = $this
      ->xpath('//input[@id=:id and @disabled="disabled"]', array(
      ':id' => 'edit-model',
    ));
    $this
      ->assertTrue($disabled_field, t('The SKU cannot be changed.'));

    //  Hide SKU field and Automatically Generate from replacement pattern below:
    $edit['asku'] = 1;
    $title = $this
      ->randomName(32);
    $overrides = array(
      'title' => $title,
    );
    $expected = array(
      'model' => $title . '-test',
    );
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->assertEqual(1, 1, '2 is equal');
    $this
      ->drupalGet('node/add/product');
    $this
      ->assertNoFieldById('edit-model', '', 'The edit-model field is not on the page');

    // Show SKU field, but for new products give the option to Automatically Generate from replacement pattern below:
    $edit['asku'] = 2;
    $title = $this
      ->randomName(32);
    $overrides = array(
      'title' => $title,
    );
    $expected = array(
      'model' => $title . '-test',
    );

    // Check auto SKU.
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->assertEqual(1, 1, '3 is equal');

    // Check regular submission.
    $expected = array();
    $overrides = array();
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->assertEqual(1, 1, '4 is equal');

    // Begin "List Price" tests.
    // Hide List Price field & Use Sell Price Value entered on product form.
    $edit = array(
      'asku' => 0,
      'lponoff' => 1,
    );
    $sell_price = mt_rand(1, 150);
    $overrides = array(
      'sell_price' => $sell_price,
    );
    $expected = array(
      'list_price' => $sell_price,
    );
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->assertEqual(1, 1, '5 is equal');
    $overrides = array();
    $this
      ->drupalGet('node/add/product');
    $this
      ->assertNoFieldById('edit-sell-price', '', 'The edit-sell-price field is not on the page');

    // Hide List Price field & Use default value below:
    $list_price = mt_rand(1, 150);
    $edit = array(
      'lponoff' => 2,
      'lp_settings' => $list_price,
    );
    $expected = array(
      'list_price' => $list_price,
    );
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->drupalGet('node/add/product');
    $this
      ->assertNoFieldById('edit-list-price', '', 'The edit-list-price field is not on the page');

    //  Show List Price field & Use default value below:
    $edit = array(
      'lponoff' => 3,
      'lp_settings' => $list_price,
    );
    $this
      ->validateSettings($edit, $overrides, $expected);

    // Test a normal submission with these settings.
    $expected = array();
    $this
      ->validateSettings($edit, $overrides, $expected);

    // Begin "Cost" tests.
    // Hide Cost field & Use default value below:
    $cost = mt_rand(1, 150);
    $edit = array(
      'lponoff' => 0,
      'costonoff' => 1,
      'cost_settings' => $cost,
    );
    $expected = array(
      'cost' => $cost,
    );
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->drupalGet('node/add/product');
    $this
      ->assertNoFieldById('edit-cost', '', 'The edit-cost field is not on the page');

    // Show Cost field & Use default value below:
    $edit['costonoff'] = 2;
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->drupalGet('node/add/product');
    $this
      ->assertFieldById('edit-cost', $cost, 'The edit-cost field is on the page');

    // Test a normal submission with these settings.
    $expected = array();
    $this
      ->validateSettings($edit, $overrides, $expected);

    // Begin "Sell price" tests.
    // Hide Sell price field & Use default value below:
    $sell_price = mt_rand(1, 150);
    $edit = array(
      'costonoff' => 0,
      'sponoff' => 1,
      'sp_settings' => $sell_price,
    );
    $expected = array(
      'sell_price' => $sell_price,
    );
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->drupalGet('node/add/product');
    $this
      ->assertNoFieldById('edit-sell-price', '', 'The edit-sell-price field is not on the page');

    // Show Sell price field & Use default value below:
    $edit['sponoff'] = 2;
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->drupalGet('node/add/product');
    $this
      ->assertFieldById('edit-sell-price', $sell_price, 'The edit-sell-price field is on the page');

    // Test a normal submission with these settings.
    $expected = array();
    $this
      ->validateSettings($edit, $overrides, $expected);

    // Begin "Default Quantity" tests.
    // Hide Default Quantity field & Use default value below:
    $default_qty = mt_rand(1, 100);
    $edit = array(
      'sponoff' => 0,
      'dqonoff' => 1,
      'dq_settings' => $default_qty,
    );
    $expected = array(
      'default_qty' => $default_qty,
    );
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->drupalGet('node/add/product');
    $this
      ->assertNoFieldById('edit-default-qty', '', 'The edit-default-qty field is not on the page');

    //  Show Default Quantity field & Use default value below:
    $edit = array(
      'dqonoff' => 2,
      'dq_settings' => $default_qty,
    );
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->drupalGet('node/add/product');
    $this
      ->assertFieldById('edit-default-qty', '', 'The edit-default-qty field is on the page');

    // Test a normal submission with these settings.
    $expected = array();
    $this
      ->validateSettings($edit, $overrides, $expected);

    // Begin "Default Package Quantity" tests.
    // Hide Default Package Quantity field & Use default value below:
    $pkg_qty = mt_rand(1, 100);
    $edit = array(
      'dqonoff' => 0,
      'pqonoff' => 1,
      'pq_settings' => $pkg_qty,
    );
    $expected = array(
      'pkg_qty' => $pkg_qty,
    );
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->drupalGet('node/add/product');
    $this
      ->assertNoFieldById('edit-pkg-qty', '', 'The edit-pkg-qty field is not on the page');

    //  Show Default Quantity field & Use default value below:
    $edit = array(
      'pqonoff' => 2,
      'pq_settings' => $pkg_qty,
    );
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->drupalGet('node/add/product');
    $this
      ->assertFieldById('edit-pkg-qty', '', 'The edit-pkg-qty field is on the page');

    // Test a normal submission with these settings.
    $expected = array();
    $this
      ->validateSettings($edit, $overrides, $expected);

    // Begin "List Position" tests.
    // Hide List Position field & Use default value below:
    $lpos = mt_rand(-25, 25);
    $edit = array(
      'pqonoff' => 0,
      'lposonoff' => 1,
      'lpos_settings' => $lpos,
    );
    $expected = array(
      'ordering' => $lpos,
    );
    $this
      ->validateSettings($edit, $overrides, $expected);

    // Begin "Shipping" tests.
    // Product is Shippable. Hide checkbox, but show other shipping fields on product entry form & use default values below:
    $length = mt_rand(1, 50);
    $width = mt_rand(1, 50);
    $height = mt_rand(1, 50);
    $length_units = array_rand(array(
      'in' => t('Inches'),
      'ft' => t('Feet'),
      'cm' => t('Centimeters'),
      'mm' => t('Millimeters'),
    ));
    $weight = mt_rand(1, 50);
    $weight_units = array_rand(array(
      'lb' => t('Pounds'),
      'kg' => t('Kilograms'),
      'oz' => t('Ounces'),
      'g' => t('Grams'),
    ));
    $edit = array(
      'lposonoff' => 0,
      'ship_settings' => 1,
      'length' => $length,
      'width' => $width,
      'height' => $height,
      'length_units' => $length_units,
      'weight' => $weight,
      'weight_units' => $weight_units,
    );
    $expected = array(
      'shippable' => 1,
      'dim_length' => $length,
      'dim_width' => $width,
      'dim_height' => $height,
      'length_units' => $length_units,
      'weight' => $weight,
      'weight_units' => $weight_units,
    );
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->drupalGet('node/add/product');
    $this
      ->assertNoFieldById('edit-shippable', '', 'The edit-shippable field is not on the page');
    $this
      ->assertFieldById('edit-weight--2', '', 'The edit-weight--2 field is on the page');
    $this
      ->assertFieldById('edit-dim-length', '', 'The edit-dim-length field is on the page');

    // Product is Shippable. Hide checkbox & all shipping fields on product entry form & use default values below:
    $edit = array(
      'ship_settings' => 5,
    );
    $expected = array(
      'shippable' => 1,
      'dim_length' => $length,
      'dim_width' => $width,
      'dim_height' => $height,
      'length_units' => $length_units,
      'weight' => $weight,
      'weight_units' => $weight_units,
    );
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->drupalGet('node/add/product');
    $this
      ->assertNoFieldById('edit-shippable', '', 'The edit-shippable field is not on the page');
    $this
      ->assertNoFieldById('edit-weight--2', '', 'The edit-weight--2 field is not on the page');
    $this
      ->assertNoFieldById('edit-dim-length', '', 'The edit-dim-length field is not on the page');

    // Product is NOT Shippable. Hide checkbox, but show other shipping fields on product entry form & use default values below:
    $edit = array(
      'ship_settings' => 2,
    );
    $expected = array(
      'shippable' => 0,
      'dim_length' => $length,
      'dim_width' => $width,
      'dim_height' => $height,
      'length_units' => $length_units,
      'weight' => $weight,
      'weight_units' => $weight_units,
    );
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->drupalGet('node/add/product');
    $this
      ->assertNoFieldById('edit-shippable', '', 'The edit-shippable field is not on the page');
    $this
      ->assertFieldById('edit-weight--2', '', 'The edit-weight--2 field is on the page');
    $this
      ->assertFieldById('edit-dim-length', '', 'The edit-dim-length field is on the page');

    // Product is NOT Shippable. Hide checkbox & all shipping fields on product entry form
    $edit = array(
      'ship_settings' => 3,
      'length' => $length,
      'width' => $width,
      'height' => $height,
      'length_units' => $length_units,
      'weight' => $weight,
      'weight_units' => $weight_units,
    );
    $expected = array(
      'shippable' => 0,
      'dim_length' => $length,
      'dim_width' => $width,
      'dim_height' => $height,
      'length_units' => $length_units,
      'weight' => $weight,
      'weight_units' => $weight_units,
    );
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->drupalGet('node/add/product');
    $this
      ->assertNoFieldById('edit-shippable', '', 'The edit-shippable field is not on the page');
    $this
      ->assertNoFieldById('edit-weight--2', '', 'The edit-weight--2 field is not on the page');
    $this
      ->assertNoFieldById('edit-dim-length', '', 'The edit-dim-length field is not on the page');

    // Show checkbox but hide all shipping fields on product entry form
    $edit = array(
      'ship_settings' => 4,
      'length' => $length,
      'width' => $width,
      'height' => $height,
      'length_units' => $length_units,
      'weight' => $weight,
      'weight_units' => $weight_units,
    );
    $expected = array(
      'dim_length' => $length,
      'dim_width' => $width,
      'dim_height' => $height,
      'length_units' => $length_units,
      'weight' => $weight,
      'weight_units' => $weight_units,
    );
    $this
      ->validateSettings($edit, $overrides, $expected);
    $this
      ->drupalGet('node/add/product');
    $this
      ->assertFieldById('edit-shippable', '', 'The edit-shippable field is on the page');
    $this
      ->assertNoFieldById('edit-weight--2', '', 'The edit-weight--2 field is not on the page');
    $this
      ->assertNoFieldById('edit-dim-length', '', 'The edit-dim-length field is not on the page');

    // Begin "Stock" tests.
    // Set stock level using default value below
    $stock_settings = mt_rand(1, 100);
    $stock_threshold = mt_rand(100, 200);
    $edit = array(
      'ship_settings' => 0,
      'stockonoff' => 1,
      'stock_settings' => $stock_settings,
      'stock_threshold' => $stock_threshold,
    );

    // Generate title so we can later get node ID by title.
    $title = $this
      ->randomName(32);
    $overrides = array(
      'title' => $title,
    );
    $expected = array();
    $expected['stock_settings'] = $stock_settings;
    $expected['stock_threshold'] = $stock_threshold;
    $this
      ->validateSettings($edit, $overrides, $expected);
    $node = $this
      ->drupalGetNodeByTitle($edit['title']);
    $this
      ->drupalGet('node/' . $node->nid . '/edit/stock');
    $this
      ->assertFieldById('edit-stock-0-stock', $stock_settings);
    $this
      ->assertFieldById('edit-stock-0-threshold', $stock_threshold);
  }

  /**
   * Helper function to set up given settings, submit a new product node and
   * check that node is valid.
   *
   * @param array $edit
   * @param array $overrides
   * @param array $expected Values that are expected from automatic submission.
   */
  protected function validateSettings($edit = array(), $overrides = array(), $expected = array()) {
    $this
      ->drupalPost('admin/store/products/power-tools/product', $edit, t('Submit'));
    $this
      ->drupalGet('node/add/product');
    foreach (array(
      'model',
      'list_price',
      'cost',
      'sell_price',
      'shippable',
      'weight',
      'weight_units',
      'dim_length',
      'dim_width',
      'dim_height',
      'length_units',
      'default_qty',
      'pkg_qty',
      'ordering',
    ) as $field) {
      if (!isset($expected[$field])) {
        $this
          ->assertFieldByName($field, NULL);
      }
    }
    $body_key = 'body[und][0][value]';

    // Make a node with those fields.
    $edit = array(
      'title' => $this
        ->randomName(32),
      $body_key => $this
        ->randomName(64),
      'model' => $this
        ->randomName(8),
      'list_price' => mt_rand(1, 200),
      'cost' => mt_rand(0, 100),
      'sell_price' => mt_rand(1, 150),
      'default_qty' => mt_rand(1, 100),
      'pkg_qty' => mt_rand(1, 100),
      'shippable' => mt_rand(0, 1),
      'weight' => mt_rand(1, 50),
      'weight_units' => array_rand(array(
        'lb' => t('Pounds'),
        'kg' => t('Kilograms'),
        'oz' => t('Ounces'),
        'g' => t('Grams'),
      )),
      'dim_length' => mt_rand(1, 50),
      'dim_width' => mt_rand(1, 50),
      'dim_height' => mt_rand(1, 50),
      'length_units' => array_rand(array(
        'in' => t('Inches'),
        'ft' => t('Feet'),
        'cm' => t('Centimeters'),
        'mm' => t('Millimeters'),
      )),
      'ordering' => mt_rand(-25, 25),
    );
    foreach ($overrides as $override_name => $override_value) {
      $edit[$override_name] = $override_value;
    }

    // If we are expecting a certain value, unset it from the form submissions.
    foreach (array_keys($expected) as $unset_name) {
      unset($edit[$unset_name]);
    }
    $this
      ->drupalPost('node/add/product', $edit, t('Save'));
    $this
      ->assertText(t('Product @title has been created.', array(
      '@title' => $edit['title'],
    )), t('Product created.'));
    $model = isset($expected['model']) ? $expected['model'] : $edit['model'];
    $this
      ->assertText(t('SKU: @model', array(
      '@model' => $model,
    )), t('Product model found.'));
    $sell_price = isset($expected['sell_price']) ? $expected['sell_price'] : $edit['sell_price'];
    $this
      ->assertText(t('Price: @price', array(
      '@price' => uc_currency_format($sell_price),
    )), t('Product sell price found.'));
    $list_price = isset($expected['list_price']) ? $expected['list_price'] : $edit['list_price'];
    $this
      ->assertText(t('List price: @price', array(
      '@price' => uc_currency_format($list_price),
    )), t('Product list price found.'));
    $cost = isset($expected['cost']) ? $expected['cost'] : $edit['cost'];
    $this
      ->assertText(t('Cost: @price', array(
      '@price' => uc_currency_format($cost),
    )), t('Product cost found.'));
    $weight = isset($expected['weight']) ? $expected['weight'] : $edit['weight'];
    $weight_units = isset($expected['weight_units']) ? $expected['weight_units'] : $edit['weight_units'];
    $this
      ->assertText(t('Weight: @weight', array(
      '@weight' => uc_weight_format($weight, $weight_units),
    )), t('Product weight found.'));
    $length = isset($expected['dim_length']) ? $expected['dim_length'] : $edit['dim_length'];
    $width = isset($expected['dim_width']) ? $expected['dim_width'] : $edit['dim_width'];
    $height = isset($expected['dim_height']) ? $expected['dim_height'] : $edit['dim_height'];
    $length_units = isset($expected['length_units']) ? $expected['length_units'] : $edit['length_units'];
    $dimensions = uc_length_format($length, $length_units) . ' × ' . uc_length_format($width, $length_units) . ' × ' . uc_length_format($height, $length_units);
    $this
      ->assertText(t('Dimensions: @dimensions', array(
      '@dimensions' => $dimensions,
    )), t('Product dimensions found.'));
    $node = $this
      ->drupalGetNodeByTitle($edit['title']);
    $default_qty = isset($expected['default_qty']) ? $expected['default_qty'] : $edit['default_qty'];
    $this
      ->assertEqual($node->default_qty, $default_qty, t('Default quantity found.'));
    $pkg_qty = isset($expected['pkg_qty']) ? $expected['pkg_qty'] : $edit['pkg_qty'];
    $this
      ->assertEqual($node->pkg_qty, $pkg_qty, t('Package quantity found.'));
  }

}

Classes

Namesort descending Description
UbercartProductPowerToolsTestCase @file Ubercart Product Power Tools Tests