Skip to content

Commit 6304ab0

Browse files
committed
Allow nil UUIDs
1 parent 357f0dd commit 6304ab0

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

src/Filter/UuidFilter.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ final class UuidFilter
2222
*/
2323
const FILTER_ERROR_FORMAT = "Value '%s' is not a valid UUID. Versions checked (%s)";
2424

25+
/**
26+
* @var string
27+
*/
28+
const NIL_NOT_ALLOWED_ERROR_FORMAT = "Value '%s' is nil uuid, but nil values are not allowed.";
29+
2530
/**
2631
* @var string
2732
*/
@@ -32,6 +37,11 @@ final class UuidFilter
3237
*/
3338
const UNSUPPORTED_VERSION_ERROR_FORMAT = 'Filter does not support UUID v%d';
3439

40+
/**
41+
* @var string
42+
*/
43+
const NIL_UUID = '00000000-0000-0000-0000-000000000000';
44+
3545
/**
3646
* @var array
3747
* @internal
@@ -44,6 +54,7 @@ final class UuidFilter
4454
*
4555
* @param string|null $value The value to be filtered.
4656
* @param bool $allowNull Flag to allow value to be null.
57+
* @param bool $allowNil Flag to allow value to be a NIL UUID.
4758
* @param array $versions List of specific UUID version to validate against.
4859
*
4960
* @return string|null
@@ -53,12 +64,17 @@ final class UuidFilter
5364
public static function filter(
5465
string $value = null,
5566
bool $allowNull = false,
67+
bool $allowNil = false,
5668
array $versions = self::VALID_UUID_VERSIONS
5769
) {
5870
if (self::valueIsNullAndValid($allowNull, $value)) {
5971
return null;
6072
}
6173

74+
if (self::valueIsNilAndValid($allowNil, $value)) {
75+
return self::NIL_UUID;
76+
}
77+
6278
self::validateVersions($versions);
6379
foreach ($versions as $version) {
6480
$pattern = sprintf(self::UUID_PATTERN_FORMAT, $version);
@@ -85,6 +101,15 @@ private static function valueIsNullAndValid(bool $allowNull, string $value = nul
85101
return $allowNull === true && $value === null;
86102
}
87103

104+
private static function valueIsNilAndValid(bool $allowNil, string $value = null): bool
105+
{
106+
if ($allowNil === false && $value === self::NIL_UUID) {
107+
throw new FilterException(sprintf(self::NIL_NOT_ALLOWED_ERROR_FORMAT, $value));
108+
}
109+
110+
return $allowNil === true && $value === self::NIL_UUID;
111+
}
112+
88113
private static function validateVersions(array $versions)
89114
{
90115
foreach ($versions as $version) {

tests/Filter/UuidFilterTest.php

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public function filterWithInvalidVersionSpecified()
8585
{
8686
$this->expectException(InvalidArgumentException::class);
8787
$this->expectExceptionMessage(sprintf(UuidFilter::UNSUPPORTED_VERSION_ERROR_FORMAT, 0));
88-
UuidFilter::filter(self::UUID_V7, false, [0]);
88+
UuidFilter::filter(self::UUID_V7, false, false, [0]);
8989
}
9090

9191
/**
@@ -102,6 +102,28 @@ public function filterValueDoesNotMatchGivenVersions()
102102
implode(', ', [1,7])
103103
)
104104
);
105-
UuidFilter::filter(self::UUID_V4, false, [1,7]);
105+
UuidFilter::filter(self::UUID_V4, false, false, [1,7]);
106+
}
107+
108+
/**
109+
* @test
110+
* @covers ::filter
111+
*/
112+
public function filterNilUuid()
113+
{
114+
$value = UuidFilter::NIL_UUID;
115+
$this->assertSame($value, UuidFilter::filter($value, false, true));
116+
}
117+
118+
/**
119+
* @test
120+
* @covers ::filter
121+
*/
122+
public function filterNilUuidNilNotAllowed()
123+
{
124+
$value = UuidFilter::NIL_UUID;
125+
$this->expectException(FilterException::class);
126+
$this->expectExceptionMessage(sprintf(UuidFilter::NIL_NOT_ALLOWED_ERROR_FORMAT, $value));
127+
UuidFilter::filter($value, false, false);
106128
}
107129
}

0 commit comments

Comments
 (0)