@@ -16,6 +16,35 @@ class RemoteUser extends ApiModel
16
16
protected $ fillable = ['id ' , 'name ' ];
17
17
}
18
18
19
+ class FileModel extends ApiModel
20
+ {
21
+ protected $ fillable = ['id ' , 'type ' , 'name ' , 'size ' ];
22
+ }
23
+
24
+ class FolderModel extends ApiModel
25
+ {
26
+ protected $ fillable = ['id ' , 'name ' , 'children ' ];
27
+
28
+ protected static array $ apiRelations = [
29
+ 'children ' => 'mapChildren ' ,
30
+ ];
31
+
32
+ protected static function mapChildren (array $ items )
33
+ {
34
+ return collect ($ items )->map (function (array $ data ) {
35
+ if ($ data ['type ' ] === 'file ' ) {
36
+ return FileModel::fromApiResponse ($ data );
37
+ }
38
+
39
+ if ($ data ['type ' ] === 'folder ' ) {
40
+ return FolderModel::fromApiResponse ($ data );
41
+ }
42
+
43
+ throw new \UnexpectedValueException ('Unknown child type: ' .$ data ['type ' ]);
44
+ });
45
+ }
46
+ }
47
+
19
48
class ApiModelTest extends TestCase
20
49
{
21
50
protected FakeGatewayClient $ gateway ;
@@ -179,4 +208,53 @@ public function delete_users_gateway()
179
208
['method ' => 'DELETE ' , 'uri ' => '/users/4 ' ],
180
209
], $ this ->gateway ->getCalls ());
181
210
}
211
+
212
+
213
+ /** @test */
214
+ public function from_api_response_maps_nested_relations ()
215
+ {
216
+ $ data = [
217
+ 'id ' => 1 ,
218
+ 'name ' => 'root ' ,
219
+ 'type ' => 'folder ' ,
220
+ 'children ' => [
221
+ ['id ' => 2 , 'name ' => 'file1.txt ' , 'type ' => 'file ' , 'size ' => 123 ],
222
+ [
223
+ 'id ' => 3 ,
224
+ 'name ' => 'docs ' ,
225
+ 'type ' => 'folder ' ,
226
+ 'children ' => [
227
+ ['id ' => 4 , 'name ' => 'file2.txt ' , 'type ' => 'file ' , 'size ' => 456 ],
228
+ [
229
+ 'id ' => 5 ,
230
+ 'name ' => 'deep ' ,
231
+ 'type ' => 'folder ' ,
232
+ 'children ' => [
233
+ ['id ' => 6 , 'name ' => 'file3.txt ' , 'type ' => 'file ' , 'size ' => 789 ],
234
+ ],
235
+ ],
236
+ ],
237
+ ],
238
+ ],
239
+ ];
240
+
241
+ $ folder = FolderModel::fromApiResponse ($ data );
242
+
243
+ $ this ->assertEquals (1 , $ folder ->id );
244
+ $ this ->assertCount (2 , $ folder ->children );
245
+ $ this ->assertInstanceOf (FileModel::class, $ folder ->children [0 ]);
246
+ $ this ->assertEquals (123 , $ folder ->children [0 ]->size );
247
+ $ this ->assertInstanceOf (FolderModel::class, $ folder ->children [1 ]);
248
+
249
+ $ subfolder = $ folder ->children [1 ];
250
+ $ this ->assertCount (2 , $ subfolder ->children );
251
+ $ this ->assertInstanceOf (FileModel::class, $ subfolder ->children [0 ]);
252
+ $ this ->assertInstanceOf (FolderModel::class, $ subfolder ->children [1 ]);
253
+
254
+ $ deep = $ subfolder ->children [1 ];
255
+ $ this ->assertCount (1 , $ deep ->children );
256
+ $ this ->assertInstanceOf (FileModel::class, $ deep ->children [0 ]);
257
+ $ this ->assertEquals ('file3.txt ' , $ deep ->children [0 ]->name );
258
+ $ this ->assertEquals (789 , $ deep ->children [0 ]->size );
259
+ }
182
260
}
0 commit comments