You are here

commerce_autosku.test in Commerce AutoSKU 7

Contains simpletests for commerce_autosku

File

commerce_autosku.test
View source
<?php

/**
 * @file
 * Contains simpletests for commerce_autosku
 */
class CommerceAutoSkuTest extends CommerceBaseTestCase {

  /**
   * Implements getInfo().
   */
  public static function getInfo() {
    return array(
      'name' => 'SKU Generation',
      'description' => 'Tests automatic generation of SKUs.',
      'group' => 'Drupal Commerce',
    );
  }

  /**
   * Implements setUp().
   */
  function setUp() {
    $modules = array(
      'commerce_product_ui',
      'commerce_autosku',
    );
    parent::setUp($modules);

    // User creation for different operations.
    $this->store_admin = $this
      ->createStoreAdmin();

    // Login with admin user.
    $this
      ->drupalLogin($this->store_admin);
  }
  public function permissionBuilder($sets) {
    $perms = parent::permissionBuilder($sets);

    // Filter perms by enabled modules:
    $possible_perms = array_keys(module_invoke_all('permission'));
    return array_intersect($perms, $possible_perms);
  }

  /**
   * Test the basic generation and token replacement.
   */
  public function testCommerceAutoSKUGeneration() {

    //Create a product pattern.
    $edit = array(
      'product_type[autosku_status]' => TRUE,
      'product_type[autosku][pattern]' => '[commerce-product:title]',
    );
    $this
      ->drupalPost('admin/commerce/products/types/product/edit', $edit, 'Save product type');
    $this
      ->productTypeSubmit(array(
      'product_type[autosku][pattern]' => '[commerce-product:title]',
    ));

    //Test Title replacement.
    $title = $this
      ->randomName();
    $edit = array(
      'title' => $title,
      'commerce_price[' . LANGUAGE_NONE . '][0][amount]' => 500,
    );
    $this
      ->drupalPost('admin/commerce/products/add/product', $edit, 'Save product');
    $product = commerce_product_load(1);
    $this
      ->assertEqual($product->sku, $title, t('Product title token replaced.'));

    //Test Duplicate SKU Handling.
    $edit = array(
      'title' => $title,
      'commerce_price[' . LANGUAGE_NONE . '][0][amount]' => 500,
    );
    $this
      ->drupalPost('admin/commerce/products/add/product', $edit, 'Save product');
    $product = commerce_product_load(2);
    $this
      ->assertEqual($product->sku, $title . '0', t('Product title token replaced.'));

    //Test the ID replacement.
    $this
      ->productTypeSubmit(array(
      'product_type[autosku][pattern]' => '[commerce-product:product-id]',
    ));
    $title = $this
      ->randomName();
    $edit = array(
      'title' => $title,
      'commerce_price[' . LANGUAGE_NONE . '][0][amount]' => 500,
    );
    $this
      ->drupalPost('admin/commerce/products/add/product', $edit, 'Save product');
    $product = commerce_product_load(3);
    $this
      ->assertEqual($product->sku, '3', t('Product ID token replaced.'));

    //Test that empty/nonexistent tokens are not printed in the generated pattern.
    $title = $this
      ->randomName();
    $this
      ->productTypeSubmit(array(
      'product_type[autosku][pattern]' => '[commerce-product:title][commerce-product:nonexistent-token]',
    ));
    $edit = array(
      'title' => $title,
      'commerce_price[' . LANGUAGE_NONE . '][0][amount]' => 500,
    );
    $this
      ->drupalPost('admin/commerce/products/add/product', $edit, 'Save product');
    $product = commerce_product_load(4);
    $this
      ->assertEqual($product->sku, $title);

    // Test that a pattern that resolves to more than 255 characters is trimmed.

    //Test that empty/nonexistent tokens are not printed in the generated pattern.
    $title = $this
      ->randomName(100);
    $this
      ->productTypeSubmit(array(
      'product_type[autosku][pattern]' => '[commerce-product:title][commerce-product:title][commerce-product:title]',
    ));
    $edit = array(
      'title' => $title,
      'commerce_price[' . LANGUAGE_NONE . '][0][amount]' => 500,
    );
    $this
      ->drupalPost('admin/commerce/products/add/product', $edit, 'Save product');
    $product = commerce_product_load(5);
    $this
      ->assertEqual(drupal_strlen($product->sku), 255);
    $this
      ->assertEqual($product->sku, drupal_substr($title . $title . $title, 0, 255));

    // Test that when trimming SKU's, we trim from the original sku rather
    // than the number-incremented version.
    $edit = array(
      'title' => $title,
      'commerce_price[' . LANGUAGE_NONE . '][0][amount]' => 500,
    );
    $this
      ->drupalPost('admin/commerce/products/add/product', $edit, 'Save product');
    $product = commerce_product_load(6);
    $this
      ->assertEqual(drupal_strlen($product->sku), 255);
    $this
      ->assertEqual($product->sku, drupal_substr($title . $title . $title, 0, 254) . 0);
  }
  public function testCommerceAutoSKUUpdates() {
    $edit = array(
      'product_type[autosku_status]' => TRUE,
      'product_type[autosku][pattern]' => '[commerce-product:product-id]',
      'product_type[autosku][advanced][update_existing]' => FALSE,
      'product_type[autosku][advanced][hide_sku]' => FALSE,
    );
    $this
      ->productTypeSubmit($edit);

    //Create a new product and check that the product_id token is correctly replaced:
    $product_edit = array(
      'title' => 'SimpleTest',
      'commerce_price[' . LANGUAGE_NONE . '][0][amount]' => 500,
    );
    $this
      ->drupalPost('admin/commerce/products/add/product', $product_edit, 'Save product');
    $product = $this
      ->commerceProductLoadWithReset(1);
    $this
      ->assertEqual('1', $product->sku, t('Generated SKU from Product ID'));

    //Now create a new product whose SKU we will change:
    $edit['product_type[autosku][pattern]'] = '[commerce-product:title]';
    $this
      ->productTypeSubmit($edit);
    $original_title = 'SimpleTest';
    $product_edit = array(
      'title' => $original_title,
      'commerce_price[' . LANGUAGE_NONE . '][0][amount]' => 500,
    );
    $this
      ->drupalPost('admin/commerce/products/add/product', $product_edit, 'Save product');
    $product = $this
      ->commerceProductLoadWithReset(2);
    $this
      ->assertIdentical($original_title, $product->sku, t('SKU was initially set to product title.'));
    $product_edit['title'] = 'SimpleTest_2';
    $this
      ->drupalPost('admin/commerce/products/2/edit', $product_edit, 'Save product');
    $product = $this
      ->commerceProductLoadWithReset(2);
    $this
      ->assertIdentical('SimpleTest_2', $product->title, t('Changed Title.'));
    $this
      ->assertIdentical($original_title, $product->sku, t('SKU was unchanged.'));
  }

  /**
   * Test the "advanced" features.
   */
  public function testCommerceAutoSKUAdvanced() {

    //Check we're not modifying anything we shouldn't
    $this
      ->drupalGet('admin/commerce/products/add/product');
    $this
      ->assertField('sku', t('SKU field was shown (unmodified).'));
    $edit = array(
      'product_type[autosku_status]' => TRUE,
      'product_type[autosku][pattern]' => '[commerce-product:title]',
      'product_type[autosku][advanced][update_existing]' => TRUE,
      'product_type[autosku][advanced][case]' => 'uppercase',
    );
    $this
      ->productTypeSubmit($edit);

    //Should be hidden by default
    $this
      ->drupalGet('admin/commerce/products/add/product');
    $this
      ->assertNoField('sku', t('SKU field was hidden (default).'));
    $edit += array(
      'product_type[autosku][advanced][hide_sku]' => FALSE,
    );
    $this
      ->productTypeSubmit($edit);

    //But we should allow it to be shown.
    $this
      ->drupalGet('admin/commerce/products/add/product');
    $this
      ->assertField('sku', t('SKU field was shown (hide sku = false).'));

    //Onto the uppercase/lowercase tests.
    $product_edit = array(
      'title' => 'SimpleTest',
      'commerce_price[' . LANGUAGE_NONE . '][0][amount]' => 500,
    );
    $this
      ->drupalPost('admin/commerce/products/add', $product_edit, 'Save product');
    $product = $this
      ->commerceProductLoadWithReset(1);
    $this
      ->assertIdentical('SIMPLETEST', $product->sku, t('SKU was uppercased.'));
    $edit['product_type[autosku][advanced][case]'] = 'lowercase';
    $this
      ->productTypeSubmit($edit);
    $this
      ->drupalPost('admin/commerce/products/1/edit', $product_edit, 'Save product');
    $product = $this
      ->commerceProductLoadWithReset(1);
    $this
      ->assertIdentical('simpletest', $product->sku, t('SKU was lowercased.'));
  }

  /**
   * Test that SKU patterns are deleted with the product type.
   */
  public function testProductTypeDelete() {
    $product_type = $this
      ->createDummyProductType();
    $result = db_query("SELECT 1 FROM {commerce_autosku_patterns} WHERE product_type = :type", array(
      ':type' => $product_type['type'],
    ));
    $this
      ->assertTrue($result
      ->fetchCol(), t('SKU pattern record exists before deleting.'));
    $this
      ->drupalGet('admin/commerce/products/types/' . str_replace('_', '-', $product_type['type']) . '/delete');
    $this
      ->drupalPost(NULL, array(), t('Delete'));
    $result = db_query("SELECT 1 FROM {commerce_autosku_patterns} WHERE product_type = :type", array(
      ':type' => $product_type['type'],
    ));
    $this
      ->assertFalse($result
      ->fetchCol(), t('SKU pattern record was deleted with product type.'));
  }
  public function productTypeSubmit($edit, $product_type = 'product') {
    $this
      ->drupalPost("admin/commerce/products/types/{$product_type}/edit", $edit, 'Save product type');
  }

  /**
   * Helper function to load a Commerce product while ensuring the
   * static cache is bypassed.
   */
  protected function commerceProductLoadWithReset($product_id) {
    $products = commerce_product_load_multiple(array(
      $product_id,
    ), array(), TRUE);
    return reset($products);
  }

}

Classes

Namesort descending Description
CommerceAutoSkuTest @file Contains simpletests for commerce_autosku