permissionBuilder($set); $user = $this->drupalCreateUser($permissions); return $user; } /** * Returns a site administrator user. Only has permissions for administering * modules in Drupal core. */ protected function createSiteAdmin() { return $this->createUserWithPermissionHelper('site admin'); } /** * Returns a store administrator user. Only has permissions for administering * Commerce modules. */ protected function createStoreAdmin() { return $this->createUserWithPermissionHelper('store admin'); } /** * Returns a store customer. It's a regular user with some Commerce * permissions as access to checkout. */ protected function createStoreCustomer() { return $this->createUserWithPermissionHelper('store customer'); } /** * Return one of the Commerce configured urls. */ protected function getCommerceUrl($element = 'cart') { $links = commerce_line_item_summary_links(); if ($element == 'cart') { return $links['view_cart']['href']; } if ($element == 'checkout') { return $links['checkout']['href']; } } /** * Creates a dummy product type for use with other tests. * * @return * A product type. * FALSE if the appropiate modules were not available. */ public function createDummyProductType($type = 'product_type', $name = 'Product Type', $description = '', $help = '', $append_random = TRUE) { if (module_exists('commerce_product')) { if ($append_random) { $type = $type .'_'. $this->randomName(20 - strlen($type) - 1); $name = $name .' '. $this->randomName(40 - strlen($name) - 1); $description = $description .' '. $this->randomString(128); $help = $help .' '. $this->randomString(128); } $new_product_type = commerce_product_ui_product_type_new(); $new_product_type['type'] = $type; $new_product_type['name'] = $name; $new_product_type['description'] = $description; $new_product_type['help'] = $help; $new_product_type['is_new'] = TRUE; $save_result = commerce_product_ui_product_type_save($new_product_type); if ($save_result === FALSE) { return FALSE; } return $new_product_type; } else { return FALSE; } } /** * Creates a dummy product for use with other tests. * * @param $type_given * Optional. The product type to base this product on. Defaults to 'product'. * @return * A product type with most of it's basic fields set random values. * FALSE if the appropiate modules were not available. */ public function createDummyProduct($sku = '', $title = '', $amount = -1, $currency_code = 'USD', $uid = 1, $type_given = 'product') { if (module_exists('commerce_product')) { $new_product = commerce_product_new($type_given); $new_product->sku = empty($sku) ? $this->randomName(10) : $sku; $new_product->title = empty($title) ? $this->randomName(10) : $title; $new_product->uid = $uid; $new_product->commerce_price[LANGUAGE_NONE][0]['amount'] = ($amount < 0) ? rand(2, 500) : $amount; $new_product->commerce_price[LANGUAGE_NONE][0]['currency_code'] = 'USD'; commerce_product_save($new_product); return $new_product; } else { return FALSE; } } /** * Create a dummy product display content type. * * @param $type * Machine name of the content type to create. Also used for human readable * name to keep things simple. * @param $attach_product_reference_field * If TRUE, automatically add a product reference field to the new content * type. * @param $field_name * Only used if $attach_product_reference_field is TRUE. Sets the name for * the field instance to attach. Creates the field if it doesn't exist. * @param $cardinality_reference_field * Only used if $attach_product_reference_field is TRUE. Sets the * cardinality for the field instance to attach. * @return * An object for the content type. * @see attachProductReferenceField() */ public function createDummyProductDisplayContentType($type = 'product_display', $attach_product_reference_field = TRUE, $field_name = 'field_product', $cardinality_reference_field = 1) { // If the specified node type already exists, return it now. if ($content_type = node_type_load($type)) { return $content_type; } $content_type = array( 'type' => $type, 'name' => $type, // Don't use a human readable name here to keep it simple. 'base' => 'node_content', 'description' => 'Use product displays to display products for sale to your customers.', 'custom' => 1, 'modified' => 1, 'locked' => 0, ); $content_type = node_type_set_defaults($content_type); node_type_save($content_type); node_add_body_field($content_type); $this->pass("Created content type: $type"); if ($attach_product_reference_field) { // Maybe $instance should be returned as well $instance = $this->attachProductReferenceField($type, $field_name, $cardinality_reference_field); } return $content_type; } /** * Create a dummy order in a given status. * * @param $uid * ID of the user that owns the order. * @param $products * Array of products that are going to be added to the order: keys are * product ids, values are the quantity of products to add. * @param $status * Status of the order * * @return * A commerce order object in the given status. */ public function createDummyOrder($uid = 1, $products = array(), $status = 'cart', $customer_profile_id = NULL) { // If there aren't any products to add to the order, create one. if (empty($products)) { $product = $this->createDummyProduct('PROD-01', 'Product One', -1, 'USD', $uid); $products[$product->product_id] = rand(1,10); } // Create a new shopping cart order by adding the products to it. foreach($products as $product_id => $quantity) { if ($product = commerce_product_load($product_id)) { $line_item = commerce_product_line_item_new($product, $quantity); $line_item = commerce_cart_product_add($uid, $line_item); } } // Load the order for returning it. $order = commerce_cart_order_load($uid); if (!empty($customer_profile_id)) { $order->commerce_customer_billing[LANGUAGE_NONE][0]['profile_id'] = $customer_profile_id; } // If the order should be in a different status, update it. if ($status <> 'cart') { $order = commerce_order_status_update($order, $status, TRUE); } commerce_order_save($order); return $order; } /** * Attach a product reference field to a given content type. Creates the field * if the given name doesn't already exist. Automatically sets the display * formatters to be the "add to cart form" for the teaser and full modes. * * @param $content_type * Name of the content type that should have a field instance attached. * @param $field_name * Only used if $attach_product_reference_field is TRUE. Sets the name for * the field instance to attach. Creates the field if it doesn't exist. * @return * An object containing the field instance that was created. * @see createDummyProductDisplayContentType() */ public function attachProductReferenceField($content_type = 'product_display', $field_name = 'field_product', $cardinality = 1) { if (module_exists('commerce_product')) { // Check if the field has already been created. $field_info = field_info_field($field_name); if (empty($field_info)) { // Add a product reference field to the product display node type $field = array( 'field_name' => $field_name, 'type' => 'commerce_product_reference', 'cardinality' => $cardinality, 'translatable' => FALSE, ); field_create_field($field); $this->pass("New field created: $field_name"); } else { debug("NOTE: attachProductReferenceField attempting to create field $field_name that already exists. This is fine and this message is just for your information."); } // Check that this instance doesn't already exist $instance = field_info_instance('node', $field_name, $content_type); if (empty($insance)) { // Add an instance of the field to the given content type $instance = array( 'field_name' => $field_name, 'entity_type' => 'node', 'label' => 'Product', 'bundle' => $content_type, 'description' => 'Choose a product to display for sale.', 'required' => TRUE, 'widget' => array( 'type' => 'options_select', ), 'display' => array( 'default' => array( 'label' => 'hidden', 'type' => 'commerce_cart_add_to_cart_form', ), 'teaser' => array( 'label' => 'hidden', 'type' => 'commerce_cart_add_to_cart_form', ), ), ); field_create_instance($instance); $this->pass("Create field instance of field $field_name on content type $content_type"); } else { $this->fail("Test Develoepr: You attempted to create a field that already exists. Field: $field_name -- Content Type: $content_type"); } return $instance; } else { $this->fail('Cannot create product reference field because Product module is not enabled.'); } } /** * Creates a product display node with an associated product. * * @param $product_ids * Array of product IDs to use for the product reference field. * @param $title * Optional title for the product node. Will default to a random name. * @param $product_display_content_type * Machine name for the product display content type to use for creating the * node. Defaults to 'product_display'. * @param $product_ref_field_name * Machine name for the product reference field on this product display * content type. Defaults to 'field_product'. * @return * The newly saved $node object. */ public function createDummyProductNode($product_ids, $title = '', $product_display_content_type = 'product_display', $product_ref_field_name = 'field_product') { if (module_exists('commerce_product')) { if (empty($title)) { $title = $this->randomString(10); } $node = (object) array('type' => $product_display_content_type); node_object_prepare($node); $node->uid = 1; $node->title = $title; foreach ($product_ids as $product_id) { $node->{$product_ref_field_name}[LANGUAGE_NONE][]['product_id'] = $product_id; } node_save($node); return $node; } else { $this->fail(t('Cannot use use createProductNode because the product module is not enabled.')); } } /** * Create a full product node without worrying about the earlier steps in * the process. * * @param $count * Number of product nodes to create. Each one will have a new product * entity associated with it. SKUs will be like PROD-n. Titles will be * like 'Product #n'. Price will be 10*n. Counting begins at 1. * @return * An array of product node objects. */ public function createDummyProductNodeBatch($count) { $this->createDummyProductDisplayContentType(); $product_nodes = array(); for ($i=1; $i<$count; $i++) { $sku = "PROD-$i"; $title = "Product #$i"; $price = $i*10; $product = $this->createDummyProduct($sku, $title, $price); $product_node = $this->createDummyProductNode(array($product->product_id), $title); $product_nodes[$i] = $product_node; } return $product_nodes; } /** * Create a dummy tax type. * * @param $tax_type * Array with the specific elements for the tax type, all the elements not * specified and required will be generated randomly. * @see hook_commerce_tax_type_info * * @return * The tax type array just created or FALSE if it wasn't created. */ public function createDummyTaxType($tax_type = array()) { $defaults = array( 'name' => 'example_tax_type', 'title' => t('Example tax type'), 'display_title' => t('Example tax type'), 'description' => t('Example tax type for testing purposes'), ); // Generate a tax type array based on defaults and specific elements. $tax_type = array_merge(commerce_tax_ui_tax_type_new(), $defaults, $tax_type); if (commerce_tax_ui_tax_type_save($tax_type)) { return commerce_tax_type_load($tax_type['name']); } else { return FALSE; } } /** * Create a dummy tax rate. * * @param $tax_type * Array with the specific elements for the tax rate, all elements not * specified and required will be generated randomly. * @see hook_commerce_tax_rate_info * * @return * The tax type array just created or FALSE if it wasn't created. */ public function createDummyTaxRate($tax_rate = array()) { $defaults = array( 'name' => 'example_tax_rate', 'title' => t('Example tax rate'), 'display_title' => t('Example tax rate'), 'rate' => rand(1,100)/1000, 'type' => 'example_tax_type', ); // Generate a tax type array based on defaults and specific elements. $tax_rate = array_merge(commerce_tax_ui_tax_rate_new(), $defaults, $tax_rate); if (commerce_tax_ui_tax_rate_save($tax_rate)) { return commerce_tax_rate_load($tax_rate['name']); } else { return FALSE; } } /** * Create a customer profile. * * @param $type * Type of the customer profile, default billing. * @param $uid * User id that will own the profile, by default anonymous. * @param $address_info * Address information, associative array keyed by the field name. * i.e. 'commerce_customer_address'. * * @return * The customer profile created or FALSE if the profile wasn't created. */ public function createDummyCustomerProfile($type = 'billing', $uid = 0, $address_info = array()) { variable_set('site_default_country', 'US'); // Initialize the profile. $profile = commerce_customer_profile_new($type, $uid); // Set the defaults. $defaults['name_line'] = $this->randomName(); $defaults = array_merge($defaults, addressfield_default_values(), $this->generateAddressInformation()); // Get all the fields for the given type, by default billing. $instances = field_info_instances('commerce_customer_profile', $type); foreach ($instances as $name => $instance) { $info_field = field_info_field($name); if ($info_field['type'] == 'addressfield') { $values = !empty($address_info[$name]) ? array_merge($defaults, $address_info[$name]) : $defaults; $values['data'] = serialize($values['data']); $profile->{$name}[LANGUAGE_NONE][] = $values; } } commerce_customer_profile_save($profile); return $profile; } /** * Enable extra currencies in the store. * * @param $currencies * Array of currency codes to be enabled */ public function enableCurrencies($currencies) { $currencies = array_merge(drupal_map_assoc($currencies), variable_get('commerce_enabled_currencies', array('USD' => 'USD'))); variable_set('commerce_enabled_currencies', $currencies); } // =============== Helper functions =============== /** * Checks if a group of modules is enabled. * * @param $module_name * Array of module names to check (without the .module extension) * @return * TRUE if all of the modules are enabled. */ protected function modulesUp($module_names) { if (is_string($module_names)) { $module_names = array($module_names); } foreach ($module_names as $module_name) { if (!module_exists($module_name)) { return FALSE; } } return TRUE; } /** * Generate random valid information for Address information. */ protected function generateAddressInformation() { $address_info['name_line'] = $this->randomName(); $address_info['thoroughfare'] = $this->randomName(); $address_info['locality'] = $this->randomName(); $address_info['postal_code'] = rand(00000, 99999); $address_info['administrative_area'] = 'KY'; return $address_info; } /** * Generate a random valid email * * @param string $type * Domain type * * @return string * Valid email */ protected function generateEmail($type = 'com'){ return $this->randomName() . '@' . $this->randomName() . '.' . $type; } /** * Assertions for Drupal Commerce. */ /** * Asserts that a product has been added to the cart. * * @param $order * A full loaded commerce_order object. * @param $product * A full loaded commerce_product object. * @param $user * User that owns the cart. * * @return TRUE if the product is in the cart, FALSE otherwise. */ public function assertProductAddedToCart($order, $product, $user = NULL) { // The order should be in cart status. $this->assertTrue(commerce_cart_order_is_cart($order), t('The order checked is in cart status')); $product_is_in_cart = FALSE; // Loop through the line items looking for products. foreach (entity_metadata_wrapper('commerce_order', $order)->commerce_line_items as $delta => $line_item_wrapper) { // If this line item matches the product checked... if ($line_item_wrapper->type->value() == 'product' && $line_item_wrapper->commerce_product->product_id->value() == $product->product_id) { $product_is_in_cart = TRUE; } } $this->assertTrue($product_is_in_cart, t('Product !product_title is present in the cart', array('!product_title' => $product->title))); // Access to the cart page to check if the product is there. if (empty($user)) { $user = $this->createStoreCustomer(); } $this->drupalLogin($user); $this->drupalGet($this->getCommerceUrl('cart')); $this->assertText($product->title, t('Product !product_title is present in the cart view', array('!product_title' => $product->title))); } /** * Asserts that a product has been created. * * @param $product * A full loaded commerce_product object. * @param $user * User that access the admin pages. Optional, if not informed, the check * is done with the store admin. */ public function assertProductCreated($product, $user = NULL) { // Check if the product is not empty and reload it from database. $this->assertFalse(empty($product), t('Product object is not empty')); $product = commerce_product_load($product->product_id); $this->assertFalse(empty($product), t('Product object is correctly loaded from database')); // Access to the admin page for the product and check if the product is there. if (empty($user)) { $user = $this->createStoreAdmin(); } $this->drupalLogin($user); $this->drupalGet('admin/commerce/products/' . $product->product_id); $this->assertFieldById('edit-sku', $product->sku, t('When editing the product in the administration interface, the SKU is informed correctly')); $this->assertFieldById('edit-title', $product->title, t('When editing the product in the administration interface, the Title is informed correctly')); } } /** * Sandbox for trying new things with tests. Eases development so only one test * has to run at a time. Move everything to CommerceBaseTesterTestCase after it * is functioning here. */ class CommerceSandboxTestCase extends CommerceBaseTestCase { protected $site_admin; /** * getInfo() returns properties that are displayed in the test selection form. */ public static function getInfo() { return array( 'name' => t('Commerce sandbox'), 'description' => t('Sandbox for trying new things with tests. Eases development so only one test has to run at a time.'), 'group' => t('Drupal Commerce'), ); } /** * setUp() performs any pre-requisite tasks that need to happen. */ public function setUp() { $modules = parent::setUpHelper('all'); parent::setUp($modules); $this->site_admin = $this->createSiteAdmin(); cache_clear_all(); // Just in case } /** * Sandbox for test development */ public function testTestTest() { } /** * Test the createDummyCustomerProfile function. */ public function testTestCreateDummyCustomerProfile() { $store_admin = $this->createStoreAdmin(); // Create a new customer profile for the store admin. $profile = $this->createDummyCustomerProfile('billing', $store_admin->uid); // Load profile reseting cache. $profile = reset(commerce_customer_profile_load_multiple(array($profile->profile_id), array(), TRUE)); $this->assertFalse(empty($profile), t('Profile can be loaded from database')); // Login with store admin user and navigate to the profile listing page. $this->drupalLogin($store_admin); $this->drupalGet('admin/commerce/customer-profiles'); $this->assertText($profile->commerce_customer_address[LANGUAGE_NONE][0]['name_line'], t('\'Name line\' field for the profile created is present in the customer profile listing')); $type = commerce_customer_profile_type_load($profile->type); $this->assertText($type['name'], t('The type of the profile is informed in the profile listing page')); } } /** * Test class to test the CommerceBaseTestCase functions. All testTestFoo * functions have "testTest" in the name to indicate that they are verifying * that a test is working. Somewhat "meta" to do this, but it eases test * development. */ class CommerceBaseTesterTestCase extends CommerceBaseTestCase { protected $site_admin; /** * getInfo() returns properties that are displayed in the test selection form. */ public static function getInfo() { return array( 'name' => t('Commerce base'), 'description' => t('Test the functionality of the base test class. Essentially, these are meta-tests.'), 'group' => t('Drupal Commerce'), ); } /** * setUp() performs any pre-requisite tasks that need to happen. */ public function setUp() { $modules = parent::setUpHelper('all'); parent::setUp($modules); $this->site_admin = $this->createSiteAdmin(); cache_clear_all(); // Just in case } /** * Ensure that all of the Commerce modules (and their dependencies) are * enabled in the test environment. */ public function testModulesEnabled() { $this->drupalLogin($this->site_admin); $this->drupalGet('admin/modules'); $module_ids = array( 'edit-modules-commerce-commerce-cart-enable', 'edit-modules-commerce-commerce-checkout-enable', 'edit-modules-commerce-commerce-enable', 'edit-modules-commerce-commerce-customer-enable', 'edit-modules-commerce-commerce-line-item-enable', 'edit-modules-commerce-commerce-order-enable', 'edit-modules-commerce-commerce-payment-enable', 'edit-modules-commerce-commerce-price-enable', 'edit-modules-commerce-commerce-product-enable', 'edit-modules-commerce-commerce-product-reference-enable', 'edit-modules-commerce-commerce-product-pricing-enable', 'edit-modules-commerce-commerce-tax-enable', 'edit-modules-commerce-commerce-payment-example-enable', 'edit-modules-commerce-commerce-ui-enable', 'edit-modules-commerce-commerce-customer-ui-enable', 'edit-modules-commerce-commerce-line-item-ui-enable', 'edit-modules-commerce-commerce-order-ui-enable', 'edit-modules-commerce-commerce-payment-ui-enable', 'edit-modules-commerce-commerce-product-pricing-ui-enable', 'edit-modules-commerce-commerce-product-ui-enable', 'edit-modules-commerce-commerce-tax-ui-enable', 'edit-modules-fields-addressfield-enable', 'edit-modules-other-entity-enable', 'edit-modules-rules-rules-enable', 'edit-modules-chaos-tool-suite-ctools-enable', 'edit-modules-views-views-enable', ); foreach ($module_ids as $module_id) { $this->assertFieldChecked($module_id); } } /** * Test that Store Admin role actually gets set up. */ public function testTestStoreAdmin() { $store_admin = $this->createStoreAdmin(); $this->drupalLogin($this->site_admin); $this->drupalGet('admin/people/permissions'); // This will break if it isn't the second role created $this->assertFieldChecked('edit-5-configure-store'); } /** * Make a test product type. */ public function testTestCreateDummyProductType() { $product_type = $this->createDummyProductType(); $store_admin = $this->createStoreAdmin(); $this->drupalLogin($store_admin); $this->drupalGet('admin/commerce/products/types'); $this->assertText($product_type['name'], t('Dummy product type name found on admin/commerce/products/types')); } /** * Make a test product. */ public function testTestCreateDummyProduct() { // Create the product. $product = $this->createDummyProduct(); // Login with the store admin. $store_admin = $this->createStoreAdmin(); $this->drupalLogin($store_admin); // Assert that the product is in the product listing. $this->drupalGet('admin/commerce/products'); $this->assertText($product->title, t('Dummy product found on admin page at admin/commerce/products')); $this->drupalGet('admin/commerce/products/list'); $this->assertText($product->title, t('Dummy product found on admin page at admin/commerce/products/list')); } /** * Test the creation of a product_display content type and add a product * reference field to the content type. */ public function testTestCreateDummyProductDisplayAndRefField() { $this->createDummyProductDisplayContentType(); $this->drupalLogin($this->site_admin); $this->drupalGet('node/add/product-display'); $this->assertText('product_display', t('product_display content type successfully created and accessible.')); //$this->assertOptionSelected('edit-field-product-und', '_none', 'Dummy Product Display reference field shows up on node add page'); $this->assertFieldById('edit-field-product-und', '', t('Product reference field found on Dummy Product Display.')); // Try to add the same field a second time and see if any errors pop up. // If uncommented, this will product an error. Basically, this should be // turned into an assertion that checks for the presence of the field. //$this->attachProductReferenceField('product_display', 'field_product'); } /** * Test the createDummyProductNode function. */ public function testTestCreateDummyProductNode() { // Create a dummy product display content type $this->createDummyProductDisplayContentType(); // Create dummy product display nodes (and their corresponding product // entities) $sku = 'PROD-01'; $product_name = 'Product One'; $product = $this->createDummyProduct($sku, $product_name); $product_node = $this->createDummyProductNode(array($product->product_id), $product_name); $this->drupalLogin($this->site_admin); $this->drupalGet("node/{$product_node->nid}"); $this->assertText($product_name, t('Product !product_name created successfully', array('!product_name' => $product_name))); } /** * Test the createDummyProductNodeBatch function. */ public function testTestCreateDummyProductNodeBatch() { $product_nodes = $this->createDummyProductNodeBatch(3); $this->drupalLogin($this->site_admin); $product_node = $product_nodes[1]; $this->drupalGet("node/{$product_node->nid}"); $this->assertText($product_node->title, t('Product !product_title node page exists', array('product_title' => $product_node->title))); } /** * Test the createDummyOrder function. */ public function testTestCreateDummyOrder() { $normal_user = $this->drupalCreateUser(array('access checkout')); $this->drupalLogin($normal_user); $sku = 'PROD-01'; $product_name = 'Product One'; $product = $this->createDummyProduct($sku, $product_name); $order = $this->createDummyOrder($normal_user->uid, array($product->product_id => 1)); // Check if the order is in cart status. $this->assertTrue(commerce_cart_order_is_cart($order), t('Order is in a shopping cart status')); $this->drupalGet('checkout'); $this->assertTitle(t('Checkout'). ' | Drupal', t('Checkout accessible for the order')); $this->assertText($product_name, t('Product is added to the order')); } /** * Test the currency value rounding. */ public function testCurrencyRounding() { // array( rounding_step => array( 'value' => 'expected result')); $rounding_numbers = array( '0.05' => array( '1' => '1', '5' => '5', '777' => '777', '1.22' => '1.20', '12.2249' => '12.20', '1200.225' => '1200.25', '0.2749' => '0.25', '490.275' => '490.30', ), '0.02' => array( '1' => '1', '777' => '777', '1.205' => '1.20', '12.20999' => '12.20', '1200.21' => '1200.22', '0.26999' => '0.26', '490.2712' => '490.28', ), '0.5' => array( '1' => '1', '5' => '5', '1.22' => '1', '12.2499' => '12', '1200.25' => '1200.5', '0.749' => '0.5', '490.75' => '491.0', ), '0.2' => array( '1' => '1', '777' => '777', '1.05' => '1', '12.0999' => '12', '1200.1' => '1200.2', '0.6999' => '0.6', '490.712' => '490.8', ), ); foreach ($rounding_numbers as $rounding_step => $numbers) { foreach ($numbers as $input => $output) { $currency = array('decimals' => 2, 'rounding_step' => $rounding_step); $result = commerce_currency_round($input, $currency); $this->assertEqual($result, $output, t('Rounding !input to !output with the rounding step: !rounding_step', array('!input' => $input, '!output' => $output, '!rounding_step' => $rounding_step))); } } } /** * Test enabling extra currencies. */ public function testEnableCurrencies() { // Enable Euros. $this->enableCurrencies(array('EUR')); // Check if Euros is enabled. $this->assertTrue(in_array('EUR', variable_get('commerce_enabled_currencies', array('USD' => 'USD'))), t('Euros are enabled')); } /** * Test creating a new tax type. */ public function testTestCreateDummyTaxType() { // Create a dummy tax type. $tax_type = $this->createDummyTaxType(); // Create and login with a store admin user. $store_admin = $this->createStoreAdmin(); $this->drupalLogin($store_admin); // Access to the tax type listing page and assert that the dummy tax type // is present. $this->drupalGet('admin/commerce/config/taxes/types'); $this->assertText($tax_type['display_title'], t('Dummy tax type found on admin page at admin/commerce/config/taxes/types')); } /** * Test creating a new tax rate. */ public function testTestCreateDummyTaxRate() { // Create a dummy tax type. $tax_type = $this->createDummyTaxType(); // Create a dummy tax rate. $tax_rate = $this->createDummyTaxRate(); // Create and login with a store admin user. $store_admin = $this->createStoreAdmin(); $this->drupalLogin($store_admin); // Access to the tax type listing page and assert that the dummy tax type // is present. $this->drupalGet('admin/commerce/config/taxes/rates'); $this->assertText($tax_rate['display_title'], t('Dummy tax rate found on admin page at admin/commerce/config/taxes/rates')); } }