t('Attribute API'), 'description' => t('Test the attribute API.'), 'group' => t('Ubercart'), ); } /** * */ function setUp() { parent::setUp('token', 'uc_store', 'uc_product', 'uc_attribute', 'ca', 'uc_order', 'uc_cart'); $admin_user = $this->drupalCreateUser(array('administer store', 'administer attributes', 'administer products', 'administer product classes')); $this->drupalLogin($admin_user); } /** * */ 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.'), t('Ubercart')); break; } } // Add a product. $product = UcProductTestCase::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.'), t('Ubercart') ); $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.'), t('Ubercart')); 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.'), t('Ubercart') ); $this->assertFalse(uc_attribute_subject_exists($attribute->aid, 'product', $product->nid)); // Add a product class. $product_class = UcProductTestCase::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.'), t('Ubercart') ); $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.'), t('Ubercart')); 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.'), t('Ubercart') ); $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' => $attribute->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.'), t('Ubercart')); 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.'), t('Ubercart')); $this->assertEqual(count($aids), count(array_intersect_key($aids, $loaded_attributes)), t('Verifying attribute result.'), t('Ubercart')); // 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.'), t('Ubercart')); 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.'), t('Ubercart')); $this->assertEqual(count($loaded_product_attributes), count(array_intersect_key($loaded_product_attributes, $product_attributes)), t('Verifying attribute result.'), t('Ubercart')); // 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.'), t('Ubercart')); 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.'), t('Ubercart')); 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.'), t('Ubercart')); $this->assertEqual(count($loaded_class_attributes), count(array_intersect_key($loaded_class_attributes, $class_attributes)), t('Verifying attribute result.'), t('Ubercart')); // 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.'), t('Ubercart')); 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.'), t('Ubercart')); 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.'), t('Ubercart')); // 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!'), t('Ubercart')); // 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.'), t('Ubercart')); } // 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.'), t('Ubercart')); $this->assertEqual(count($loaded_product_attributes), count(array_intersect_key($loaded_product_attributes, $product_attributes)), t('Verifying attribute result.'), t('Ubercart')); // 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.'), t('Ubercart')); $this->assertEqual(count($loaded_class_attributes), count(array_intersect_key($loaded_class_attributes, $class_attributes)), t('Verifying attribute result.'), t('Ubercart')); // 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(), t('Ubercart')); // Test deletion by aid. uc_attribute_adjustments_delete(array('aid' => 2)); $this->assertEqual(5, db_query("SELECT COUNT(*) FROM {uc_product_adjustments}")->fetchField(), t('Ubercart')); // Test deletion by oid. uc_attribute_adjustments_delete(array('oid' => 2)); $this->assertEqual(3, db_query("SELECT COUNT(*) FROM {uc_product_adjustments}")->fetchField(), t('Ubercart')); // 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(), t('Ubercart')); } /** * */ public function testAttributeUIAddAttribute() { $this->drupalGet('admin/store/attributes/add'); $this->AssertText(t('The name of the attribute used in administrative forms'), t('Attribute add form working.'), t('Ubercart')); $edit = (array) self::createAttribute(array(), FALSE); $this->drupalPost('admin/store/attributes/add', $edit, t('Submit')); $this->assertRaw('
'. print_r($var, TRUE) .''); } }