=== added file 'uc_attribute/uc_attribute.test' --- uc_attribute/uc_attribute.test 1970-01-01 00:00:00 +0000 +++ uc_attribute/uc_attribute.test 2009-06-15 21:35:17 +0000 @@ -0,0 +1,691 @@ + 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 = UbercartProductTestCase::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_result(db_query("SELECT aid FROM {uc_product_attributes} WHERE nid = %d", $product->nid)), + 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', $product->nid); + + // 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_result(db_query("SELECT aid FROM {uc_product_attributes} WHERE nid = %d", $product->nid)), + 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 = UbercartProductTestCase::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_result(db_query("SELECT aid FROM {uc_class_attributes} WHERE pcid = '%s'", $product_class->pcid)), + 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, 'class', $product_class->pcid); + + // 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_result(db_query("SELECT aid FROM {uc_class_attributes} WHERE pcid = '%s'", $product_class->pcid)), + 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_result(db_query("SELECT aid FROM {uc_attributes} WHERE aid = %d", $attribute->aid)), t('Attribute was seriously deleted properly!'), t('Ubercart')); + + // Test that options were deleted properly. + foreach ($options as $option) { + $this->assertFalse(db_result(db_query("SELECT oid FROM {uc_attribute_options} WHERE oid = %d", $option->oid)), 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_result(db_query("SELECT COUNT(*) FROM {uc_product_adjustments}")), t('Ubercart')); + + // Test deletion by aid. + uc_attribute_adjustments_delete(array('aid' => 2)); + $this->assertEqual(5, db_result(db_query("SELECT COUNT(*) FROM {uc_product_adjustments}")), t('Ubercart')); + + // Test deletion by oid. + uc_attribute_adjustments_delete(array('oid' => 2)); + $this->assertEqual(3, db_result(db_query("SELECT COUNT(*) FROM {uc_product_adjustments}")), t('Ubercart')); + + // Test deletion by aid and oid. + uc_attribute_adjustments_delete(array('aid' => 1, 'oid' => 3)); + $this->assertEqual(2, db_result(db_query("SELECT COUNT(*) FROM {uc_product_adjustments}")), 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) .''); + } +}