From acd74d3e4bedcbcff5eb3aaed76a4bfeb08b625b Mon Sep 17 00:00:00 2001 From: Jan Jakes Date: Thu, 17 Mar 2022 16:05:35 +0100 Subject: [PATCH] Add factory for array WP JSON schema [MAILPOET-4195] --- mailpoet/lib/Validator/Schema/ArraySchema.php | 28 +++++++ .../unit/Validator/Schema/ArraySchemaTest.php | 73 +++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 mailpoet/lib/Validator/Schema/ArraySchema.php create mode 100644 mailpoet/tests/unit/Validator/Schema/ArraySchemaTest.php diff --git a/mailpoet/lib/Validator/Schema/ArraySchema.php b/mailpoet/lib/Validator/Schema/ArraySchema.php new file mode 100644 index 0000000000..508765ff10 --- /dev/null +++ b/mailpoet/lib/Validator/Schema/ArraySchema.php @@ -0,0 +1,28 @@ + '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); + } +} diff --git a/mailpoet/tests/unit/Validator/Schema/ArraySchemaTest.php b/mailpoet/tests/unit/Validator/Schema/ArraySchemaTest.php new file mode 100644 index 0000000000..d647c723ef --- /dev/null +++ b/mailpoet/tests/unit/Validator/Schema/ArraySchemaTest.php @@ -0,0 +1,73 @@ +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']; + }; + } +}