Skip to content

Commit a42ca67

Browse files
committed
Fix and add tests
1 parent 4d1c2b8 commit a42ca67

File tree

4 files changed

+73
-29
lines changed

4 files changed

+73
-29
lines changed

features/openapi/docs.feature

+4-4
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ Feature: Documentation support
153153
And the JSON node "paths./related_dummies/{id}/related_to_dummy_friends.get.parameters" should have 6 elements
154154

155155
# Subcollection - check schema
156-
And the JSON node "paths./related_dummies/{id}/related_to_dummy_friends.get.responses.200.content.application/ld+json.schema.properties.hydra:member.items.$ref" should be equal to "#/components/schemas/RelatedToDummyFriend.jsonld-fakemanytomany"
156+
And the JSON node "paths./related_dummies/{id}/related_to_dummy_friends.get.responses.200.content.application/ld+json.schema.properties.hydra:member.items.$ref" should be equal to "#/components/schemas/RelatedToDummyFriend.jsonld-fakemanytomany.output"
157157

158158
# Deprecations
159159
And the JSON node "paths./dummies.get.deprecated" should be false
@@ -165,8 +165,8 @@ Feature: Documentation support
165165
And the JSON node "paths./deprecated_resources/{id}.patch.deprecated" should be true
166166

167167
# Formats
168-
And the OpenAPI class "Dummy.jsonld" exists
169-
And the "@id" property exists for the OpenAPI class "Dummy.jsonld"
168+
And the OpenAPI class "Dummy.jsonld.output" exists
169+
And the "@id" property exists for the OpenAPI class "Dummy.jsonld.output"
170170
And the JSON node "paths./dummies.get.responses.200.content.application/ld+json" should be equal to:
171171
"""
172172
{
@@ -176,7 +176,7 @@ Feature: Documentation support
176176
"hydra:member": {
177177
"type": "array",
178178
"items": {
179-
"$ref": "#/components/schemas/Dummy.jsonld"
179+
"$ref": "#/components/schemas/Dummy.jsonld.output"
180180
}
181181
},
182182
"hydra:totalItems": {

tests/Hydra/JsonSchema/SchemaFactoryTest.php

+47-3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use ApiPlatform\Metadata\ApiResource;
2222
use ApiPlatform\Metadata\Get;
2323
use ApiPlatform\Metadata\GetCollection;
24+
use ApiPlatform\Metadata\Post;
2425
use ApiPlatform\Metadata\Property\Factory\PropertyMetadataFactoryInterface;
2526
use ApiPlatform\Metadata\Property\Factory\PropertyNameCollectionFactoryInterface;
2627
use ApiPlatform\Metadata\Property\PropertyNameCollection;
@@ -49,6 +50,7 @@ protected function setUp(): void
4950

5051
$propertyNameCollectionFactory = $this->prophesize(PropertyNameCollectionFactoryInterface::class);
5152
$propertyNameCollectionFactory->create(Dummy::class, ['enable_getter_setter_extraction' => true, 'schema_type' => Schema::TYPE_OUTPUT])->willReturn(new PropertyNameCollection());
53+
$propertyNameCollectionFactory->create(Dummy::class, ['enable_getter_setter_extraction' => true, 'schema_type' => Schema::TYPE_INPUT])->willReturn(new PropertyNameCollection());
5254
$propertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class);
5355

5456
$definitionNameFactory = new DefinitionNameFactory(['jsonapi' => true, 'jsonhal' => true, 'jsonld' => true]);
@@ -69,7 +71,12 @@ public function testBuildSchema(): void
6971
$resultSchema = $this->schemaFactory->buildSchema(Dummy::class);
7072

7173
$this->assertTrue($resultSchema->isDefined());
72-
$this->assertSame('Dummy.jsonld', $resultSchema->getRootDefinitionKey());
74+
$this->assertSame('Dummy.jsonld.output', $resultSchema->getRootDefinitionKey());
75+
76+
$resultSchema = $this->schemaFactory->buildSchema(Dummy::class, 'jsonld', Schema::TYPE_INPUT, new Post());
77+
78+
$this->assertTrue($resultSchema->isDefined());
79+
$this->assertSame('Dummy.jsonld.input', $resultSchema->getRootDefinitionKey());
7380
}
7481

7582
public function testCustomFormatBuildSchema(): void
@@ -94,7 +101,6 @@ public function testHasRootDefinitionKeyBuildSchema(): void
94101
$this->assertArrayHasKey('@context', $properties);
95102
$this->assertEquals(
96103
[
97-
'readOnly' => true,
98104
'oneOf' => [
99105
['type' => 'string'],
100106
[
@@ -122,7 +128,7 @@ public function testHasRootDefinitionKeyBuildSchema(): void
122128
public function testSchemaTypeBuildSchema(): void
123129
{
124130
$resultSchema = $this->schemaFactory->buildSchema(Dummy::class, 'jsonld', Schema::TYPE_OUTPUT, new GetCollection());
125-
$definitionName = 'Dummy.jsonld';
131+
$definitionName = 'Dummy.jsonld.output';
126132

127133
$this->assertNull($resultSchema->getRootDefinitionKey());
128134
// @noRector
@@ -151,6 +157,12 @@ public function testSchemaTypeBuildSchema(): void
151157
$this->assertArrayNotHasKey('@context', $properties);
152158
$this->assertArrayHasKey('@type', $properties);
153159
$this->assertArrayHasKey('@id', $properties);
160+
161+
$resultSchema = $this->schemaFactory->buildSchema(Dummy::class, 'jsonld', Schema::TYPE_INPUT, new Post());
162+
$definitionName = 'Dummy.jsonld.input';
163+
164+
$this->assertSame($definitionName, $resultSchema->getRootDefinitionKey());
165+
$this->assertFalse(isset($resultSchema['properties']));
154166
}
155167

156168
public function testHasHydraViewNavigationBuildSchema(): void
@@ -168,4 +180,36 @@ public function testHasHydraViewNavigationBuildSchema(): void
168180
$this->assertArrayHasKey('hydra:previous', $resultSchema['properties']['hydra:view']['properties']);
169181
$this->assertArrayHasKey('hydra:next', $resultSchema['properties']['hydra:view']['properties']);
170182
}
183+
184+
public function testRequiredBasePropertiesBuildSchema(): void
185+
{
186+
$resultSchema = $this->schemaFactory->buildSchema(Dummy::class);
187+
$definitions = $resultSchema->getDefinitions();
188+
$rootDefinitionKey = $resultSchema->getRootDefinitionKey();
189+
190+
$this->assertTrue(isset($definitions[$rootDefinitionKey]));
191+
$this->assertTrue(isset($definitions[$rootDefinitionKey]['required']));
192+
$requiredProperties = $resultSchema['definitions'][$rootDefinitionKey]['required'];
193+
$this->assertContains('@context', $requiredProperties);
194+
$this->assertContains('@id', $requiredProperties);
195+
$this->assertContains('@type', $requiredProperties);
196+
197+
$resultSchema = $this->schemaFactory->buildSchema(Dummy::class, 'jsonld', Schema::TYPE_OUTPUT, new GetCollection());
198+
$definitions = $resultSchema->getDefinitions();
199+
$itemsDefinitionKey = array_key_first($definitions->getArrayCopy());
200+
201+
$this->assertTrue(isset($definitions[$itemsDefinitionKey]));
202+
$this->assertTrue(isset($definitions[$itemsDefinitionKey]['required']));
203+
$requiredProperties = $resultSchema['definitions'][$itemsDefinitionKey]['required'];
204+
$this->assertNotContains('@context', $requiredProperties);
205+
$this->assertContains('@id', $requiredProperties);
206+
$this->assertContains('@type', $requiredProperties);
207+
208+
$resultSchema = $this->schemaFactory->buildSchema(Dummy::class, 'jsonld', Schema::TYPE_INPUT, new Post());
209+
$definitions = $resultSchema->getDefinitions();
210+
$itemsDefinitionKey = array_key_first($definitions->getArrayCopy());
211+
212+
$this->assertTrue(isset($definitions[$itemsDefinitionKey]));
213+
$this->assertFalse(isset($definitions[$itemsDefinitionKey]['required']));
214+
}
171215
}

tests/JsonSchema/Command/JsonSchemaGenerateCommandTest.php

+21-21
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ public function testExecuteWithJsonldTypeInput(): void
7676
$this->tester->run(['command' => 'api:json-schema:generate', 'resource' => $this->entityClass, '--operation' => '_api_/dummies{._format}_post', '--format' => 'jsonld', '--type' => 'input']);
7777
$result = $this->tester->getDisplay();
7878

79-
$this->assertStringNotContainsString('@id', $result);
80-
$this->assertStringNotContainsString('@context', $result);
81-
$this->assertStringNotContainsString('@type', $result);
79+
$this->assertStringContainsString('@id', $result);
80+
$this->assertStringContainsString('@context', $result);
81+
$this->assertStringContainsString('@type', $result);
8282
}
8383

8484
/**
@@ -103,24 +103,24 @@ public function testArraySchemaWithReference(): void
103103
$result = $this->tester->getDisplay();
104104
$json = json_decode($result, associative: true);
105105

106-
$this->assertEquals($json['definitions']['BagOfTests.jsonld-write']['properties']['tests'], [
106+
$this->assertEquals($json['definitions']['BagOfTests.jsonld-write.input']['properties']['tests'], [
107107
'type' => 'string',
108108
'foo' => 'bar',
109109
]);
110110

111-
$this->assertEquals($json['definitions']['BagOfTests.jsonld-write']['properties']['nonResourceTests'], [
111+
$this->assertEquals($json['definitions']['BagOfTests.jsonld-write.input']['properties']['nonResourceTests'], [
112112
'type' => 'array',
113113
'items' => [
114-
'$ref' => '#/definitions/NonResourceTestEntity.jsonld-write',
114+
'$ref' => '#/definitions/NonResourceTestEntity.jsonld-write.input',
115115
],
116116
]);
117117

118-
$this->assertEquals($json['definitions']['BagOfTests.jsonld-write']['properties']['description'], [
118+
$this->assertEquals($json['definitions']['BagOfTests.jsonld-write.input']['properties']['description'], [
119119
'maxLength' => 255,
120120
]);
121121

122-
$this->assertEquals($json['definitions']['BagOfTests.jsonld-write']['properties']['type'], [
123-
'$ref' => '#/definitions/TestEntity.jsonld-write',
122+
$this->assertEquals($json['definitions']['BagOfTests.jsonld-write.input']['properties']['type'], [
123+
'$ref' => '#/definitions/TestEntity.jsonld-write.input',
124124
]);
125125
}
126126

@@ -130,14 +130,14 @@ public function testArraySchemaWithMultipleUnionTypesJsonLd(): void
130130
$result = $this->tester->getDisplay();
131131
$json = json_decode($result, associative: true);
132132

133-
$this->assertEquals($json['definitions']['Nest.jsonld']['properties']['owner']['anyOf'], [
134-
['$ref' => '#/definitions/Wren.jsonld'],
135-
['$ref' => '#/definitions/Robin.jsonld'],
133+
$this->assertEquals($json['definitions']['Nest.jsonld.output']['properties']['owner']['anyOf'], [
134+
['$ref' => '#/definitions/Wren.jsonld.output'],
135+
['$ref' => '#/definitions/Robin.jsonld.output'],
136136
['type' => 'null'],
137137
]);
138138

139-
$this->assertArrayHasKey('Wren.jsonld', $json['definitions']);
140-
$this->assertArrayHasKey('Robin.jsonld', $json['definitions']);
139+
$this->assertArrayHasKey('Wren.jsonld.output', $json['definitions']);
140+
$this->assertArrayHasKey('Robin.jsonld.output', $json['definitions']);
141141
}
142142

143143
public function testArraySchemaWithMultipleUnionTypesJsonApi(): void
@@ -185,7 +185,7 @@ public function testArraySchemaWithTypeFactory(): void
185185
$result = $this->tester->getDisplay();
186186
$json = json_decode($result, associative: true);
187187

188-
$this->assertEquals($json['definitions']['Foo.jsonld']['properties']['expiration'], ['type' => 'string', 'format' => 'date']);
188+
$this->assertEquals($json['definitions']['Foo.jsonld.output']['properties']['expiration'], ['type' => 'string', 'format' => 'date']);
189189
}
190190

191191
/**
@@ -197,7 +197,7 @@ public function testWritableNonResourceRef(): void
197197
$result = $this->tester->getDisplay();
198198
$json = json_decode($result, associative: true);
199199

200-
$this->assertEquals($json['definitions']['SaveProduct.jsonld']['properties']['codes']['items']['$ref'], '#/definitions/ProductCode.jsonld');
200+
$this->assertEquals($json['definitions']['SaveProduct.jsonld.input']['properties']['codes']['items']['$ref'], '#/definitions/ProductCode.jsonld.input');
201201
}
202202

203203
/**
@@ -209,8 +209,8 @@ public function testOpenApiResourceRefIsNotOverwritten(): void
209209
$result = $this->tester->getDisplay();
210210
$json = json_decode($result, associative: true);
211211

212-
$this->assertEquals('#/definitions/DummyFriend', $json['definitions']['Issue6299.Issue6299OutputDto.jsonld']['properties']['itemDto']['$ref']);
213-
$this->assertEquals('#/definitions/DummyDate', $json['definitions']['Issue6299.Issue6299OutputDto.jsonld']['properties']['collectionDto']['items']['$ref']);
212+
$this->assertEquals('#/definitions/DummyFriend', $json['definitions']['Issue6299.Issue6299OutputDto.jsonld.output']['properties']['itemDto']['$ref']);
213+
$this->assertEquals('#/definitions/DummyDate', $json['definitions']['Issue6299.Issue6299OutputDto.jsonld.output']['properties']['collectionDto']['items']['$ref']);
214214
}
215215

216216
/**
@@ -222,7 +222,7 @@ public function testSubSchemaJsonLd(): void
222222
$result = $this->tester->getDisplay();
223223
$json = json_decode($result, associative: true);
224224

225-
$this->assertArrayHasKey('@id', $json['definitions']['ThirdLevel.jsonld-friends']['properties']);
225+
$this->assertArrayHasKey('@id', $json['definitions']['ThirdLevel.jsonld-friends.output']['properties']);
226226
}
227227

228228
public function testJsonApiIncludesSchema(): void
@@ -280,7 +280,7 @@ public function testBackedEnumExamplesAreNotLost(): void
280280
$this->tester->run(['command' => 'api:json-schema:generate', 'resource' => 'ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\Issue6317\Issue6317', '--type' => 'output', '--format' => 'jsonld']);
281281
$result = $this->tester->getDisplay();
282282
$json = json_decode($result, associative: true);
283-
$properties = $json['definitions']['Issue6317.jsonld']['properties'];
283+
$properties = $json['definitions']['Issue6317.jsonld.output']['properties'];
284284

285285
$this->assertArrayHasKey('example', $properties['id']);
286286
$this->assertArrayHasKey('example', $properties['name']);
@@ -295,7 +295,7 @@ public function testResourceWithEnumPropertiesSchema(): void
295295
$this->tester->run(['command' => 'api:json-schema:generate', 'resource' => 'ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\ResourceWithEnumProperty', '--type' => 'output', '--format' => 'jsonld']);
296296
$result = $this->tester->getDisplay();
297297
$json = json_decode($result, associative: true);
298-
$properties = $json['definitions']['ResourceWithEnumProperty.jsonld']['properties'];
298+
$properties = $json['definitions']['ResourceWithEnumProperty.jsonld.output']['properties'];
299299

300300
$this->assertSame(
301301
[

tests/Symfony/Bundle/Command/OpenApiCommandTest.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ public function testBackedEnumExamplesAreNotLost(): void
134134
};
135135

136136
$assertExample($json['components']['schemas']['Issue6317']['properties'], 'id');
137-
$assertExample($json['components']['schemas']['Issue6317.jsonld']['properties'], 'id');
137+
$assertExample($json['components']['schemas']['Issue6317.jsonld.output']['properties'], 'id');
138138
$assertExample($json['components']['schemas']['Issue6317.jsonapi']['properties']['data']['properties']['attributes']['properties'], '_id');
139139
$assertExample($json['components']['schemas']['Issue6317.jsonhal']['properties'], 'id');
140140
}

0 commit comments

Comments
 (0)