commerce_order_ui.test in Commerce Core 7
Functional tests for the commerce order UI module.
File
modules/order/tests/commerce_order_ui.testView source
<?php
/**
* @file
* Functional tests for the commerce order UI module.
*/
/**
* Functional tests for the commerce order UI module.
*/
class CommerceOrderUIAdminTest extends CommerceBaseTestCase {
/**
* Dummy product for adding to the orders.
*/
protected $product;
/**
* Order created and manipulated in the process.
*/
protected $order;
/**
* Implementation of getInfo().
*/
public static function getInfo() {
return array(
'name' => 'Order administration',
'description' => 'Test creating, editing and deleting an order through the order administration user interface.',
'group' => 'Drupal Commerce',
);
}
/**
* Implementation of setUp().
*/
function setUp() {
$modules = parent::setUpHelper('all');
parent::setUp($modules);
// User creation for different operations.
$this->store_admin = $this
->createStoreAdmin();
$this->store_customer = $this
->createStoreCustomer();
// Create dummy product.
$this->product = $this
->createDummyProduct('PROD-01', 'Product One');
// Log in as store admin.
$this
->drupalLogin($this->store_admin);
// Navigate to the order administration page.
$this
->drupalGet('admin/commerce/orders/add');
// Add a billing information profile to the order.
$this
->drupalPostAJAX(NULL, array(), array(
'op' => t('Add billing information'),
));
// Fill in the billing address information
$country_field = 'commerce_customer_billing[und][profiles][0][commerce_customer_address][und][0][country]';
$this
->drupalPostAJAX(NULL, array(
$country_field => 'US',
), $country_field);
// Create the base order for the rest of tests. Assign it to the normal
// user.
$this
->drupalPost(NULL, array(
'name' => $this->store_customer->name,
), t('Save order', array(), array(
'context' => 'a drupal commerce order',
)));
// Load the order from database for later use.
$orders = commerce_order_load_multiple(array(), array(
'uid' => $this->store_customer->uid,
));
$this->order = reset($orders);
// Reset the cache as we don't want to keep the lock.
entity_get_controller('commerce_order')
->resetCache();
// Enable an additional currency.
$this
->enableCurrencies(array(
'EUR',
));
}
/**
* Test if an order gets correctly created.
*/
public function testCommerceOrderUICreateOrder() {
// First, check if the order has been created in the database.
$this
->assertTrue(is_object($this->order), t('Order has been created in database'));
// Also, the user owning the order should match.
$this
->assertTrue($this->order->uid == $this->store_customer->uid, t('Order owner match'));
}
/**
* Test general edit form fields of an order.
*/
public function testCommerceOrderUIEditOrder() {
// Log in as a normal user.
$this
->drupalLogin($this->store_customer);
// Navigate to the order edit page, it shouldn't be accessible.
$this
->drupalGet('admin/commerce/orders/' . $this->order->order_id . '/edit');
$this
->assertResponse(403, t('Normal user is not able to access the order edit admin screen'));
// Log in as store admin.
$this
->drupalLogin($this->store_admin);
// Access the edit page of the order.
$this
->drupalGet('admin/commerce/orders/' . $this->order->order_id . '/edit');
$this
->assertResponse(200, t('Store admin user can access the order edit admin screen'));
// Update some values, like the owner of the order, datestamp, etc.
$timestamp = REQUEST_TIME;
$edit = array(
'name' => '',
'log' => $this
->randomName(),
'date_created' => format_date($timestamp, 'custom', 'Y-m-d H:i:s O'),
'date_placed' => format_date($timestamp, 'custom', 'Y-m-d H:i:s O'),
'status' => 'completed',
);
// Save the order.
$this
->drupalPost(NULL, $edit, t('Save order', array(), array(
'context' => 'a drupal commerce order',
)));
// Reload the order from database.
$orders = commerce_order_load_multiple(array(
$this->order->order_id,
), array(), TRUE);
$order = reset($orders);
$order_wrapper = entity_metadata_wrapper('commerce_order', $order);
// Check the order properties.
$this
->pass(t('Order in database assertions:'));
$this
->assertTrue($order_wrapper->uid
->value() == 0, t('Order owner correctly updated'));
$this
->assertTrue($order->log == $edit['log'], t('Order log correctly updated'));
$this
->assertTrue($order_wrapper->created
->value() == $timestamp, t('Order created date correctly updated'));
$this
->assertTrue($order_wrapper->placed
->value() == $timestamp, t('Order placed date correctly updated'));
$this
->assertTrue($order_wrapper->status
->value() == $edit['status'], t('Order status correctly updated'));
// Check if the values have been changed. Log is not checked because it
// is a message for each revision.
$this
->pass(t('Order in screen assertions:'));
$this
->assertFieldById('edit-name', $edit['name'], t('Name correctly modified'));
$this
->assertFieldById('edit-date-created', $edit['date_created'], t('Created date changed correctly'));
$this
->assertFieldById('edit-date-placed', $edit['date_placed'], t('Placed date changed correctly'));
$this
->assertOptionSelected('edit-status', $edit['status'], t('Status changed'));
}
/**
* Test adding products to an order via Admin UI.
*/
public function testCommerceOrderUIAddProductsToOrder() {
// Log in as store admin.
$this
->drupalLogin($this->store_admin);
// Access the edit page of the order.
$this
->drupalGet('admin/commerce/orders/' . $this->order->order_id . '/edit');
// Add a product line item to the order.
$this
->drupalPostAJAX(NULL, array(
'commerce_line_items[und][actions][line_item_type]' => 'product',
), array(
'op' => t('Add line item'),
));
$this
->assertFieldByXPath("//input[starts-with(@id, 'edit-commerce-line-items-und-actions-product-sku')]", NULL, t('Product select form is present in the order admin screen'));
$this
->assertFieldByXPath("//input[starts-with(@id, 'edit-commerce-line-items-und-actions-save-line-item')]", NULL, t('Add product button is present in the order admin screen'));
$this
->drupalPostAJAX(NULL, array(
'commerce_line_items[und][actions][product_sku]' => $this->product->sku,
), array(
'op' => t('Add product'),
));
$this
->drupalPost(NULL, array(), t('Save order', array(), array(
'context' => 'a drupal commerce order',
)));
// Reload the order directly from db.
$order = commerce_order_load_multiple(array(
$this->order->order_id,
), array(), TRUE);
// Reset the cache as we don't want to keep the lock.
entity_get_controller('commerce_order')
->resetCache();
// Check if the product has been added to the order.
foreach (entity_metadata_wrapper('commerce_order', reset($order))->commerce_line_items as $delta => $line_item_wrapper) {
if ($line_item_wrapper
->getBundle() == 'product') {
$product = $line_item_wrapper->commerce_product
->value();
$products[$product->product_id] = $product;
}
}
$this
->assertTrue(array_key_exists($this->product->product_id, $products), t('Added product is included in the order at the database level'));
// Access the edit page of the order and check if the product is present.
$this
->drupalGet('admin/commerce/orders/' . $this->order->order_id . '/edit');
$this
->assertText($this->product->sku, t('SKU from product is present in the order edit screen'));
$this
->assertText($this->product->title, t('Product title is present in the order edit screen'));
}
/**
* Test updating line items within an order.
*/
public function testCommerceOrderUIUpdateLineItems() {
// Log in as store admin.
$this
->drupalLogin($this->store_admin);
// Access the edit page of the order.
$this
->drupalGet('admin/commerce/orders/' . $this->order->order_id . '/edit');
// Add a product line item to the order.
$this
->drupalPostAJAX(NULL, array(
'commerce_line_items[und][actions][line_item_type]' => 'product',
), array(
'op' => t('Add line item'),
));
$this
->drupalPostAJAX(NULL, array(
'commerce_line_items[und][actions][product_sku]' => $this->product->sku,
), array(
'op' => t('Add product'),
));
$this
->drupalPost(NULL, array(), t('Save order', array(), array(
'context' => 'a drupal commerce order',
)));
// Reload the order directly from db and wrap it to get the line item ids.
$orders = commerce_order_load_multiple(array(
$this->order->order_id,
), array(), TRUE);
$order = reset($orders);
$order_wrapper = entity_metadata_wrapper('commerce_order', $order);
// Reset the cache as we don't want to keep the lock.
entity_get_controller('commerce_order')
->resetCache();
// Also wrap the product to access easier to its price.
$product_wrapper = entity_metadata_wrapper('commerce_product', $this->product);
// Get the first line item id.
$line_item_id = $order_wrapper->commerce_line_items
->get(0)
->value()->line_item_id;
// Format the price based in the currency.
$price = commerce_currency_amount_to_decimal($product_wrapper->commerce_price->amount
->value(), $product_wrapper->commerce_price->currency_code
->value());
// Check the existance of the fields for quantity and price of the line
// item just created.
$this
->pass(t('Check the existance of quantiy, price and currency code fields'));
$this
->assertFieldById('edit-commerce-line-items-und-line-items-' . $line_item_id . '-quantity', 1, t('Quantity field is present and has value 1'));
$this
->assertFieldById('edit-commerce-line-items-und-line-items-' . $line_item_id . '-commerce-unit-price-und-0-amount', $price, t('Price of the product is correct'));
$this
->assertOptionSelected('edit-commerce-line-items-und-line-items-' . $line_item_id . '-commerce-unit-price-und-0-currency-code', $product_wrapper->commerce_price->currency_code
->value(), t('Currency code is valid'));
// Generate new quantity and prices and save them.
$new_qty = rand(0, 99);
$new_currency_code = 'EUR';
$new_price = commerce_currency_amount_to_decimal(rand(2, 500), $new_currency_code);
$edit = array(
'commerce_line_items[und][line_items][' . $line_item_id . '][quantity]' => $new_qty,
'commerce_line_items[und][line_items][' . $line_item_id . '][commerce_unit_price][und][0][amount]' => $new_price,
'commerce_line_items[und][line_items][' . $line_item_id . '][commerce_unit_price][und][0][currency_code]' => $new_currency_code,
);
$this
->drupalPost(NULL, $edit, t('Save order', array(), array(
'context' => 'a drupal commerce order',
)));
// Check if the modifications have been correctly done.
$this
->assertFieldById('edit-commerce-line-items-und-line-items-' . $line_item_id . '-quantity', $new_qty, t('Quantity field has been correctly modified'));
$this
->assertFieldById('edit-commerce-line-items-und-line-items-' . $line_item_id . '-commerce-unit-price-und-0-amount', $new_price, t('Price of the product has been correctly modified'));
$this
->assertOptionSelected('edit-commerce-line-items-und-line-items-' . $line_item_id . '-commerce-unit-price-und-0-currency-code', $new_currency_code, t('Currency code has been correctly modified'));
}
/**
* Check the integrity of the order admin page and also if a given order is
* displayed correctly.
*/
public function testCommerceOrderUIViewOrderAdmin() {
// Log in as a normal user.
$this
->drupalLogin($this->store_customer);
// Navigate to the order management page, it shouldn't be accessible.
$this
->drupalGet('admin/commerce/orders');
$this
->assertResponse(403, t('Normal user is not able to access the order admin screen'));
// Log in as store admin.
$this
->drupalLogin($this->store_admin);
// Navigate to the order management page and check if the order data is
// really there.
$this
->drupalGet('admin/commerce/orders');
$this
->assertResponse(200, t('Store admin user can access the order admin screen'));
$this
->pass(t('Order admin screen assertions:'));
// Check if the create an order link is present.
$this
->assertText(t('Create an order'), t('%create text is present', array(
'%create' => t('Create an order'),
)));
// Get the current status of the order.
$status = commerce_order_status_load($this->order->status);
// Check if there is at least an order created and the correct one is
// present.
$this
->assertNoText(t('No orders have been created yet.'), t('Order admin screen has at least one order'));
$this
->assertText($this->order->order_number, t('The order number for the created order is present'));
$this
->assertText($status['title'], t('The order status for the created order is present'));
$this
->assertText($this->store_customer->name, t('The name of the order owner for the created order is present'));
// Check if the links for editing the order are present.
$links = menu_contextual_links('commerce-order', 'admin/commerce/orders', array(
$this->order->order_id,
));
// Reset the cache as we don't want to keep the lock.
entity_get_controller('commerce_order')
->resetCache();
$this
->assertRaw(theme('links', array(
'links' => $links,
'attributes' => array(
'class' => array(
'links',
'inline',
'operations',
),
),
)), t('Links for orders are present'));
$this
->drupalGet('admin/commerce/orders/' . $this->order->order_id . '/view');
$this
->assertResponse(200, t('Store admin user can access the order view page'));
}
/**
* Test if the owner of the order can see it correctly.
*/
public function testCommerceOrderUIViewOrderUser() {
// Log in as a normal user.
$this
->drupalLogin($this->store_customer);
// Access the order profile menu page.
$this
->drupalGet('user/' . $this->store_customer->uid . '/orders');
$this
->assertResponse(200, t('Users can access to their own orders listing'));
// Access the order just created for the user.
$this
->drupalGet('user/' . $this->store_customer->uid . '/orders/' . $this->order->order_id);
$this
->assertResponse(200, t('Users can access their own order details'));
$this
->assertTitle(t('Order @number', array(
'@number' => $this->order->order_number,
)) . ' | Drupal', t('The order number accessed by the user matches the order from URL'));
}
/**
* Test if one user can access orders belonging to other user.
*/
public function testCommerceOrderUIViewOrderOtherUser() {
// Create an additional user.
$this->other_user = $this
->drupalCreateUser();
// Log in as the additional user.
$this
->drupalLogin($this->other_user);
// Access the order profile menu page.
$this
->drupalGet('user/' . $this->store_customer->uid . '/orders');
$this
->assertResponse(404, t('Users are not able to access other user\'s orders listing'));
// Access the order details.
$this
->drupalGet('user/' . $this->store_customer->uid . '/orders/' . $this->order->order_id);
$this
->assertResponse(403, t('Users are not able to access other user\'s order details'));
}
/**
* Test the deletion of an order.
*/
public function testCommerceOrderUIDeleteOrder() {
// Log in as a normal user.
$this
->drupalLogin($this->store_customer);
// Navigate to the page to delete the order.
$this
->drupalGet('admin/commerce/orders/' . $this->order->order_id . '/delete');
$this
->assertResponse(403, t('Normal user is not able to delete orders'));
// Log in as store admin.
$this
->drupalLogin($this->store_admin);
// Navigate to the page to delete the order.
$this
->drupalGet('admin/commerce/orders/' . $this->order->order_id . '/delete');
// The confirmation page is accesible and the form is ok.
$this
->assertResponse(200, t('Store admin user can access the order deletion page'));
$this
->assertText(t('Deleting this order cannot be undone.'), t('The confirmation message for order delete is displayed'));
// Delete the order.
$this
->drupalPost(NULL, array(), t('Delete'));
// Reload the order from database.
$orders = commerce_order_load_multiple(array(
$this->order->order_id,
), array(), TRUE);
$order = reset($orders);
$this
->assertFalse($order, t('Order has been deleted from database'));
// Check if the confirmation message is displayed.
$this
->assertText(t('Order @number has been deleted.', array(
'@number' => $this->order->order_number,
)), t('Order message for deletion is displayed with the correct order number'));
// Check if the order is present in the page.
$this
->assertText(t('No orders have been created yet.'), t('After deleting the only order created, there is no order left in the order admin screen'));
}
/**
* Test the helper text of an order.
*/
public function testCommerceOrderUIHelpText() {
// Log in as a normal user.
$this
->drupalLogin($this->store_customer);
// Navigate to the page to configure the helper text.
$this
->drupalGet('admin/commerce/config/order');
$this
->assertResponse(403, t('Normal user is not able to configure the helper text for orders'));
// Log in as store admin.
$this
->drupalLogin($this->store_admin);
// Navigate to the page to configure the helper text.
$this
->drupalGet('admin/commerce/config/order');
$this
->assertResponse(200, t('Store admin user can configure the helper text for orders'));
// Check the integrity of the form.
$this
->assertFieldById('edit-commerce-order-help-text', NULL, t('Order help text textarea is available'));
// Save a random content for the help text.
$edit = array(
'commerce_order_help_text' => $this
->randomName(),
);
$this
->drupalPost(NULL, $edit, t('Save configuration'));
// Check if the text has been stored
$this
->assertText(t('The configuration options have been saved.'), t('Confirmation message for saving the helper text is displayed'));
$this
->assertFieldById('edit-commerce-order-help-text', $edit['commerce_order_help_text'], t('Order help text textarea displays the stored helper text'));
$this
->assertTrue(variable_get('commerce_order_help_text', '') == $edit['commerce_order_help_text'], t('Order help text saved in database'));
// Check if the text is displayed in the order creation page.
$this
->drupalGet('admin/commerce/orders/add');
$this
->assertText($edit['commerce_order_help_text'], t('Order help text message displayed in the order creation page'));
}
/**
* Test the integrity of manage fields Order UI form pages.
*/
public function testCommerceOrderAdminUIManageFields() {
// Log in as a normal user.
$this
->drupalLogin($this->store_customer);
// Navigate to the manage fields screen for the order type.
$this
->drupalGet('admin/commerce/config/order/fields');
$this
->assertResponse(403, t('Normal user is not able to access the manage fields screen for the order type'));
// Log in as store admin.
$this
->drupalLogin($this->store_admin);
// Navigate to the manage fields screen for the order type.
$this
->drupalGet('admin/commerce/config/order/fields');
$this
->assertResponse(200, t('Store admin user can access the manage fields screen for the order type'));
// Get the instances attached to the commerce order bundle and assert if
// they are present in the form.
$field_instances = field_info_instances('commerce_order', 'commerce_order');
foreach ($field_instances as $instance) {
$this
->assertText($instance['label'], t('%instance is present in the manage fields screen', array(
'%instance' => $instance['label'],
)));
}
}
/**
* Test the integrity of display fields Order UI form pages.
*/
public function testCommerceOrderAdminUIDisplayFields() {
// Log in as a normal user.
$this
->drupalLogin($this->store_customer);
// Navigate to the display fields screen for the order type.
$this
->drupalGet('admin/commerce/config/order/display');
$this
->assertResponse(403, t('Normal user is not able to access the display fields screen for the order type'));
// Log in as store admin.
$this
->drupalLogin($this->store_admin);
// Navigate to the display fields screen for the order type.
$this
->drupalGet('admin/commerce/config/order/display');
$this
->assertResponse(200, t('Store admin user can access the display fields screen for the order type'));
// Assert the field instances for the display.
$field_instances = field_info_instances('commerce_order', 'commerce_order');
foreach ($field_instances as $instance) {
$this
->assertText($instance['label'], t('%instance is present in the display fields screen', array(
'%instance' => $instance['label'],
)));
}
}
}
Classes
Name | Description |
---|---|
CommerceOrderUIAdminTest | Functional tests for the commerce order UI module. |