- Refactor Coupon : is Customer matching Coupon rules
This commit is contained in:
gmorel
2013-09-08 17:36:21 +02:00
parent 49be95a2e7
commit e78ba1f670
14 changed files with 2415 additions and 1234 deletions

View File

@@ -220,11 +220,11 @@
<service id="thelia.constraint.manager" class="Thelia\Constraint\ConstraintManager">
<argument type="service" id="service_container" />
</service>
<service id="thelia.constraint.rule.available_for_x_articles" class="Thelia\Constraint\Rule\AvailableForXArticles">
<service id="thelia.constraint.rule.available_for_x_articles" class="Thelia\Constraint\Rule\AvailableForXArticlesManager">
<argument type="service" id="thelia.translator" />
<tag name="thelia.coupon.addRule"/>
</service>
<service id="thelia.constraint.rule.available_for_total_amount" class="Thelia\Constraint\Rule\AvailableForTotalAmount">
<service id="thelia.constraint.rule.available_for_total_amount" class="Thelia\Constraint\Rule\AvailableForTotalAmountManager">
<argument type="service" id="thelia.translator" />
<tag name="thelia.coupon.addRule"/>
</service>

View File

@@ -25,9 +25,7 @@ namespace Thelia\Constraint;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
use Symfony\Component\Serializer\Serializer;
use Thelia\Constraint\Rule\AvailableForTotalAmountManager;
use Thelia\Constraint\Rule\CouponRuleInterface;
use Thelia\Constraint\Rule\SerializableRule;
use Thelia\Coupon\CouponAdapterInterface;
@@ -45,7 +43,7 @@ use Thelia\Coupon\CouponRuleCollection;
* @author Guillaume MOREL <gmorel@openstudio.fr>
*
*/
class ConstraintManager
class ConstraintFactory
{
/** @var ContainerInterface Service Container */
protected $container = null;
@@ -67,28 +65,6 @@ class ConstraintManager
$this->adapter = $container->get('thelia.adapter');
}
/**
* Check if the current Coupon is matching its conditions (Rules)
* Thelia variables are given by the CouponAdapterInterface
*
* @param CouponRuleCollection $collection A collection of rules
*
* @return bool
*/
public function isMatching(CouponRuleCollection $collection)
{
$isMatching = true;
/** @var CouponRuleInterface $rule */
foreach ($collection->getRules() as $rule) {
if (!$rule->isMatching($this->adapter)) {
$isMatching = false;
}
}
return $isMatching;
}
/**
* Serialize a collection of rules
*
@@ -128,8 +104,8 @@ class ConstraintManager
foreach ($unserializedRules as $rule) {
if ($this->container->has($rule->ruleServiceId)) {
/** @var CouponRuleInterface $couponRule */
$couponRule = $this->container->get($rule->ruleServiceId);
$couponRule->populateFromForm(
$couponRule = $this->build(
$rule->ruleServiceId,
(array) $rule->operators,
(array) $rule->values
);
@@ -140,4 +116,28 @@ class ConstraintManager
return $collection;
}
/**
* Build a Coupon Rule from form
*
* @param string $ruleServiceId Rule class name
* @param array $operators Rule Operator (<, >, = )
* @param array $values Values setting this Rule
*
* @throws \InvalidArgumentException
* @return CouponRuleInterface Ready to use Rule or false
*/
public function build($ruleServiceId, array $operators, array $values)
{
if (!$this->container->has($ruleServiceId)) {
return false;
}
/** @var CouponRuleInterface $rule */
$rule = $this->container->get($ruleServiceId);
$rule->setValidatorsFromForm($operators, $values);
return $rule;
}
}

View File

@@ -0,0 +1,133 @@
<?php
/**********************************************************************************/
/* */
/* Thelia */
/* */
/* Copyright (c) OpenStudio */
/* email : info@thelia.net */
/* web : http://www.thelia.net */
/* */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 3 of the License */
/* */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* */
/**********************************************************************************/
namespace Thelia\Constraint;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Thelia\Constraint\Rule\AvailableForTotalAmountManager;
use Thelia\Constraint\Rule\CouponRuleInterface;
use Thelia\Constraint\Rule\Operators;
use Thelia\Coupon\CouponRuleCollection;
/**
* Created by JetBrains PhpStorm.
* Date: 8/19/13
* Time: 3:24 PM
*
* Validate Constraints
*
* @package Constraint
* @author Guillaume MOREL <gmorel@openstudio.fr>
*
*/
class ConstraintValidator
{
/**
* Check if a Customer meets SerializableRule
*
* @param CouponRuleCollection $rules Rules to check against the Customer
*
* @return bool
*/
public function test(CouponRuleCollection $rules)
{
$isMatching = true;
/** @var CouponRuleInterface $rule */
foreach ($rules->getRules() as $rule) {
if (!$rule->isMatching()) {
$isMatching = false;
}
}
return $isMatching;
}
/**
* Do variable comparison
*
* @param mixed $v1 Variable 1
* @param string $o Operator
*
* @param mixed $v2 Variable 2
* @throws \Exception
* @return bool
*/
public function variableOpComparison($v1, $o, $v2) {
if ($o == Operators::DIFFERENT) {
return ($v1 != $v2);
} // could put this elsewhere...
// $operators = str_split($o);
// foreach($o as $operator) {
switch ($o) { // return will exit switch, foreach loop, function
case Operators::SUPERIOR : // >
if ($v1 > $v2) {
return true;
} else {
continue;
} break;
case Operators::SUPERIOR_OR_EQUAL : // >=
if ($v1 >= $v2) {
return true;
} else {
continue;
} break;
case Operators::INFERIOR : // <
if ($v1 < $v2) {
return true;
} else {
continue;
} break;
case Operators::INFERIOR_OR_EQUAL : // <=
if ($v1 <= $v2) {
return true;
} else {
continue;
} break;
case Operators::EQUAL : // ==
if ($v1 == $v2) {
return true;
} else {
continue;
} break;
case Operators::IN:
if (in_array($v1, $v2)) { // in
return true;
} else {
continue;
} break;
case Operators::OUT:
if (!in_array($v1, $v2)) { // not in
return true;
} else {
continue;
} break;
default: throw new \Exception('Unrecognized operator ' . $o);
}
// }
return false;
}
}

View File

@@ -25,12 +25,14 @@ namespace Thelia\Constraint\Rule;
use Symfony\Component\Intl\Exception\NotImplementedException;
use Symfony\Component\Translation\Translator;
use Thelia\Constraint\ConstraintValidator;
use Thelia\Coupon\CouponAdapterInterface;
use Thelia\Constraint\Validator\PriceParam;
use Thelia\Constraint\Validator\RuleValidator;
use Thelia\Exception\InvalidRuleException;
use Thelia\Exception\InvalidRuleOperatorException;
use Thelia\Exception\InvalidRuleValueException;
use Thelia\Type\FloatType;
/**
* Created by JetBrains PhpStorm.
@@ -44,26 +46,33 @@ use Thelia\Exception\InvalidRuleValueException;
* @author Guillaume MOREL <gmorel@openstudio.fr>
*
*/
class AvailableForTotalAmount extends CouponRuleAbstract
class AvailableForTotalAmountManager extends CouponRuleAbstract
{
/** Rule 1st parameter : price */
CONST PARAM1_PRICE = 'price';
CONST INPUT1 = 'price';
/** Rule 1st parameter : currency */
CONST PARAM1_CURRENCY = 'currency';
CONST INPUT2 = 'currency';
/** @var string Service Id from Resources/config.xml */
protected $serviceId = 'thelia.constraint.rule.available_for_total_amount';
/** @var array Available Operators (Operators::CONST) */
protected $availableOperators = array(
Operators::INFERIOR,
Operators::EQUAL,
Operators::SUPERIOR,
self::INPUT1 => array(
Operators::INFERIOR,
Operators::INFERIOR_OR_EQUAL,
Operators::EQUAL,
Operators::SUPERIOR_OR_EQUAL,
Operators::SUPERIOR
),
self::INPUT2 => array(
Operators::EQUAL,
)
);
/** @var RuleValidator Price Validator */
protected $priceValidator = null;
// /** @var RuleValidator Price Validator */
// protected $priceValidator = null;
/**
* Check if backoffice inputs are relevant or not
@@ -96,34 +105,146 @@ class AvailableForTotalAmount extends CouponRuleAbstract
return $this->isPriceValid($price->getPrice(), $price->getCurrency());
}
// /**
// * Check if Checkout inputs are relevant or not
// *
// * @throws InvalidRuleValueException if Value is not allowed
// * @return bool
// */
// public function checkCheckoutInput()
// {
// $currency = $this->adapter->getCheckoutCurrency();
// if (empty($currency)) {
// throw new InvalidRuleValueException(
// get_class(), self::PARAM1_CURRENCY
// );
// }
//
// $price = $this->adapter->getCartTotalPrice();
// if (empty($price)) {
// throw new InvalidRuleValueException(
// get_class(), self::PARAM1_PRICE
// );
// }
//
// $this->paramsToValidate = array(
// self::PARAM1_PRICE => $this->adapter->getCartTotalPrice(),
// self::PARAM1_CURRENCY => $this->adapter->getCheckoutCurrency()
// );
//
// return $this->isPriceValid($price, $currency);
// }
/**
* Check if Checkout inputs are relevant or not
* Check validators relevancy and store them
*
* @throws InvalidRuleValueException if Value is not allowed
* @return bool
* @param array $operators Operators the Admin set in BackOffice
* @param array $values Values the Admin set in BackOffice
*
* @throws \InvalidArgumentException
* @return $this
*/
public function checkCheckoutInput()
public function setValidatorsFromForm(array $operators, array $values)
{
$currency = $this->adapter->getCheckoutCurrency();
if (empty($currency)) {
throw new InvalidRuleValueException(
get_class(), self::PARAM1_CURRENCY
);
}
$price = $this->adapter->getCartTotalPrice();
if (empty($price)) {
throw new InvalidRuleValueException(
get_class(), self::PARAM1_PRICE
);
}
$this->paramsToValidate = array(
self::PARAM1_PRICE => $this->adapter->getCartTotalPrice(),
self::PARAM1_CURRENCY => $this->adapter->getCheckoutCurrency()
$this->setValidators(
$operators[self::INPUT1],
$values[self::INPUT1],
$operators[self::INPUT2],
$values[self::INPUT2]
);
return $this->isPriceValid($price, $currency);
return $this;
}
/**
* Check validators relevancy and store them
*
* @param string $priceOperator Price Operator ex <
* @param float $priceValue Price set to meet condition
* @param string $currencyOperator Currency Operator ex =
* @param string $currencyValue Currency set to meet condition
*
* @throws \InvalidArgumentException
* @return $this
*/
protected function setValidators($priceOperator, $priceValue, $currencyOperator, $currencyValue)
{
$isOperator1Legit = $this->isOperatorLegit(
$priceOperator,
$this->availableOperators[self::INPUT1]
);
if (!$isOperator1Legit) {
throw new \InvalidArgumentException(
'Operator for price field is not legit'
);
}
$isOperator1Legit = $this->isOperatorLegit(
$currencyOperator,
$this->availableOperators[self::INPUT2]
);
if (!$isOperator1Legit) {
throw new \InvalidArgumentException(
'Operator for currency field is not legit'
);
}
$floatType = new FloatType();
if (!$floatType->isValid($priceValue) || $priceValue <= 0) {
throw new \InvalidArgumentException(
'Value for price field is not legit'
);
}
// @todo check currency is legit or not
$this->operators = array(
self::INPUT1 => $priceOperator,
self::INPUT2 => $currencyOperator,
);
$this->values = array(
self::INPUT1 => $priceValue,
self::INPUT2 => $currencyValue,
);
return $this;
}
/**
* Test if Customer meets conditions
*
* @return bool
*/
public function isMatching()
{
$isOperator1Legit = $this->isOperatorLegit(
$this->operators[self::INPUT1],
$this->availableOperators[self::INPUT1]
);
$isOperator2Legit = $this->isOperatorLegit(
$this->operators[self::INPUT2],
$this->availableOperators[self::INPUT2]
);
if (!$isOperator1Legit || !$isOperator2Legit) {
return false;
}
$constrainValidator = new ConstraintValidator();
$constraint1 =$constrainValidator->variableOpComparison(
$this->adapter->getCartTotalPrice(),
$this->operators[self::INPUT1],
$this->values[self::INPUT1]
);
$constraint2 =$constrainValidator->variableOpComparison(
$this->adapter->getCheckoutCurrency(),
$this->operators[self::INPUT2],
$this->values[self::INPUT2]
);
if ($constraint1 && $constraint2) {
return true;
}
return false;
}
/**
@@ -154,20 +275,20 @@ class AvailableForTotalAmount extends CouponRuleAbstract
return true;
}
/**
* Generate current Rule param to be validated from adapter
*
* @return $this
*/
protected function setParametersToValidate()
{
$this->paramsToValidate = array(
self::PARAM1_PRICE => $this->adapter->getCartTotalPrice(),
self::PARAM1_CURRENCY => $this->adapter->getCheckoutCurrency()
);
return $this;
}
// /**
// * Generate current Rule param to be validated from adapter
// *
// * @return $this
// */
// protected function setParametersToValidate()
// {
// $this->paramsToValidate = array(
// self::PARAM1_PRICE => $this->adapter->getCartTotalPrice(),
// self::PARAM1_CURRENCY => $this->adapter->getCheckoutCurrency()
// );
//
// return $this;
// }
/**
* Get I18n name
@@ -207,38 +328,38 @@ class AvailableForTotalAmount extends CouponRuleAbstract
return $toolTip;
}
/**
* Populate a Rule from a form admin
*
* @param array $operators Rule Operator set by the Admin
* @param array $values Rule Values set by the Admin
*
* @throws \InvalidArgumentException
* @return $this
*/
public function populateFromForm(array $operators, array $values)
{
if ($values[self::PARAM1_PRICE] === null
|| $values[self::PARAM1_CURRENCY] === null
) {
throw new \InvalidArgumentException(
'The Rule ' . get_class() . 'needs at least a quantity set (' . self::PARAM1_PRICE . ', ' . self::PARAM1_CURRENCY . ')'
);
}
$this->priceValidator = new RuleValidator(
$operators[self::PARAM1_PRICE],
new PriceParam(
$this->translator,
$values[self::PARAM1_PRICE],
$values[self::PARAM1_CURRENCY]
)
);
$this->validators = array(self::PARAM1_PRICE => $this->priceValidator);
return $this;
}
// /**
// * Populate a Rule from a form admin
// *
// * @param array $operators Rule Operator set by the Admin
// * @param array $values Rule Values set by the Admin
// *
// * @throws \InvalidArgumentException
// * @return $this
// */
// public function populateFromForm(array $operators, array $values)
// {
// if ($values[self::PARAM1_PRICE] === null
// || $values[self::PARAM1_CURRENCY] === null
// ) {
// throw new \InvalidArgumentException(
// 'The Rule ' . get_class() . 'needs at least a quantity set (' . self::PARAM1_PRICE . ', ' . self::PARAM1_CURRENCY . ')'
// );
// }
//
// $this->priceValidator = new RuleValidator(
// $operators[self::PARAM1_PRICE],
// new PriceParam(
// $this->translator,
// $values[self::PARAM1_PRICE],
// $values[self::PARAM1_CURRENCY]
// )
// );
//
// $this->validators = array(self::PARAM1_PRICE => $this->priceValidator);
//
// return $this;
// }
/**
* Return a serializable Rule
@@ -249,14 +370,9 @@ class AvailableForTotalAmount extends CouponRuleAbstract
{
$serializableRule = new SerializableRule();
$serializableRule->ruleServiceId = $this->serviceId;
$serializableRule->operators = array(
self::PARAM1_PRICE => $this->priceValidator->getOperator()
);
$serializableRule->operators = $this->operators;
$serializableRule->values = array(
self::PARAM1_PRICE => $this->priceValidator->getParam()->getPrice(),
self::PARAM1_CURRENCY => $this->priceValidator->getParam()->getCurrency()
);
$serializableRule->values = $this->values;
return $serializableRule;
}

View File

@@ -25,10 +25,13 @@ namespace Thelia\Constraint\Rule;
use InvalidArgumentException;
use Symfony\Component\Translation\Translator;
use Thelia\Constraint\ConstraintValidator;
use Thelia\Constraint\Validator\QuantityParam;
use Thelia\Constraint\Validator\RuleValidator;
use Thelia\Coupon\CouponAdapterInterface;
use Thelia\Exception\InvalidRuleException;
use Thelia\Exception\InvalidRuleValueException;
use Thelia\Type\FloatType;
/**
* Created by JetBrains PhpStorm.
@@ -41,19 +44,23 @@ use Thelia\Exception\InvalidRuleValueException;
* @author Guillaume MOREL <gmorel@openstudio.fr>
*
*/
class AvailableForXArticles extends CouponRuleAbstract
class AvailableForXArticlesManager extends CouponRuleAbstract
{
/** Rule 1st parameter : quantity */
CONST PARAM1_QUANTITY = 'quantity';
CONST INPUT1 = 'quantity';
/** @var string Service Id from Resources/config.xml */
protected $serviceId = 'thelia.constraint.rule.available_for_x_articles';
/** @var array Available Operators (Operators::CONST) */
protected $availableOperators = array(
Operators::INFERIOR,
Operators::EQUAL,
Operators::SUPERIOR,
self::INPUT1 => array(
Operators::INFERIOR,
Operators::INFERIOR_OR_EQUAL,
Operators::EQUAL,
Operators::SUPERIOR_OR_EQUAL,
Operators::SUPERIOR
)
);
/** @var QuantityParam Quantity Validator */
@@ -107,24 +114,100 @@ class AvailableForXArticles extends CouponRuleAbstract
return $this;
}
// /**
// * Check if Checkout inputs are relevant or not
// *
// * @throws \Thelia\Exception\InvalidRuleValueException
// * @return bool
// */
// public function checkCheckoutInput()
// {
// if (!isset($this->paramsToValidate)
// || empty($this->paramsToValidate)
// ||!isset($this->paramsToValidate[self::PARAM1_QUANTITY])
// ) {
// throw new InvalidRuleValueException(get_class(), self::PARAM1_QUANTITY);
// }
//
// $price = $this->paramsToValidate[self::PARAM1_QUANTITY];
//
// return $this->isQuantityValid($price);
// }
/**
* Check if Checkout inputs are relevant or not
* Check validators relevancy and store them
*
* @throws \Thelia\Exception\InvalidRuleValueException
* @return bool
* @param array $operators Operators the Admin set in BackOffice
* @param array $values Values the Admin set in BackOffice
*
* @throws \InvalidArgumentException
* @return $this
*/
public function checkCheckoutInput()
public function setValidatorsFromForm(array $operators, array $values)
{
if (!isset($this->paramsToValidate)
|| empty($this->paramsToValidate)
||!isset($this->paramsToValidate[self::PARAM1_QUANTITY])
) {
throw new InvalidRuleValueException(get_class(), self::PARAM1_QUANTITY);
$this->setValidators(
$operators[self::INPUT1],
$values[self::INPUT1]
);
return $this;
}
/**
* Check validators relevancy and store them
*
* @param string $quantityOperator Quantity Operator ex <
* @param int $quantityValue Quantity set to meet condition
*
* @throws \InvalidArgumentException
* @return $this
*/
protected function setValidators($quantityOperator, $quantityValue)
{
$isOperator1Legit = $this->isOperatorLegit(
$quantityOperator,
$this->availableOperators[self::INPUT1]
);
if (!$isOperator1Legit) {
throw new \InvalidArgumentException(
'Operator for quantity field is not legit'
);
}
$price = $this->paramsToValidate[self::PARAM1_QUANTITY];
if (!is_int($quantityValue) || $quantityValue <= 0) {
throw new \InvalidArgumentException(
'Value for quantity field is not legit'
);
}
return $this->isQuantityValid($price);
$this->operators = array(
self::INPUT1 => $quantityOperator,
);
$this->values = array(
self::INPUT1 => $quantityValue,
);
return $this;
}
/**
* Test if Customer meets conditions
*
* @return bool
*/
public function isMatching()
{
$constrainValidator = new ConstraintValidator();
$constraint1 =$constrainValidator->variableOpComparison(
$this->adapter->getNbArticlesInCart(),
$this->operators[self::INPUT1],
$this->values[self::INPUT1]
);
if ($constraint1) {
return true;
}
return false;
}
/**
@@ -184,35 +267,35 @@ class AvailableForXArticles extends CouponRuleAbstract
return $toolTip;
}
/**
* Populate a Rule from a form admin
*
* @param array $operators Rule Operator set by the Admin
* @param array $values Rule Values set by the Admin
*
* @throws InvalidArgumentException
* @return $this
*/
public function populateFromForm(array $operators, array $values)
{
if ($values[self::PARAM1_QUANTITY] === null) {
throw new InvalidArgumentException(
'The Rule ' . get_class() . 'needs at least a quantity set (' . self::PARAM1_QUANTITY. ')'
);
}
$this->quantityValidator = new RuleValidator(
$operators[self::PARAM1_QUANTITY],
new QuantityParam(
$this->adapter,
$values[self::PARAM1_QUANTITY]
)
);
$this->validators = array(self::PARAM1_QUANTITY => $this->quantityValidator);
return $this;
}
// /**
// * Populate a Rule from a form admin
// *
// * @param array $operators Rule Operator set by the Admin
// * @param array $values Rule Values set by the Admin
// *
// * @throws InvalidArgumentException
// * @return $this
// */
// public function populateFromForm(array $operators, array $values)
// {
// if ($values[self::PARAM1_QUANTITY] === null) {
// throw new InvalidArgumentException(
// 'The Rule ' . get_class() . 'needs at least a quantity set (' . self::PARAM1_QUANTITY. ')'
// );
// }
//
// $this->quantityValidator = new RuleValidator(
// $operators[self::PARAM1_QUANTITY],
// new QuantityParam(
// $this->adapter,
// $values[self::PARAM1_QUANTITY]
// )
// );
//
// $this->validators = array(self::PARAM1_QUANTITY => $this->quantityValidator);
//
// return $this;
// }
/**
* Return a serializable Rule

View File

@@ -67,6 +67,12 @@ abstract class CouponRuleAbstract implements CouponRuleInterface
/** @var Translator Service Translator */
protected $translator = null;
/** @var array Operators set by Admin in BackOffice */
protected $operators = array();
/** @var array Values set by Admin in BackOffice */
protected $values = array();
/**
* Constructor
*
@@ -78,59 +84,61 @@ abstract class CouponRuleAbstract implements CouponRuleInterface
$this->translator = $adapter->getTranslator();
}
/**
* Check validator relevancy and store them
*
* @param array $validators Array of RuleValidator
* validating $paramsToValidate against
*
* @return $this
* @throws InvalidRuleException
*/
protected function setValidators(array $validators)
{
foreach ($validators as $validator) {
if (!$validator instanceof RuleValidator) {
throw new InvalidRuleException(get_class());
}
if (!in_array($validator->getOperator(), $this->availableOperators)) {
throw new InvalidRuleOperatorException(
get_class(),
$validator->getOperator()
);
}
}
$this->validators = $validators;
// /**
// * Check validator relevancy and store them
// *
// * @param array $validators Array of RuleValidator
// * validating $paramsToValidate against
// *
// * @return $this
// * @throws InvalidRuleException
// */
// protected function setValidators(array $validators)
// {
// foreach ($validators as $validator) {
// if (!$validator instanceof RuleValidator) {
// throw new InvalidRuleException(get_class());
// }
// if (!in_array($validator->getOperator(), $this->availableOperators)) {
// throw new InvalidRuleOperatorException(
// get_class(),
// $validator->getOperator()
// );
// }
// }
// $this->validators = $validators;
//
// return $this;
// }
return $this;
}
/**
* Check if the current Checkout matches this condition
*
* @return bool
*/
public function isMatching()
{
$this->checkBackOfficeInput();
$this->checkCheckoutInput();
$isMatching = true;
/** @var $validator RuleValidator*/
foreach ($this->validators as $param => $validator) {
$a = $this->paramsToValidate[$param];
$operator = $validator->getOperator();
/** @var ComparableInterface, RuleParameterAbstract $b */
$b = $validator->getParam();
if (!Operators::isValid($a, $operator, $b)) {
$isMatching = false;
}
}
return $isMatching;
}
// /**
// * Check if the current Checkout matches this condition
// *
// * @return bool
// */
// public function isMatching()
// {
// $this->checkBackOfficeInput();
// $this->checkCheckoutInput();
//
// $isMatching = true;
// /** @var $validator RuleValidator*/
// foreach ($this->validators as $param => $validator) {
// $a = $this->paramsToValidate[$param];
// $operator = $validator->getOperator();
// /** @var ComparableInterface, RuleParameterAbstract $b */
// $b = $validator->getParam();
//
// if (!Operators::isValid($a, $operator, $b)) {
// $isMatching = false;
// }
// }
//
// return $isMatching;
//
// }
/**
* Return all available Operators for this Rule
@@ -162,16 +170,16 @@ abstract class CouponRuleAbstract implements CouponRuleInterface
return true;
}
/**
* Generate current Rule param to be validated from adapter
*
* @throws \Thelia\Exception\NotImplementedException
* @return $this
*/
protected function setParametersToValidate()
{
throw new \Thelia\Exception\NotImplementedException();
}
// /**
// * Generate current Rule param to be validated from adapter
// *
// * @throws \Thelia\Exception\NotImplementedException
// * @return $this
// */
// protected function setParametersToValidate()
// {
// throw new \Thelia\Exception\NotImplementedException();
// }
/**
* Return all validators
@@ -194,6 +202,17 @@ abstract class CouponRuleAbstract implements CouponRuleInterface
return $this->serviceId;
}
/**
* Validate if Operator given is available for this Coupon
*
* @param string $operator Operator to validate ex <
* @param array $availableOperators Available operators
*
* @return bool
*/
protected function isOperatorLegit($operator, array $availableOperators)
{
return in_array($operator, $availableOperators);
}
}

View File

@@ -46,6 +46,13 @@ interface CouponRuleInterface
*/
function __construct(CouponAdapterInterface $adapter);
/**
* Get Rule Service id
*
* @return string
*/
public function getServiceId();
/**
* Check if backoffice inputs are relevant or not
*
@@ -53,15 +60,33 @@ interface CouponRuleInterface
*/
public function checkBackOfficeInput();
/**
* Check if Checkout inputs are relevant or not
*
* @return bool
*/
public function checkCheckoutInput();
// /**
// * Check if Checkout inputs are relevant or not
// *
// * @return bool
// */
// public function checkCheckoutInput();
/**
* Check if the current Checkout matches this condition
* Check validators relevancy and store them
*
* @param array $operators Operators the Admin set in BackOffice
* @param array $values Values the Admin set in BackOffice
*
* @throws \InvalidArgumentException
* @return $this
*/
public function setValidatorsFromForm(array $operators, array $values);
// /**
// * Check if the current Checkout matches this condition
// *
// * @return bool
// */
// public function isMatching();
/**
* Test if Customer meets conditions
*
* @return bool
*/
@@ -96,15 +121,15 @@ interface CouponRuleInterface
*/
public function getValidators();
/**
* Populate a Rule from a form admin
*
* @param array $operators Rule Operator set by the Admin
* @param array $values Rule Values set by the Admin
*
* @return bool
*/
public function populateFromForm(array$operators, array $values);
// /**
// * Populate a Rule from a form admin
// *
// * @param array $operators Rule Operator set by the Admin
// * @param array $values Rule Values set by the Admin
// *
// * @return bool
// */
// public function populateFromForm(array$operators, array $values);
/**

View File

@@ -51,62 +51,66 @@ abstract class Operators
CONST SUPERIOR = '>';
/** Param1 is different to Param2 */
CONST DIFFERENT = '!=';
/** Param1 is in Param2 */
CONST IN = 'in';
/** Param1 is not in Param2 */
CONST OUT = 'out';
/**
* Check if a parameter is valid against a ComparableInterface from its operator
*
* @param mixed $a Parameter to validate
* @param string $operator Operator to validate against
* @param ComparableInterface $b Comparable to validate against
*
* @return bool
*/
public static function isValid($a, $operator, ComparableInterface $b)
{
$ret = false;
try {
$comparison = $b->compareTo($a);
} catch (\Exception $e) {
return false;
}
switch ($operator) {
case self::INFERIOR:
if ($comparison == 1) {
return true;
}
break;
case self::INFERIOR_OR_EQUAL:
if ($comparison == 1 || $comparison == 0) {
return true;
}
break;
case self::EQUAL:
if ($comparison == 0) {
return true;
}
break;
case self::SUPERIOR_OR_EQUAL:
if ($comparison == -1 || $comparison == 0) {
return true;
}
break;
case self::SUPERIOR:
if ($comparison == -1) {
return true;
}
break;
case self::DIFFERENT:
if ($comparison != 0) {
return true;
}
break;
default:
}
return $ret;
}
// /**
// * Check if a parameter is valid against a ComparableInterface from its operator
// *
// * @param mixed $a Parameter to validate
// * @param string $operator Operator to validate against
// * @param ComparableInterface $b Comparable to validate against
// *
// * @return bool
// */
// public static function isValid($a, $operator, ComparableInterface $b)
// {
// $ret = false;
//
// try {
// $comparison = $b->compareTo($a);
// } catch (\Exception $e) {
// return false;
// }
//
// switch ($operator) {
// case self::INFERIOR:
// if ($comparison == 1) {
// return true;
// }
// break;
// case self::INFERIOR_OR_EQUAL:
// if ($comparison == 1 || $comparison == 0) {
// return true;
// }
// break;
// case self::EQUAL:
// if ($comparison == 0) {
// return true;
// }
// break;
// case self::SUPERIOR_OR_EQUAL:
// if ($comparison == -1 || $comparison == 0) {
// return true;
// }
// break;
// case self::SUPERIOR:
// if ($comparison == -1) {
// return true;
// }
// break;
// case self::DIFFERENT:
// if ($comparison != 0) {
// return true;
// }
// break;
// default:
// }
//
// return $ret;
// }
/**
* Get operator translation
@@ -162,6 +166,20 @@ abstract class Operators
'constraint'
);
break;
case self::IN:
$ret = $translator->trans(
'in',
array(),
'constraint'
);
break;
case self::OUT:
$ret = $translator->trans(
'not in',
array(),
'constraint'
);
break;
default:
}

View File

@@ -128,25 +128,5 @@ class CouponFactory
}
// /**
// * Build a Coupon Rule from form
// *
// * @param string $type Rule class name
// * @param string $operator Rule Operator (<, >, = )
// * @param array $values Values setting this Rule
// *
// * @return CouponRuleInterface Ready to use Rule or false
// */
// public function buildCouponRuleFromForm($ruleServiceId, $operator, array $values)
// {
// /** @var CouponAdapterInterface $adapter */
// $adapter = $this->container->get('thelia.adapter');
// $validator = new PriceParam()
// try {
// $rule = new AvailableForTotalAmount($adapter, $validators);
// $rule = new $type($adapter, $validators);
// } catch (\Exception $e) {
// return false;
// }
// }
}

View File

@@ -24,17 +24,11 @@
namespace Thelia\Constraint;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Thelia\Constraint\Rule\AvailableForXArticles;
use Thelia\Constraint\Validator\PriceParam;
use Thelia\Constraint\Validator\RuleValidator;
use Thelia\Constraint\Rule\AvailableForTotalAmount;
use Thelia\Constraint\Rule\AvailableForTotalAmountManager;
use Thelia\Constraint\Rule\AvailableForXArticlesManager;
use Thelia\Constraint\Rule\Operators;
use Thelia\Coupon\CouponBaseAdapter;
use Thelia\Coupon\CouponBaseAdapterTest;
use Thelia\Coupon\CouponRuleCollection;
use Thelia\Coupon\Type\CouponInterface;
use Thelia\Coupon\Type\RemoveXAmount;
use Thelia\Tools\PhpUnitUtils;
/**
* Created by JetBrains PhpStorm.
@@ -47,7 +41,7 @@ use Thelia\Tools\PhpUnitUtils;
* @author Guillaume MOREL <gmorel@openstudio.fr>
*
*/
class ConstraintManagerTest extends \PHPUnit_Framework_TestCase
class ConstraintFactoryTest extends \PHPUnit_Framework_TestCase
{
/**
@@ -59,9 +53,9 @@ class ConstraintManagerTest extends \PHPUnit_Framework_TestCase
}
/**
* Check the if the Constraint Manager is able to check RuleValidators
* Check the Rules serialization module
*/
public function testIsMatching()
public function testBuild()
{
$stubTranslator = $this->getMockBuilder('\Thelia\Core\Translation\Translator')
->disableOriginalConstructor()
@@ -75,43 +69,68 @@ class ConstraintManagerTest extends \PHPUnit_Framework_TestCase
->method('getTranslator')
->will($this->returnValue($stubTranslator));
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(321.98));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('USD'));
$rule1 = new AvailableForTotalAmount($stubAdapter);
$operators = array(AvailableForTotalAmount::PARAM1_PRICE => Operators::SUPERIOR);
$values = array(
AvailableForTotalAmount::PARAM1_PRICE => 40.00,
AvailableForTotalAmount::PARAM1_CURRENCY => 'USD'
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => Operators::SUPERIOR,
AvailableForTotalAmountManager::INPUT2 => Operators::EQUAL
);
$rule1->populateFromForm($operators, $values);
$rule2 = new AvailableForTotalAmount($stubAdapter);
$operators = array(AvailableForTotalAmount::PARAM1_PRICE => Operators::INFERIOR);
$values = array(
AvailableForTotalAmount::PARAM1_PRICE => 400.00,
AvailableForTotalAmount::PARAM1_CURRENCY => 'USD'
AvailableForTotalAmountManager::INPUT1 => 40.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR'
);
$rule2->populateFromForm($operators, $values);
$rules = new CouponRuleCollection();
$rules->add($rule1);
$rules->add($rule2);
$rule1->setValidatorsFromForm($operators, $values);
/** @var ConstraintManager $constraintManager */
$constraintManager = new ConstraintManager($this->getContainer());
$constraintFactory = new ConstraintFactory($this->getContainer());
$ruleManager1 = $constraintFactory->build($rule1->getServiceId(), $operators, $values);
$expected = true;
$actual = $constraintManager->isMatching($rules);
$expected = $rule1;
$actual = $ruleManager1;
$this->assertEquals($expected, $actual, 'The ConstraintManager is no more able to check if a Rule is matching');
$this->assertEquals($expected, $actual);
$this->assertEquals($rule1->getServiceId(), $ruleManager1->getServiceId());
$this->assertEquals($rule1->getValidators(), $ruleManager1->getValidators());
}
/**
* Check the Rules serialization module
*/
public function testBuildFail()
{
$stubTranslator = $this->getMockBuilder('\Thelia\Core\Translation\Translator')
->disableOriginalConstructor()
->getMock();
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getTranslator')
->will($this->returnValue($stubTranslator));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => Operators::SUPERIOR,
AvailableForTotalAmountManager::INPUT2 => Operators::EQUAL
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 40.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR'
);
$rule1->setValidatorsFromForm($operators, $values);
/** @var ConstraintManager $constraintManager */
$constraintFactory = new ConstraintFactory($this->getContainer());
$ruleManager1 = $constraintFactory->build('unset.service', $operators, $values);
$expected = false;
$actual = $ruleManager1;
$this->assertEquals($expected, $actual);
}
/**
* Check the Rules serialization module
*/
@@ -129,31 +148,37 @@ class ConstraintManagerTest extends \PHPUnit_Framework_TestCase
->method('getTranslator')
->will($this->returnValue($stubTranslator));
$rule1 = new AvailableForTotalAmount($stubAdapter);
$operators = array(AvailableForTotalAmount::PARAM1_PRICE => Operators::SUPERIOR);
$values = array(
AvailableForTotalAmount::PARAM1_PRICE => 40.00,
AvailableForTotalAmount::PARAM1_CURRENCY => 'EUR'
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => Operators::SUPERIOR,
AvailableForTotalAmountManager::INPUT2 => Operators::EQUAL
);
$rule1->populateFromForm($operators, $values);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 40.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR'
);
$rule1->setValidatorsFromForm($operators, $values);
$rule2 = new AvailableForTotalAmount($stubAdapter);
$operators = array(AvailableForTotalAmount::PARAM1_PRICE => Operators::INFERIOR);
$values = array(
AvailableForTotalAmount::PARAM1_PRICE => 400.00,
AvailableForTotalAmount::PARAM1_CURRENCY => 'EUR'
$rule2 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => Operators::SUPERIOR,
AvailableForTotalAmountManager::INPUT2 => Operators::EQUAL
);
$rule2->populateFromForm($operators, $values);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR'
);
$rule2->setValidatorsFromForm($operators, $values);
$rules = new CouponRuleCollection();
$rules->add($rule1);
$rules->add($rule2);
/** @var ConstraintManager $constraintManager */
$constraintManager = new ConstraintManager($this->getContainer());
$constraintFactory = new ConstraintFactory($this->getContainer());
$serializedRules = $constraintManager->serializeCouponRuleCollection($rules);
$unserializedRules = $constraintManager->unserializeCouponRuleCollection($serializedRules);
$serializedRules = $constraintFactory->serializeCouponRuleCollection($rules);
$unserializedRules = $constraintFactory->unserializeCouponRuleCollection($serializedRules);
$expected = (string)$rules;
$actual = (string)$unserializedRules;
@@ -182,8 +207,8 @@ class ConstraintManagerTest extends \PHPUnit_Framework_TestCase
->method('getTranslator')
->will($this->returnValue($stubTranslator));
$rule1 = new AvailableForTotalAmount($stubAdapter);
$rule2 = new AvailableForXArticles($stubAdapter);
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$rule2 = new AvailableForXArticlesManager($stubAdapter);
$adapter = new CouponBaseAdapter($container);

View File

@@ -0,0 +1,337 @@
<?php
/**********************************************************************************/
/* */
/* Thelia */
/* */
/* Copyright (c) OpenStudio */
/* email : info@thelia.net */
/* web : http://www.thelia.net */
/* */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 3 of the License */
/* */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* */
/**********************************************************************************/
namespace Thelia\Constraint;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Thelia\Constraint\Rule\AvailableForTotalAmountManager;
use Thelia\Constraint\Rule\AvailableForXArticlesManager;
use Thelia\Constraint\Rule\Operators;
use Thelia\Coupon\CouponBaseAdapter;
use Thelia\Coupon\CouponRuleCollection;
/**
* Created by JetBrains PhpStorm.
* Date: 8/19/13
* Time: 3:24 PM
*
* Unit Test ConstraintValidator Class
*
* @package Constraint
* @author Guillaume MOREL <gmorel@openstudio.fr>
*
*/
class ConstraintValidatorTest extends \PHPUnit_Framework_TestCase
{
/**
* Sets up the fixture, for example, opens a network connection.
* This method is called before a test is executed.
*/
public function setUp()
{
}
public function testTestSuccess1Rules()
{
$ConstraintValidator = new ConstraintValidator();
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(401));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('EUR'));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => '>',
AvailableForTotalAmountManager::INPUT2 => '=='
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR');
$rule1->setValidatorsFromForm($operators, $values);
$rules = new CouponRuleCollection();
$rules->add($rule1);
$isValid = $ConstraintValidator->test($rules);
$expected = true;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
public function testTestFail1Rules()
{
$ConstraintValidator = new ConstraintValidator();
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(400));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('EUR'));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => '>',
AvailableForTotalAmountManager::INPUT2 => '=='
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR');
$rule1->setValidatorsFromForm($operators, $values);
$rules = new CouponRuleCollection();
$rules->add($rule1);
$isValid = $ConstraintValidator->test($rules);
$expected = false;
$actual =$isValid;
$this->assertEquals($expected, $actual, 'Constraints validator always think Customer is matching rules');
}
public function testTestSuccess2Rules()
{
$ConstraintValidator = new ConstraintValidator();
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(401));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('EUR'));
$stubAdapter->expects($this->any())
->method('getNbArticlesInCart')
->will($this->returnValue(5));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => '>',
AvailableForTotalAmountManager::INPUT2 => '=='
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR');
$rule1->setValidatorsFromForm($operators, $values);
$rule2 = new AvailableForXArticlesManager($stubAdapter);
$operators = array(
AvailableForXArticlesManager::INPUT1 => '>'
);
$values = array(
AvailableForXArticlesManager::INPUT1 => 4
);
$rule2->setValidatorsFromForm($operators, $values);
$rules = new CouponRuleCollection();
$rules->add($rule1);
$rules->add($rule2);
$isValid = $ConstraintValidator->test($rules);
$expected = true;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
public function testTestFail2Rules()
{
$ConstraintValidator = new ConstraintValidator();
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(400));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('EUR'));
$stubAdapter->expects($this->any())
->method('getNbArticlesInCart')
->will($this->returnValue(5));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => '>',
AvailableForTotalAmountManager::INPUT2 => '=='
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR');
$rule1->setValidatorsFromForm($operators, $values);
$rule2 = new AvailableForXArticlesManager($stubAdapter);
$operators = array(
AvailableForXArticlesManager::INPUT1 => '>'
);
$values = array(
AvailableForXArticlesManager::INPUT1 => 4
);
$rule2->setValidatorsFromForm($operators, $values);
$rules = new CouponRuleCollection();
$rules->add($rule1);
$rules->add($rule2);
$isValid = $ConstraintValidator->test($rules);
$expected = false;
$actual =$isValid;
$this->assertEquals($expected, $actual, 'Constraints validator always think Customer is matching rules');
}
public function testVariableOpComparisonSuccess()
{
$ConstraintValidator = new ConstraintValidator();
$expected = true;
$actual = $ConstraintValidator->variableOpComparison(1, Operators::EQUAL, 1);
$this->assertEquals($expected, $actual);
$actual = $ConstraintValidator->variableOpComparison(1, Operators::DIFFERENT, 2);
$this->assertEquals($expected, $actual);
$actual = $ConstraintValidator->variableOpComparison(1, Operators::SUPERIOR, 0);
$this->assertEquals($expected, $actual);
$actual = $ConstraintValidator->variableOpComparison(1, Operators::INFERIOR, 2);
$this->assertEquals($expected, $actual);
$actual = $ConstraintValidator->variableOpComparison(1, Operators::INFERIOR_OR_EQUAL, 1);
$this->assertEquals($expected, $actual);
$actual = $ConstraintValidator->variableOpComparison(1, Operators::INFERIOR_OR_EQUAL, 2);
$this->assertEquals($expected, $actual);
$actual = $ConstraintValidator->variableOpComparison(1, Operators::SUPERIOR_OR_EQUAL, 1);
$this->assertEquals($expected, $actual);
$actual = $ConstraintValidator->variableOpComparison(1, Operators::SUPERIOR_OR_EQUAL, 0);
$this->assertEquals($expected, $actual);
$actual = $ConstraintValidator->variableOpComparison(1, Operators::IN, array(1, 2, 3));
$this->assertEquals($expected, $actual);
$actual = $ConstraintValidator->variableOpComparison(1, Operators::OUT, array(0, 2, 3));
$this->assertEquals($expected, $actual);
}
public function testVariableOpComparisonFail()
{
$ConstraintValidator = new ConstraintValidator();
$expected = false;
$actual = $ConstraintValidator->variableOpComparison(2, Operators::EQUAL, 1);
$this->assertEquals($expected, $actual);
$actual = $ConstraintValidator->variableOpComparison(2, Operators::DIFFERENT, 2);
$this->assertEquals($expected, $actual);
$actual = $ConstraintValidator->variableOpComparison(0, Operators::SUPERIOR, 0);
$this->assertEquals($expected, $actual);
$actual = $ConstraintValidator->variableOpComparison(3, Operators::INFERIOR, 2);
$this->assertEquals($expected, $actual);
$actual = $ConstraintValidator->variableOpComparison(2, Operators::INFERIOR_OR_EQUAL, 1);
$this->assertEquals($expected, $actual);
$actual = $ConstraintValidator->variableOpComparison(3, Operators::SUPERIOR_OR_EQUAL, 4);
$this->assertEquals($expected, $actual);
$actual = $ConstraintValidator->variableOpComparison(0, Operators::IN, array(1, 2, 3));
$this->assertEquals($expected, $actual);
$actual = $ConstraintValidator->variableOpComparison(2, Operators::OUT, array(0, 2, 3));
$this->assertEquals($expected, $actual);
}
/**
* @expectedException \Exception
*/
public function testVariableOpComparisonException()
{
$ConstraintValidator = new ConstraintValidator();
$expected = true;
$actual = $ConstraintValidator->variableOpComparison(1, 'bad', 1);
$this->assertEquals($expected, $actual);
}
/**
* Get Mocked Container with 2 Rules
*
* @return ContainerBuilder
*/
public function getContainer()
{
$container = new ContainerBuilder();
$stubTranslator = $this->getMockBuilder('\Thelia\Core\Translation\Translator')
->disableOriginalConstructor()
->getMock();
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getTranslator')
->will($this->returnValue($stubTranslator));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$rule2 = new AvailableForXArticlesManager($stubAdapter);
$adapter = new CouponBaseAdapter($container);
$container->set('thelia.constraint.rule.available_for_total_amount', $rule1);
$container->set('thelia.constraint.rule.available_for_x_articles', $rule2);
$container->set('thelia.adapter', $adapter);
return $container;
}
/**
* Tears down the fixture, for example, closes a network connection.
* This method is called after a test is executed.
*/
protected function tearDown()
{
}
}

View File

@@ -23,12 +23,8 @@
namespace Thelia\Coupon;
use Thelia\Constraint\Validator\PriceParam;
use Thelia\Constraint\Validator\RuleValidator;
use Thelia\Constraint\Rule\AvailableForTotalAmount;
use Thelia\Constraint\Rule\AvailableForTotalAmountManager;
use Thelia\Constraint\Rule\Operators;
use Thelia\Exception\InvalidRuleOperatorException;
use Thelia\Exception\InvalidRuleValueException;
/**
* Created by JetBrains PhpStorm.
@@ -52,344 +48,613 @@ class AvailableForTotalAmountTest extends \PHPUnit_Framework_TestCase
*/
protected function setUp()
{
/** @var CouponAdapterInterface $stubTheliaAdapter */
$this->stubTheliaAdapter = $this->generateValidCouponBaseAdapterMock();
// /** @var CouponAdapterInterface $stubTheliaAdapter */
// $this->stubTheliaAdapter = $this->generateValidCouponBaseAdapterMock();
}
/**
* Generate valid CouponBaseAdapter
*
* @param float $cartTotalPrice Total amount of the current Cart
*
* @return CouponAdapterInterface
*/
protected function generateValidCouponBaseAdapterMock($cartTotalPrice = 421.23)
{
/** @var CouponAdapterInterface $stubTheliaAdapter */
$stubTheliaAdapter = $this->getMock(
'Thelia\Coupon\CouponBaseAdapter',
array('getCartTotalPrice'),
array()
);
$stubTheliaAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue($cartTotalPrice));
// /**
// * Generate valid CouponBaseAdapter
// *
// * @param float $cartTotalPrice Total amount of the current Cart
// *
// * @return CouponAdapterInterface
// */
// protected function generateValidCouponBaseAdapterMock($cartTotalPrice = 421.23)
// {
// /** @var CouponAdapterInterface $stubTheliaAdapter */
// $stubTheliaAdapter = $this->getMock(
// 'Thelia\Coupon\CouponBaseAdapter',
// array('getCartTotalPrice'),
// array()
// );
// $stubTheliaAdapter->expects($this->any())
// ->method('getCartTotalPrice')
// ->will($this->returnValue($cartTotalPrice));
//
// return $stubTheliaAdapter;
// }
return $stubTheliaAdapter;
}
// /**
// * Check if validity test on BackOffice inputs are working
// *
// * @covers Thelia\Coupon\Rule\AvailableForTotalAmount::checkBackOfficeInput
// *
// */
// public function testValidBackOfficeInput()
// {
// $adapter = new CouponBaseAdapter();
//
// $validators = array(
// AvailableForTotalAmount::PARAM1_PRICE => new RuleValidator(
// Operators::SUPERIOR,
// new PriceParam(
// $adapter, 421.23, 'EUR'
// )
// )
// );
// $rule = new AvailableForTotalAmount($adapter, $validators);
//
// $expected = true;
// $actual = $rule->checkBackOfficeInput();
// $this->assertEquals($expected, $actual);
// }
/**
* Check if validity test on BackOffice inputs are working
*
* @covers Thelia\Coupon\Rule\AvailableForTotalAmount::checkBackOfficeInput
*
*/
public function testValidBackOfficeInput()
{
$adapter = new CouponBaseAdapter();
// /**
// * Check if validity test on BackOffice inputs are working
// *
// * @covers Thelia\Coupon\Rule\AvailableForTotalAmount::checkBackOfficeInput
// * @expectedException \Thelia\Exception\InvalidRuleOperatorException
// *
// */
// public function testInValidBackOfficeInputOperator()
// {
// $adapter = new CouponBaseAdapter();
//
// $validators = array(
// AvailableForTotalAmount::PARAM1_PRICE => new RuleValidator(
// 'X',
// new PriceParam(
// $adapter, 421.23, 'EUR'
// )
// )
// );
//
// $rule = new AvailableForTotalAmount($adapter, $validators);
//
// $expected = false;
// $actual = $rule->checkBackOfficeInput();
// $this->assertEquals($expected, $actual);
// }
$validators = array(
AvailableForTotalAmount::PARAM1_PRICE => new RuleValidator(
Operators::SUPERIOR,
new PriceParam(
$adapter, 421.23, 'EUR'
)
)
);
$rule = new AvailableForTotalAmount($adapter, $validators);
// /**
// * Check if validity test on BackOffice inputs are working
// *
// * @covers Thelia\Coupon\Rule\AvailableForTotalAmount::checkBackOfficeInput
// * @expectedException \ErrorException
// *
// */
// public function testInValidBackOfficeInputValue()
// {
// $adapter = $this->generateValidCouponBaseAdapterMock();
//
// $validators = array(
// AvailableForTotalAmount::PARAM1_PRICE => new RuleValidator(
// Operators::SUPERIOR,
// 421
// )
// );
//
// $rule = new AvailableForTotalAmount($adapter, $validators);
//
// $expected = false;
// $actual = $rule->checkBackOfficeInput();
// $this->assertEquals($expected, $actual);
// }
$expected = true;
$actual = $rule->checkBackOfficeInput();
$this->assertEquals($expected, $actual);
}
/**
* Check if validity test on BackOffice inputs are working
*
* @covers Thelia\Coupon\Rule\AvailableForTotalAmount::checkBackOfficeInput
* @expectedException \Thelia\Exception\InvalidRuleOperatorException
*
*/
public function testInValidBackOfficeInputOperator()
{
$adapter = new CouponBaseAdapter();
$validators = array(
AvailableForTotalAmount::PARAM1_PRICE => new RuleValidator(
'X',
new PriceParam(
$adapter, 421.23, 'EUR'
)
)
);
$rule = new AvailableForTotalAmount($adapter, $validators);
$expected = false;
$actual = $rule->checkBackOfficeInput();
$this->assertEquals($expected, $actual);
}
/**
* Check if validity test on BackOffice inputs are working
*
* @covers Thelia\Coupon\Rule\AvailableForTotalAmount::checkBackOfficeInput
* @expectedException \ErrorException
*
*/
public function testInValidBackOfficeInputValue()
{
$adapter = $this->generateValidCouponBaseAdapterMock();
$validators = array(
AvailableForTotalAmount::PARAM1_PRICE => new RuleValidator(
Operators::SUPERIOR,
421
)
);
$rule = new AvailableForTotalAmount($adapter, $validators);
$expected = false;
$actual = $rule->checkBackOfficeInput();
$this->assertEquals($expected, $actual);
}
/**
* Check if validity test on FrontOffice inputs are working
*
* @covers Thelia\Coupon\Rule\AvailableForTotalAmount::checkCheckoutInput
*
*/
public function testValidCheckoutInput()
{
$adapter = $this->stubTheliaAdapter;
$validators = array(
AvailableForTotalAmount::PARAM1_PRICE => new RuleValidator(
Operators::SUPERIOR,
new PriceParam(
$adapter, 421.23, 'EUR'
)
)
);
$rule = new AvailableForTotalAmount($adapter, $validators);
$expected = true;
$actual = $rule->checkCheckoutInput();
$this->assertEquals($expected, $actual);
}
/**
* Check if validity test on FrontOffice inputs are working
*
* @covers Thelia\Coupon\Rule\AvailableForTotalAmount::checkCheckoutInput
* @expectedException \Thelia\Exception\InvalidRuleValueException
*
*/
public function testInValidCheckoutInputValue()
{
$adapter = $this->generateValidCouponBaseAdapterMock(421);
$validators = array(
AvailableForTotalAmount::PARAM1_PRICE => new RuleValidator(
Operators::SUPERIOR,
new PriceParam(
$adapter, 421.23, 'EUR'
)
)
);
$rule = new AvailableForTotalAmount($adapter, $validators);
$expected = false;
$actual = $rule->checkCheckoutInput();
$this->assertEquals($expected, $actual);
}
/**
* Check if validity test on FrontOffice inputs are working
*
* @covers Thelia\Coupon\Rule\AvailableForTotalAmount::checkCheckoutInput
* @expectedException \Thelia\Exception\InvalidRuleValueException
*
*/
public function testInValidCheckoutInputType()
{
$adapter = $this->generateValidCouponBaseAdapterMock(421);
$validators = array(
AvailableForTotalAmount::PARAM1_PRICE => new RuleValidator(
Operators::SUPERIOR,
new PriceParam(
$adapter, 421.23, 'EUR'
)
)
);
$rule = new AvailableForTotalAmount($adapter, $validators);
$expected = false;
$actual = $rule->checkCheckoutInput();
$this->assertEquals($expected, $actual);
}
/**
* Check if test inferior operator is working
*
* @covers Thelia\Coupon\Rule\AvailableForTotalAmount::isMatching
* @covers Thelia\Constraint\Rule\AvailableForTotalAmountManager::isMatching
*
*/
public function testMatchingRuleInferior()
{
$adapter = $this->generateValidCouponBaseAdapterMock(421.22);
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$validators = array(
AvailableForTotalAmount::PARAM1_PRICE => new RuleValidator(
Operators::INFERIOR,
new PriceParam(
$adapter, 421.23, 'EUR'
)
)
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(399));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('EUR'));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => Operators::INFERIOR,
AvailableForTotalAmountManager::INPUT2 => Operators::EQUAL
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR');
$rule1->setValidatorsFromForm($operators, $values);
$rule = new AvailableForTotalAmount($adapter, $validators);
$isValid = $rule1->isMatching();
$expected = true;
$actual = $rule->isMatching();
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test inferior operator is working
*
* @covers Thelia\Coupon\Rule\AvailableForTotalAmount::isMatching
* @covers Thelia\Constraint\Rule\AvailableForTotalAmountManager::isMatching
*
*/
public function testNotMatchingRuleInferior()
{
$adapter = $this->generateValidCouponBaseAdapterMock(421.23);
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$validators = array(
AvailableForTotalAmount::PARAM1_PRICE => new RuleValidator(
Operators::INFERIOR,
new PriceParam(
$adapter, 421.23, 'EUR'
)
)
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(400));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('EUR'));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => Operators::INFERIOR,
AvailableForTotalAmountManager::INPUT2 => Operators::EQUAL
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR');
$rule1->setValidatorsFromForm($operators, $values);
$rule = new AvailableForTotalAmount($adapter, $validators);
$isValid = $rule1->isMatching();
$expected = false;
$actual = $rule->isMatching();
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test inferior operator is working
*
* @covers Thelia\Constraint\Rule\AvailableForTotalAmountManager::isMatching
*
*/
public function testMatchingRuleInferiorEquals()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(400));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('EUR'));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => Operators::INFERIOR_OR_EQUAL,
AvailableForTotalAmountManager::INPUT2 => Operators::EQUAL
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR');
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = true;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test inferior operator is working
*
* @covers Thelia\Constraint\Rule\AvailableForTotalAmountManager::isMatching
*
*/
public function testMatchingRuleInferiorEquals2()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(399));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('EUR'));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => Operators::INFERIOR_OR_EQUAL,
AvailableForTotalAmountManager::INPUT2 => Operators::EQUAL
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR');
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = true;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test inferior operator is working
*
* @covers Thelia\Constraint\Rule\AvailableForTotalAmountManager::isMatching
*
*/
public function testNotMatchingRuleInferiorEquals()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(401));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('EUR'));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => Operators::INFERIOR_OR_EQUAL,
AvailableForTotalAmountManager::INPUT2 => Operators::EQUAL
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR');
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = false;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test equals operator is working
*
* @covers Thelia\Coupon\Rule\AvailableForTotalAmount::isMatching
* @covers Thelia\Constraint\Rule\AvailableForTotalAmountManager::isMatching
*
*/
public function testMatchingRuleEqual()
{
$adapter = $this->stubTheliaAdapter;
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$validators = array(
AvailableForTotalAmount::PARAM1_PRICE => new RuleValidator(
Operators::EQUAL,
new PriceParam(
$adapter, 421.23, 'EUR'
)
)
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(400));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('EUR'));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => Operators::EQUAL,
AvailableForTotalAmountManager::INPUT2 => Operators::EQUAL
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR');
$rule1->setValidatorsFromForm($operators, $values);
$rule = new AvailableForTotalAmount($adapter, $validators);
$isValid = $rule1->isMatching();
$expected = true;
$actual = $rule->isMatching();
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test equals operator is working
*
* @covers Thelia\Coupon\Rule\AvailableForTotalAmount::isMatching
* @covers Thelia\Constraint\Rule\AvailableForTotalAmountManager::isMatching
*
*/
public function testNotMatchingRuleEqual()
{
$adapter = $this->generateValidCouponBaseAdapterMock(421.22);
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$validators = array(
AvailableForTotalAmount::PARAM1_PRICE => new RuleValidator(
Operators::EQUAL,
new PriceParam(
$adapter, 421.23, 'EUR'
)
)
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(399));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('EUR'));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => Operators::EQUAL,
AvailableForTotalAmountManager::INPUT2 => Operators::EQUAL
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR');
$rule1->setValidatorsFromForm($operators, $values);
$rule = new AvailableForTotalAmount($adapter, $validators);
$isValid = $rule1->isMatching();
$expected = false;
$actual = $rule->isMatching();
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test superior operator is working
*
* @covers Thelia\Coupon\Rule\AvailableForTotalAmount::isMatching
* @covers Thelia\Constraint\Rule\AvailableForTotalAmountManager::isMatching
*
*/
public function testMatchingRuleSuperiorEquals()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(401));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('EUR'));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => Operators::SUPERIOR_OR_EQUAL,
AvailableForTotalAmountManager::INPUT2 => Operators::EQUAL
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR');
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = true;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test superior operator is working
*
* @covers Thelia\Constraint\Rule\AvailableForTotalAmountManager::isMatching
*
*/
public function testMatchingRuleSuperiorEquals2()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(400));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('EUR'));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => Operators::SUPERIOR_OR_EQUAL,
AvailableForTotalAmountManager::INPUT2 => Operators::EQUAL
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR');
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = true;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test superior operator is working
*
* @covers Thelia\Constraint\Rule\AvailableForTotalAmountManager::isMatching
*
*/
public function testNotMatchingRuleSuperiorEquals()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(399.00));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('EUR'));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => Operators::SUPERIOR_OR_EQUAL,
AvailableForTotalAmountManager::INPUT2 => Operators::EQUAL
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR');
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = false;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test superior operator is working
*
* @covers Thelia\Constraint\Rule\AvailableForTotalAmountManager::isMatching
*
*/
public function testMatchingRuleSuperior()
{
$adapter = $this->generateValidCouponBaseAdapterMock(421.24);
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$validators = array(
AvailableForTotalAmount::PARAM1_PRICE => new RuleValidator(
Operators::SUPERIOR,
new PriceParam(
$adapter, 421.23, 'EUR'
)
)
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(401));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('EUR'));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => Operators::SUPERIOR,
AvailableForTotalAmountManager::INPUT2 => Operators::EQUAL
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR');
$rule1->setValidatorsFromForm($operators, $values);
$rule = new AvailableForTotalAmount($adapter, $validators);
$isValid = $rule1->isMatching();
$expected = true;
$actual = $rule->isMatching();
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test superior operator is working
*
* @covers Thelia\Coupon\Rule\AvailableForTotalAmount::isMatching
* @covers Thelia\Constraint\Rule\AvailableForTotalAmountManager::isMatching
*
*/
public function testNotMatchingRuleSuperior()
{
$adapter = $this->generateValidCouponBaseAdapterMock(421.23);
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$validators = array(
AvailableForTotalAmount::PARAM1_PRICE => new RuleValidator(
Operators::SUPERIOR,
new PriceParam(
$adapter, 421.23, 'EUR'
)
)
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(399.00));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('EUR'));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => Operators::SUPERIOR,
AvailableForTotalAmountManager::INPUT2 => Operators::EQUAL
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR');
$rule1->setValidatorsFromForm($operators, $values);
$rule = new AvailableForTotalAmount($adapter, $validators);
$isValid = $rule1->isMatching();
$expected = false;
$actual = $rule->isMatching();
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check currency is checked
*
* @covers Thelia\Constraint\Rule\AvailableForTotalAmountManager::isMatching
*
*/
public function testMatchingRuleCurrency()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(400.00));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('EUR'));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => Operators::EQUAL,
AvailableForTotalAmountManager::INPUT2 => Operators::EQUAL
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'EUR');
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = true;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check currency is checked
*
* @covers Thelia\Constraint\Rule\AvailableForTotalAmountManager::isMatching
*
*/
public function testNotMatchingRuleCurrency()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getCartTotalPrice')
->will($this->returnValue(400.00));
$stubAdapter->expects($this->any())
->method('getCheckoutCurrency')
->will($this->returnValue('EUR'));
$rule1 = new AvailableForTotalAmountManager($stubAdapter);
$operators = array(
AvailableForTotalAmountManager::INPUT1 => Operators::EQUAL,
AvailableForTotalAmountManager::INPUT2 => Operators::EQUAL
);
$values = array(
AvailableForTotalAmountManager::INPUT1 => 400.00,
AvailableForTotalAmountManager::INPUT2 => 'USD');
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = false;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}

View File

@@ -23,11 +23,8 @@
namespace Thelia\Coupon;
use Thelia\Constraint\Rule\AvailableForXArticles;
use Thelia\Constraint\Rule\AvailableForXArticlesManager;
use Thelia\Constraint\Rule\Operators;
use Thelia\Constraint\Validator\QuantityParam;
use Thelia\Constraint\Validator\RuleValidator;
use Thelia\Exception\InvalidRuleOperatorException;
/**
* Created by JetBrains PhpStorm.
@@ -43,8 +40,8 @@ use Thelia\Exception\InvalidRuleOperatorException;
class AvailableForXArticlesTest extends \PHPUnit_Framework_TestCase
{
/** @var CouponAdapterInterface $stubTheliaAdapter */
protected $stubTheliaAdapter = null;
// /** @var CouponAdapterInterface $stubTheliaAdapter */
// protected $stubTheliaAdapter = null;
/**
* Sets up the fixture, for example, opens a network connection.
@@ -52,54 +49,54 @@ class AvailableForXArticlesTest extends \PHPUnit_Framework_TestCase
*/
protected function setUp()
{
/** @var CouponAdapterInterface $stubTheliaAdapter */
$this->stubTheliaAdapter = $this->generateValidCouponBaseAdapterMock();
// /** @var CouponAdapterInterface $stubTheliaAdapter */
// $this->stubTheliaAdapter = $this->generateValidCouponBaseAdapterMock();
}
/**
* Generate valid CouponBaseAdapter
*
* @param int $nbArticlesInCart Total articles in the current Cart
*
* @return CouponAdapterInterface
*/
protected function generateValidCouponBaseAdapterMock($nbArticlesInCart = 4)
{
/** @var CouponAdapterInterface $stubTheliaAdapter */
$stubTheliaAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->setMethods(array('getNbArticlesInCart'))
->getMock();
$stubTheliaAdapter->expects($this->any())
->method('getNbArticlesInCart')
->will($this->returnValue($nbArticlesInCart));
// /**
// * Generate valid CouponBaseAdapter
// *
// * @param int $nbArticlesInCart Total articles in the current Cart
// *
// * @return CouponAdapterInterface
// */
// protected function generateValidCouponBaseAdapterMock($nbArticlesInCart = 4)
// {
// /** @var CouponAdapterInterface $stubTheliaAdapter */
// $stubTheliaAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
// ->disableOriginalConstructor()
// ->setMethods(array('getNbArticlesInCart'))
// ->getMock();
// $stubTheliaAdapter->expects($this->any())
// ->method('getNbArticlesInCart')
// ->will($this->returnValue($nbArticlesInCart));
//
// return $stubTheliaAdapter;
// }
return $stubTheliaAdapter;
}
/**
* Check if validity test on BackOffice inputs are working
*
* @covers Thelia\Coupon\Rule\AvailableForXArticles::checkBackOfficeInput
*
*/
public function testValidBackOfficeInput()
{
$translator = $this->getMockBuilder('\Thelia\Core\Translation\Translator')
->disableOriginalConstructor()
->getMock();
$rule = new AvailableForXArticles($translator);
$operators = array(AvailableForXArticles::PARAM1_QUANTITY => Operators::SUPERIOR);
$values = array(
AvailableForXArticles::PARAM1_QUANTITY => 4
);
$rule->populateFromForm($operators, $values);
$expected = true;
$actual = $rule->checkBackOfficeInput();
$this->assertEquals($expected, $actual);
}
// /**
// * Check if validity test on BackOffice inputs are working
// *
// * @covers Thelia\Coupon\Rule\AvailableForXArticles::checkBackOfficeInput
// *
// */
// public function testValidBackOfficeInput()
// {
// $translator = $this->getMockBuilder('\Thelia\Core\Translation\Translator')
// ->disableOriginalConstructor()
// ->getMock();
//
// $rule = new AvailableForXArticles($translator);
// $operators = array(AvailableForXArticles::PARAM1_QUANTITY => Operators::SUPERIOR);
// $values = array(
// AvailableForXArticles::PARAM1_QUANTITY => 4
// );
// $rule->populateFromForm($operators, $values);
//
// $expected = true;
// $actual = $rule->checkBackOfficeInput();
// $this->assertEquals($expected, $actual);
// }
// /**
// * Check if validity test on BackOffice inputs are working
@@ -126,7 +123,7 @@ class AvailableForXArticlesTest extends \PHPUnit_Framework_TestCase
// $actual = $rule->checkBackOfficeInput();
// $this->assertEquals($expected, $actual);
// }
//
// /**
// * Check if validity test on BackOffice inputs are working
// *
@@ -152,7 +149,7 @@ class AvailableForXArticlesTest extends \PHPUnit_Framework_TestCase
// $actual = $rule->checkBackOfficeInput();
// $this->assertEquals($expected, $actual);
// }
//
// /**
// * Check if validity test on BackOffice inputs are working
// *
@@ -178,212 +175,395 @@ class AvailableForXArticlesTest extends \PHPUnit_Framework_TestCase
// $actual = $rule->checkBackOfficeInput();
// $this->assertEquals($expected, $actual);
// }
//
//
//
//
//
// /**
// * Check if validity test on FrontOffice inputs are working
// *
// * @covers Thelia\Coupon\Rule\AvailableForXArticles::checkCheckoutInput
// */
// public function testValidCheckoutInput()
// {
// $adapter = $this->stubTheliaAdapter;
// $validators = array(
// AvailableForXArticles::PARAM1_QUANTITY => new RuleValidator(
// Operators::SUPERIOR,
// new QuantityParam(
// $adapter,
// 4
// )
// )
// );
// $rule = new AvailableForXArticles($adapter, $validators);
//
// $expected = true;
// $actual = $rule->checkCheckoutInput();
// $this->assertEquals($expected, $actual);
// }
//
// /**
// * Check if validity test on FrontOffice inputs are working
// *
// * @covers Thelia\Coupon\Rule\AvailableForXArticles::checkCheckoutInput
// * @expectedException \Thelia\Exception\InvalidRuleValueException
// */
// public function testInValidCheckoutInputFloat()
// {
// $adapter = $this->generateValidCouponBaseAdapterMock(4.5);
// $validators = array(
// AvailableForXArticles::PARAM1_QUANTITY => new RuleValidator(
// Operators::SUPERIOR,
// new QuantityParam(
// $adapter,
// 4
// )
// )
// );
// $rule = new AvailableForXArticles($adapter, $validators);
//
// $expected = false;
// $actual = $rule->checkCheckoutInput();
// $this->assertEquals($expected, $actual);
// }
//
// /**
// * Check if validity test on FrontOffice inputs are working
// *
// * @covers Thelia\Coupon\Rule\AvailableForXArticles::checkCheckoutInput
// * @expectedException \Thelia\Exception\InvalidRuleValueException
// */
// public function testInValidCheckoutInputNegative()
// {
// $adapter = $this->generateValidCouponBaseAdapterMock(-1);
//
// $validators = array(
// AvailableForXArticles::PARAM1_QUANTITY => new RuleValidator(
// Operators::SUPERIOR,
// new QuantityParam(
// $adapter,
// 4
// )
// )
// );
// $rule = new AvailableForXArticles($adapter, $validators);
//
// $expected = false;
// $actual = $rule->checkCheckoutInput();
// $this->assertEquals($expected, $actual);
// }
//
// /**
// * Check if validity test on FrontOffice inputs are working
// *
// * @covers Thelia\Coupon\Rule\AvailableForXArticles::checkCheckoutInput
// * @expectedException \Thelia\Exception\InvalidRuleValueException
// */
// public function testInValidCheckoutInputString()
// {
// $adapter = $this->generateValidCouponBaseAdapterMock('bad');
//
// $validators = array(
// AvailableForXArticles::PARAM1_QUANTITY => new RuleValidator(
// Operators::SUPERIOR,
// new QuantityParam(
// $adapter,
// 4
// )
// )
// );
// $rule = new AvailableForXArticles($adapter, $validators);
//
// $expected = false;
// $actual = $rule->checkCheckoutInput();
// $this->assertEquals($expected, $actual);
// }
//
// /**
// * Check if test inferior operator is working
// *
// * @covers Thelia\Coupon\Rule\AvailableForXArticles::isMatching
// *
// */
// public function testMatchingRuleInferior()
// {
// $adapter = $this->stubTheliaAdapter;
// $validators = array(
// AvailableForXArticles::PARAM1_QUANTITY => new RuleValidator(
// Operators::INFERIOR,
// new QuantityParam(
// $adapter,
// 5
// )
// )
// );
// $rule = new AvailableForXArticles($adapter, $validators);
//
// $expected = true;
// $actual = $rule->isMatching();
// $this->assertEquals($expected, $actual);
// }
//
// /**
// * Check if test equals operator is working
// *
// * @covers Thelia\Coupon\Rule\AvailableForXArticles::isMatching
// *
// */
// public function testMatchingRuleEqual()
// {
// $adapter = $this->stubTheliaAdapter;
// $validators = array(
// AvailableForXArticles::PARAM1_QUANTITY => new RuleValidator(
// Operators::EQUAL,
// new QuantityParam(
// $adapter,
// 4
// )
// )
// );
// $rule = new AvailableForXArticles($adapter, $validators);
//
// $expected = true;
// $actual = $rule->isMatching();
// $this->assertEquals($expected, $actual);
// }
//
// /**
// * Check if test superior operator is working
// *
// * @covers Thelia\Coupon\Rule\AvailableForXArticles::isMatching
// *
// */
// public function testMatchingRuleSuperior()
// {
// $adapter = $this->stubTheliaAdapter;
// $validators = array(
// AvailableForXArticles::PARAM1_QUANTITY => new RuleValidator(
// Operators::SUPERIOR,
// new QuantityParam(
// $adapter,
// 3
// )
// )
// );
// $rule = new AvailableForXArticles($adapter, $validators);
//
// $expected = true;
// $actual = $rule->isMatching();
// $this->assertEquals($expected, $actual);
// }
//
// /**
// * Check if test unavailable operator is working
// *
// * @covers Thelia\Coupon\Rule\AvailableForXArticles::isMatching
// * @expectedException \Thelia\Exception\InvalidRuleOperatorException
// *
// */
// public function testNotMatchingRule()
// {
// $adapter = $this->stubTheliaAdapter;
// $validators = array(
// AvailableForXArticles::PARAM1_QUANTITY => new RuleValidator(
// Operators::DIFFERENT,
// new QuantityParam(
// $adapter,
// 3
// )
// )
// );
// $rule = new AvailableForXArticles($adapter, $validators);
//
// $expected = false;
// $actual = $rule->isMatching();
// $this->assertEquals($expected, $actual);
// }
/**
* Check if test inferior operator is working
*
* @covers Thelia\Constraint\Rule\AvailableForXArticlesManager::isMatching
*
*/
public function testMatchingRuleInferior()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getNbArticlesInCart')
->will($this->returnValue(4));
$rule1 = new AvailableForXArticlesManager($stubAdapter);
$operators = array(
AvailableForXArticlesManager::INPUT1 => Operators::INFERIOR
);
$values = array(
AvailableForXArticlesManager::INPUT1 => 5
);
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = true;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test inferior operator is working
*
* @covers Thelia\Constraint\Rule\AvailableForXArticlesManager::isMatching
*
*/
public function testNotMatchingRuleInferior()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getNbArticlesInCart')
->will($this->returnValue(4));
$rule1 = new AvailableForXArticlesManager($stubAdapter);
$operators = array(
AvailableForXArticlesManager::INPUT1 => Operators::INFERIOR
);
$values = array(
AvailableForXArticlesManager::INPUT1 => 4,
);
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = false;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test inferior operator is working
*
* @covers Thelia\Constraint\Rule\AvailableForXArticlesManager::isMatching
*
*/
public function testMatchingRuleInferiorEquals()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getNbArticlesInCart')
->will($this->returnValue(4));
$rule1 = new AvailableForXArticlesManager($stubAdapter);
$operators = array(
AvailableForXArticlesManager::INPUT1 => Operators::INFERIOR_OR_EQUAL,
);
$values = array(
AvailableForXArticlesManager::INPUT1 => 5,
);
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = true;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test inferior operator is working
*
* @covers Thelia\Constraint\Rule\AvailableForXArticlesManager::isMatching
*
*/
public function testMatchingRuleInferiorEquals2()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getNbArticlesInCart')
->will($this->returnValue(4));
$rule1 = new AvailableForXArticlesManager($stubAdapter);
$operators = array(
AvailableForXArticlesManager::INPUT1 => Operators::INFERIOR_OR_EQUAL
);
$values = array(
AvailableForXArticlesManager::INPUT1 => 4
);
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = true;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test inferior operator is working
*
* @covers Thelia\Constraint\Rule\AvailableForXArticlesManager::isMatching
*
*/
public function testNotMatchingRuleInferiorEquals()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getNbArticlesInCart')
->will($this->returnValue(4));
$rule1 = new AvailableForXArticlesManager($stubAdapter);
$operators = array(
AvailableForXArticlesManager::INPUT1 => Operators::INFERIOR_OR_EQUAL
);
$values = array(
AvailableForXArticlesManager::INPUT1 => 3
);
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = false;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test equals operator is working
*
* @covers Thelia\Constraint\Rule\AvailableForXArticlesManager::isMatching
*
*/
public function testMatchingRuleEqual()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getNbArticlesInCart')
->will($this->returnValue(4));
$rule1 = new AvailableForXArticlesManager($stubAdapter);
$operators = array(
AvailableForXArticlesManager::INPUT1 => Operators::EQUAL
);
$values = array(
AvailableForXArticlesManager::INPUT1 => 4
);
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = true;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test equals operator is working
*
* @covers Thelia\Constraint\Rule\AvailableForXArticlesManager::isMatching
*
*/
public function testNotMatchingRuleEqual()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getNbArticlesInCart')
->will($this->returnValue(4));
$rule1 = new AvailableForXArticlesManager($stubAdapter);
$operators = array(
AvailableForXArticlesManager::INPUT1 => Operators::EQUAL
);
$values = array(
AvailableForXArticlesManager::INPUT1 => 5
);
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = false;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test superior operator is working
*
* @covers Thelia\Constraint\Rule\AvailableForXArticlesManager::isMatching
*
*/
public function testMatchingRuleSuperiorEquals()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getNbArticlesInCart')
->will($this->returnValue(4));
$rule1 = new AvailableForXArticlesManager($stubAdapter);
$operators = array(
AvailableForXArticlesManager::INPUT1 => Operators::SUPERIOR_OR_EQUAL
);
$values = array(
AvailableForXArticlesManager::INPUT1 => 4
);
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = true;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test superior operator is working
*
* @covers Thelia\Constraint\Rule\AvailableForXArticlesManager::isMatching
*
*/
public function testMatchingRuleSuperiorEquals2()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getNbArticlesInCart')
->will($this->returnValue(4));
$rule1 = new AvailableForXArticlesManager($stubAdapter);
$operators = array(
AvailableForXArticlesManager::INPUT1 => Operators::SUPERIOR_OR_EQUAL
);
$values = array(
AvailableForXArticlesManager::INPUT1 => 3
);
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = true;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test superior operator is working
*
* @covers Thelia\Constraint\Rule\AvailableForXArticlesManager::isMatching
*
*/
public function testNotMatchingRuleSuperiorEquals()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getNbArticlesInCart')
->will($this->returnValue(4));
$rule1 = new AvailableForXArticlesManager($stubAdapter);
$operators = array(
AvailableForXArticlesManager::INPUT1 => Operators::SUPERIOR_OR_EQUAL
);
$values = array(
AvailableForXArticlesManager::INPUT1 => 5
);
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = false;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test superior operator is working
*
* @covers Thelia\Constraint\Rule\AvailableForXArticlesManager::isMatching
*
*/
public function testMatchingRuleSuperior()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getNbArticlesInCart')
->will($this->returnValue(4));
$rule1 = new AvailableForXArticlesManager($stubAdapter);
$operators = array(
AvailableForXArticlesManager::INPUT1 => Operators::SUPERIOR
);
$values = array(
AvailableForXArticlesManager::INPUT1 => 3
);
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = true;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**
* Check if test superior operator is working
*
* @covers Thelia\Constraint\Rule\AvailableForXArticlesManager::isMatching
*
*/
public function testNotMatchingRuleSuperior()
{
$stubAdapter = $this->getMockBuilder('\Thelia\Coupon\CouponBaseAdapter')
->disableOriginalConstructor()
->getMock();
$stubAdapter->expects($this->any())
->method('getNbArticlesInCart')
->will($this->returnValue(4));
$rule1 = new AvailableForXArticlesManager($stubAdapter);
$operators = array(
AvailableForXArticlesManager::INPUT1 => Operators::SUPERIOR
);
$values = array(
AvailableForXArticlesManager::INPUT1 => 4
);
$rule1->setValidatorsFromForm($operators, $values);
$isValid = $rule1->isMatching();
$expected = false;
$actual =$isValid;
$this->assertEquals($expected, $actual);
}
/**

View File

@@ -48,365 +48,365 @@ class OperatorsTest extends \PHPUnit_Framework_TestCase
{
}
/**
*
* @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
*
*/
public function testOperatorInferiorValidBefore()
{
$adapter = new CouponBaseAdapter();
// Given
$a = 11;
$operator = Operators::INFERIOR;
$b = new QuantityParam($adapter, 12);
// When
$actual = Operators::isValid($a, $operator, $b);
// Then
$this->assertTrue($actual);
}
/**
*
* @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
*
*/
public function testOperatorInferiorInvalidEquals()
{
// Given
$adapter = new CouponBaseAdapter();
$a = 12;
$operator = Operators::INFERIOR;
$b = new QuantityParam($adapter, 12);
// When
$actual = Operators::isValid($a, $operator, $b);
// Then
$this->assertFalse($actual);
}
/**
*
* @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
*
*/
public function testOperatorInferiorInvalidAfter()
{
// Given
$adapter = new CouponBaseAdapter();
$a = 13;
$operator = Operators::INFERIOR;
$b = new QuantityParam($adapter, 12);
// When
$actual = Operators::isValid($a, $operator, $b);
// Then
$this->assertFalse($actual);
}
/**
*
* @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
*
*/
public function testOperatorInferiorOrEqualValidEqual()
{
// Given
$adapter = new CouponBaseAdapter();
$a = 11;
$operator = Operators::INFERIOR_OR_EQUAL;
$b = new QuantityParam($adapter, 11);
// When
$actual = Operators::isValid($a, $operator, $b);
// Then
$this->assertTrue($actual);
}
/**
*
* @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
*
*/
public function testOperatorInferiorOrEqualValidBefore()
{
// Given
$adapter = new CouponBaseAdapter();
$a = 10;
$operator = Operators::INFERIOR_OR_EQUAL;
$b = new QuantityParam($adapter, 11);
// When
$actual = Operators::isValid($a, $operator, $b);
// Then
$this->assertTrue($actual);
}
/**
*
* @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
*
*/
public function testOperatorInferiorOrEqualInValidAfter()
{
// Given
$adapter = new CouponBaseAdapter();
$a = 12;
$operator = Operators::INFERIOR_OR_EQUAL;
$b = new QuantityParam($adapter, 11);
// When
$actual = Operators::isValid($a, $operator, $b);
// Then
$this->assertFalse($actual);
}
/**
*
* @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
*
*/
public function testOperatorEqualValidEqual()
{
// Given
$adapter = new CouponBaseAdapter();
$a = 12;
$operator = Operators::EQUAL;
$b = new QuantityParam($adapter, 12);
// When
$actual = Operators::isValid($a, $operator, $b);
// Then
$this->assertTrue($actual);
}
/**
*
* @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
*
*/
public function testOperatorEqualInValidBefore()
{
// Given
$adapter = new CouponBaseAdapter();
$a = 11;
$operator = Operators::EQUAL;
$b = new QuantityParam($adapter, 12);
// When
$actual = Operators::isValid($a, $operator, $b);
// Then
$this->assertFalse($actual);
}
/**
*
* @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
*
*/
public function testOperatorEqualInValidAfter()
{
// Given
$adapter = new CouponBaseAdapter();
$a = 13;
$operator = Operators::EQUAL;
$b = new QuantityParam($adapter, 12);
// When
$actual = Operators::isValid($a, $operator, $b);
// Then
$this->assertFalse($actual);
}
/**
*
* @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
*
*/
public function testOperatorSuperiorOrEqualValidEqual()
{
// Given
$adapter = new CouponBaseAdapter();
$a = 13;
$operator = Operators::SUPERIOR_OR_EQUAL;
$b = new QuantityParam($adapter, 13);
// When
$actual = Operators::isValid($a, $operator, $b);
// Then
$this->assertTrue($actual);
}
/**
*
* @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
*
*/
public function testOperatorSuperiorOrEqualAfter()
{
// Given
$adapter = new CouponBaseAdapter();
$a = 14;
$operator = Operators::SUPERIOR_OR_EQUAL;
$b = new QuantityParam($adapter, 13);
// When
$actual = Operators::isValid($a, $operator, $b);
// Then
$this->assertTrue($actual);
}
/**
*
* @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
*
*/
public function testOperatorSuperiorOrEqualInvalidBefore()
{
// Given
$adapter = new CouponBaseAdapter();
$a = 12;
$operator = Operators::SUPERIOR_OR_EQUAL;
$b = new QuantityParam($adapter, 13);
// When
$actual = Operators::isValid($a, $operator, $b);
// Then
$this->assertFalse($actual);
}
/**
*
* @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
*
*/
public function testOperatorSuperiorValidAfter()
{
// Given
$adapter = new CouponBaseAdapter();
$a = 13;
$operator = Operators::SUPERIOR;
$b = new QuantityParam($adapter, 12);
// When
$actual = Operators::isValid($a, $operator, $b);
// Then
$this->assertTrue($actual);
}
/**
*
* @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
*
*/
public function testOperatorSuperiorInvalidEqual()
{
// Given
$adapter = new CouponBaseAdapter();
$a = 12;
$operator = Operators::SUPERIOR;
$b = new QuantityParam($adapter, 12);
// When
$actual = Operators::isValid($a, $operator, $b);
// Then
$this->assertFalse($actual);
}
/**
*
* @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
*
*/
public function testOperatorSuperiorInvalidBefore()
{
// Given
$adapter = new CouponBaseAdapter();
$a = 11;
$operator = Operators::SUPERIOR;
$b = new QuantityParam($adapter, 12);
// When
$actual = Operators::isValid($a, $operator, $b);
// Then
$this->assertFalse($actual);
}
/**
*
* @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
*
*/
public function testOperatorDifferentValid()
{
// Given
$adapter = new CouponBaseAdapter();
$a = 12;
$operator = Operators::DIFFERENT;
$b = new QuantityParam($adapter, 11);
// When
$actual = Operators::isValid($a, $operator, $b);
// Then
$this->assertTrue($actual);
}
/**
*
* @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
*
*/
public function testOperatorDifferentInvalidEquals()
{
// Given
$adapter = new CouponBaseAdapter();
$a = 11;
$operator = Operators::DIFFERENT;
$b = new QuantityParam($adapter, 11);
// When
$actual = Operators::isValid($a, $operator, $b);
// Then
$this->assertFalse($actual);
}
/**
*
* @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
*
*/
public function testOperatorInValid()
{
// Given
$adapter = new CouponBaseAdapter();
$a = 12;
$operator = 'X';
$b = new QuantityParam($adapter, 11);
// When
$actual = Operators::isValid($a, $operator, $b);
// Then
$this->assertFalse($actual);
}
// /**
// *
// * @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
// *
// */
// public function testOperatorInferiorValidBefore()
// {
// $adapter = new CouponBaseAdapter();
// // Given
// $a = 11;
// $operator = Operators::INFERIOR;
// $b = new QuantityParam($adapter, 12);
//
// // When
// $actual = Operators::isValid($a, $operator, $b);
//
// // Then
// $this->assertTrue($actual);
// }
//
// /**
// *
// * @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
// *
// */
// public function testOperatorInferiorInvalidEquals()
// {
// // Given
// $adapter = new CouponBaseAdapter();
// $a = 12;
// $operator = Operators::INFERIOR;
// $b = new QuantityParam($adapter, 12);
//
// // When
// $actual = Operators::isValid($a, $operator, $b);
//
// // Then
// $this->assertFalse($actual);
// }
//
// /**
// *
// * @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
// *
// */
// public function testOperatorInferiorInvalidAfter()
// {
// // Given
// $adapter = new CouponBaseAdapter();
// $a = 13;
// $operator = Operators::INFERIOR;
// $b = new QuantityParam($adapter, 12);
//
// // When
// $actual = Operators::isValid($a, $operator, $b);
//
// // Then
// $this->assertFalse($actual);
// }
//
// /**
// *
// * @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
// *
// */
// public function testOperatorInferiorOrEqualValidEqual()
// {
// // Given
// $adapter = new CouponBaseAdapter();
// $a = 11;
// $operator = Operators::INFERIOR_OR_EQUAL;
// $b = new QuantityParam($adapter, 11);
//
// // When
// $actual = Operators::isValid($a, $operator, $b);
//
// // Then
// $this->assertTrue($actual);
// }
//
// /**
// *
// * @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
// *
// */
// public function testOperatorInferiorOrEqualValidBefore()
// {
// // Given
// $adapter = new CouponBaseAdapter();
// $a = 10;
// $operator = Operators::INFERIOR_OR_EQUAL;
// $b = new QuantityParam($adapter, 11);
//
// // When
// $actual = Operators::isValid($a, $operator, $b);
//
// // Then
// $this->assertTrue($actual);
// }
//
// /**
// *
// * @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
// *
// */
// public function testOperatorInferiorOrEqualInValidAfter()
// {
// // Given
// $adapter = new CouponBaseAdapter();
// $a = 12;
// $operator = Operators::INFERIOR_OR_EQUAL;
// $b = new QuantityParam($adapter, 11);
//
// // When
// $actual = Operators::isValid($a, $operator, $b);
//
// // Then
// $this->assertFalse($actual);
// }
//
// /**
// *
// * @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
// *
// */
// public function testOperatorEqualValidEqual()
// {
// // Given
// $adapter = new CouponBaseAdapter();
// $a = 12;
// $operator = Operators::EQUAL;
// $b = new QuantityParam($adapter, 12);
//
// // When
// $actual = Operators::isValid($a, $operator, $b);
//
// // Then
// $this->assertTrue($actual);
// }
//
// /**
// *
// * @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
// *
// */
// public function testOperatorEqualInValidBefore()
// {
// // Given
// $adapter = new CouponBaseAdapter();
// $a = 11;
// $operator = Operators::EQUAL;
// $b = new QuantityParam($adapter, 12);
//
// // When
// $actual = Operators::isValid($a, $operator, $b);
//
// // Then
// $this->assertFalse($actual);
// }
//
// /**
// *
// * @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
// *
// */
// public function testOperatorEqualInValidAfter()
// {
// // Given
// $adapter = new CouponBaseAdapter();
// $a = 13;
// $operator = Operators::EQUAL;
// $b = new QuantityParam($adapter, 12);
//
// // When
// $actual = Operators::isValid($a, $operator, $b);
//
// // Then
// $this->assertFalse($actual);
// }
//
// /**
// *
// * @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
// *
// */
// public function testOperatorSuperiorOrEqualValidEqual()
// {
// // Given
// $adapter = new CouponBaseAdapter();
// $a = 13;
// $operator = Operators::SUPERIOR_OR_EQUAL;
// $b = new QuantityParam($adapter, 13);
//
// // When
// $actual = Operators::isValid($a, $operator, $b);
//
// // Then
// $this->assertTrue($actual);
// }
//
// /**
// *
// * @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
// *
// */
// public function testOperatorSuperiorOrEqualAfter()
// {
// // Given
// $adapter = new CouponBaseAdapter();
// $a = 14;
// $operator = Operators::SUPERIOR_OR_EQUAL;
// $b = new QuantityParam($adapter, 13);
//
// // When
// $actual = Operators::isValid($a, $operator, $b);
//
// // Then
// $this->assertTrue($actual);
// }
//
// /**
// *
// * @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
// *
// */
// public function testOperatorSuperiorOrEqualInvalidBefore()
// {
// // Given
// $adapter = new CouponBaseAdapter();
// $a = 12;
// $operator = Operators::SUPERIOR_OR_EQUAL;
// $b = new QuantityParam($adapter, 13);
//
// // When
// $actual = Operators::isValid($a, $operator, $b);
//
// // Then
// $this->assertFalse($actual);
// }
//
// /**
// *
// * @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
// *
// */
// public function testOperatorSuperiorValidAfter()
// {
// // Given
// $adapter = new CouponBaseAdapter();
// $a = 13;
// $operator = Operators::SUPERIOR;
// $b = new QuantityParam($adapter, 12);
//
// // When
// $actual = Operators::isValid($a, $operator, $b);
//
// // Then
// $this->assertTrue($actual);
// }
//
// /**
// *
// * @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
// *
// */
// public function testOperatorSuperiorInvalidEqual()
// {
// // Given
// $adapter = new CouponBaseAdapter();
// $a = 12;
// $operator = Operators::SUPERIOR;
// $b = new QuantityParam($adapter, 12);
//
// // When
// $actual = Operators::isValid($a, $operator, $b);
//
// // Then
// $this->assertFalse($actual);
// }
//
// /**
// *
// * @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
// *
// */
// public function testOperatorSuperiorInvalidBefore()
// {
// // Given
// $adapter = new CouponBaseAdapter();
// $a = 11;
// $operator = Operators::SUPERIOR;
// $b = new QuantityParam($adapter, 12);
//
// // When
// $actual = Operators::isValid($a, $operator, $b);
//
// // Then
// $this->assertFalse($actual);
// }
//
// /**
// *
// * @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
// *
// */
// public function testOperatorDifferentValid()
// {
// // Given
// $adapter = new CouponBaseAdapter();
// $a = 12;
// $operator = Operators::DIFFERENT;
// $b = new QuantityParam($adapter, 11);
//
// // When
// $actual = Operators::isValid($a, $operator, $b);
//
// // Then
// $this->assertTrue($actual);
// }
//
// /**
// *
// * @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
// *
// */
// public function testOperatorDifferentInvalidEquals()
// {
// // Given
// $adapter = new CouponBaseAdapter();
// $a = 11;
// $operator = Operators::DIFFERENT;
// $b = new QuantityParam($adapter, 11);
//
// // When
// $actual = Operators::isValid($a, $operator, $b);
//
// // Then
// $this->assertFalse($actual);
// }
//
// /**
// *
// * @covers Thelia\Coupon\Rule\Operator::isValidAccordingToOperator
// *
// */
// public function testOperatorInValid()
// {
// // Given
// $adapter = new CouponBaseAdapter();
// $a = 12;
// $operator = 'X';
// $b = new QuantityParam($adapter, 11);
//
// // When
// $actual = Operators::isValid($a, $operator, $b);
//
// // Then
// $this->assertFalse($actual);
// }