Skip to content

Commit d7e607d

Browse files
committed
test: Add conditions tests
1 parent 88bbcf2 commit d7e607d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+2618
-39
lines changed

src/Datafile/Conditions.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Featurevisor\Datafile\Conditions\ConditionFactory;
99
use Featurevisor\Datafile\Conditions\ConditionInterface;
1010
use Featurevisor\Datafile\Conditions\EveryoneCondition;
11+
use Featurevisor\Datafile\Conditions\NotCondition;
1112

1213
final class Conditions implements ConditionInterface
1314
{
@@ -23,6 +24,10 @@ public static function createFromMixed($conditions): self
2324
return new self(new EveryoneCondition());
2425
}
2526

27+
if (is_string($conditions)) { // Unsupported string condition
28+
return new self(new NotCondition(new EveryoneCondition()));
29+
}
30+
2631
if (is_array($conditions) === false) {
2732
throw new \InvalidArgumentException('Conditions must be array or string');
2833
}

src/Datafile/Conditions/AfterCondition.php

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77

88
use DateTimeImmutable;
9+
use DateTimeInterface;
10+
use Exception;
911

1012
final class AfterCondition implements ConditionInterface
1113
{
@@ -22,8 +24,23 @@ public function __construct(string $attribute, DateTimeImmutable $value)
2224

2325
public function isSatisfiedBy(array $context): bool
2426
{
25-
$contextDate = new DateTimeImmutable($this->getValueFromContext($context, $this->attribute));
26-
27-
return $contextDate > $this->value;
27+
try {
28+
$valueFromContext = $this->getValueFromContext($context, $this->attribute);
29+
if ($valueFromContext === null) {
30+
return false;
31+
}
32+
if ($valueFromContext instanceof DateTimeInterface) {
33+
$contextDate = DateTimeImmutable::createFromFormat(
34+
DateTimeInterface::RFC3339,
35+
$valueFromContext->format(DateTimeInterface::RFC3339)
36+
);
37+
} else {
38+
$contextDate = new DateTimeImmutable($valueFromContext);
39+
}
40+
41+
return $contextDate > $this->value;
42+
} catch (Exception $e) {
43+
return false;
44+
}
2845
}
2946
}

src/Datafile/Conditions/BeforeCondition.php

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77

88
use DateTimeImmutable;
9+
use DateTimeInterface;
910

1011
final class BeforeCondition implements ConditionInterface
1112
{
@@ -22,8 +23,23 @@ public function __construct(string $attribute, DateTimeImmutable $value)
2223

2324
public function isSatisfiedBy(array $context): bool
2425
{
25-
$contextDate = new DateTimeImmutable($this->getValueFromContext($context, $this->attribute));
26-
27-
return $contextDate < $this->value;
26+
try {
27+
$valueFromContext = $this->getValueFromContext($context, $this->attribute);
28+
if ($valueFromContext === null) {
29+
return false;
30+
}
31+
if ($valueFromContext instanceof DateTimeInterface) {
32+
$contextDate = DateTimeImmutable::createFromFormat(
33+
DateTimeInterface::RFC3339,
34+
$valueFromContext->format(DateTimeInterface::RFC3339)
35+
);
36+
} else {
37+
$contextDate = new DateTimeImmutable($valueFromContext);
38+
}
39+
40+
return $contextDate < $this->value;
41+
} catch (\Exception $e) {
42+
return false;
43+
}
2844
}
2945
}

src/Datafile/Conditions/ConditionFactory.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ final class ConditionFactory
1212
{
1313
public function create(array $conditions): ConditionInterface
1414
{
15+
if (array_key_exists('attribute', $conditions)) {
16+
return $this->createCondition($conditions);
17+
}
18+
1519
$mappedConditions = array_map(fn ($condition) => $this->map($condition), $conditions);
1620

1721
if (count($mappedConditions) === 1) {
@@ -44,13 +48,12 @@ private function map(array $condition): ConditionInterface
4448

4549
private function createCondition(array $condition): ConditionInterface
4650
{
47-
if (!isset($condition['attribute']) || !isset($condition['operator']) || !isset($condition['value'])) {
48-
var_dump($condition);
51+
if (!isset($condition['attribute']) || !isset($condition['operator'])) {
4952
throw new InvalidArgumentException('Invalid condition format');
5053
}
5154

5255
$attribute = $condition['attribute'];
53-
$value = $condition['value'];
56+
$value = $condition['value'] ?? null;
5457

5558
switch ($condition['operator']) {
5659
case 'after':
@@ -88,9 +91,13 @@ private function createCondition(array $condition): ConditionInterface
8891
case 'lessThanOrEquals':
8992
return new LessThanOrEqualsCondition($attribute, $value);
9093
case 'matches':
91-
return new MatchesCondition($attribute, sprintf('/%s/%s', $value, $condition['regexFlags']));
94+
return new MatchesCondition($attribute, sprintf('/%s/%s', $value, $condition['regexFlags'] ?? ''));
95+
case 'notMatches':
96+
return new NotCondition(new MatchesCondition($attribute, sprintf('/%s/%s', $value, $condition['regexFlags'] ?? '')));
9297
case 'semverEquals':
9398
return new SemverEqualsCondition($attribute, $value);
99+
case 'semverNotEquals':
100+
return new NotCondition(new SemverEqualsCondition($attribute, $value));
94101
case 'semverGreaterThan':
95102
return new SemverGreaterThanCondition($attribute, $value);
96103
case 'semverGreaterThanOrEquals':

src/Datafile/Conditions/ContainsCondition.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ public function __construct(string $attribute, string $value)
2020

2121
public function isSatisfiedBy(array $context): bool
2222
{
23-
return str_contains($this->getValueFromContext($context, $this->attribute), $this->value);
23+
return str_contains((string) $this->getValueFromContext($context, $this->attribute), $this->value);
2424
}
2525
}

src/Datafile/Conditions/EndsWithCondition.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ public function __construct(string $attribute, string $value)
2020

2121
public function isSatisfiedBy(array $context): bool
2222
{
23-
return str_ends_with($this->getValueFromContext($context, $this->attribute), $this->value);
23+
return str_ends_with((string) $this->getValueFromContext($context, $this->attribute), $this->value);
2424
}
2525
}

src/Datafile/Conditions/GreaterThanCondition.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ public function __construct(string $attribute, $value)
2626

2727
public function isSatisfiedBy(array $context): bool
2828
{
29-
return $this->getValueFromContext($context, $this->attribute) > $this->value;
29+
$valueFromContext = $this->getValueFromContext($context, $this->attribute);
30+
if ($valueFromContext === null) {
31+
return false;
32+
}
33+
34+
return $valueFromContext > $this->value;
3035
}
3136
}

src/Datafile/Conditions/GreaterThanOrEqualsCondition.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ final class GreaterThanOrEqualsCondition implements ConditionInterface
1616

1717
public function __construct(string $attribute, $value)
1818
{
19-
if (is_int($value) === false || is_float($value) === false) {
19+
if (is_int($value) === false && is_float($value) === false) {
2020
throw new \InvalidArgumentException('GreaterThanOrEqualCondition value must be float or integer');
2121
}
2222

src/Datafile/Conditions/LessThanCondition.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ public function __construct(string $attribute, $value)
2626

2727
public function isSatisfiedBy(array $context): bool
2828
{
29-
return $this->getValueFromContext($context, $this->attribute) < $this->value;
29+
$valueFromContext = $this->getValueFromContext($context, $this->attribute);
30+
if ($valueFromContext === null) {
31+
return false;
32+
}
33+
34+
return $valueFromContext < $this->value;
3035
}
3136
}

src/Datafile/Conditions/LessThanOrEqualsCondition.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ final class LessThanOrEqualsCondition implements ConditionInterface
1616

1717
public function __construct(string $attribute, $value)
1818
{
19-
if (is_int($value) === false || is_float($value) === false) {
19+
if (is_int($value) === false && is_float($value) === false) {
2020
throw new \InvalidArgumentException('LessThanOrEqualsCondition value must be float or integer');
2121
}
2222

0 commit comments

Comments
 (0)