You are here

public function UbercartAttributeTestCase::testAttributeAPI in Ubercart 7.3

Same name and namespace in other branches
  1. 6.2 uc_attribute/uc_attribute.test \UbercartAttributeTestCase::testAttributeAPI()

Tests the basic attribute API.

File

uc_attribute/tests/uc_attribute.test, line 32
Ubercart Attribute Tests.

Class

UbercartAttributeTestCase
SimpleTests for the Ubercart Attributes API.

Code

public function testAttributeAPI() {

  // Create an attribute.
  $attribute = self::createAttribute();

  // Test retrieval.
  $loaded_attribute = uc_attribute_load($attribute->aid);

  // Check the attribute integrity.
  foreach (self::attributeFieldsToTest() as $field) {
    if ($loaded_attribute->{$field} != $attribute->{$field}) {
      $this
        ->fail(t('Attribute integrity check failed.'));
      break;
    }
  }

  // Add a product.
  $product = $this
    ->createProduct();

  // Attach the attribute to a product.
  uc_attribute_subject_save($attribute, 'product', $product->nid);

  // Confirm the database is correct.
  $this
    ->assertEqual($attribute->aid, db_query("SELECT aid FROM {uc_product_attributes} WHERE nid = :nid", array(
    ':nid' => $product->nid,
  ))
    ->fetchField(), t('Attribute was attached to a product properly.'));
  $this
    ->assertTrue(uc_attribute_subject_exists($attribute->aid, 'product', $product->nid));

  // Test retrieval.
  $loaded_attribute = uc_attribute_load($attribute->aid, $product->nid, 'product');

  // Check the attribute integrity.
  foreach (self::attributeFieldsToTest('product') as $field) {
    if ($loaded_attribute->{$field} != $attribute->{$field}) {
      $this
        ->fail(t('Attribute integrity check failed.'));
      break;
    }
  }

  // Delete it.
  uc_attribute_subject_delete($attribute->aid, 'product', $product->nid);

  // Confirm again.
  $this
    ->assertFalse(db_query("SELECT aid FROM {uc_product_attributes} WHERE nid = :nid", array(
    ':nid' => $product->nid,
  ))
    ->fetchField(), t('Attribute was detached from a product properly.'));
  $this
    ->assertFalse(uc_attribute_subject_exists($attribute->aid, 'product', $product->nid));

  // Add a product class.
  $product_class = $this
    ->createProductClass();

  // Attach the attribute to a product class.
  uc_attribute_subject_save($attribute, 'class', $product_class->pcid);

  // Confirm the database is correct.
  $this
    ->assertEqual($attribute->aid, db_query("SELECT aid FROM {uc_class_attributes} WHERE pcid = :pcid", array(
    ':pcid' => $product_class->pcid,
  ))
    ->fetchField(), t('Attribute was attached to a product class properly.'));
  $this
    ->assertTrue(uc_attribute_subject_exists($attribute->aid, 'class', $product_class->pcid));

  // Test retrieval.
  $loaded_attribute = uc_attribute_load($attribute->aid, $product_class->pcid, 'class');

  // Check the attribute integrity.
  foreach (self::attributeFieldsToTest('class') as $field) {
    if ($loaded_attribute->{$field} != $attribute->{$field}) {
      $this
        ->fail(t('Attribute integrity check failed.'));
      break;
    }
  }

  // Delete it.
  uc_attribute_subject_delete($attribute->aid, 'class', $product_class->pcid);

  // Confirm again.
  $this
    ->assertFalse(db_query("SELECT aid FROM {uc_class_attributes} WHERE pcid = :pcid", array(
    ':pcid' => $product_class->pcid,
  ))
    ->fetchField(), t('Attribute was detached from a product class properly.'));
  $this
    ->assertFalse(uc_attribute_subject_exists($attribute->aid, 'class', $product_class->pcid));

  // Create a few more.
  for ($i = 0; $i < 5; $i++) {
    $a = self::createAttribute();
    $attributes[$a->aid] = $a;
  }

  // Add some options, organizing them by aid and oid.
  $attribute_aids = array_keys($attributes);
  $all_options = array();
  foreach ($attribute_aids as $aid) {
    for ($i = 0; $i < 3; $i++) {
      $option = self::createAttributeOption(array(
        'aid' => $aid,
      ));
      $all_options[$option->aid][$option->oid] = $option;
    }
  }
  for ($i = 0; $i < 3; $i++) {
    $option = self::createAttributeOption(array(
      'aid' => $aid,
    ));
    $all_options[$option->aid][$option->oid] = $option;
  }

  // Get the options.
  $attribute = uc_attribute_load($attribute->aid);

  // Load every attribute we got.
  $attributes_with_options = uc_attribute_load_multiple();

  // Make sure all the new options are on attributes correctly.
  foreach ($all_options as $aid => $options) {
    foreach ($options as $oid => $option) {
      foreach (self::attributeOptionFieldsToTest() as $field) {
        if ($option->{$field} != $attributes_with_options[$aid]->options[$oid]->{$field}) {
          $this
            ->fail(t('Option integrity check failed.'));
          break;
        }
      }
    }
  }

  // Pick 5 keys to check at random.
  $aids = drupal_map_assoc(array_rand($attributes, 3));

  // Load the attributes back.
  $loaded_attributes = uc_attribute_load_multiple($aids);

  // Make sure we only got the attributes we asked for. No more, no less.
  $this
    ->assertEqual(count($aids), count($loaded_attributes), t('Verifying attribute result.'));
  $this
    ->assertEqual(count($aids), count(array_intersect_key($aids, $loaded_attributes)), t('Verifying attribute result.'));

  // Check the attributes' integrity.
  foreach ($loaded_attributes as $aid => $loaded_attribute) {
    foreach (self::attributeFieldsToTest() as $field) {
      if ($attributes[$aid]->{$field} != $loaded_attributes[$aid]->{$field}) {
        $this
          ->fail(t('Attribute integrity check failed.'));
        break;
      }
    }
  }

  // Add the selected attributes to the product.
  foreach ($loaded_attributes as $loaded_attribute) {
    uc_attribute_subject_save($loaded_attribute, 'product', $product->nid, TRUE);
  }

  // Test loading all product attributes. (This covers uc_attribute_load_product_attributes(),
  // as the semantics are the same -cha0s)
  $loaded_product_attributes = uc_attribute_load_multiple(array(), 'product', $product->nid);

  // We'll get all in $loaded_attributes above, plus the original.
  $product_attributes = $loaded_attributes;

  // Make sure we only got the attributes we asked for. No more, no less.
  $this
    ->assertEqual(count($loaded_product_attributes), count($product_attributes), t('Verifying attribute result.'));
  $this
    ->assertEqual(count($loaded_product_attributes), count(array_intersect_key($loaded_product_attributes, $product_attributes)), t('Verifying attribute result.'));

  // Check the attributes' integrity.
  foreach ($loaded_product_attributes as $aid => $loaded_product_attribute) {
    foreach (self::attributeFieldsToTest('product') as $field) {
      if ($loaded_product_attributes[$aid]->{$field} != $product_attributes[$aid]->{$field}) {
        $this
          ->fail(t('Attribute integrity check failed.'));
        break;
      }
    }
  }

  // Make sure all the options are on attributes correctly.
  foreach ($all_options as $aid => $options) {
    foreach ($options as $oid => $option) {
      if (empty($loaded_product_attributes[$aid]) || empty($loaded_product_attributes[$aid]->options[$oid])) {
        continue;
      }
      foreach (self::attributeOptionFieldsToTest() as $field) {
        if ($option->{$field} != $loaded_product_attributes[$aid]->options[$oid]->{$field}) {
          $this
            ->fail(t('Option integrity check failed.'));
          break;
        }
      }
    }
  }

  // Add the selected attributes to the product.
  foreach ($loaded_attributes as $loaded_attribute) {
    uc_attribute_subject_save($loaded_attribute, 'class', $product_class->pcid, TRUE);
  }

  // Test loading all product attributes. (This covers uc_attribute_load_product_attributes(),
  // as the semantics are the same -cha0s)
  $loaded_class_attributes = uc_attribute_load_multiple(array(), 'class', $product_class->pcid);

  // We'll get all in $loaded_attributes above, plus the original.
  $class_attributes = $loaded_attributes;

  // Make sure we only got the attributes we asked for. No more, no less.
  $this
    ->assertEqual(count($loaded_class_attributes), count($class_attributes), t('Verifying attribute result.'));
  $this
    ->assertEqual(count($loaded_class_attributes), count(array_intersect_key($loaded_class_attributes, $class_attributes)), t('Verifying attribute result.'));

  // Check the attributes' integrity.
  foreach ($loaded_class_attributes as $aid => $loaded_class_attribute) {
    foreach (self::attributeFieldsToTest('class') as $field) {
      if ($loaded_class_attributes[$aid]->{$field} != $class_attributes[$aid]->{$field}) {
        $this
          ->fail(t('Attribute integrity check failed.'));
        break;
      }
    }
  }

  // Make sure all the options are on attributes correctly.
  foreach ($all_options as $aid => $options) {
    foreach ($options as $oid => $option) {
      if (empty($loaded_class_attributes[$aid]) || empty($loaded_class_attributes[$aid]->options[$oid])) {
        continue;
      }
      foreach (self::attributeOptionFieldsToTest() as $field) {
        if ($option->{$field} != $loaded_class_attributes[$aid]->options[$oid]->{$field}) {
          $this
            ->fail(t('Option integrity check failed.'));
          break;
        }
      }
    }
  }

  // Test deletion of base attribute.
  $aid = $attribute->aid;
  $options = $attribute->options;
  uc_attribute_delete($attribute->aid);
  $this
    ->assertFalse(uc_attribute_load($attribute->aid), t('Attribute was deleted properly.'));

  // Sanity check!
  $this
    ->assertFalse(db_query("SELECT aid FROM {uc_attributes} WHERE aid = :aid", array(
    ':aid' => $attribute->aid,
  ))
    ->fetchField(), t('Attribute was seriously deleted properly!'));

  // Test that options were deleted properly.
  foreach ($options as $option) {
    $this
      ->assertFalse(db_query("SELECT oid FROM {uc_attribute_options} WHERE oid = :oid", array(
      ':oid' => $option->oid,
    ))
      ->fetchField(), t('Make sure options are deleted properly.'));
  }

  // Test the deletion applied to products too.
  $loaded_product_attributes = uc_attribute_load_multiple(array(), 'product', $product->nid);

  // We'll get all in $loaded_attributes above, without the original. (Which
  // has been deleted.)
  $product_attributes = $loaded_attributes;

  // Make sure we only got the attributes we asked for. No more, no less.
  $this
    ->assertEqual(count($loaded_product_attributes), count($product_attributes), t('Verifying attribute result.'));
  $this
    ->assertEqual(count($loaded_product_attributes), count(array_intersect_key($loaded_product_attributes, $product_attributes)), t('Verifying attribute result.'));

  // Test the deletion applied to classes too.
  $loaded_class_attributes = uc_attribute_load_multiple(array(), 'class', $product_class->pcid);

  // We'll get all in $loaded_attributes above, without the original. (Which
  // has been deleted.)
  $class_attributes = $loaded_attributes;

  // Make sure we only got the attributes we asked for. No more, no less.
  $this
    ->assertEqual(count($loaded_class_attributes), count($class_attributes), t('Verifying attribute result.'));
  $this
    ->assertEqual(count($loaded_class_attributes), count(array_intersect_key($loaded_class_attributes, $class_attributes)), t('Verifying attribute result.'));

  // Add some adjustments.
  self::createProductAdjustment(array(
    'combination' => 'a:1:{i:1;s:1:"1";}',
    'nid' => 1,
  ));
  self::createProductAdjustment(array(
    'combination' => 'a:1:{i:1;s:1:"2";}',
    'nid' => 1,
  ));
  self::createProductAdjustment(array(
    'combination' => 'a:1:{i:1;s:1:"3";}',
    'nid' => 1,
  ));
  self::createProductAdjustment(array(
    'combination' => 'a:1:{i:2;s:1:"1";}',
    'nid' => 2,
  ));
  self::createProductAdjustment(array(
    'combination' => 'a:1:{i:3;s:1:"1";}',
    'nid' => 2,
  ));
  self::createProductAdjustment(array(
    'combination' => 'a:1:{i:1;s:1:"2";}',
    'nid' => 3,
  ));
  self::createProductAdjustment(array(
    'combination' => 'a:1:{i:1;s:1:"3";}',
    'nid' => 3,
  ));
  self::createProductAdjustment(array(
    'combination' => 'a:1:{i:3;s:1:"2";}',
    'nid' => 3,
  ));
  self::createProductAdjustment(array(
    'combination' => 'a:1:{i:3;s:1:"3";}',
    'nid' => 4,
  ));

  // Test deletion by nid.
  uc_attribute_adjustments_delete(array(
    'nid' => 1,
  ));
  $this
    ->assertEqual(6, db_query("SELECT COUNT(*) FROM {uc_product_adjustments}")
    ->fetchField());

  // Test deletion by aid.
  uc_attribute_adjustments_delete(array(
    'aid' => 2,
  ));
  $this
    ->assertEqual(5, db_query("SELECT COUNT(*) FROM {uc_product_adjustments}")
    ->fetchField());

  // Test deletion by oid.
  uc_attribute_adjustments_delete(array(
    'oid' => 2,
  ));
  $this
    ->assertEqual(3, db_query("SELECT COUNT(*) FROM {uc_product_adjustments}")
    ->fetchField());

  // Test deletion by aid and oid.
  uc_attribute_adjustments_delete(array(
    'aid' => 1,
    'oid' => 3,
  ));
  $this
    ->assertEqual(2, db_query("SELECT COUNT(*) FROM {uc_product_adjustments}")
    ->fetchField());
}