Skip to content

Commit e173a61

Browse files
committed
Fix index issues in MethodModelBinderResolver
* Add ability to include UserContext Fixes graphql-dotnet#455
1 parent eefc942 commit e173a61

File tree

2 files changed

+225
-1
lines changed

2 files changed

+225
-1
lines changed

src/GraphQL.Tests/Utilities/SchemaBuilderExecutionTests.cs

Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,175 @@ type Query {
151151

152152
result.ShouldBe(serializedExpectedResult);
153153
}
154+
155+
[Fact]
156+
public void can_use_source_without_params()
157+
{
158+
var schema = Schema.For(@"
159+
type Query {
160+
source: Boolean
161+
}
162+
", _=>
163+
{
164+
_.Types.Include<ParametersType>();
165+
});
166+
167+
var result = schema.Execute(_ =>
168+
{
169+
_.Query = "{ source }";
170+
_.Root = new { Hello = "World" };
171+
});
172+
173+
var expectedResult = CreateQueryResult("{ 'source': true }");
174+
var serializedExpectedResult = Writer.Write(expectedResult);
175+
176+
result.ShouldBe(serializedExpectedResult);
177+
}
178+
179+
[Fact]
180+
public void can_use_resolvefieldcontext_without_params()
181+
{
182+
var schema = Schema.For(@"
183+
type Query {
184+
resolve: String
185+
}
186+
", _=>
187+
{
188+
_.Types.Include<ParametersType>();
189+
});
190+
191+
var result = schema.Execute(_ =>
192+
{
193+
_.Query = "{ resolve }";
194+
_.ExposeExceptions = true;
195+
});
196+
197+
var expectedResult = CreateQueryResult("{ 'resolve': 'Resolved' }");
198+
var serializedExpectedResult = Writer.Write(expectedResult);
199+
200+
result.ShouldBe(serializedExpectedResult);
201+
}
202+
203+
[Fact]
204+
public void can_use_resolvefieldcontext_with_params()
205+
{
206+
var schema = Schema.For(@"
207+
type Query {
208+
resolveWithParam(id: String): String
209+
}
210+
", _=>
211+
{
212+
_.Types.Include<ParametersType>();
213+
});
214+
215+
var result = schema.Execute(_ =>
216+
{
217+
_.Query = @"{ resolveWithParam(id: ""abcd"") }";
218+
});
219+
220+
var expectedResult = CreateQueryResult("{ 'resolveWithParam': 'Resolved abcd' }");
221+
var serializedExpectedResult = Writer.Write(expectedResult);
222+
223+
result.ShouldBe(serializedExpectedResult);
224+
}
225+
226+
[Fact]
227+
public void can_use_usercontext()
228+
{
229+
var schema = Schema.For(@"
230+
type Query {
231+
userContext: String
232+
}
233+
", _=>
234+
{
235+
_.Types.Include<ParametersType>();
236+
});
237+
238+
var result = schema.Execute(_ =>
239+
{
240+
_.Query = @"{ userContext }";
241+
_.UserContext = new MyUserContext { Name = "Quinn" };
242+
});
243+
244+
var expectedResult = CreateQueryResult("{ 'userContext': 'Quinn' }");
245+
var serializedExpectedResult = Writer.Write(expectedResult);
246+
247+
result.ShouldBe(serializedExpectedResult);
248+
}
249+
250+
[Fact]
251+
public void can_use_usercontext_with_params()
252+
{
253+
var schema = Schema.For(@"
254+
type Query {
255+
userContextWithParam(id: String): String
256+
}
257+
", _=>
258+
{
259+
_.Types.Include<ParametersType>();
260+
});
261+
262+
var result = schema.Execute(_ =>
263+
{
264+
_.Query = @"{ userContextWithParam(id: ""abcd"") }";
265+
_.UserContext = new MyUserContext { Name = "Quinn" };
266+
});
267+
268+
var expectedResult = CreateQueryResult("{ 'userContextWithParam': 'Quinn abcd' }");
269+
var serializedExpectedResult = Writer.Write(expectedResult);
270+
271+
result.ShouldBe(serializedExpectedResult);
272+
}
273+
274+
[Fact]
275+
public void can_use_context_source_usercontext()
276+
{
277+
var schema = Schema.For(@"
278+
type Query {
279+
three: Boolean
280+
}
281+
", _=>
282+
{
283+
_.Types.Include<ParametersType>();
284+
});
285+
286+
var result = schema.Execute(_ =>
287+
{
288+
_.Query = @"{ three }";
289+
_.Root = new { Hello = "World" };
290+
_.UserContext = new MyUserContext { Name = "Quinn" };
291+
});
292+
293+
var expectedResult = CreateQueryResult("{ 'three': true }");
294+
var serializedExpectedResult = Writer.Write(expectedResult);
295+
296+
result.ShouldBe(serializedExpectedResult);
297+
}
298+
299+
[Fact]
300+
public void can_use_context_source_usercontext_with_params()
301+
{
302+
var schema = Schema.For(@"
303+
type Query {
304+
four(id: Int): Boolean
305+
}
306+
", _=>
307+
{
308+
_.Types.Include<ParametersType>();
309+
});
310+
311+
var result = schema.Execute(_ =>
312+
{
313+
_.Query = @"{ four(id: 123) }";
314+
_.Root = new { Hello = "World" };
315+
_.UserContext = new MyUserContext { Name = "Quinn" };
316+
});
317+
318+
var expectedResult = CreateQueryResult("{ 'four': true }");
319+
var serializedExpectedResult = Writer.Write(expectedResult);
320+
321+
result.ShouldBe(serializedExpectedResult);
322+
}
154323
}
155324

156325
public class PostData
@@ -220,4 +389,48 @@ public Pet Pet(PetKind type)
220389
return new Cat {Name = "Biscuit", Meows = true};
221390
}
222391
}
392+
393+
[GraphQLMetadata("Query")]
394+
class ParametersType
395+
{
396+
public bool Source(object source)
397+
{
398+
return source != null;
399+
}
400+
401+
public string Resolve(ResolveFieldContext context)
402+
{
403+
return "Resolved";
404+
}
405+
406+
public string ResolveWithParam(ResolveFieldContext context, string id)
407+
{
408+
return $"Resolved {id}";
409+
}
410+
411+
public string UserContext(MyUserContext context)
412+
{
413+
return context.Name;
414+
}
415+
416+
public string UserContextWithParam(MyUserContext context, string id)
417+
{
418+
return $"{context.Name} {id}";
419+
}
420+
421+
public bool Three(ResolveFieldContext resolveContext, object source, MyUserContext context)
422+
{
423+
return resolveContext != null && context != null && source != null;
424+
}
425+
426+
public bool Four(ResolveFieldContext resolveContext, object source, MyUserContext context, int id)
427+
{
428+
return resolveContext != null && context != null && source != null && id != 0;
429+
}
430+
}
431+
432+
class MyUserContext
433+
{
434+
public string Name { get; set; }
435+
}
223436
}

src/GraphQL/Resolvers/MethodModelBinderResolver.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,23 @@ public object Resolve(ResolveFieldContext context)
4040
index++;
4141
}
4242

43-
if (context.Source?.GetType() == _parameters[index].ParameterType)
43+
if (_parameters.Length > index
44+
&& context.Source != null
45+
&& (context.Source?.GetType() == _parameters[index].ParameterType
46+
|| string.Equals(_parameters[index].Name, "source", StringComparison.OrdinalIgnoreCase)))
4447
{
4548
arguments[index] = context.Source;
4649
index++;
4750
}
4851

52+
if (_parameters.Length > index
53+
&& context.UserContext != null
54+
&& context.UserContext?.GetType() == _parameters[index].ParameterType)
55+
{
56+
arguments[index] = context.UserContext;
57+
index++;
58+
}
59+
4960
foreach (var parameter in _parameters.Skip(index))
5061
{
5162
arguments[index] = context.GetArgument(parameter.ParameterType, parameter.Name);

0 commit comments

Comments
 (0)