Skip to content

Commit 53ce8f2

Browse files
committed
#5736 Create a failing scenario.
1 parent 3e3595d commit 53ce8f2

File tree

7 files changed

+644
-0
lines changed

7 files changed

+644
-0
lines changed
Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
Feature: Resources, subresources and their subresources with uri variables that are not `id`
2+
@issue5736
3+
As a client software developer
4+
I need to be able to update subresources and their deeper subresources
5+
6+
@createSchema
7+
Scenario: PUT Team with POST Employee
8+
Given I add "Content-Type" header equal to "application/json"
9+
And I send a "POST" request to "/issue5736_companies/" with body:
10+
"""
11+
{
12+
"name": "Company 1"
13+
}
14+
"""
15+
16+
And I add "Content-Type" header equal to "application/json"
17+
And I send a "POST" request to "/issue5736_companies/1/issue5736_teams" with body:
18+
"""
19+
{
20+
"name": "Team 1",
21+
"employees": [
22+
{
23+
"name": "Employee 1"
24+
},
25+
{
26+
"name": "Employee 2"
27+
},
28+
{
29+
"name": "Employee 3"
30+
}
31+
]
32+
}
33+
"""
34+
35+
And I add "Content-Type" header equal to "application/json"
36+
And I send a "PUT" request to "/issue5736_companies/1/issue5736_teams/1" with body:
37+
"""
38+
{
39+
"name": "Team 1",
40+
"employees": [
41+
{
42+
"@id": "/issue5736_companies/1/issue5736_teams/1/issue5736_employees/1",
43+
"name": "Employee 1"
44+
},
45+
{
46+
"@id": "/issue5736_companies/1/issue5736_teams/1/issue5736_employees/2",
47+
"name": "Employee 2"
48+
},
49+
{
50+
"@id": "/issue5736_companies/1/issue5736_teams/1/issue5736_employees/3",
51+
"name": "Employee 3"
52+
},
53+
{
54+
"name": "Employee 4"
55+
}
56+
]
57+
}
58+
"""
59+
Then the response status code should be 200
60+
And the response should be in JSON
61+
And the JSON should be equal to:
62+
"""
63+
{
64+
"@id": "/issue5736_companies/1/issue5736_teams/1",
65+
"@type": "Issue5736Team",
66+
"name": "Team 1",
67+
"employees": [
68+
{
69+
"@id": "/issue5736_companies/1/issue5736_teams/1/issue5736_employees/1",
70+
"@type": "Issue5736Employee",
71+
"name": "Employee 1"
72+
},
73+
{
74+
"@id": "/issue5736_companies/1/issue5736_teams/1/issue5736_employees/2",
75+
"@type": "Issue5736Employee",
76+
"name": "Employee 2"
77+
},
78+
{
79+
"@id": "/issue5736_companies/1/issue5736_teams/1/issue5736_employees/3",
80+
"@type": "Issue5736Employee",
81+
"name": "Employee 3"
82+
},
83+
{
84+
"@id": "/issue5736_companies/1/issue5736_teams/1/issue5736_employees/4",
85+
"@type": "Issue5736Employee",
86+
"name": "Employee 4"
87+
}
88+
]
89+
}
90+
"""
91+
92+
@createSchema
93+
Scenario: PUT Team with PUT Employee
94+
Given I add "Content-Type" header equal to "application/json"
95+
And I send a "POST" request to "/issue5736_companies/" with body:
96+
"""
97+
{
98+
"name": "Company 1"
99+
}
100+
"""
101+
102+
And I add "Content-Type" header equal to "application/json"
103+
And I send a "POST" request to "/issue5736_companies/1/issue5736_teams" with body:
104+
"""
105+
{
106+
"name": "Team 1",
107+
"employees": [
108+
{
109+
"name": "Employee 1"
110+
},
111+
{
112+
"name": "Employee 2"
113+
},
114+
{
115+
"name": "Employee 3"
116+
}
117+
]
118+
}
119+
"""
120+
121+
And I add "Content-Type" header equal to "application/json"
122+
And I send a "PUT" request to "/issue5736_companies/1/issue5736_teams/1" with body:
123+
"""
124+
{
125+
"name": "Team 1",
126+
"employees": [
127+
{
128+
"@id": "/issue5736_companies/1/issue5736_teams/1/issue5736_employees/1",
129+
"name": "Employee 1"
130+
},
131+
{
132+
"@id": "/issue5736_companies/1/issue5736_teams/1/issue5736_employees/2",
133+
"name": "Employee 2"
134+
},
135+
{
136+
"@id": "/issue5736_companies/1/issue5736_teams/1/issue5736_employees/3",
137+
"name": "Employee 3 edited"
138+
}
139+
]
140+
}
141+
"""
142+
Then the response status code should be 200
143+
And the response should be in JSON
144+
And the JSON should be equal to:
145+
"""
146+
{
147+
"@id": "/issue5736_companies/1/issue5736_teams/1",
148+
"@type": "Issue5736Team",
149+
"name": "Team 1",
150+
"employees": [
151+
{
152+
"@id": "/issue5736_companies/1/issue5736_teams/1/issue5736_employees/1",
153+
"@type": "Issue5736Employee",
154+
"name": "Employee 1"
155+
},
156+
{
157+
"@id": "/issue5736_companies/1/issue5736_teams/1/issue5736_employees/2",
158+
"@type": "Issue5736Employee",
159+
"name": "Employee 2"
160+
},
161+
{
162+
"@id": "/issue5736_companies/1/issue5736_teams/1/issue5736_employees/3",
163+
"@type": "Issue5736Employee",
164+
"name": "Employee 3 edited"
165+
}
166+
]
167+
}
168+
"""
169+
170+
@createSchema
171+
Scenario: PUT Team with DELETE Employee
172+
Given I add "Content-Type" header equal to "application/json"
173+
And I send a "POST" request to "/issue5736_companies/" with body:
174+
"""
175+
{
176+
"name": "Company 1"
177+
}
178+
"""
179+
180+
And I add "Content-Type" header equal to "application/json"
181+
And I send a "POST" request to "/issue5736_companies/1/issue5736_teams" with body:
182+
"""
183+
{
184+
"name": "Team 1",
185+
"employees": [
186+
{
187+
"name": "Employee 1"
188+
},
189+
{
190+
"name": "Employee 2"
191+
},
192+
{
193+
"name": "Employee 3"
194+
}
195+
]
196+
}
197+
"""
198+
199+
And I add "Content-Type" header equal to "application/json"
200+
And I send a "PUT" request to "/issue5736_companies/1/issue5736_teams/1" with body:
201+
"""
202+
{
203+
"name": "Team 1",
204+
"employees": [
205+
{
206+
"@id": "/issue5736_companies/1/issue5736_teams/1/issue5736_employees/1",
207+
"name": "Employee 1"
208+
},
209+
{
210+
"@id": "/issue5736_companies/1/issue5736_teams/1/issue5736_employees/2",
211+
"name": "Employee 2"
212+
}
213+
]
214+
}
215+
"""
216+
Then the response status code should be 200
217+
And the response should be in JSON
218+
And the JSON should be equal to:
219+
"""
220+
{
221+
"@id": "/issue5736_companies/1/issue5736_teams/1",
222+
"@type": "Issue5736Team",
223+
"name": "Team 1",
224+
"employees": [
225+
{
226+
"@id": "/issue5736_companies/1/issue5736_teams/1/issue5736_employees/1",
227+
"@type": "Issue5736Employee",
228+
"name": "Employee 1"
229+
},
230+
{
231+
"@id": "/issue5736_companies/1/issue5736_teams/1/issue5736_employees/2",
232+
"@type": "Issue5736Employee",
233+
"name": "Employee 2"
234+
}
235+
]
236+
}
237+
"""
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the API Platform project.
5+
*
6+
* (c) Kévin Dunglas <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
declare(strict_types=1);
13+
14+
namespace ApiPlatform\Tests\Fixtures\TestBundle\Entity\Issue5736Aerendir;
15+
16+
use ApiPlatform\Metadata as API;
17+
use Doctrine\Common\Collections\ArrayCollection;
18+
use Doctrine\Common\Collections\Collection;
19+
use Doctrine\ORM\Mapping as ORM;
20+
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
21+
22+
#[ORM\Entity]
23+
#[ORM\Table(name: 'issue5736_companies')]
24+
#[API\ApiResource(
25+
normalizationContext: [
26+
AbstractNormalizer::GROUPS => ['company:read'],
27+
],
28+
denormalizationContext: [
29+
AbstractNormalizer::GROUPS => ['company:write'],
30+
],
31+
operations: [
32+
new API\GetCollection(
33+
uriTemplate: self::API_ENDPOINT,
34+
),
35+
new API\Get(
36+
uriTemplate: self::API_RESOURCE,
37+
),
38+
new API\Post(
39+
read: false,
40+
uriTemplate: self::API_ENDPOINT,
41+
),
42+
new API\Put(
43+
uriTemplate: self::API_RESOURCE,
44+
),
45+
],
46+
)]
47+
class Company
48+
{
49+
public const API_ID_PLACEHOLDER = 'issue5736_company';
50+
public const API_ENDPOINT = 'issue5736_companies';
51+
public const API_RESOURCE = '/' . self::API_ENDPOINT . '/{' . self::API_ID_PLACEHOLDER . '}';
52+
53+
#[ORM\Column(type: 'integer', nullable: true)]
54+
#[ORM\Id]
55+
#[ORM\GeneratedValue(strategy: 'AUTO')]
56+
private ?int $id = null;
57+
58+
#[ORM\Column]
59+
private string $name;
60+
61+
/** @var Collection<Team> */
62+
#[ORM\OneToMany(targetEntity: Team::class, mappedBy: 'company')]
63+
private Collection $teams;
64+
65+
/** @var Collection<Employee> */
66+
#[ORM\OneToMany(targetEntity: Team::class, mappedBy: 'company')]
67+
private Collection $employees;
68+
69+
public function __construct()
70+
{
71+
$this->teams = new ArrayCollection();
72+
$this->employees = new ArrayCollection();
73+
}
74+
75+
public function getId() : ?int
76+
{
77+
return $this->id;
78+
}
79+
80+
public function getName() : string
81+
{
82+
return $this->name;
83+
}
84+
85+
public function setName(string $name) : void
86+
{
87+
$this->name = $name;
88+
}
89+
90+
public function getTeams() : Collection
91+
{
92+
return $this->teams;
93+
}
94+
95+
public function getEmployees() : Collection
96+
{
97+
return $this->employees;
98+
}
99+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the API Platform project.
5+
*
6+
* (c) Kévin Dunglas <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
declare(strict_types=1);
13+
14+
namespace ApiPlatform\Tests\Fixtures\TestBundle\Entity\Issue5736Aerendir;
15+
16+
interface CompanyAwareInterface
17+
{
18+
public function setCompany(Company $company): void;
19+
20+
public function getCompany(): ?Company;
21+
}

0 commit comments

Comments
 (0)