Skip to content

Commit

Permalink
Implement input/output with data transformers
Browse files Browse the repository at this point in the history
  • Loading branch information
soyuka committed Feb 13, 2019
1 parent bb30d60 commit 573d489
Show file tree
Hide file tree
Showing 76 changed files with 1,822 additions and 340 deletions.
32 changes: 32 additions & 0 deletions features/bootstrap/DoctrineContext.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyCar as DummyCarDocument;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyCarColor as DummyCarColorDocument;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyDate as DummyDateDocument;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyDtoCustom as DummyDtoCustomDocument;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyDtoNoInput as DummyDtoNoInputDocument;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyDtoNoOutput as DummyDtoNoOutputDocument;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\DummyFriend as DummyFriendDocument;
Expand Down Expand Up @@ -59,6 +60,7 @@
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyCar;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyCarColor;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyDate;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyDtoCustom;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyDtoNoInput;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyDtoNoOutput;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyFriend;
Expand Down Expand Up @@ -1182,6 +1184,36 @@ public function thereIsAMaxDepthDummyWithLevelOfDescendants(int $level)
$this->manager->flush();
}

/**
* @Given there is a DummyCustomDto
*/
public function thereIsADummyCustomDto()
{
$dto = $this->isOrm() ? new DummyDtoCustom() : new DummyDtoCustomDocument();
$dto->lorem = 'test';
$dto->ipsum = '0';
$this->manager->persist($dto);

$this->manager->flush();
$this->manager->clear();
}

/**
* @Given there are :nb DummyCustomDto
*/
public function thereAreNbDummyCustomDto($nb)
{
for ($i = 1; $i <= $nb; ++$i) {
$dto = $this->isOrm() ? new DummyDtoCustom() : new DummyDtoCustomDocument();
$dto->lorem = 'test';
$dto->ipsum = (string) $i;
$this->manager->persist($dto);
}

$this->manager->flush();
$this->manager->clear();
}

private function isOrm(): bool
{
return null !== $this->schemaTool;
Expand Down
22 changes: 17 additions & 5 deletions features/graphql/mutation.feature
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ Feature: GraphQL mutation support
And the response should be in JSON
And the header "Content-Type" should be equal to "application/json"
And the JSON node "data.__type.fields[0].name" should contain "delete"
And the JSON node "data.__type.fields[0].description" should match '/^Deletes a [A-z0-9]+\.$/'
And the JSON node "data.__type.fields[0].description" should match '/^Deletes a [A-z0-9]+.$/'
And the JSON node "data.__type.fields[0].type.name" should match "/^delete[A-z0-9]+Payload$/"
And the JSON node "data.__type.fields[0].type.kind" should be equal to "OBJECT"
And the JSON node "data.__type.fields[0].args[0].name" should be equal to "input"
Expand Down Expand Up @@ -310,7 +310,7 @@ Feature: GraphQL mutation support
When I send the following GraphQL request:
"""
mutation {
createDummyDtoNoInput(input: {foo: "A new one", bar: 3, clientMutationId: "myId"}) {
createDummyDtoNoInput(input: {lorem: "A new one", ipsum: 3, clientMutationId: "myId"}) {
clientMutationId
}
}
Expand All @@ -323,7 +323,19 @@ Feature: GraphQL mutation support
{
"errors": [
{
"message": "Field \"foo\" is not defined by type createDummyDtoNoInputInput.",
"message": "Field createDummyDtoNoInputInput.id of required type ID! was not provided.",
"extensions": {
"category": "graphql"
},
"locations": [
{
"line": 2,
"column": 32
}
]
},
{
"message": "Field \"lorem\" is not defined by type createDummyDtoNoInputInput.",
"extensions": {
"category": "graphql"
},
Expand All @@ -335,14 +347,14 @@ Feature: GraphQL mutation support
]
},
{
"message": "Field \"bar\" is not defined by type createDummyDtoNoInputInput.",
"message": "Field \"ipsum\" is not defined by type createDummyDtoNoInputInput.",
"extensions": {
"category": "graphql"
},
"locations": [
{
"line": 2,
"column": 51
"column": 53
}
]
}
Expand Down
2 changes: 1 addition & 1 deletion features/jsonapi/related-resouces-inclusion.feature
Original file line number Diff line number Diff line change
Expand Up @@ -363,11 +363,11 @@ Feature: JSON API Inclusion of Related Resources
"dummyDate": null,
"dummyBoolean": null,
"embeddedDummy": {
"dummyName": null,
"dummyBoolean": null,
"dummyDate": null,
"dummyFloat": null,
"dummyPrice": null,
"dummyName": null,
"symfony": null
},
"_id": 1,
Expand Down
212 changes: 212 additions & 0 deletions features/main/input_output.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
Feature: DTO input and output
In order to use an hypermedia API
As a client software developer
I need to be able to use DTOs on my resources as Input or Output objects.

@createSchema
Scenario: Create a resource with a custom Input.
When I add "Content-Type" header equal to "application/ld+json"
And I send a "POST" request to "/dummy_dto_customs" with body:
"""
{
"foo": "test",
"bar": 1
}
"""
Then the response status code should be 201
And the response should be in JSON
And the header "Content-Type" should be equal to "application/ld+json; charset=utf-8"
And the JSON should be equal to:
"""
{
"@context": "/contexts/DummyDtoCustom",
"@id": "/dummy_dto_customs/1",
"@type": "DummyDtoCustom",
"lorem": "test",
"ipsum": "1",
"id": 1
}
"""

@createSchema
Scenario: Get an item with a custom output
Given there is a DummyCustomDto
When I send a "GET" request to "/dummy_dto_custom_output/1"
Then the response status code should be 200
And the response should be in JSON
And the header "Content-Type" should be equal to "application/ld+json; charset=utf-8"
And the JSON should be a superset of:
"""
{
"@context": {
"@vocab": "http://example.com/docs.jsonld#",
"hydra": "http://www.w3.org/ns/hydra/core#",
"foo": {
"@type": "@id"
},
"bar": {
"@type": "@id"
}
},
"@type": "CustomOutputDto",
"foo": "test",
"bar": 0
}
"""

@createSchema
Scenario: Get a collection with a custom output
Given there are 2 DummyCustomDto
When I send a "GET" request to "/dummy_dto_custom_output"
Then the response status code should be 200
And the response should be in JSON
And the header "Content-Type" should be equal to "application/ld+json; charset=utf-8"
And the JSON should be a superset of:
"""
{
"@context": "/contexts/DummyDtoCustom",
"@id": "/dummy_dto_customs",
"@type": "hydra:Collection",
"hydra:member": [
{
"foo": "test",
"bar": 1
},
{
"foo": "test",
"bar": 2
}
],
"hydra:totalItems": 2
}
"""

@createSchema
Scenario: Create a DummyCustomDto object without output
When I add "Content-Type" header equal to "application/ld+json"
And I send a "POST" request to "/dummy_dto_custom_post_without_output" with body:
"""
{
"lorem": "test",
"ipsum": "1"
}
"""
Then the response status code should be 201
And the response should be empty

@createSchema
Scenario: Create and update a DummyInputOutput
When I add "Content-Type" header equal to "application/ld+json"
And I send a "POST" request to "/dummy_dto_input_outputs" with body:
"""
{
"foo": "test",
"bar": 1
}
"""
Then the response status code should be 201
And the JSON should be a superset of:
"""
{
"@context": {
"@vocab": "http://example.com/docs.jsonld#",
"hydra": "http://www.w3.org/ns/hydra/core#",
"baz": {
"@type": "@id"
},
"bat": {
"@type": "@id"
}
},
"@type": "OutputDto",
"baz": 1,
"bat": "test"
}
"""
Then I add "Content-Type" header equal to "application/ld+json"
And I send a "PUT" request to "/dummy_dto_input_outputs/1" with body:
"""
{
"foo": "test",
"bar": 2
}
"""
Then the response status code should be 200
And the JSON should be a superset of:
"""
{
"@context": {
"@vocab": "http:\/\/example.com\/docs.jsonld#",
"hydra": "http:\/\/www.w3.org\/ns\/hydra\/core#",
"baz": {
"@type": "@id"
},
"bat": {
"@type": "@id"
}
},
"@type": "OutputDto",
"baz": 2,
"bat": "test"
}
"""

@createSchema
Scenario: Use DTO with relations on User
When I add "Content-Type" header equal to "application/ld+json"
And I send a "POST" request to "/users" with body:
"""
{
"username": "soyuka",
"plainPassword": "a real password",
"email": "[email protected]"
}
"""
Then the response status code should be 201
Then I add "Content-Type" header equal to "application/ld+json"
And I send a "PUT" request to "/users/recover/1" with body:
"""
{
"user": "/users/1"
}
"""
Then the response status code should be 200
And the JSON should be a superset of:
"""
{
"@context": {
"@vocab": "http://example.com/docs.jsonld#",
"hydra": "http://www.w3.org/ns/hydra/core#",
"user": {
"@type": "@id"
}
},
"@type": "RecoverPasswordOutput",
"user": {
"@id": "/users/1",
"@type": "User",
"email": "[email protected]",
"fullname": null,
"username": "soyuka"
}
}
"""

# @createSchema
# Scenario: Execute a GraphQL query on DTO
# Given there are 2 DummyCustomDto
# When I send the following GraphQL request:
# """
# {
# dummyDtoCustom(id: "/dummy_dto_customs/1") {
# lorem
# ipsum
# }
# }
# """
# Then the response status code should be 200
# And the response should be in JSON
# And the header "Content-Type" should be equal to "application/json"
# Then print last JSON response
# And the JSON node "data.dummy.id" should be equal to "/dummies/1"
# And the JSON node "data.dummy.name" should be equal to "Dummy #1"
Loading

0 comments on commit 573d489

Please sign in to comment.