Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
173 changes: 173 additions & 0 deletions tests/phpunit/tests/json-schema.php
Original file line number Diff line number Diff line change
Expand Up @@ -983,4 +983,177 @@ public function test_wp_prepare_json_value_for_client_uses_pattern_properties()

$this->assertSame( '{"item-1":{}}', wp_json_encode( $prepared ) );
}

/**
* Data provider for test_wp_json_schema_matches_type().
*
* @return array<string, array{0: mixed, 1: array<string, mixed>, 2: string, 3: bool}>
*/
public static function data_wp_json_schema_matches_type() {
return array(
'type allows the requested type' => array(
array(),
array( 'type' => array( 'object', 'array' ) ),
'array',
true,
),
'type does not allow the requested type' => array(
array(),
array( 'type' => 'object' ),
'array',
false,
),
'value fails validation as the requested type' => array(
array(),
array(
'type' => 'array',
'minItems' => 1,
),
'array',
false,
),
'schema without type or combining keywords' => array(
array(),
array( 'minItems' => 0 ),
'array',
false,
),
'anyOf with a matching branch' => array(
array(),
array(
'anyOf' => array(
array( 'type' => 'object' ),
array( 'type' => 'array' ),
),
),
'array',
true,
),
'anyOf with the type and a valid value in different branches' => array(
array(),
array(
'anyOf' => array(
array(
'type' => 'array',
'minItems' => 1,
),
array( 'type' => 'object' ),
),
),
'array',
false,
),
'oneOf without a branch of the requested type' => array(
array(),
array(
'oneOf' => array(
array( 'type' => 'object' ),
array( 'type' => 'string' ),
),
),
'array',
false,
),
'oneOf with several matching branches' => array(
array(),
array(
'oneOf' => array(
array( 'type' => 'array' ),
array(
'type' => 'array',
'maxItems' => 1,
),
),
),
'array',
false,
),
'anyOf and oneOf must both match' => array(
array(),
array(
'anyOf' => array(
array( 'type' => 'array' ),
),
'oneOf' => array(
array( 'type' => 'object' ),
),
),
'array',
false,
),
'untyped branch inherits an allowing parent type' => array(
array(),
array(
'type' => array( 'object', 'array' ),
'anyOf' => array(
array( 'maxItems' => 1 ),
),
),
'array',
true,
),
'untyped branch inherits a rejecting parent type' => array(
array(),
array(
'type' => array( 'object', 'string' ),
'anyOf' => array(
array( 'maxProperties' => 1 ),
),
),
'array',
false,
),
'only non-array branches' => array(
array(),
array(
'anyOf' => array( 'array' ),
),
'array',
false,
),
'nested combining keywords' => array(
array( 'a' ),
array(
'oneOf' => array(
array(
'anyOf' => array(
array(
'type' => 'array',
'minItems' => 2,
),
array(
'type' => 'array',
'items' => array( 'type' => 'string' ),
),
),
),
array( 'type' => 'string' ),
),
),
'array',
true,
),
'object requested for an empty array' => array(
array(),
array( 'type' => array( 'object', 'array' ) ),
'object',
true,
),
);
}

/**
* Tests whether a value matches a schema through a given type.
*
* @ticket 66267
* @dataProvider data_wp_json_schema_matches_type
*
* @param mixed $value The value to validate.
* @param array<string, mixed> $schema The schema to inspect.
* @param string $type The type to match.
* @param bool $expected Whether the value is expected to match.
*/
public function test_wp_json_schema_matches_type( $value, $schema, $type, $expected ) {
$this->assertSame( $expected, _wp_json_schema_matches_type( $value, $schema, $type ) );
}
}
Loading