public function UbercartTaxesTestCase::testInclusiveTaxes in Ubercart 7.3
File
- uc_taxes/
tests/ uc_taxes.test, line 30 - Tax tests.
Class
- UbercartTaxesTestCase
- Tests the tax functionality.
Code
public function testInclusiveTaxes() {
$this
->drupalLogin($this->adminUser);
// Create a 20% inclusive tax rate.
$rate = (object) array(
'name' => $this
->randomName(8),
'rate' => 0.2,
'taxed_product_types' => array(
'product',
),
'taxed_line_items' => array(),
'weight' => 0,
'shippable' => 0,
'display_include' => 1,
'inclusion_text' => $this
->randomName(6),
);
uc_taxes_rate_save($rate);
// Ensure Rules picks up the new condition.
entity_flush_caches();
// Create a $10 product.
$product = $this
->createProduct(array(
'sell_price' => 10,
));
// Create an attribute.
$attribute = (object) array(
'name' => $this
->randomName(8),
'label' => $this
->randomName(8),
'description' => $this
->randomName(8),
'required' => TRUE,
'display' => 1,
'ordering' => 0,
);
uc_attribute_save($attribute);
// Create an option with a price adjustment of $5.
$option = (object) array(
'aid' => $attribute->aid,
'name' => $this
->randomName(8),
'cost' => 0,
'price' => 5,
'weight' => 0,
'ordering' => 0,
);
uc_attribute_option_save($option);
// Attach the attribute to the product.
$attribute = uc_attribute_load($attribute->aid);
uc_attribute_subject_save($attribute, 'product', $product->nid, TRUE);
// Create a product kit containing the product.
$kit = $this
->drupalCreateNode(array(
'type' => 'product_kit',
'products' => array(
$product->nid,
),
'ordering' => 0,
'mutable' => UC_PRODUCT_KIT_UNMUTABLE_WITH_LIST,
'default_qty' => 1,
));
// Set the kit total to $9 to automatically apply a discount.
$kit = node_load($kit->nid);
$kit->kit_total = 9;
node_save($kit);
$kit = node_load($kit->nid);
$this
->assertEqual($kit->products[$product->nid]->discount, -1, 'Product kit component has correct discount applied.');
// Ensure the price is displayed tax-inclusively on the add-to-cart form.
$this
->drupalGet('node/' . $kit->nid);
$this
->assertText('$10.80' . $rate->inclusion_text, 'Tax inclusive price on node-view form is accurate.');
// $10.80 = $9.00 + 20%
$this
->assertRaw($option->name . ', +$6.00</option>', 'Tax inclusive option price on node view form is accurate.');
// $6.00 = $5.00 + 20%
// Add the product kit to the cart, selecting the option.
$attribute_key = 'products[' . $product->nid . '][attributes][' . $attribute->aid . ']';
$this
->drupalPost('node/' . $kit->nid, array(
$attribute_key => $option->oid,
), t('Add to cart'));
// Check that the subtotal is $16.80 ($10 base + $5 option - $1 discount, with 20% tax)
$this
->drupalGet('cart');
$this
->assertText('Subtotal: $16.80', 'Order subtotal is correct on cart page.');
// Make sure that the subtotal is also correct on the checkout page.
$this
->drupalPost('cart', array(), 'Checkout');
$this
->assertText('Subtotal: $16.80', 'Order subtotal is correct on checkout page.');
// Manually proceed to checkout review.
$zone_id = db_query_range('SELECT zone_id FROM {uc_zones} WHERE zone_country_id = :country ORDER BY rand()', 0, 1, array(
'country' => variable_get('uc_store_country', 840),
))
->fetchField();
$edit = array(
'panes[delivery][delivery_first_name]' => $this
->randomName(10),
'panes[delivery][delivery_last_name]' => $this
->randomName(10),
'panes[delivery][delivery_street1]' => $this
->randomName(10),
'panes[delivery][delivery_city]' => $this
->randomName(10),
'panes[delivery][delivery_zone]' => $zone_id,
'panes[delivery][delivery_postal_code]' => mt_rand(10000, 99999),
'panes[billing][billing_first_name]' => $this
->randomName(10),
'panes[billing][billing_last_name]' => $this
->randomName(10),
'panes[billing][billing_street1]' => $this
->randomName(10),
'panes[billing][billing_city]' => $this
->randomName(10),
'panes[billing][billing_zone]' => $zone_id,
'panes[billing][billing_postal_code]' => mt_rand(10000, 99999),
);
$this
->drupalPost('cart/checkout', $edit, t('Review order'));
$this
->assertRaw(t('Your order is almost complete.'));
// Make sure the price is still listed tax-inclusively.
// !TODO This could be handled more specifically with a regex.
$this
->assertText('$16.80' . $rate->inclusion_text, 'Tax inclusive price appears in cart pane on checkout review page');
// Ensure the tax-inclusive price is listed on the order admin page.
$order_id = db_query("SELECT order_id FROM {uc_orders} WHERE delivery_first_name = :name", array(
':name' => $edit['panes[delivery][delivery_first_name]'],
))
->fetchField();
$this
->assertTrue($order_id, 'Order was created successfully');
$this
->drupalGet('admin/store/orders/' . $order_id);
$this
->assertText('$16.80' . $rate->inclusion_text, 'Tax inclusive price appears on the order view page.');
// And on the invoice.
$this
->drupalGet('admin/store/orders/' . $order_id . '/invoice');
$this
->assertText('$16.80' . $rate->inclusion_text, 'Tax inclusive price appears on the invoice.');
// And on the printable invoice.
$this
->drupalGet('admin/store/orders/' . $order_id . '/invoice');
$this
->assertText('$16.80' . $rate->inclusion_text, 'Tax inclusive price appears on the printable invoice.');
}