Skip to content

Commit 7b1b954

Browse files
author
Cyril Mizzi
committed
creates ModelTransformerTest
fixes ModelTransformer
1 parent 01cfe41 commit 7b1b954

File tree

2 files changed

+104
-5
lines changed

2 files changed

+104
-5
lines changed

src/Transformer/Type/ModelTransformer.php

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,16 +154,25 @@ private function getFields(Model $model) {
154154
* @return callable
155155
*/
156156
private function getResolver(array $relation) {
157-
$method = $relation['field'];
157+
$method = $relation['field'];
158+
$primary = $this->app->make($relation['model'])->getKeyName();
159+
$order = array_flip(array_keys($this->getArguments()));
158160

159-
return function($root, array $args) use ($method) {
160-
$collection = $root->{$method};
161+
return function($root, array $args) use ($method, $primary, $order) {
162+
// Clone collection in order to not erase existin collection
163+
$collection = clone $root->{$method};
164+
165+
// We have to specific custom order to args because we cannot take
166+
// some elements before splicing it...
167+
uksort($args, function($key) use ($order) {
168+
return $order[$key];
169+
});
161170

162171
foreach ($args as $key => $value) {
163172
switch ($key) {
164173
case 'after' : $collection = $collection->where($primary, '>', $value) ; break;
165174
case 'before' : $collection = $collection->where($primary, '<', $value) ; break;
166-
case 'skip' : $collection = $collection->skip($value) ; break;
175+
case 'skip' : $collection = $collection->splice($value) ; break;
167176
case 'take' : $collection = $collection->take($value) ; break;
168177
}
169178
}
@@ -174,7 +183,7 @@ private function getResolver(array $relation) {
174183

175184
/**
176185
* Return available arguments (many because there's no argument for single
177-
* element)
186+
* element). Order matter
178187
*
179188
* @return array
180189
*/
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
<?php
2+
namespace StudioNet\GraphQL\Tests\Transformer;
3+
4+
use StudioNet\GraphQL\Tests\Entity;
5+
use StudioNet\GraphQL\Tests\TestCase;
6+
use StudioNet\GraphQL\Transformer\Type\ModelTransformer;
7+
use StudioNet\GraphQL\Type\EloquentObjectType;
8+
9+
/**
10+
* ModelTransformerTest
11+
*
12+
* @see TestCase
13+
*/
14+
class ModelTransformerTest extends TestCase {
15+
/**
16+
* testSupports
17+
*
18+
* @return void
19+
*/
20+
public function testSupports() {
21+
$transformer = $this->app->make(ModelTransformer::class);
22+
23+
$this->assertTrue($transformer->supports($this->app->make(Entity\User::class)));
24+
$this->assertTrue($transformer->supports($this->app->make(Entity\Post::class)));
25+
$this->assertFalse($transformer->supports('blabla'));
26+
}
27+
28+
/**
29+
* testTransform
30+
*
31+
* @return void
32+
*/
33+
public function testTransform() {
34+
$user = $this->app->make(Entity\User::class);
35+
$transformer = $this->app->make(ModelTransformer::class);
36+
$object = $transformer->transform($user);
37+
$fields = $object->getFields();
38+
39+
$this->assertInstanceOf(EloquentObjectType::class, $object);
40+
$this->assertSame('User', $object->name);
41+
$this->assertSame('A User model representation', $object->description);
42+
$this->assertSame($user, $object->getModel());
43+
44+
foreach (['id', 'name', 'email', 'posts', 'created_at', 'updated_at'] as $field) {
45+
$this->assertArrayHasKey($field, $fields);
46+
}
47+
}
48+
49+
/**
50+
* testRelationshipColumnArguments
51+
*
52+
* @return void
53+
*/
54+
public function testRelationshipColumnArguments() {
55+
$user = $this->app->make(Entity\User::class);
56+
$transformer = $this->app->make(ModelTransformer::class);
57+
$args = $transformer->transform($user)->getFields()['posts']->config['args'];
58+
$assert = [
59+
'after' => \GraphQL\Type\Definition\IDType::class,
60+
'before' => \GraphQL\Type\Definition\IDType::class,
61+
'skip' => \GraphQL\Type\Definition\IntType::class,
62+
'take' => \GraphQL\Type\Definition\IntType::class
63+
];
64+
65+
foreach ($assert as $argument => $type) {
66+
$this->assertArrayHasKey($argument, $args);
67+
$this->assertInstanceOf($type, $args[$argument]['type']);
68+
}
69+
}
70+
71+
/**
72+
* testResolve
73+
*
74+
* @return void
75+
*/
76+
public function testResolve() {
77+
factory(Entity\User::class, 5)->create()->each(function($user) {
78+
$user->posts()->saveMany(factory(Entity\Post::class, 5)->make());
79+
});
80+
81+
$builder = Entity\User::class;
82+
$user = $this->app->make($builder);
83+
$entity = $builder::with('posts')->find(1);
84+
$transformer = $this->app->make(ModelTransformer::class);
85+
$resolver = $transformer->transform($user)->getFields()['posts']->config['resolve'];
86+
$response = call_user_func_array($resolver, [$entity, ['take' => 1, 'skip' => 1]]);
87+
88+
$this->assertSame($entity->posts->get(1)->toArray(), $response[0]->toArray());
89+
}
90+
}

0 commit comments

Comments
 (0)