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'); } } }