11
11
12
12
namespace Tobyz \Tests \JsonApiServer \feature ;
13
13
14
+ use Psr \Http \Message \ServerRequestInterface ;
15
+ use Tobyz \JsonApiServer \Adapter \AdapterInterface ;
16
+ use Tobyz \JsonApiServer \Exception \ForbiddenException ;
14
17
use Tobyz \JsonApiServer \JsonApi ;
18
+ use Tobyz \JsonApiServer \Schema \Type ;
15
19
use Tobyz \Tests \JsonApiServer \AbstractTestCase ;
16
20
use Tobyz \Tests \JsonApiServer \MockAdapter ;
17
21
@@ -22,58 +26,181 @@ class CreateTest extends AbstractTestCase
22
26
*/
23
27
private $ api ;
24
28
25
- /**
26
- * @var MockAdapter
27
- */
28
- private $ adapter ;
29
-
30
29
public function setUp (): void
31
30
{
32
31
$ this ->api = new JsonApi ('http://example.com ' );
32
+ }
33
33
34
- $ this ->adapter = new MockAdapter ();
34
+ protected function createResource (array $ data = [])
35
+ {
36
+ return $ this ->api ->handle (
37
+ $ this ->buildRequest ('POST ' , '/users ' )
38
+ ->withParsedBody ([
39
+ 'data ' => array_merge ([
40
+ 'type ' => 'users ' ,
41
+ 'id ' => '1 ' ,
42
+ ], $ data )
43
+ ])
44
+ );
35
45
}
36
46
37
47
public function test_resources_are_not_creatable_by_default ()
38
48
{
39
- $ this ->markTestIncomplete ();
49
+ $ this ->api ->resource ('users ' , new MockAdapter ());
50
+
51
+ $ this ->expectException (ForbiddenException::class);
52
+
53
+ $ this ->createResource ();
40
54
}
41
55
42
56
public function test_resource_creation_can_be_explicitly_enabled ()
43
57
{
44
- $ this ->markTestIncomplete ();
58
+ $ this ->api ->resource ('users ' , new MockAdapter (), function (Type $ type ) {
59
+ $ type ->creatable ();
60
+ });
61
+
62
+ $ response = $ this ->createResource ();
63
+
64
+ $ this ->assertEquals (201 , $ response ->getStatusCode ());
45
65
}
46
66
47
67
public function test_resource_creation_can_be_conditionally_enabled ()
48
68
{
49
- $ this ->markTestIncomplete ();
69
+ $ this ->api ->resource ('users ' , new MockAdapter (), function (Type $ type ) {
70
+ $ type ->creatable (function () {
71
+ return true ;
72
+ });
73
+ });
74
+
75
+ $ response = $ this ->createResource ();
76
+
77
+ $ this ->assertEquals (201 , $ response ->getStatusCode ());
50
78
}
51
79
52
80
public function test_resource_creation_can_be_explicitly_disabled ()
53
81
{
54
- $ this ->markTestIncomplete ();
82
+ $ this ->api ->resource ('users ' , new MockAdapter (), function (Type $ type ) {
83
+ $ type ->notCreatable ();
84
+ });
85
+
86
+ $ this ->expectException (ForbiddenException::class);
87
+
88
+ $ this ->createResource ();
55
89
}
56
90
57
91
public function test_resource_creation_can_be_conditionally_disabled ()
58
92
{
59
- $ this ->markTestIncomplete ();
93
+ $ this ->api ->resource ('users ' , new MockAdapter (), function (Type $ type ) {
94
+ $ type ->creatable (function () {
95
+ return false ;
96
+ });
97
+ });
98
+
99
+ $ this ->expectException (ForbiddenException::class);
100
+
101
+ $ this ->createResource ();
102
+ }
103
+
104
+ public function test_resource_creatable_callback_receives_correct_parameters ()
105
+ {
106
+ $ called = false ;
107
+
108
+ $ this ->api ->resource ('users ' , new MockAdapter (), function (Type $ type ) use (&$ called ) {
109
+ $ type ->creatable (function ($ request ) use (&$ called ) {
110
+ $ this ->assertInstanceOf (ServerRequestInterface::class, $ request );
111
+ return $ called = true ;
112
+ });
113
+ });
114
+
115
+ $ this ->createResource ();
116
+
117
+ $ this ->assertTrue ($ called );
60
118
}
61
119
62
- public function test_new_models_are_supplied_by_the_adapter ()
120
+ public function test_new_models_are_supplied_and_saved_by_the_adapter ()
63
121
{
64
- $ this ->markTestIncomplete ();
122
+ $ adapter = $ this ->prophesize (AdapterInterface::class);
123
+ $ adapter ->create ()->willReturn ($ createdModel = (object ) []);
124
+ $ adapter ->save ($ createdModel )->shouldBeCalled ();
125
+ $ adapter ->getId ($ createdModel )->willReturn ('1 ' );
126
+
127
+ $ this ->api ->resource ('users ' , $ adapter ->reveal (), function (Type $ type ) {
128
+ $ type ->creatable ();
129
+ });
130
+
131
+ $ this ->createResource ();
65
132
}
66
133
67
134
public function test_resources_can_provide_custom_models ()
68
135
{
69
- $ this ->markTestIncomplete ();
136
+ $ createdModel = (object ) [];
137
+
138
+ $ adapter = $ this ->prophesize (AdapterInterface::class);
139
+ $ adapter ->create ()->shouldNotBeCalled ();
140
+ $ adapter ->save ($ createdModel )->shouldBeCalled ();
141
+ $ adapter ->getId ($ createdModel )->willReturn ('1 ' );
142
+
143
+ $ this ->api ->resource ('users ' , $ adapter ->reveal (), function (Type $ type ) use ($ createdModel ) {
144
+ $ type ->creatable ();
145
+ $ type ->create (function ($ request ) use ($ createdModel ) {
146
+ $ this ->assertInstanceOf (ServerRequestInterface::class, $ request );
147
+ return $ createdModel ;
148
+ });
149
+ });
150
+
151
+ $ this ->createResource ();
70
152
}
71
153
72
- public function test_creating_a_resource_calls_the_save_adapter_method ()
154
+ public function test_resources_can_provide_custom_savers ()
73
155
{
74
- $ this ->markTestIncomplete ();
156
+ $ called = false ;
157
+
158
+ $ adapter = $ this ->prophesize (AdapterInterface::class);
159
+ $ adapter ->create ()->willReturn ($ createdModel = (object ) []);
160
+ $ adapter ->save ($ createdModel )->shouldNotBeCalled ();
161
+ $ adapter ->getId ($ createdModel )->willReturn ('1 ' );
162
+
163
+ $ this ->api ->resource ('users ' , $ adapter ->reveal (), function (Type $ type ) use ($ createdModel , &$ called ) {
164
+ $ type ->creatable ();
165
+ $ type ->save (function ($ model , $ request ) use ($ createdModel , &$ called ) {
166
+ $ model ->id = '1 ' ;
167
+ $ this ->assertSame ($ createdModel , $ model );
168
+ $ this ->assertInstanceOf (ServerRequestInterface::class, $ request );
169
+ return $ called = true ;
170
+ });
171
+ });
172
+
173
+ $ this ->createResource ();
174
+
175
+ $ this ->assertTrue ($ called );
75
176
}
76
177
77
- // saver...
78
- // listeners...
178
+ public function test_resources_can_have_creation_listeners ()
179
+ {
180
+ $ called = 0 ;
181
+
182
+ $ adapter = $ this ->prophesize (AdapterInterface::class);
183
+ $ adapter ->create ()->willReturn ($ createdModel = (object ) []);
184
+ $ adapter ->getId ($ createdModel )->willReturn ('1 ' );
185
+
186
+ $ this ->api ->resource ('users ' , $ adapter ->reveal (), function (Type $ type ) use ($ adapter , $ createdModel , &$ called ) {
187
+ $ type ->creatable ();
188
+ $ type ->creating (function ($ model , $ request ) use ($ adapter , $ createdModel , &$ called ) {
189
+ $ this ->assertSame ($ createdModel , $ model );
190
+ $ this ->assertInstanceOf (ServerRequestInterface::class, $ request );
191
+ $ adapter ->save ($ createdModel )->shouldNotHaveBeenCalled ();
192
+ $ called ++;
193
+ });
194
+ $ type ->created (function ($ model , $ request ) use ($ adapter , $ createdModel , &$ called ) {
195
+ $ this ->assertSame ($ createdModel , $ model );
196
+ $ this ->assertInstanceOf (ServerRequestInterface::class, $ request );
197
+ $ adapter ->save ($ createdModel )->shouldHaveBeenCalled ();
198
+ $ called ++;
199
+ });
200
+ });
201
+
202
+ $ this ->createResource ();
203
+
204
+ $ this ->assertEquals (2 , $ called );
205
+ }
79
206
}
0 commit comments