Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 9d3bf7c

Browse filesBrowse files
Bug fix for developer items collection
1 parent 15fcb93 commit 9d3bf7c
Copy full SHA for 9d3bf7c

File tree

7 files changed

+187
-7
lines changed
Filter options

7 files changed

+187
-7
lines changed

‎src/graphql-aspnet/Engine/DefaultGraphQLRuntime.cs

Copy file name to clipboardExpand all lines: src/graphql-aspnet/Engine/DefaultGraphQLRuntime.cs
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public Task<IQueryExecutionResult> ExecuteRequestAsync(
120120
request,
121121
serviceProvider,
122122
session,
123-
items: new MetaDataCollection(),
123+
items: request.Items ?? new MetaDataCollection(),
124124
securityContext: securityContext,
125125
metrics: metricsPackage,
126126
logger: _logger);

‎src/unit-tests/graphql-aspnet-testframework/PipelineContextBuilders/QueryContextBuilder.cs

Copy file name to clipboardExpand all lines: src/unit-tests/graphql-aspnet-testframework/PipelineContextBuilders/QueryContextBuilder.cs
+5-6Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public class QueryContextBuilder
3737
private IUserSecurityContext _userSecurityContext;
3838
private IQueryExecutionMetrics _metrics;
3939
private IGraphEventLogger _eventLogger;
40+
private MetaDataCollection _items;
4041

4142
/// <summary>
4243
/// Initializes a new instance of the <see cref="QueryContextBuilder" /> class.
@@ -49,7 +50,10 @@ public QueryContextBuilder(
4950
{
5051
_serviceProvider = Validation.ThrowIfNullOrReturn(serviceProvider, nameof(serviceProvider));
5152
_userSecurityContext = userSecurityContext;
53+
54+
_items = new MetaDataCollection();
5255
_mockRequest = new Mock<IQueryExecutionRequest>();
56+
_mockRequest.Setup(x => x.Items).Returns(_items);
5357
_sourceData = new List<KeyValuePair<SchemaItemPath, object>>();
5458
}
5559

@@ -142,18 +146,13 @@ public virtual QueryExecutionContext Build()
142146
var startDate = DateTimeOffset.UtcNow;
143147
_mockRequest.Setup(x => x.StartTimeUTC).Returns(startDate);
144148

145-
var metaData = new MetaDataCollection();
146-
147-
// unchangable items about the request
148-
var request = new Mock<IQueryExecutionRequest>();
149-
request.Setup(x => x.Items).Returns(metaData);
150-
151149
// updateable items about the request
152150
var context = new QueryExecutionContext(
153151
this.QueryRequest,
154152
_serviceProvider,
155153
new QuerySession(),
156154
securityContext: _userSecurityContext,
155+
items: this.QueryRequest.Items,
157156
metrics: _metrics,
158157
logger: _eventLogger);
159158

‎src/unit-tests/graphql-aspnet-tests/Execution/GeneralQueryExecutionTests.cs

Copy file name to clipboardExpand all lines: src/unit-tests/graphql-aspnet-tests/Execution/GeneralQueryExecutionTests.cs
+27Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -956,5 +956,32 @@ public async Task TypeExtension_OnGeneralObject_ResolvesDataCorrectly()
956956
var result = await server.RenderResult(builder);
957957
CommonAssertions.AreEqualJsonStrings(expectedOutput, result);
958958
}
959+
960+
[Test]
961+
public async Task ExternalItem_InjectedIntoContextItemsCollection_MakesItToController()
962+
{
963+
var server = new TestServerBuilder()
964+
.AddType<ExternalItemCollectionController>()
965+
.Build();
966+
967+
var context = server.CreateQueryContextBuilder()
968+
.AddQueryText("query { itemPassed }")
969+
.Build();
970+
971+
context.Items.Add("test-key", new TwoPropertyObject()
972+
{
973+
Property2 = 5,
974+
});
975+
976+
var expectedOutput =
977+
@"{
978+
""data"": {
979+
""itemPassed"" : 5
980+
}
981+
}";
982+
983+
var result = await server.RenderResult(context);
984+
CommonAssertions.AreEqualJsonStrings(expectedOutput, result);
985+
}
959986
}
960987
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// *************************************************************
2+
// project: graphql-aspnet
3+
// --
4+
// repo: https://github.com/graphql-aspnet
5+
// docs: https://graphql-aspnet.github.io
6+
// --
7+
// License: MIT
8+
// *************************************************************
9+
10+
namespace GraphQL.AspNet.Tests.Execution.TestData.ExecutionPlanTestData
11+
{
12+
using GraphQL.AspNet.Attributes;
13+
using GraphQL.AspNet.Controllers;
14+
using GraphQL.AspNet.Tests.Framework.CommonHelpers;
15+
16+
public class ExternalItemCollectionController : GraphController
17+
{
18+
[QueryRoot]
19+
public int ItemPassed()
20+
{
21+
if (this.Request.Items != null && this.Request.Items.ContainsKey("test-key") && this.Request.Items["test-key"] is TwoPropertyObject item)
22+
{
23+
return item.Property2;
24+
}
25+
26+
return -1;
27+
}
28+
}
29+
}

‎src/unit-tests/graphql-aspnet-tests/Web/GetRequestTests.cs

Copy file name to clipboardExpand all lines: src/unit-tests/graphql-aspnet-tests/Web/GetRequestTests.cs
+56Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ namespace GraphQL.AspNet.Tests.Web
2020
using GraphQL.AspNet.Tests.Framework;
2121
using GraphQL.AspNet.Tests.Framework.CommonHelpers;
2222
using GraphQL.AspNet.Tests.Web.CancelTokenTestData;
23+
using GraphQL.AspNet.Tests.Web.WebTestData;
2324
using Microsoft.AspNetCore.Http;
2425
using Microsoft.AspNetCore.Http.Internal;
2526
using Microsoft.Extensions.DependencyInjection;
@@ -272,5 +273,60 @@ public async Task POSTRequest_WithQueryAsBody_WithoutGraphQLContentType_Fails()
272273

273274
Assert.AreEqual(400, httpContext.Response.StatusCode);
274275
}
276+
277+
[Test]
278+
public async Task CustomAddedRequestItem_MakesItToController()
279+
{
280+
var serverBuilder = new TestServerBuilder();
281+
serverBuilder.AddGraphController<ExternalItemCollectionController>();
282+
serverBuilder.AddTransient<ItemInjectorHttpProcessor>();
283+
284+
var server = serverBuilder.Build();
285+
286+
using var scope = server.ServiceProvider.CreateScope();
287+
var processor = scope.ServiceProvider.GetRequiredService<ItemInjectorHttpProcessor>();
288+
289+
var postBodyQuery = "query { itemPassed }";
290+
291+
// use the query directly as the post body (not json encoded)
292+
var stream = new MemoryStream(Encoding.UTF8.GetBytes(postBodyQuery));
293+
var httpContext = new DefaultHttpContext()
294+
{
295+
Request =
296+
{
297+
Body = stream,
298+
ContentLength = stream.Length,
299+
},
300+
Response =
301+
{
302+
Body = new MemoryStream(),
303+
},
304+
};
305+
306+
var request = httpContext.Request as DefaultHttpRequest;
307+
request.Method = "POST";
308+
request.ContentType = Constants.Web.GRAPHQL_CONTENT_TYPE_HEADER_VALUE;
309+
httpContext.RequestServices = scope.ServiceProvider;
310+
311+
// context will attempt to be deserialized as json and fail
312+
// should return status 400
313+
await processor.InvokeAsync(httpContext);
314+
await httpContext.Response.Body.FlushAsync();
315+
316+
httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
317+
var reader = new StreamReader(httpContext.Response.Body);
318+
var result = reader.ReadToEnd();
319+
320+
Assert.AreEqual(200, httpContext.Response.StatusCode);
321+
322+
var expectedJson = @"
323+
{
324+
""data"": {
325+
""itemPassed"": 3
326+
}
327+
}";
328+
329+
CommonAssertions.AreEqualJsonStrings(expectedJson, result);
330+
}
275331
}
276332
}
+29Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// *************************************************************
2+
// project: graphql-aspnet
3+
// --
4+
// repo: https://github.com/graphql-aspnet
5+
// docs: https://graphql-aspnet.github.io
6+
// --
7+
// License: MIT
8+
// *************************************************************
9+
10+
namespace GraphQL.AspNet.Tests.Web.WebTestData
11+
{
12+
using GraphQL.AspNet.Attributes;
13+
using GraphQL.AspNet.Controllers;
14+
using GraphQL.AspNet.Tests.Framework.CommonHelpers;
15+
16+
public class ExternalItemCollectionController : GraphController
17+
{
18+
[QueryRoot]
19+
public int ItemPassed()
20+
{
21+
if (this.Request.Items != null && this.Request.Items.ContainsKey("test-key") && this.Request.Items["test-key"] is TwoPropertyObject item)
22+
{
23+
return item.Property2;
24+
}
25+
26+
return -1;
27+
}
28+
}
29+
}
+40Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// *************************************************************
2+
// project: graphql-aspnet
3+
// --
4+
// repo: https://github.com/graphql-aspnet
5+
// docs: https://graphql-aspnet.github.io
6+
// --
7+
// License: MIT
8+
// *************************************************************
9+
10+
namespace GraphQL.AspNet.Tests.Web.WebTestData
11+
{
12+
using System.Threading;
13+
using System.Threading.Tasks;
14+
using GraphQL.AspNet;
15+
using GraphQL.AspNet.Engine;
16+
using GraphQL.AspNet.Interfaces.Engine;
17+
using GraphQL.AspNet.Interfaces.Execution;
18+
using GraphQL.AspNet.Interfaces.Logging;
19+
using GraphQL.AspNet.Schemas;
20+
using GraphQL.AspNet.Tests.Framework.CommonHelpers;
21+
22+
public class ItemInjectorHttpProcessor : DefaultGraphQLHttpProcessor<GraphSchema>
23+
{
24+
public ItemInjectorHttpProcessor(GraphSchema schema, IGraphQLRuntime<GraphSchema> runtime, IQueryResponseWriter<GraphSchema> writer, IGraphEventLogger logger = null)
25+
: base(schema, runtime, writer, logger)
26+
{
27+
}
28+
29+
protected override async Task<IQueryExecutionRequest> CreateQueryRequestAsync(GraphQueryData queryData, CancellationToken cancelToken = default)
30+
{
31+
var request = await base.CreateQueryRequestAsync(queryData, cancelToken);
32+
request.Items.Add("test-key", new TwoPropertyObject()
33+
{
34+
Property2 = 3,
35+
});
36+
37+
return request;
38+
}
39+
}
40+
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.