Skip to content

Commit 608089b

Browse files
[Fusion] Add new integration test snapshot format (#8725)
1 parent 31c7902 commit 608089b

File tree

447 files changed

+38673
-16928
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

447 files changed

+38673
-16928
lines changed

src/All.slnx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@
193193
<Project Path="HotChocolate/Fusion-vnext/test/Fusion.Language.Tests/HotChocolate.Fusion.Language.Tests.csproj" />
194194
<Project Path="HotChocolate/Fusion-vnext/test/Fusion.Packaging.Tests/HotChocolate.Fusion.Packaging.Tests.csproj" />
195195
<Project Path="HotChocolate/Fusion-vnext/test/Fusion.Utilities.Tests/HotChocolate.Fusion.Utilities.Tests.csproj" />
196+
<Project Path="HotChocolate/Fusion-vnext/test/Fusion.Tests.Shared/HotChocolate.Fusion.Tests.Shared.csproj" />
196197
</Folder>
197198
<Folder Name="/HotChocolate/Language/" />
198199
<Folder Name="/HotChocolate/Language/src/">

src/CookieCrumble/src/CookieCrumble/Snapshot.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ public Snapshot(string? postFix = null, string? extension = null)
4848
_extension = extension ?? ".snap";
4949
}
5050

51+
public string Title => _title;
52+
5153
public static Snapshot Create(string? postFix = null, string? extension = null)
5254
=> new(postFix, extension);
5355

src/HotChocolate/Fusion-vnext/src/Fusion.Execution/DependencyInjection/CoreFusionGatewayBuilderExtensions.SourceSchemaClients.cs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using HotChocolate.Fusion.Configuration;
22
using HotChocolate.Fusion.Execution;
33
using HotChocolate.Fusion.Execution.Clients;
4+
using HotChocolate.Fusion.Execution.Nodes;
45

56
namespace Microsoft.Extensions.DependencyInjection;
67

@@ -27,6 +28,9 @@ public static partial class CoreFusionGatewayBuilderExtensions
2728
/// <param name="onAfterReceive">
2829
/// The action to call after the response is received.
2930
/// </param>
31+
/// <param name="onSourceSchemaResult">
32+
/// The action to call after a <see cref="SourceSchemaResult"/> was materialized.
33+
/// </param>
3034
/// <returns>
3135
/// The fusion gateway builder.
3236
/// </returns>
@@ -35,16 +39,18 @@ public static IFusionGatewayBuilder AddHttpClientConfiguration(
3539
string name,
3640
Uri baseAddress,
3741
SupportedOperationType supportedOperations = SupportedOperationType.All,
38-
Action<OperationPlanContext, HttpRequestMessage>? onBeforeSend = null,
39-
Action<OperationPlanContext, HttpResponseMessage>? onAfterReceive = null)
42+
Action<OperationPlanContext, ExecutionNode, HttpRequestMessage>? onBeforeSend = null,
43+
Action<OperationPlanContext, ExecutionNode, HttpResponseMessage>? onAfterReceive = null,
44+
Action<OperationPlanContext, ExecutionNode, SourceSchemaResult>? onSourceSchemaResult = null)
4045
=> AddHttpClientConfiguration(
4146
builder,
4247
name,
4348
name,
4449
baseAddress,
4550
supportedOperations,
4651
onBeforeSend,
47-
onAfterReceive);
52+
onAfterReceive,
53+
onSourceSchemaResult);
4854

4955
/// <summary>
5056
/// Adds an http client configuration to the fusion gateway.
@@ -70,6 +76,9 @@ public static IFusionGatewayBuilder AddHttpClientConfiguration(
7076
/// <param name="onAfterReceive">
7177
/// The action to call after the response is received.
7278
/// </param>
79+
/// <param name="onSourceSchemaResult">
80+
/// The action to call after a <see cref="SourceSchemaResult"/> was materialized.
81+
/// </param>
7382
/// <returns>
7483
/// The fusion gateway builder.
7584
/// </returns>
@@ -79,8 +88,9 @@ public static IFusionGatewayBuilder AddHttpClientConfiguration(
7988
string httpClientName,
8089
Uri baseAddress,
8190
SupportedOperationType supportedOperations = SupportedOperationType.All,
82-
Action<OperationPlanContext, HttpRequestMessage>? onBeforeSend = null,
83-
Action<OperationPlanContext, HttpResponseMessage>? onAfterReceive = null)
91+
Action<OperationPlanContext, ExecutionNode, HttpRequestMessage>? onBeforeSend = null,
92+
Action<OperationPlanContext, ExecutionNode, HttpResponseMessage>? onAfterReceive = null,
93+
Action<OperationPlanContext, ExecutionNode, SourceSchemaResult>? onSourceSchemaResult = null)
8494
{
8595
ArgumentNullException.ThrowIfNull(builder);
8696
ArgumentNullException.ThrowIfNull(name);
@@ -95,7 +105,8 @@ public static IFusionGatewayBuilder AddHttpClientConfiguration(
95105
baseAddress,
96106
supportedOperations,
97107
onBeforeSend,
98-
onAfterReceive));
108+
onAfterReceive,
109+
onSourceSchemaResult));
99110
}
100111

101112
/// <summary>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
using HotChocolate.Fusion.Execution.Nodes;
2+
13
namespace HotChocolate.Fusion.Execution.Clients;
24

35
public interface ISourceSchemaClient : IAsyncDisposable
46
{
57
ValueTask<SourceSchemaClientResponse> ExecuteAsync(
68
OperationPlanContext context,
9+
ExecutionNode node,
710
SourceSchemaClientRequest request,
811
CancellationToken cancellationToken);
912
}

src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Clients/SourceSchemaHttpClient.cs

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Net.Http.Headers;
33
using System.Reactive.Disposables;
44
using System.Runtime.CompilerServices;
5+
using HotChocolate.Fusion.Execution.Nodes;
56
using HotChocolate.Language;
67
using HotChocolate.Transport;
78
using HotChocolate.Transport.Http;
@@ -27,25 +28,26 @@ public SourceSchemaHttpClient(
2728

2829
public async ValueTask<SourceSchemaClientResponse> ExecuteAsync(
2930
OperationPlanContext context,
31+
ExecutionNode node,
3032
SourceSchemaClientRequest request,
3133
CancellationToken cancellationToken)
3234
{
3335
ArgumentNullException.ThrowIfNull(context);
3436
ArgumentNullException.ThrowIfNull(request);
3537

3638
var httpRequest = CreateHttpRequest(request);
37-
httpRequest.State = (context, _configuration);
39+
httpRequest.State = (context, node, _configuration);
3840

3941
httpRequest.OnMessageCreated += static (_, requestMessage, state) =>
4042
{
41-
var (context, configuration) = ((OperationPlanContext, SourceSchemaHttpClientConfiguration))state!;
42-
configuration.OnBeforeSend(context, requestMessage);
43+
var (context, node, configuration) = ((OperationPlanContext, ExecutionNode, SourceSchemaHttpClientConfiguration))state!;
44+
configuration.OnBeforeSend?.Invoke(context, node, requestMessage);
4345
};
4446

4547
httpRequest.OnMessageReceived += static (_, responseMessage, state) =>
4648
{
47-
var (context, configuration) = ((OperationPlanContext, SourceSchemaHttpClientConfiguration))state!;
48-
configuration.OnAfterReceive(context, responseMessage);
49+
var (context, node, configuration) = ((OperationPlanContext, ExecutionNode, SourceSchemaHttpClientConfiguration))state!;
50+
configuration.OnAfterReceive?.Invoke(context, node, responseMessage);
4951
};
5052

5153
var httpResponse = await _client.SendAsync(httpRequest, cancellationToken);
@@ -146,16 +148,23 @@ private sealed class Response(
146148
public override async IAsyncEnumerable<SourceSchemaResult> ReadAsResultStreamAsync(
147149
[EnumeratorCancellation] CancellationToken cancellationToken = default)
148150
{
151+
var (context, node, configuration) =
152+
((OperationPlanContext, ExecutionNode, SourceSchemaHttpClientConfiguration))request.State!;
153+
149154
if (operation == OperationType.Subscription)
150155
{
151156
await foreach (var result in response.ReadAsResultStreamAsync().WithCancellation(cancellationToken))
152157
{
153-
yield return new SourceSchemaResult(
158+
var sourceSchemaResult = new SourceSchemaResult(
154159
Path.Root,
155160
result,
156161
result.Data,
157162
result.Errors,
158163
result.Extensions);
164+
165+
configuration.OnSourceSchemaResult?.Invoke(context, node, sourceSchemaResult);
166+
167+
yield return sourceSchemaResult;
159168
}
160169
}
161170
else
@@ -165,24 +174,32 @@ public override async IAsyncEnumerable<SourceSchemaResult> ReadAsResultStreamAsy
165174
case 0:
166175
{
167176
var result = await response.ReadAsResultAsync(cancellationToken);
168-
yield return new SourceSchemaResult(
177+
var sourceSchemaResult = new SourceSchemaResult(
169178
Path.Root,
170179
result,
171180
result.Data,
172181
result.Errors,
173182
result.Extensions);
183+
184+
configuration.OnSourceSchemaResult?.Invoke(context, node, sourceSchemaResult);
185+
186+
yield return sourceSchemaResult;
174187
break;
175188
}
176189

177190
case 1:
178191
{
179192
var result = await response.ReadAsResultAsync(cancellationToken);
180-
yield return new SourceSchemaResult(
193+
var sourceSchemaResult = new SourceSchemaResult(
181194
variables[0].Path,
182195
result,
183196
result.Data,
184197
result.Errors,
185198
result.Extensions);
199+
200+
configuration.OnSourceSchemaResult?.Invoke(context, node, sourceSchemaResult);
201+
202+
yield return sourceSchemaResult;
186203
break;
187204
}
188205

@@ -201,17 +218,23 @@ public override async IAsyncEnumerable<SourceSchemaResult> ReadAsResultStreamAsy
201218
result.Data,
202219
result.Errors,
203220
result.Extensions);
221+
222+
configuration.OnSourceSchemaResult?.Invoke(context, node, errorResult);
204223
break;
205224
}
206225

207226
var index = result.VariableIndex!.Value;
208227
var (path, _) = variables[index];
209-
yield return new SourceSchemaResult(
228+
var sourceSchemaResult = new SourceSchemaResult(
210229
path,
211230
result,
212231
result.Data,
213232
result.Errors,
214233
result.Extensions);
234+
235+
configuration.OnSourceSchemaResult?.Invoke(context, node, sourceSchemaResult);
236+
237+
yield return sourceSchemaResult;
215238
}
216239

217240
if (errorResult is not null)

src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Clients/SourceSchemaHttpClientConfiguration.cs

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using HotChocolate.Fusion.Execution.Nodes;
2+
13
namespace HotChocolate.Fusion.Execution.Clients;
24

35
/// <summary>
@@ -6,9 +8,6 @@ namespace HotChocolate.Fusion.Execution.Clients;
68
public class SourceSchemaHttpClientConfiguration
79
: ISourceSchemaClientConfiguration
810
{
9-
private readonly Action<OperationPlanContext, HttpRequestMessage>? _onBeforeSend;
10-
private readonly Action<OperationPlanContext, HttpResponseMessage>? _onAfterReceive;
11-
1211
/// <summary>
1312
/// Initializes a new instance of <see cref="SourceSchemaHttpClientConfiguration"/>.
1413
/// </summary>
@@ -27,12 +26,16 @@ public class SourceSchemaHttpClientConfiguration
2726
/// <param name="onAfterReceive">
2827
/// The action to call after the response is received.
2928
/// </param>
29+
/// <param name="onSourceSchemaResult">
30+
/// The action to call after a <see cref="SourceSchemaResult"/> was materialized.
31+
/// </param>
3032
public SourceSchemaHttpClientConfiguration(
3133
string name,
3234
Uri baseAddress,
3335
SupportedOperationType supportedOperations = SupportedOperationType.All,
34-
Action<OperationPlanContext, HttpRequestMessage>? onBeforeSend = null,
35-
Action<OperationPlanContext, HttpResponseMessage>? onAfterReceive = null)
36+
Action<OperationPlanContext, ExecutionNode, HttpRequestMessage>? onBeforeSend = null,
37+
Action<OperationPlanContext, ExecutionNode, HttpResponseMessage>? onAfterReceive = null,
38+
Action<OperationPlanContext, ExecutionNode, SourceSchemaResult>? onSourceSchemaResult = null)
3639
{
3740
ArgumentNullException.ThrowIfNull(name);
3841
ArgumentNullException.ThrowIfNull(baseAddress);
@@ -41,8 +44,9 @@ public SourceSchemaHttpClientConfiguration(
4144
HttpClientName = name;
4245
BaseAddress = baseAddress;
4346
SupportedOperations = supportedOperations;
44-
_onBeforeSend = onBeforeSend;
45-
_onAfterReceive = onAfterReceive;
47+
OnBeforeSend = onBeforeSend;
48+
OnAfterReceive = onAfterReceive;
49+
OnSourceSchemaResult = onSourceSchemaResult;
4650
}
4751

4852
/// <summary>
@@ -64,13 +68,17 @@ public SourceSchemaHttpClientConfiguration(
6468
/// <param name="onAfterReceive">
6569
/// The action to call after the response is received.
6670
/// </param>
71+
/// <param name="onSourceSchemaResult">
72+
/// The action to call after a <see cref="SourceSchemaResult"/> was materialized.
73+
/// </param>
6774
public SourceSchemaHttpClientConfiguration(
6875
string name,
6976
string httpClientName,
7077
Uri baseAddress,
7178
SupportedOperationType supportedOperations = SupportedOperationType.All,
72-
Action<OperationPlanContext, HttpRequestMessage>? onBeforeSend = null,
73-
Action<OperationPlanContext, HttpResponseMessage>? onAfterReceive = null)
79+
Action<OperationPlanContext, ExecutionNode, HttpRequestMessage>? onBeforeSend = null,
80+
Action<OperationPlanContext, ExecutionNode, HttpResponseMessage>? onAfterReceive = null,
81+
Action<OperationPlanContext, ExecutionNode, SourceSchemaResult>? onSourceSchemaResult = null)
7482
{
7583
ArgumentNullException.ThrowIfNull(name);
7684
ArgumentNullException.ThrowIfNull(httpClientName);
@@ -80,8 +88,9 @@ public SourceSchemaHttpClientConfiguration(
8088
HttpClientName = httpClientName;
8189
BaseAddress = baseAddress;
8290
SupportedOperations = supportedOperations;
83-
_onBeforeSend = onBeforeSend;
84-
_onAfterReceive = onAfterReceive;
91+
OnBeforeSend = onBeforeSend;
92+
OnAfterReceive = onAfterReceive;
93+
OnSourceSchemaResult = onSourceSchemaResult;
8594
}
8695

8796
/// <summary>
@@ -107,28 +116,15 @@ public SourceSchemaHttpClientConfiguration(
107116
/// <summary>
108117
/// Called before the request is sent.
109118
/// </summary>
110-
/// <param name="context">
111-
/// The operation plan context.
112-
/// </param>
113-
/// <param name="requestMessage">
114-
/// The request message.
115-
/// </param>
116-
public virtual void OnBeforeSend(
117-
OperationPlanContext context,
118-
HttpRequestMessage requestMessage)
119-
=> _onBeforeSend?.Invoke(context, requestMessage);
119+
public Action<OperationPlanContext, ExecutionNode, HttpRequestMessage>? OnBeforeSend { get; }
120120

121121
/// <summary>
122122
/// Called after the response is received.
123123
/// </summary>
124-
/// <param name="context">
125-
/// The operation plan context.
126-
/// </param>
127-
/// <param name="responseMessage">
128-
/// The response message.
129-
/// </param>
130-
public virtual void OnAfterReceive(
131-
OperationPlanContext context,
132-
HttpResponseMessage responseMessage)
133-
=> _onAfterReceive?.Invoke(context, responseMessage);
124+
public Action<OperationPlanContext, ExecutionNode, HttpResponseMessage>? OnAfterReceive { get; }
125+
126+
/// <summary>
127+
/// Called after a <see cref="SourceSchemaResult"/> was materialized.
128+
/// </summary>
129+
public Action<OperationPlanContext, ExecutionNode, SourceSchemaResult>? OnSourceSchemaResult { get; }
134130
}

src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Clients/SourceSchemaResult.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public SourceSchemaResult(
2020
_resource = resource;
2121
Path = path;
2222
Data = data;
23+
RawErrors = errors;
2324
Errors = SourceSchemaErrors.From(errors);
2425
Extensions = extensions;
2526
Final = final;
@@ -31,6 +32,8 @@ public SourceSchemaResult(
3132

3233
public SourceSchemaErrors? Errors { get; }
3334

35+
public JsonElement RawErrors { get; }
36+
3437
public JsonElement Extensions { get; }
3538

3639
public FinalMessage Final { get; }

src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/OperationExecutionNode.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ protected override async ValueTask<ExecutionStatus> OnExecuteAsync(
117117
try
118118
{
119119
// we execute the GraphQL request against a source schema
120-
var response = await client.ExecuteAsync(context, request, cancellationToken);
120+
var response = await client.ExecuteAsync(context, this, request, cancellationToken);
121121
context.TrackSourceSchemaClientResponse(this, response);
122122

123123
// we read the responses from the response stream.
@@ -217,7 +217,7 @@ internal async Task<SubscriptionResult> SubscribeAsync(
217217

218218
try
219219
{
220-
var response = await client.ExecuteAsync(context, request, cancellationToken);
220+
var response = await client.ExecuteAsync(context, this, request, cancellationToken);
221221

222222
var stream = new SubscriptionEnumerable(
223223
context,

src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/Serialization/JsonOperationPlanParser.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,8 @@ private static (NodeFieldExecutionNode, int[]?, Dictionary<string, int>?, int?)
284284

285285
if (idValue is VariableNode variableNode)
286286
{
287-
if (!operation.Definition.VariableDefinitions.Any(v => v.Variable.Equals(variableNode)))
287+
if (!operation.Definition.VariableDefinitions
288+
.Any(v => v.Variable.Equals(variableNode, SyntaxComparison.Syntax)))
288289
{
289290
throw new InvalidOperationException(
290291
$"'idValue' references non-existent '{variableNode.Name}' variable.");

0 commit comments

Comments
 (0)