Add title, description, and default fields to schema

[MAILPOET-4195]
This commit is contained in:
Jan Jakes
2022-03-23 11:26:59 +01:00
committed by Veljko V
parent 6293809b1e
commit 065282504a
3 changed files with 55 additions and 5 deletions

View File

@@ -33,6 +33,21 @@ abstract class Schema {
return $this->unsetSchemaProperty('required');
}
/** @return static */
public function title(string $title) {
return $this->updateSchemaProperty('title', $title);
}
/** @return static */
public function description(string $description) {
return $this->updateSchemaProperty('description', $description);
}
/** @return static */
public function default($default) {
return $this->updateSchemaProperty('default', $default);
}
public function toArray(): array {
return $this->schema;
}

View File

@@ -423,6 +423,8 @@ class ValidatorTest extends MailPoetTest {
public function testComplex(): void {
$schema = Builder::object()
->title('User')
->description('User schema definition')
->properties([
'id' => Builder::string()->required()->formatUuid(),
'created_at' => Builder::string()->required()->formatDateTime(),
@@ -431,7 +433,7 @@ class ValidatorTest extends MailPoetTest {
'email' => Builder::string()->required()->formatEmail(),
'ip' => Builder::string()->required()->formatIp(),
'refresh_interval' => Builder::integer()->required()->multipleOf(3600),
'subscribed' => Builder::boolean()->required(),
'subscribed' => Builder::boolean()->default(false),
// nested object
'profile' => Builder::object([
@@ -490,6 +492,8 @@ class ValidatorTest extends MailPoetTest {
$this->assertSame(
[
'type' => 'object',
'title' => 'User',
'description' => 'User schema definition',
'properties' => [
'id' => [
'type' => 'string',
@@ -531,7 +535,7 @@ class ValidatorTest extends MailPoetTest {
],
'subscribed' => [
'type' => 'boolean',
'required' => true,
'default' => false,
],
'profile' => [
'type' => 'object',
@@ -663,7 +667,7 @@ class ValidatorTest extends MailPoetTest {
$this->assertSame(
$schema->toString(),
'{"type":"object","properties":{"id":{"type":"string","required":true,"format":"uuid"},"created_at":{"type":"string","required":true,"format":"date-time"},"username":{"type":"string","required":true,"minLength":2,"maxLength":30,"pattern":"^[a-z0-9]+$"},"password":{"type":"string","required":true,"minLength":8,"maxLength":1024},"email":{"type":"string","required":true,"format":"email"},"ip":{"type":"string","required":true,"format":"ip"},"refresh_interval":{"type":"integer","required":true,"multipleOf":3600},"subscribed":{"type":"boolean","required":true},"profile":{"type":"object","properties":{"url":{"type":"string","required":true,"format":"uri"},"photo_url":{"type":["string","null"],"required":true},"color":{"type":"string","required":true,"format":"hex-color"},"age":{"type":"integer","required":true},"rating":{"type":"integer","required":true,"minimum":0,"maximum":5},"score":{"type":"number","required":true,"minimum":0.0,"exclusiveMinimum":true,"maximum":100.0},"distance":{"type":"number","required":true}}},"preferences":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","required":true},"value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}],"required":true},"meta":{"type":"string"}}},"uniqueItems":true},"properties":{"type":"object","patternProperties":{"^number_":{"anyOf":[{"type":"integer"},{"type":"number"}]},"^string_":{"type":"string"},"^bool_":{"type":"boolean"}}},"linked_accounts":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"apple_id":{"type":"string","required":true}}},{"type":"object","properties":{"facebook_id":{"type":"string","required":true}}},{"type":"object","properties":{"google_id":{"type":"string","required":true}}}]}},"attributes":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"boolean"},{"type":"number"},{"type":"null"}]}}}}'
'{"type":"object","title":"User","description":"User schema definition","properties":{"id":{"type":"string","required":true,"format":"uuid"},"created_at":{"type":"string","required":true,"format":"date-time"},"username":{"type":"string","required":true,"minLength":2,"maxLength":30,"pattern":"^[a-z0-9]+$"},"password":{"type":"string","required":true,"minLength":8,"maxLength":1024},"email":{"type":"string","required":true,"format":"email"},"ip":{"type":"string","required":true,"format":"ip"},"refresh_interval":{"type":"integer","required":true,"multipleOf":3600},"subscribed":{"type":"boolean","default":false},"profile":{"type":"object","properties":{"url":{"type":"string","required":true,"format":"uri"},"photo_url":{"type":["string","null"],"required":true},"color":{"type":"string","required":true,"format":"hex-color"},"age":{"type":"integer","required":true},"rating":{"type":"integer","required":true,"minimum":0,"maximum":5},"score":{"type":"number","required":true,"minimum":0.0,"exclusiveMinimum":true,"maximum":100.0},"distance":{"type":"number","required":true}}},"preferences":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","required":true},"value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}],"required":true},"meta":{"type":"string"}}},"uniqueItems":true},"properties":{"type":"object","patternProperties":{"^number_":{"anyOf":[{"type":"integer"},{"type":"number"}]},"^string_":{"type":"string"},"^bool_":{"type":"boolean"}}},"linked_accounts":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"apple_id":{"type":"string","required":true}}},{"type":"object","properties":{"facebook_id":{"type":"string","required":true}}},{"type":"object","properties":{"google_id":{"type":"string","required":true}}}]}},"attributes":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"boolean"},{"type":"number"},{"type":"null"}]}}}}'
);
$this->assertValidationPassed(

View File

@@ -35,18 +35,46 @@ class SchemaTest extends MailPoetUnitTest {
$this->assertSame('{"type":"test"}', $schema->toString());
}
public function testTitle(): void {
$schema = $this->getTestingSchema()->title('Schema title');
$this->assertSame(['type' => 'test', 'title' => 'Schema title'], $schema->toArray());
$this->assertSame('{"type":"test","title":"Schema title"}', $schema->toString());
}
public function testDescription(): void {
$schema = $this->getTestingSchema()->description('Schema description');
$this->assertSame(['type' => 'test', 'description' => 'Schema description'], $schema->toArray());
$this->assertSame('{"type":"test","description":"Schema description"}', $schema->toString());
}
public function testDefault(): void {
$schema = $this->getTestingSchema()->default('Default value');
$this->assertSame(['type' => 'test', 'default' => 'Default value'], $schema->toArray());
$this->assertSame('{"type":"test","default":"Default value"}', $schema->toString());
$schema = $this->getTestingSchema()->default(null);
$this->assertSame(['type' => 'test', 'default' => null], $schema->toArray());
$this->assertSame('{"type":"test","default":null}', $schema->toString());
}
public function testMixedProperties(): void {
$schema = $this->getTestingSchema()
->required()
->nullable();
->nullable()
->title('Schema title')
->description('Schema description')
->default('Default value');
$this->assertSame([
'type' => ['test', 'null'],
'required' => true,
'title' => 'Schema title',
'description' => 'Schema description',
'default' => 'Default value',
], $schema->toArray());
$this->assertSame(
'{"type":["test","null"],"required":true}',
'{"type":["test","null"],"required":true,"title":"Schema title","description":"Schema description","default":"Default value"}',
$schema->toString()
);
}
@@ -57,6 +85,9 @@ class SchemaTest extends MailPoetUnitTest {
$this->assertNotSame($schema->nonNullable(), $schema);
$this->assertNotSame($schema->required(), $schema);
$this->assertNotSame($schema->optional(), $schema);
$this->assertNotSame($schema->title('Title'), $schema);
$this->assertNotSame($schema->description('Description'), $schema);
$this->assertNotSame($schema->default(null), $schema);
}
private function getTestingSchema(): Schema {