Add factory for array WP JSON schema
[MAILPOET-4195]
This commit is contained in:
28
mailpoet/lib/Validator/Schema/ArraySchema.php
Normal file
28
mailpoet/lib/Validator/Schema/ArraySchema.php
Normal file
@ -0,0 +1,28 @@
|
||||
<?php declare(strict_types = 1);
|
||||
|
||||
namespace MailPoet\Validator\Schema;
|
||||
|
||||
use MailPoet\Validator\Schema;
|
||||
|
||||
// See: https://developer.wordpress.org/rest-api/extending-the-rest-api/schema/#arrays
|
||||
class ArraySchema extends Schema {
|
||||
protected $schema = [
|
||||
'type' => 'array',
|
||||
];
|
||||
|
||||
public function items(Schema $schema): self {
|
||||
return $this->updateSchemaProperty('items', $schema->toArray());
|
||||
}
|
||||
|
||||
public function minItems(int $value): self {
|
||||
return $this->updateSchemaProperty('minItems', $value);
|
||||
}
|
||||
|
||||
public function maxItems(int $value): self {
|
||||
return $this->updateSchemaProperty('maxItems', $value);
|
||||
}
|
||||
|
||||
public function uniqueItems(): self {
|
||||
return $this->updateSchemaProperty('uniqueItems', true);
|
||||
}
|
||||
}
|
73
mailpoet/tests/unit/Validator/Schema/ArraySchemaTest.php
Normal file
73
mailpoet/tests/unit/Validator/Schema/ArraySchemaTest.php
Normal file
@ -0,0 +1,73 @@
|
||||
<?php declare(strict_types = 1);
|
||||
|
||||
namespace MailPoet\Validator\Schema;
|
||||
|
||||
use MailPoet\Validator\Schema;
|
||||
use MailPoetUnitTest;
|
||||
|
||||
class ArraySchemaTest extends MailPoetUnitTest {
|
||||
public function testPlain(): void {
|
||||
$array = new ArraySchema();
|
||||
$this->assertSame(['type' => 'array'], $array->toArray());
|
||||
$this->assertSame('{"type":"array"}', $array->toString());
|
||||
}
|
||||
|
||||
public function testItems(): void {
|
||||
$array = (new ArraySchema())->items($this->getNumberSchemaMock());
|
||||
$this->assertSame(['type' => 'array', 'items' => ['type' => 'number']], $array->toArray());
|
||||
$this->assertSame('{"type":"array","items":{"type":"number"}}', $array->toString());
|
||||
}
|
||||
|
||||
public function testMinItems(): void {
|
||||
$array = (new ArraySchema())->minItems(1);
|
||||
$this->assertSame(['type' => 'array', 'minItems' => 1], $array->toArray());
|
||||
$this->assertSame('{"type":"array","minItems":1}', $array->toString());
|
||||
}
|
||||
|
||||
public function testMaxItems(): void {
|
||||
$array = (new ArraySchema())->maxItems(10);
|
||||
$this->assertSame(['type' => 'array', 'maxItems' => 10], $array->toArray());
|
||||
$this->assertSame('{"type":"array","maxItems":10}', $array->toString());
|
||||
}
|
||||
|
||||
public function testUniqueItems(): void {
|
||||
$array = (new ArraySchema())->uniqueItems();
|
||||
$this->assertSame(['type' => 'array', 'uniqueItems' => true], $array->toArray());
|
||||
$this->assertSame('{"type":"array","uniqueItems":true}', $array->toString());
|
||||
}
|
||||
|
||||
public function testMixedProperties(): void {
|
||||
$array = (new ArraySchema())
|
||||
->items($this->getNumberSchemaMock())
|
||||
->minItems(3)
|
||||
->maxItems(10)
|
||||
->uniqueItems();
|
||||
|
||||
$this->assertSame([
|
||||
'type' => 'array',
|
||||
'items' => ['type' => 'number'],
|
||||
'minItems' => 3,
|
||||
'maxItems' => 10,
|
||||
'uniqueItems' => true,
|
||||
], $array->toArray());
|
||||
|
||||
$this->assertSame(
|
||||
'{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":10,"uniqueItems":true}',
|
||||
$array->toString()
|
||||
);
|
||||
}
|
||||
|
||||
public function testImmutability(): void {
|
||||
$array = new ArraySchema();
|
||||
$this->assertNotSame($array->items($this->getNumberSchemaMock()), $array);
|
||||
$this->assertNotSame($array->minItems(3), $array);
|
||||
$this->assertNotSame($array->maxItems(10), $array);
|
||||
$this->assertNotSame($array->uniqueItems(), $array);
|
||||
}
|
||||
|
||||
private function getNumberSchemaMock(): Schema {
|
||||
return new class extends Schema {
|
||||
protected $schema = ['type' => 'number'];
|
||||
};
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user