Skip to content

Commit

Permalink
Refine some types, improve coverage
Browse files Browse the repository at this point in the history
  • Loading branch information
gsteel committed Oct 31, 2024
1 parent ac25107 commit ea2b8c8
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 27 deletions.
22 changes: 11 additions & 11 deletions src/Document/Fragment/Factory.php
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ private static function imageFactory(object $data, string $name = 'main'): Image

return Image::new(
$name,
self::assertObjectPropertyIsString($data, 'url'),
self::assertObjectPropertyIsNonEmptyString($data, 'url'),
self::assertObjectPropertyIsInteger($dimensions, 'width'),
self::assertObjectPropertyIsInteger($dimensions, 'height'),
self::optionalStringProperty($data, 'alt'),
Expand All @@ -177,7 +177,7 @@ private static function linkFactory(object $data): Link

if ($type === 'Web') {
return WebLink::new(
self::assertObjectPropertyIsString($data, 'url'),
self::assertObjectPropertyIsNonEmptyString($data, 'url'),
self::optionalStringProperty($data, 'target'),
);
}
Expand All @@ -186,7 +186,7 @@ private static function linkFactory(object $data): Link

if ($type === 'Media' && $kind === 'image') {
return ImageLink::new(
self::assertObjectPropertyIsString($data, 'url'),
self::assertObjectPropertyIsNonEmptyString($data, 'url'),
self::assertObjectPropertyIsString($data, 'name'),
self::assertObjectPropertyIsIntegerish($data, 'size'),
self::assertObjectPropertyIsIntegerish($data, 'width'),
Expand All @@ -196,7 +196,7 @@ private static function linkFactory(object $data): Link

if ($type === 'Media') {
return MediaLink::new(
self::assertObjectPropertyIsString($data, 'url'),
self::assertObjectPropertyIsNonEmptyString($data, 'url'),
self::assertObjectPropertyIsString($data, 'name'),
self::assertObjectPropertyIsIntegerish($data, 'size'),
);
Expand All @@ -209,9 +209,9 @@ private static function linkFactory(object $data): Link
$lang ??= '*';

return DocumentLink::new(
self::assertObjectPropertyIsString($data, 'id'),
self::assertObjectPropertyIsNonEmptyString($data, 'id'),
self::optionalStringProperty($data, 'uid'),
self::assertObjectPropertyIsString($data, 'type'),
self::assertObjectPropertyIsNonEmptyString($data, 'type'),
$lang,
$isBroken,
self::assertObjectPropertyAllString($data, 'tags'),
Expand All @@ -232,7 +232,7 @@ private static function embedFactory(object $data): Fragment

return Embed::new(
self::assertObjectPropertyIsString($data, 'type'),
self::assertObjectPropertyIsString($data, 'embed_url'),
self::assertObjectPropertyIsNonEmptyString($data, 'embed_url'),
self::optionalStringProperty($data, 'provider_name'),
self::optionalStringProperty($data, 'html'),
self::optionalIntegerPropertyOrNull($data, 'width'),
Expand All @@ -253,10 +253,10 @@ private static function sliceFactory(object $data): Fragment
}, $primary));

$type = self::assertObjectPropertyIsNonEmptyString($data, 'slice_type');
$label = self::optionalNonEmptyStringProperty($data, 'slice_label');
$label = self::optionalStringProperty($data, 'slice_label');
$variation = self::optionalStringProperty($data, 'variation');
$version = self::optionalNonEmptyStringProperty($data, 'version');
$id = self::optionalNonEmptyStringProperty($data, 'id');
$version = self::optionalStringProperty($data, 'version');
$id = self::optionalStringProperty($data, 'id');

if (is_string($id) && is_string($variation)) {
return Slice::shared(
Expand Down Expand Up @@ -302,7 +302,7 @@ private static function spanFactory(object $data): Span
}

return Span::new(
self::assertObjectPropertyIsString($data, 'type'),
self::assertObjectPropertyIsNonEmptyString($data, 'type'),
self::assertObjectPropertyIsInteger($data, 'start'),
self::assertObjectPropertyIsInteger($data, 'end'),
$label,
Expand Down
20 changes: 5 additions & 15 deletions src/Value/DataAssertionBehaviour.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ private static function assertObjectPropertyIsString(object $object, string $pro
private static function assertObjectPropertyIsNonEmptyString(object $object, string $property): string
{
self::assertPropertyExists($object, $property);
$value = $object->{$property};
if (! is_string($value) || $value === '') {
$value = self::optionalStringProperty($object, $property);
if ($value === null) {
throw UnexpectedValue::withInvalidPropertyType($object, $property, 'non-empty-string');
}

Expand Down Expand Up @@ -133,35 +133,25 @@ private static function assertObjectPropertyIsObject(object $object, string $pro
return $value;
}

/** @return non-empty-string|null */
private static function optionalStringProperty(object $object, string $property): string|null
{
if (! property_exists($object, $property)) {
return null;
}

$value = $object->{$property};
if (! $value) {
if ($value === null) {
return null;
}

if (! is_string($value)) {
if (! is_string($value) || $value === '') {
throw UnexpectedValue::withInvalidPropertyType($object, $property, 'string or null');
}

return $value;
}

/** @return non-empty-string|null */
private static function optionalNonEmptyStringProperty(object $object, string $property): string|null
{
$value = self::optionalStringProperty($object, $property);
if ($value === '') {
return null;
}

return $value;
}

/** @return mixed[]|null */
private static function optionalArrayProperty(object $object, string $property): array|null
{
Expand Down
2 changes: 1 addition & 1 deletion test/Unit/Document/Fragment/FactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ public static function exceptionalImageSpecs(): array
],
'Non string URL' => [
'{"dimensions":{"width":100,"height":100}, "url":null}',
'Expected the object property "url" to be a string',
'Expected the object property "url" to be a non-empty-string',
],
'Non string Alt' => [
'{"dimensions":{"width":100,"height":100}, "url":"foo", "alt":1}',
Expand Down

0 comments on commit ea2b8c8

Please sign in to comment.