t('Various functional tests'),
'description' => '',
'group' => t('UC Restrict Qty'),
);
}
/**
* Implementation of setUp().
*/
function setUp() {
parent::setUp('uc_store', 'uc_cart', 'uc_product', 'uc_order', 'ca', 'uc_restrict_qty');
}
/**
* Implementation of tearDown().
*/
function tearDown() {
parent::tearDown();
}
function drupalCreateProduct($price = 100) {
// Create a product
$node = array(
'type' => 'product',
'sell_price' => $price,
'list_price' => '',
'cost' => '',
'model' => '',
'weight' => '',
'weight_units' => '',
'length' => '',
'width' => '',
'height' => '',
'length_units' => '',
'default_qty' => '',
'pkg_qty' => '',
'shippable' => 0,
'ordering' => '',
);
$product = $this->drupalCreateNode($node);
return $product;
}
function drupalCreateOrder($products = array(), $user = NULL) {
if (!isset($user)) {
$user = $this->drupalCreateUser();
}
$order = uc_order_new($user->uid);
if (!empty($products)) {
foreach ($products as $product) {
$product_data->order_product_id = 0;
$product_data->nid = $product->nid;
$product_data->qty = 1;
$product_data->title = $product->title;
$product_data->model = $product->model;
$product_data->cost = $product->cost;
$product_data->price = $product->sell_price;
$order->products[] = $product_data;
}
}
$order->delivery_first_name = $this->randomName();
$order->delivery_last_name = $this->randomName();
$order->delivery_phone = $this->randomName();
$order->delivery_company = $this->randomName();
$order->delivery_street1 = $this->randomName();
$order->delivery_street2 = $this->randomName();
$order->delivery_city = $this->randomName();
$order->delivery_zone = $this->randomName();
$order->delivery_postal_code = $this->randomName();
$order->delivery_country = $this->randomName();
$order->billing_first_name = $this->randomName();
$order->billing_last_name = $this->randomName();
$order->billing_phone = $this->randomName();
$order->billing_company = $this->randomName();
$order->billing_street1 = $this->randomName();
$order->billing_street2 = $this->randomName();
$order->billing_city = $this->randomName();
$order->billing_zone = $this->randomName();
$order->billing_postal_code = $this->randomName();
$order->billing_country = $this->randomName();
$order->payment_method = $this->randomName();
$order->manufacturer = $this->randomName();
$order->weight = rand();
$order->data = array();
uc_order_save($order);
return $order;
}
function testAdminProductSettings() {
$admin = $this->drupalCreateUser(array('administer product features'));
$this->drupalLogin($admin);
// Test settings' validators
$settings = array(
'uc_restrict_qty_global' => 'test',
'uc_restrict_qty_default_qty' => 1,
'uc_restrict_qty_default_lifetime' => 1,
);
$this->drupalPost('admin/store/settings/products/edit/features', $settings, t('Save configuration'));
$this->assertText(t('You must enter 0 or a positive number value.'), 'Settings validation [Global limit]');
$settings = array(
'uc_restrict_qty_global' => 1,
'uc_restrict_qty_default_qty' => 'test',
'uc_restrict_qty_default_lifetime' => 1,
);
$this->drupalPost('admin/store/settings/products/edit/features', $settings, t('Save configuration'));
$this->assertText(t('You must enter 0 or a positive number value.'), 'Settings validation [Default maximum limit for a product]');
// Submit real data
$settings = array(
'uc_restrict_qty_global' => 5,
'uc_restrict_qty_default_qty' => 2,
'uc_restrict_qty_default_lifetime' => 1,
);
$this->drupalPost('admin/store/settings/products/edit/features', $settings, t('Save configuration'));
$this->assertText(t('The configuration options have been saved.'), 'Settings saved');
$product = $this->drupalCreateProduct();
// Check if feature available
$this->drupalGet('node/'. $product->nid .'/edit/features');
$this->assertRaw('', 'Check if feature ready to be added');
// Test feature form default values
$test = array('feature' => 'restrict_qty');
$this->drupalPost('node/'. $product->nid .'/edit/features', $test, t('Add'));
$this->assertRaw('', 'Check if defaults prefilled [qty]');
$this->assertRaw('', 'Check if defaults prefilled [lifetime]');
// Test feature form submision
$product_settings = array(
'model' => $product->model,
'quantity' => 'test',
'lifetime' => 1,
);
$this->drupalPost('node/'. $product->nid .'/edit/features/restrict_qty/add', $product_settings, t('Save feature'));
$this->assertText(t('You must enter 0 or a positive integer value.'), 'New product feature [validation]');
// Save proper data
$product_settings['quantity'] = 1;
$this->drupalPost('node/'. $product->nid .'/edit/features/restrict_qty/add', $product_settings, t('Save feature'));
$this->assertText(t('The product feature has been added.'), 'New product feature [save|success message]');
$this->assertRaw('
Restrict Qty
', 'New product feature [save|appeared in the table]');
// Double SKU submit check
$this->drupalPost('node/'. $product->nid .'/edit/features/restrict_qty/add', $product_settings, t('Save feature'));
$this->assertText(t('A quantity restriction has already been set up for this SKU'), 'New product feature [validation SKU]');
$this->drupalGet('node/'. $product->nid .'/edit/features');
if (preg_match('|node/[0-9]*/edit/features/restrict_qty/[0-9]*|', $this->content, $matches)) {
$edit_url = $matches[0];
$this->drupalGet($edit_url);
$this->assertRaw('', 'Check if new data saved [qty]');
$this->assertRaw('', 'Check if new data saved [lifetime]');
// Test feature form updation
$product_settings = array(
'model' => $product->model,
'quantity' => 55,
'lifetime' => FALSE,
);
$this->drupalPost($edit_url, $product_settings, t('Save feature'));
$this->assertText(t('The product feature has been updated.'), 'Feature updated');
$this->drupalGet($edit_url);
$this->assertRaw('', 'Check if updated data saved [qty]');
$this->assertRaw('', 'Check if updated data saved [lifetime]');
}
else {
$this->fail('Feature edit link not found');
}
}
function testGlobalLimit() {
$limit = 2;
variable_set('uc_restrict_qty_global', $limit);
$product = $this->drupalCreateProduct();
$this->drupalPost('node/'. $product->nid, array(), t('Add to cart'));
$this->assertRaw(t('@product-title added to your shopping cart.', array('@product-title' => $product->title, '!url' => url('cart'))), 'Global limit [adding to cart below limit]');
$product = $this->drupalCreateProduct();
$this->drupalPost('node/'. $product->nid, array(), t('Add to cart'));
$this->assertRaw(t('@product-title added to your shopping cart.', array('@product-title' => $product->title, '!url' => url('cart'))), 'Global limit [close to limit]');
$product = $this->drupalCreateProduct();
$this->drupalPost('node/'. $product->nid, array(), t('Add to cart'));
$this->assertNoRaw(t('@product-title added to your shopping cart.', array('@product-title' => $product->title, '!url' => url('cart'))), 'Global limit [above the limit|not added]');
$this->assertRaw(format_plural($limit, "Sorry, you may only have a total of 1 item in your cart. You must checkout or remove the item in your cart before adding a different item.",
"Sorry, you may only have a total of @count items in your cart. You must checkout or remove items from your cart before adding others.", array('@cart' => url('cart'), '@checkout' => url('cart/checkout'))), 'Global limit [above the limit|message shown]');
variable_set('uc_restrict_qty_global', 0);
$product = $this->drupalCreateProduct();
$this->drupalPost('node/'. $product->nid, array(), t('Add to cart'));
$this->assertRaw(t('@product-title added to your shopping cart.', array('@product-title' => $product->title, '!url' => url('cart'))), 'Global limit [no limit]');
}
function testProductLimit() {
$admin = $this->drupalCreateUser(array('administer product features'));
$this->drupalLogin($admin);
$product = $this->drupalCreateProduct();
variable_set('uc_restrict_qty_global', 0);
$product_settings = array(
'model' => $product->model,
'quantity' => 1,
'lifetime' => 0,
);
$this->drupalPost('node/'. $product->nid .'/edit/features/restrict_qty/add', $product_settings, t('Save feature'));
$user1 = $this->drupalCreateUser();
$this->drupalLogin($user1);
$this->drupalPost('node/'. $product->nid, array(), t('Add to cart'));
$this->assertRaw(t('@product-title added to your shopping cart.', array('@product-title' => $product->title, '!url' => url('cart'))), 'Product limit [#1 to add]');
// Single item should be not included into input field
$this->assertRaw('
1
', 'Global limit [#1 without input in cart]');
// Second should cause error
$this->drupalPost('node/'. $product->nid, array(), t('Add to cart'));
$this->assertRaw(format_plural($product_settings['quantity'], 'You may only add 1 !item to your cart. Quantity has been restricted.', 'You may only add @count !item to your cart. Quantity has been restricted.', array('!item' => $product->title)), 'Product limit [above the limit]');
$this->drupalLogin($admin);
$this->drupalGet('node/'. $product->nid .'/edit/features');
if (preg_match('|node/[0-9]*/edit/features/restrict_qty/[0-9]*|', $this->content, $matches)) {
$edit_url = $matches[0];
$product_settings = array(
'model' => $product->model,
'quantity' => 2,
'lifetime' => FALSE,
);
$this->drupalPost($edit_url, $product_settings, t('Save feature'));
// Login another user (to get empty cart)
$user2 = $this->drupalCreateUser();
$this->drupalLogin($user2);
$this->drupalPost('node/'. $product->nid, array(), t('Add to cart'));
$this->assertRaw(t('@product-title added to your shopping cart.', array('@product-title' => $product->title, '!url' => url('cart'))), 'Product limit [#2 to add|first]');
// Item should be included into input field
$this->assertRaw('', 'Product limit [#2 with input in cart]');
$this->drupalPost('node/'. $product->nid, array(), t('Add to cart'));
$this->assertRaw(t('Your item(s) have been updated.'), '#2 to add|second');
$this->assertNoRaw(format_plural($product_settings['quantity'], 'You may only add 1 !item to your cart. Quantity has been restricted.', 'You may only add @count !item to your cart. Quantity has been restricted.', array('!item' => $product->title)), 'Product limit [#2 to add|second|no warnings]');
$this->drupalPost('node/'. $product->nid, array(), t('Add to cart'));
$this->assertRaw(format_plural($product_settings['quantity'], 'You may only add 1 !item to your cart. Quantity has been restricted.', 'You may only add @count !item to your cart. Quantity has been restricted.', array('!item' => $product->title)), 'Product limit [#2 to add|third|above limit warning]');
$this->assertRaw('', 'Product limit [#2 to add|third|#2 in cart]');
// Test lifetime limit
$this->drupalLogin($admin);
$product_settings = array(
'model' => $product->model,
'quantity' => 2,
'lifetime' => 1,
);
$this->drupalPost($edit_url, $product_settings, t('Save feature'));
$user3 = $this->drupalCreateUser(array('view own orders'));
$this->drupalLogin($user3);
$products = array($product);
$order = $this->drupalCreateOrder($products, $user3);
uc_order_update_status($order->order_id, 'completed');
$this->drupalPost('node/'. $product->nid, array(), t('Add to cart'));
$this->assertRaw(t('@product-title added to your shopping cart.', array('@product-title' => $product->title, '!url' => url('cart'))), 'Product lifetime limit [first and last]');
// It should be single item without input, as we have limit 2 with one alrready ordered
$this->assertRaw('
1
', 'Product lifetime limit [#1 without input in cart]');
// Second should cause error
$this->drupalPost('node/'. $product->nid, array(), t('Add to cart'));
$this->assertRaw(format_plural($product_settings['quantity'] - count($products), 'You may only add 1 !item to your cart. Quantity has been restricted.', 'You may only add @count !item to your cart. Quantity has been restricted.', array('!item' => $product->title)), 'Product lifetime limit [above the limit]');
// Restrict adding product to the cart, if limit has been reached
$this->drupalLogin($admin);
$product_settings = array(
'model' => $product->model,
'quantity' => 1,
'lifetime' => 1,
);
$this->drupalPost($edit_url, $product_settings, t('Save feature'));
$this->drupalLogin($user3);
// Any adding to cart should cause warning, as everything available already ordered
$this->drupalPost('node/'. $product->nid, array(), t('Add to cart'));
$this->assertRaw(t('Sorry, you have reached the quantity limit for this product. You can not order more items of this product.'), 'Product lifetime limit [above the limit]');
}
else {
$this->fail('Feature edit link not found');
}
}
}