Files
kupshop/bundles/KupShop/BonusProgramBundle/Tests/BonusProgramOtherReceiverTest.php
2025-08-02 16:30:27 +02:00

101 lines
3.7 KiB
PHP

<?php
namespace KupShop\BonusProgramBundle\Tests;
use KupShop\DevelopmentBundle\Util\Tests\CartTestTrait;
use KupShop\OrderDiscountBundle\Tests\OrderTestDiscountTrait;
use KupShop\OrderDiscountBundle\Util\DiscountManager;
use KupShop\OrderingBundle\Util\Purchase\PurchaseUtil;
use Query\Operator;
class BonusProgramOtherReceiverTest extends \DatabaseTestCase
{
use CartTestTrait;
use OrderTestDiscountTrait;
private ?PurchaseUtil $currencyContext = null;
private ?DiscountManager $discountManager = null;
protected function setUp(): void
{
parent::setUp();
$this->purchaseStateUtil = $this->get(PurchaseUtil::class);
$this->discountManager = $this->get(DiscountManager::class);
}
/** @dataProvider data_purchaseStateProvider */
public function testOrderStorno($applyModule)
{
$applyModule();
$points = sqlQueryBuilder()->select('SUM(points)')
->from('bonus_points')
->groupBy('id_user')
->andWhere(Operator::equals(['id_user' => 1]))
->execute()->fetchOne();
$this->assertEquals(300, $points, 'Uzivatel ma 300 bodu z 2 objednavek');
$this->order = \Order::get(1);
$this->order->storno();
$points = sqlQueryBuilder()->select('SUM(points)')
->from('bonus_points')
->groupBy('id_user')
->andWhere(Operator::equals(['id_user' => 1]))
->andWhere(Operator::not(Operator::equals(['status' => 'deleted'])))
->execute()->fetchOne();
$this->assertEquals(100, $points, 'Po stornu objednavky id 1 uzivateli zbyde 100 bodu');
}
/** @dataProvider data_purchaseStateProvider */
public function testApplyActions($applyModule)
{
$applyModule();
$this->activateDiscount([1]);
$this->prepareCart();
$this->insertProduct(9);
$this->cart->addCoupon('INFLUENCER10');
$this->cart->addCoupon('INFLUENCER20');
$this->cart->createFromDB();
$pState = $this->purchaseStateUtil->createStateFromCart($this->cart);
$this->discountManager->setPurchaseState($pState);
$this->discountManager->recalculate();
$coupons = $pState->getActiveCoupons();
$data = $pState->getCustomData('points_for_other_receivers');
$this->assertEquals('INFLUENCER10', $coupons['INFLUENCER10'], 'Uplatneni kuponu na odjednavku');
$this->assertEquals(1, $data[0]['user_id'], 'Nasetovani uzivatale, ktery obdrzi body');
$this->assertEquals('INFLUENCER20', $coupons['INFLUENCER20'], 'Uplatneni slevy na odjednavce');
$this->assertEquals(3, $data[1]['user_id'], 'Nasetovani uzivatale, ktery obdrzi body');
$points = $pState->getProductsTotalPrice()->getPriceWithVat()->asFloat() * 0.1 + 100;
$this->assertEquals($points, $data[0]['points'], '5999 cena produktu, 599.9 (10%) bodu z ceny produktu + 100 bodu pevne mnozstvi', 0.01);
$points = $pState->getProductsTotalPrice()->getPriceWithVat()->asFloat() * 0.2;
$this->assertEquals($points, $data[1]['points'], '5999 cena produktu, 1199.8 (20%) bodu z ceny produktu', 0.01);
$this->order = $this->submitOrder();
// overeni zapsani bodu BonusComputerem do DB
$userBonus = sqlQueryBuilder()->select('*')->from('bonus_points')
->andWhere(Operator::inIntArray(array_column($data, 'user_id'), 'id_user'))
->execute()->fetchAllAssociative();
$this->assertEquals(1, $userBonus[2]['id_user']);
$this->assertEquals(700, $userBonus[2]['points']);
$this->assertEquals(3, $userBonus[3]['id_user']);
$this->assertEquals(1200, $userBonus[3]['points']);
}
public function getDataSet()
{
return $this->getJsonDataSetFromFile();
}
}