/** * Add premium / bonus article to cart * @param sAddPremium - ordernumber of bonus article (defined in s_articles_premiums) * Return to cart / confirm page on success */ public function addPremiumAction() { if ($this->Request()->isPost()) { if (!$this->Request()->getParam('sAddPremium')) { $this->View()->sBasketInfo = Shopware()->Snippets()->getNamespace()->get('CheckoutSelectPremiumVariant', 'Please select an option to place the required premium to the cart', true); } else { $this->basket->sSYSTEM->_GET['sAddPremium'] = $this->Request()->getParam('sAddPremium'); $this->basket->sInsertPremium(); } } $this->forward($this->Request()->getParam('sTargetAction', 'index')); }
/** * @covers sBasket::sInsertPremium */ public function testsInsertPremium() { // Test with empty session, expect true $this->assertTrue($this->module->sInsertPremium()); // Create session id $this->module->sSYSTEM->sSESSION_ID = uniqid(); $this->session->offsetSet('sessionId', $this->module->sSYSTEM->sSESSION_ID); // Test with session, expect true $this->assertTrue($this->module->sInsertPremium()); $normalArticle = $this->db->fetchRow('SELECT * FROM s_articles_details detail INNER JOIN s_articles article ON article.id = detail.articleID WHERE detail.active = 1 AND detail.articleId NOT IN ( SELECT id FROM s_addon_premiums ) ORDER BY RAND() LIMIT 1'); $premiumArticleOne = $this->db->fetchRow('SELECT article.id, detail.ordernumber FROM s_articles_details detail INNER JOIN s_articles article ON article.id = detail.articleID WHERE detail.active = 1 AND detail.ordernumber NOT IN ( SELECT ordernumber FROM s_addon_premiums ) ORDER BY RAND() LIMIT 1'); $premiumArticleTwo = $this->db->fetchRow('SELECT article.id, detail.ordernumber FROM s_articles_details detail INNER JOIN s_articles article ON article.id = detail.articleID WHERE detail.active = 1 AND detail.ordernumber IN ( SELECT ordernumber FROM s_addon_premiums ) ORDER BY RAND() LIMIT 1'); // Add one normal article to basket // Test that calling sInsertPremium does nothing $this->db->insert('s_order_basket', array('price' => 1, 'quantity' => 1, 'sessionID' => $this->session->get('sessionId'), 'ordernumber' => $normalArticle['ordernumber'], 'articleID' => $normalArticle['articleID'], 'modus' => 0)); $this->assertTrue($this->module->sInsertPremium()); $this->assertEquals(1, $this->db->fetchOne('SELECT count(*) FROM s_order_basket WHERE sessionID = ?', array($this->module->sSYSTEM->sSESSION_ID))); // Add premium articles to basket // Test that calling sInsertPremium removes them $this->db->insert('s_order_basket', array('price' => 1, 'quantity' => 1, 'sessionID' => $this->session->get('sessionId'), 'ordernumber' => $premiumArticleOne['ordernumber'], 'articleID' => $premiumArticleOne['id'], 'modus' => 1)); $this->db->insert('s_order_basket', array('price' => 1, 'quantity' => 1, 'sessionID' => $this->session->get('sessionId'), 'ordernumber' => $premiumArticleTwo['ordernumber'], 'articleID' => $premiumArticleTwo['id'], 'modus' => 1)); $this->assertTrue($this->module->sInsertPremium()); $this->assertEquals(1, $this->db->fetchOne('SELECT count(*) FROM s_order_basket WHERE sessionID = ?', array($this->module->sSYSTEM->sSESSION_ID))); // Add sAddPremium to _GET. // Basket price is 1, so expect premium articles to be denied $this->module->sSYSTEM->_GET['sAddPremium'] = $premiumArticleTwo['ordernumber']; $this->assertFalse($this->module->sInsertPremium()); // Increase basket price and retry $this->db->insert('s_order_basket', array('price' => 10000, 'quantity' => 1, 'sessionID' => $this->session->get('sessionId'), 'ordernumber' => $normalArticle['ordernumber'], 'articleID' => $normalArticle['articleID'], 'modus' => 0)); // Will still get false due to cache $this->assertFalse($this->module->sInsertPremium()); // Change the premium article to a non-premium, fail $this->module->sSYSTEM->_GET['sAddPremium'] = $premiumArticleOne['ordernumber']; $this->assertFalse($this->module->sInsertPremium()); $this->assertEquals(2, $this->db->fetchOne('SELECT count(*) FROM s_order_basket WHERE sessionID = ?', array($this->module->sSYSTEM->sSESSION_ID))); // Change the premium article to a premium, succeed $this->module->sSYSTEM->_GET['sAddPremium'] = $premiumArticleTwo['ordernumber']; $this->assertGreaterThan(0, $this->module->sInsertPremium()); $this->assertEquals(3, $this->db->fetchOne('SELECT count(*) FROM s_order_basket WHERE sessionID = ?', array($this->module->sSYSTEM->sSESSION_ID))); // Housekeeping $this->db->delete('s_order_basket', array('sessionID = ?' => $this->session->get('sessionId'))); }