Skip to content

Commit 2de5f1c

Browse files
authored
Merge pull request #216 from kuzn-ilya/fix/issue-215
Add support for IDataLoaderResult<>
2 parents 99d84bc + 7570c6e commit 2de5f1c

File tree

5 files changed

+82
-0
lines changed

5 files changed

+82
-0
lines changed

src/GraphQL.Conventions/Attributes/MetaData/NameAttribute.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using GraphQL.Conventions.Attributes.MetaData.Utilities;
88
using GraphQL.Conventions.Types.Descriptors;
99
using GraphQL.Conventions.Types.Resolution.Extensions;
10+
using GraphQL.DataLoader;
1011

1112
// ReSharper disable once CheckNamespace
1213
namespace GraphQL.Conventions
@@ -62,6 +63,11 @@ public override void MapType(GraphTypeInfo type, TypeInfo typeInfo)
6263
return;
6364
}
6465

66+
while (typeInfo.IsGenericType(typeof(IDataLoaderResult<>)))
67+
{
68+
typeInfo = typeInfo.TypeParameter();
69+
}
70+
6571
if (typeInfo.IsGenericType(typeof(Task<>)))
6672
{
6773
typeInfo = typeInfo.TypeParameter();

src/GraphQL.Conventions/Types/Descriptors/GraphTypeInfo.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Threading.Tasks;
66
using GraphQL.Conventions.Types.Resolution;
77
using GraphQL.Conventions.Types.Resolution.Extensions;
8+
using GraphQL.DataLoader;
89

910
namespace GraphQL.Conventions.Types.Descriptors
1011
{
@@ -108,6 +109,11 @@ private void DeriveMetaData()
108109
{
109110
var type = TypeRepresentation;
110111

112+
while (type.IsGenericType(typeof(IDataLoaderResult<>)))
113+
{
114+
type = type.TypeParameter();
115+
}
116+
111117
if (type.IsGenericType(typeof(Task<>)))
112118
{
113119
IsTask = true;

src/GraphQL.Conventions/Types/Resolution/Extensions/ReflectionExtensions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Threading.Tasks;
88
using GraphQL.Conventions.Extensions;
99
using GraphQL.Conventions.Types.Descriptors;
10+
using GraphQL.DataLoader;
1011

1112
namespace GraphQL.Conventions.Types.Resolution.Extensions
1213
{
@@ -82,6 +83,11 @@ public static async Task<object> GetTaskResult(this object obj)
8283

8384
public static TypeInfo GetTypeRepresentation(this TypeInfo typeInfo)
8485
{
86+
while (typeInfo.IsGenericType(typeof(IDataLoaderResult<>)))
87+
{
88+
typeInfo = typeInfo.TypeParameter();
89+
}
90+
8591
if (typeInfo.IsGenericType(typeof(Task<>)))
8692
{
8793
typeInfo = typeInfo.TypeParameter();

src/GraphQL.Conventions/Types/Resolution/ObjectReflector.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using GraphQL.Conventions.Handlers;
88
using GraphQL.Conventions.Types.Descriptors;
99
using GraphQL.Conventions.Types.Resolution.Extensions;
10+
using GraphQL.DataLoader;
1011

1112
namespace GraphQL.Conventions.Types.Resolution
1213
{
@@ -80,6 +81,11 @@ public GraphSchemaInfo GetSchema(TypeInfo typeInfo)
8081

8182
public GraphTypeInfo GetType(TypeInfo typeInfo, bool isInjected = false)
8283
{
84+
while (typeInfo.IsGenericType(typeof(IDataLoaderResult<>)))
85+
{
86+
typeInfo = typeInfo.TypeParameter();
87+
}
88+
8389
if (typeInfo.IsGenericType(typeof(Task<>)))
8490
{
8591
typeInfo = typeInfo.TypeParameter();
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using System.Threading.Tasks;
2+
using GraphQL.Conventions;
3+
using GraphQL.DataLoader;
4+
using GraphQL.NewtonsoftJson;
5+
using Tests.Templates;
6+
7+
namespace Tests.Execution
8+
{
9+
public class DataLoaderResultUnwrappingTests : ConstructionTestBase
10+
{
11+
[Test]
12+
public async Task Schema_Will_Execute_With_No_Errors_When_A_Type_Is_In_A_IDataLoaderResult()
13+
{
14+
const string query = @"{
15+
dataLoaderResult
16+
nestedDataLoaderResult
17+
anEnum
18+
nestedEnum
19+
namedResult
20+
resultProperty
21+
}";
22+
23+
var schema = Schema<BugReproSchemaDataLoaderResult>();
24+
25+
var result = await schema.ExecuteAsync((e) => e.Query = query);
26+
ResultHelpers.AssertNoErrorsInResult(result);
27+
}
28+
29+
private class BugReproSchemaDataLoaderResult
30+
{
31+
public BugReproQueryDataLoaderResult Query { get; }
32+
}
33+
34+
public enum BugReproQueryDataLoaderResultEnum
35+
{
36+
Zero,
37+
One
38+
}
39+
40+
private class BugReproQueryDataLoaderResult
41+
{
42+
public IDataLoaderResult<string> DataLoaderResult() => new DataLoaderResult<string>("Test");
43+
44+
public IDataLoaderResult<IDataLoaderResult<string>> NestedDataLoaderResult() => new DataLoaderResult<IDataLoaderResult<string>>(new DataLoaderResult<string>("Test"));
45+
46+
public IDataLoaderResult<BugReproQueryDataLoaderResultEnum> AnEnum() => new DataLoaderResult<BugReproQueryDataLoaderResultEnum>(BugReproQueryDataLoaderResultEnum.One);
47+
48+
public IDataLoaderResult<IDataLoaderResult<BugReproQueryDataLoaderResultEnum>> NestedEnum() => new DataLoaderResult<IDataLoaderResult<BugReproQueryDataLoaderResultEnum>>(new DataLoaderResult<BugReproQueryDataLoaderResultEnum>(BugReproQueryDataLoaderResultEnum.One));
49+
50+
[Name("namedResult")]
51+
public IDataLoaderResult<int> ANamedResult() => new DataLoaderResult<int>(100500);
52+
53+
public IDataLoaderResult<int> ResultProperty => new DataLoaderResult<int>(100500);
54+
55+
public IDataLoaderResult<int> ResultField = new DataLoaderResult<int>(100500);
56+
}
57+
}
58+
}

0 commit comments

Comments
 (0)