Skip to content

Commit

Permalink
Added rules and modified DateRule handling
Browse files Browse the repository at this point in the history
  • Loading branch information
MrTammer committed Mar 28, 2019
1 parent 96a1969 commit 51b4514
Show file tree
Hide file tree
Showing 7 changed files with 207 additions and 31 deletions.
7 changes: 5 additions & 2 deletions src/Concerns/AssertsErrorFormat.php
Original file line number Diff line number Diff line change
Expand Up @@ -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()
);
}
Expand Down
29 changes: 26 additions & 3 deletions src/DataGeneration/Factories/RuleFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
{
Expand All @@ -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':
Expand All @@ -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();
}
Expand Down
31 changes: 31 additions & 0 deletions src/DataGeneration/RuleCollection.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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());
}
}
}
18 changes: 9 additions & 9 deletions src/DataGeneration/RuleParser.php
Original file line number Diff line number Diff line change
Expand Up @@ -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,
];

/**
Expand All @@ -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;
}

Expand Down
32 changes: 32 additions & 0 deletions src/DataGeneration/Rules/BetweenRule.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace Digitonic\ApiTestSuite\DataGeneration\Rules;

use Digitonic\ApiTestSuite\DataGeneration\Contracts\Rule;
use Digitonic\ApiTestSuite\DataGeneration\Rules\Rule as BaseRule;

class BetweenRule extends BaseRule implements Rule
{
private $min;

private $max;

public function __construct($min, $max)
{
$this->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;
}
}
107 changes: 90 additions & 17 deletions src/DataGeneration/Rules/DateRule.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
Expand All @@ -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;
}
}
14 changes: 14 additions & 0 deletions src/DataGeneration/Rules/NumericRule.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Digitonic\ApiTestSuite\DataGeneration\Rules;

use Digitonic\ApiTestSuite\DataGeneration\Contracts\Rule;
use Digitonic\ApiTestSuite\DataGeneration\Rules\Rule as BaseRule;

class NumericRule extends BaseRule implements Rule
{
public function handle(array &$payload, $field, array $rules, $newValueSeed, $class, $user){
$payload[$field] = (float)$newValueSeed;
return $payload;
}
}

0 comments on commit 51b4514

Please sign in to comment.