Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

attempt of interface fix #2

Open
wants to merge 2 commits into
base: test-input-output
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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