From 51b45148599e1ddc82db3ee65a896d2da5c0ff88 Mon Sep 17 00:00:00 2001 From: MrTammer Date: Thu, 28 Mar 2019 16:34:46 +0000 Subject: [PATCH] Added rules and modified DateRule handling --- src/Concerns/AssertsErrorFormat.php | 7 +- src/DataGeneration/Factories/RuleFactory.php | 29 ++++- src/DataGeneration/RuleCollection.php | 31 ++++++ src/DataGeneration/RuleParser.php | 18 ++-- src/DataGeneration/Rules/BetweenRule.php | 32 ++++++ src/DataGeneration/Rules/DateRule.php | 107 ++++++++++++++++--- src/DataGeneration/Rules/NumericRule.php | 14 +++ 7 files changed, 207 insertions(+), 31 deletions(-) create mode 100644 src/DataGeneration/Rules/BetweenRule.php create mode 100644 src/DataGeneration/Rules/NumericRule.php diff --git a/src/Concerns/AssertsErrorFormat.php b/src/Concerns/AssertsErrorFormat.php index 6ff9d3b..2a9de77 100644 --- a/src/Concerns/AssertsErrorFormat.php +++ b/src/Concerns/AssertsErrorFormat.php @@ -18,10 +18,13 @@ protected function assertErrorFormat(TestResponse $response, $status, $data = [] { $response->assertStatus($status); $this->assertRegExp( - "/" . View::file( + "/" . trim(View::file( config('digitonic.api-test-suite.templates.base_path') . 'errors/' . $status . '.blade.php', $data - )->render() . "/", + )->with([ + 'exception' => $response->exception + ])->render()) . "/", + $response->getContent() ); } diff --git a/src/DataGeneration/Factories/RuleFactory.php b/src/DataGeneration/Factories/RuleFactory.php index 4cc5847..64626c9 100644 --- a/src/DataGeneration/Factories/RuleFactory.php +++ b/src/DataGeneration/Factories/RuleFactory.php @@ -8,6 +8,8 @@ use Digitonic\ApiTestSuite\DataGeneration\Rules\BooleanRule; use Digitonic\ApiTestSuite\DataGeneration\Rules\CallbackRule; use Digitonic\ApiTestSuite\DataGeneration\Rules\DateRule; +use Digitonic\ApiTestSuite\DataGeneration\Rules\AfterRule; +use Digitonic\ApiTestSuite\DataGeneration\Rules\BeforeRule; use Digitonic\ApiTestSuite\DataGeneration\Rules\InRule; use Digitonic\ApiTestSuite\DataGeneration\Rules\IntegerRule; use Digitonic\ApiTestSuite\DataGeneration\Rules\MaxRule; @@ -16,6 +18,8 @@ use Digitonic\ApiTestSuite\DataGeneration\Rules\StringRule; use Digitonic\ApiTestSuite\DataGeneration\Rules\UniqueRule; use Digitonic\ApiTestSuite\DataGeneration\Rules\UrlRule; +use Digitonic\ApiTestSuite\DataGeneration\Rules\NumericRule; +use Digitonic\ApiTestSuite\DataGeneration\Rules\BetweenRule; class RuleFactory { @@ -33,6 +37,8 @@ public function build($rule, $parameters) return new BooleanRule(); case 'integer': return new IntegerRule(); + case 'numeric': + return new NumericRule(); case 'allowed_recipients': return new AllowedRecipientsRule(); case 'array': @@ -48,11 +54,28 @@ public function build($rule, $parameters) case 'max': return New MaxRule($parameters); case 'date_format': - return new DateRule($parameters, 1, Carbon::parse('+80years')->getTimestamp()); + $rule = new DateRule(); + $rule->setFormat($parameters); + return $rule; case 'after': - return new DateRule('Y-m-d H:i:s', Carbon::parse($parameters)->getTimestamp(), Carbon::parse('+80years')->getTimestamp()); + $rule = new DateRule(); + $rule->setAfter(Carbon::parse($parameters)->getTimestamp(), true); + return $rule; + case 'after_or_equal': + $rule = new DateRule(); + $rule->setAfter(Carbon::parse($parameters)->getTimestamp(), false); + return $rule; case 'before': - return new DateRule('Y-m-d H:i:s', 1, Carbon::parse($parameters)->getTimestamp()); + $rule = new DateRule(); + $rule->setBefore(Carbon::parse($parameters)->getTimestamp(), true); + return $rule; + case 'before_or_equal': + $rule = new DateRule(); + $rule->setBefore(Carbon::parse($parameters)->getTimestamp(), false); + return $rule; + case 'between': + $params = explode(',', $parameters); + return new BetweenRule($params[0], $params[1]); default: return new NullRule(); } diff --git a/src/DataGeneration/RuleCollection.php b/src/DataGeneration/RuleCollection.php index d92d700..6d08a41 100644 --- a/src/DataGeneration/RuleCollection.php +++ b/src/DataGeneration/RuleCollection.php @@ -3,6 +3,7 @@ namespace Digitonic\ApiTestSuite\DataGeneration; use Digitonic\ApiTestSuite\DataGeneration\Contracts\Rule; +use Digitonic\ApiTestSuite\DataGeneration\Rules\DateRule; use Digitonic\ApiTestSuite\DataGeneration\Rules\RequiredRule; use Illuminate\Support\Collection; @@ -37,4 +38,34 @@ public function setRequired($required) { $this->required = $required; } + + public function push($value) + { + if ($value instanceof DateRule){ + foreach($this->items as $index=>$rule){ + if ($rule instanceof DateRule){ + $this->updateDateRule($value, $index); + } else { + parent::push($value); + } + } + } else { + parent::push($value); + } + } + + public function updateDateRule(DateRule $rule, $index) + { + if (!$this->items[$index]->getAfter() && $rule->getAfter()){ + $this->items[$index]->setAfter($rule->getAfter(), $rule->getStrictAfter()); + } + + if (!$this->items[$index]->getBefore() && $rule->getBefore()){ + $this->items[$index]->setBefore($rule->getBefore(), $rule->getStrictBefore()); + } + + if (!$this->items[$index]->getFormat() && $rule->getFormat()){ + $this->items[$index]->setFormat($rule->getFormat()); + } + } } diff --git a/src/DataGeneration/RuleParser.php b/src/DataGeneration/RuleParser.php index b8d0be3..461ae6a 100644 --- a/src/DataGeneration/RuleParser.php +++ b/src/DataGeneration/RuleParser.php @@ -8,10 +8,13 @@ class RuleParser { const RULE_ORDER = [ 'required' => 1, - 'after' => 2, 'before' => 2, - 'date_format' => 98, - 'max' => 99 + 'before_or_equal' => 2, + 'after' => 3, + 'after_or_equal' => 3, + 'max' => 98, + 'date_format' => 99, + 'between' => 99, ]; /** @@ -30,27 +33,24 @@ public function parse($rules) $factory = new RuleFactory(); $rulesArray = explode('|', $rules); - usort($rulesArray, function($a, $b){ + usort($rulesArray, function ($a, $b) { $aName = $this->getRuleName($a); $aWeight = isset(self::RULE_ORDER[$aName]) ? self::RULE_ORDER[$aName] : 50; $bName = $this->getRuleName($b); $bWeight = isset(self::RULE_ORDER[$bName]) ? self::RULE_ORDER[$bName] : 50; - if ($aWeight == $bWeight){ + if ($aWeight == $bWeight) { return 0; } return $aWeight > $bWeight ? 1 : -1; }); - // todo reorder: Make MaxRule as last, 'after' and 'before' before 'date_format' - $ruleSet = new RuleCollection(); foreach ($rulesArray as $rule) { $ruleName = $this->getRuleName($rule); $params = $this->getRuleParams($rule); $ruleSet->push($factory->build($ruleName, $params)); } - - + return $ruleSet; } diff --git a/src/DataGeneration/Rules/BetweenRule.php b/src/DataGeneration/Rules/BetweenRule.php new file mode 100644 index 0000000..f0bf871 --- /dev/null +++ b/src/DataGeneration/Rules/BetweenRule.php @@ -0,0 +1,32 @@ +min = $min; + $this->max = $max; + } + + public function handle(array &$payload, $field, array $rules, $newValueSeed, $class, $user) + { + $type = gettype($payload[$field]); + + if ($type === 'double'){ + $type = 'float'; + } + + $var = rand($this->min, $this->max); + settype($var, $type); + $payload[$field] = $var; + } +} diff --git a/src/DataGeneration/Rules/DateRule.php b/src/DataGeneration/Rules/DateRule.php index a8bcffa..2a8319a 100644 --- a/src/DataGeneration/Rules/DateRule.php +++ b/src/DataGeneration/Rules/DateRule.php @@ -11,21 +11,8 @@ class DateRule extends BaseRule implements Rule private $format; private $before; private $after; - - /** - * DateRule constructor. - * @param $format - * @param $beforeTimestamp - * @param $afterTimestamp - */ - public function __construct($format, $afterTimestamp, $beforeTimestamp) - { - parent::__construct(); - $this->format = $format; - $this->after = (int)$afterTimestamp; - $this->before = (int)$beforeTimestamp; - } - + private $strictAfter; + private $strictBefore; /** * @param array $payload @@ -38,10 +25,14 @@ public function __construct($format, $afterTimestamp, $beforeTimestamp) */ public function handle(array &$payload, $field, array $rules, $newValueSeed, $class, $user) { + // todo set defaults if not set + $this->after = empty($this->after) ? $this->getTimestamp('-80years') : $this->after; + $this->before = empty($this->before) ? $this->getTimestamp('+80years') : $this->before; + if (isset($payload[$field])) { $defaultTimestamp = $this->getTimestamp($payload[$field]); - $after = max($defaultTimestamp,$this->after); - $before = min($defaultTimestamp,$this->before); + $after = max($defaultTimestamp, $this->after); + $before = min($after, $this->before); } else { $after = $this->after; $before = $this->before; @@ -54,4 +45,86 @@ protected function getTimestamp($dateString) { return Carbon::parse($dateString)->getTimestamp(); } + + /** + * @return mixed + */ + public function getFormat() + { + return $this->format; + } + + /** + * @param mixed $format + */ + public function setFormat($format): void + { + $this->format = $format; + } + + /** + * @return mixed + */ + public function getBefore() + { + return $this->before; + } + + /** + * @param mixed $before + */ + public function setBefore($before, $strict = true): void + { + $this->before = $before; + $this->strictBefore = $strict; + } + + /** + * @return mixed + */ + public function getAfter() + { + return $this->after; + } + + /** + * @param mixed $after + */ + public function setAfter($after, $strict = true): void + { + $this->after = $after; + $this->strictAfter = $strict; + } + + /** + * @return mixed + */ + public function getStrictAfter() + { + return $this->strictAfter; + } + + /** + * @param mixed $strictAfter + */ + public function setStrictAfter($strictAfter): void + { + $this->strictAfter = $strictAfter; + } + + /** + * @return mixed + */ + public function getStrictBefore() + { + return $this->strictBefore; + } + + /** + * @param mixed $strictBefore + */ + public function setStrictBefore($strictBefore): void + { + $this->strictBefore = $strictBefore; + } } diff --git a/src/DataGeneration/Rules/NumericRule.php b/src/DataGeneration/Rules/NumericRule.php new file mode 100644 index 0000000..6efd088 --- /dev/null +++ b/src/DataGeneration/Rules/NumericRule.php @@ -0,0 +1,14 @@ +