Add factory for array WP JSON schema

[MAILPOET-4195]
This commit is contained in:
Jan Jakes
2022-03-17 16:05:35 +01:00
committed by Veljko V
parent e8241466da
commit acd74d3e4b
2 changed files with 101 additions and 0 deletions

View 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);
}
}

View 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'];
};
}
}