7
7
use Nuwave \Lighthouse \Execution \ResolveInfo ;
8
8
use Nuwave \Lighthouse \Support \Contracts \GraphQLContext ;
9
9
use Tests \DBTestCase ;
10
+ use Tests \Utils \Models \Task ;
10
11
use Tests \Utils \Models \User ;
11
12
12
13
final class BuilderDirectiveTest extends DBTestCase
@@ -155,6 +156,60 @@ public function testCallsCustomBuilderMethodOnFieldWithoutValue(): void
155
156
' )->assertJsonCount (2 , 'data.users ' );
156
157
}
157
158
159
+ public function testCallsCustomBuilderMethodOnFieldWithSpecificModel (): void
160
+ {
161
+ $ this ->schema = /** @lang GraphQL */ <<<GRAPHQL
162
+ type Query {
163
+ users: [User!]! @all
164
+ }
165
+
166
+ type User {
167
+ id: ID
168
+ tasks: [Task!]! @hasMany(type: SIMPLE) @builder(method: " {$ this ->qualifyTestResolver ('specificModel ' )}")
169
+ }
170
+
171
+ type Task {
172
+ id: ID
173
+ }
174
+ GRAPHQL ;
175
+
176
+ $ users = factory (User::class, 2 )->create ();
177
+
178
+ foreach ($ users as $ user ) {
179
+ assert ($ user instanceof User);
180
+
181
+ $ userName = $ user ->name ;
182
+ assert (is_string ($ userName ), 'set by UserFactory ' );
183
+
184
+ $ taskWithSameName = factory (Task::class)->make ();
185
+ assert ($ taskWithSameName instanceof Task);
186
+ $ taskWithSameName ->name = $ userName ;
187
+ $ taskWithSameName ->user ()->associate ($ user );
188
+ $ taskWithSameName ->save ();
189
+
190
+ $ taskWithOtherName = factory (Task::class)->make ();
191
+ assert ($ taskWithOtherName instanceof Task);
192
+ $ taskWithOtherName ->name = "Different from {$ userName }" ;
193
+ $ taskWithOtherName ->user ()->associate ($ user );
194
+ $ taskWithOtherName ->save ();
195
+ }
196
+
197
+ $ this ->graphQL (/** @lang GraphQL */ '
198
+ {
199
+ users {
200
+ id
201
+ tasks(first: 10) {
202
+ data {
203
+ id
204
+ }
205
+ }
206
+ }
207
+ }
208
+ ' )
209
+ ->assertJsonCount (1 , 'data.users.0.tasks.data ' )
210
+ ->assertJsonCount (1 , 'data.users.1.tasks.data ' );
211
+ }
212
+
158
213
/**
159
214
* @param \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<\Tests\Utils\Models\User> $builder
160
215
*
@@ -164,4 +219,17 @@ public static function limit(QueryBuilder|EloquentBuilder $builder, ?int $value)
164
219
{
165
220
return $ builder ->limit ($ value ?? 2 );
166
221
}
222
+
223
+ /**
224
+ * @param \Illuminate\Database\Eloquent\Builder<\Tests\Utils\Models\User> $builder
225
+ *
226
+ * @return \Illuminate\Database\Eloquent\Builder<\Tests\Utils\Models\User>
227
+ */
228
+ public static function specificModel (
229
+ EloquentBuilder $ builder ,
230
+ ?int $ value ,
231
+ User $ user ,
232
+ ): EloquentBuilder {
233
+ return $ builder ->where ('name ' , $ user ->name );
234
+ }
167
235
}
0 commit comments