Skip to content

Commit 137d57d

Browse files
Update tests
1 parent 0caef33 commit 137d57d

7 files changed

Lines changed: 379 additions & 29 deletions

src/Immediate.Handlers.Analyzers/DiagnosticIds.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@ internal static class DiagnosticIds
2121
public const string IHR0017ContainingClassInstanceMembersMustBePrivate = "IHR0017";
2222
public const string IHR0018ContainingClassMustBeStatic = "IHR0018";
2323
public const string IHR0019StaticHandlerCouldBeSealed = "IHR0019";
24+
public const string IHR0020BehaviorHasIncorrectTypeArgument = "IHR0020";
2425
}

tests/Immediate.Handlers.Tests/AnalyzerTests/BehaviorAnalyzerTests/Tests.BehaviorTypeWithOneGenericParameter.cs

Lines changed: 193 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,135 @@ namespace Immediate.Handlers.Tests.AnalyzerTests.BehaviorAnalyzerTests;
77
public sealed partial class Tests
88
{
99
[Fact]
10-
public async Task BehaviorTypeWithOneGenericParameter_DoesNotAlert() =>
10+
public async Task BehaviorTypeWithCorrectTRequest_DoesNotAlert() =>
11+
await AnalyzerTestHelpers.CreateAnalyzerTest<BehaviorsAnalyzer>(
12+
"""
13+
using System;
14+
using System.Collections.Generic;
15+
using System.IO;
16+
using System.Linq;
17+
using System.Net.Http;
18+
using System.Threading;
19+
using System.Threading.Tasks;
20+
using Immediate.Handlers.Shared;
21+
using Normal;
22+
23+
[assembly: Behaviors(
24+
typeof(RequestLoggingBehavior<>)
25+
)]
26+
27+
namespace Normal;
28+
29+
public class User { }
30+
public interface ILogger<T>;
31+
32+
// Single type parameter behavior
33+
public sealed class RequestLoggingBehavior<TResponse>(ILogger<RequestLoggingBehavior<TResponse>> logger)
34+
: Immediate.Handlers.Shared.Behavior<int, TResponse>
35+
{
36+
public override async ValueTask<TResponse> HandleAsync(int request, CancellationToken cancellationToken)
37+
{
38+
_ = logger.ToString();
39+
var response = await Next(request, cancellationToken);
40+
41+
return response;
42+
}
43+
}
44+
45+
public class UsersService(ILogger<UsersService> logger)
46+
{
47+
public ValueTask<string> GetUsers()
48+
{
49+
_ = logger.ToString();
50+
return ValueTask.FromResult("result");
51+
}
52+
}
53+
54+
[Handler]
55+
[Behaviors(
56+
typeof(RequestLoggingBehavior<>)
57+
)]
58+
public static partial class GetUsersQuery
59+
{
60+
private static ValueTask<string> HandleAsync(
61+
int request,
62+
UsersService usersService,
63+
CancellationToken token)
64+
{
65+
token.ThrowIfCancellationRequested();
66+
return usersService.GetUsers();
67+
}
68+
}
69+
""",
70+
DriverReferenceAssemblies.Normal
71+
).RunAsync(TestContext.Current.CancellationToken);
72+
73+
[Fact]
74+
public async Task BehaviorTypeWithIncorrectTRequest_Alerts() =>
75+
await AnalyzerTestHelpers.CreateAnalyzerTest<BehaviorsAnalyzer>(
76+
"""
77+
using System;
78+
using System.Collections.Generic;
79+
using System.IO;
80+
using System.Linq;
81+
using System.Net.Http;
82+
using System.Threading;
83+
using System.Threading.Tasks;
84+
using Immediate.Handlers.Shared;
85+
using Normal;
86+
87+
[assembly: Behaviors(
88+
typeof(RequestLoggingBehavior<>)
89+
)]
90+
91+
namespace Normal;
92+
93+
public class User { }
94+
public interface ILogger<T>;
95+
96+
// Single type parameter behavior
97+
public sealed class RequestLoggingBehavior<TResponse>(ILogger<RequestLoggingBehavior<TResponse>> logger)
98+
: Immediate.Handlers.Shared.Behavior<double, TResponse>
99+
{
100+
public override async ValueTask<TResponse> HandleAsync(double request, CancellationToken cancellationToken)
101+
{
102+
_ = logger.ToString();
103+
var response = await Next(request, cancellationToken);
104+
105+
return response;
106+
}
107+
}
108+
109+
public class UsersService(ILogger<UsersService> logger)
110+
{
111+
public ValueTask<string> GetUsers()
112+
{
113+
_ = logger.ToString();
114+
return ValueTask.FromResult("result");
115+
}
116+
}
117+
118+
[Handler]
119+
[Behaviors(
120+
{|IHR0020:typeof(RequestLoggingBehavior<>)|}
121+
)]
122+
public static partial class GetUsersQuery
123+
{
124+
private static ValueTask<string> HandleAsync(
125+
int request,
126+
UsersService usersService,
127+
CancellationToken token)
128+
{
129+
token.ThrowIfCancellationRequested();
130+
return usersService.GetUsers();
131+
}
132+
}
133+
""",
134+
DriverReferenceAssemblies.Normal
135+
).RunAsync(TestContext.Current.CancellationToken);
136+
137+
[Fact]
138+
public async Task BehaviorTypeWithCorrectTResponse_DoesNotAlert() =>
11139
await AnalyzerTestHelpers.CreateAnalyzerTest<BehaviorsAnalyzer>(
12140
"""
13141
using System;
@@ -69,4 +197,68 @@ private static ValueTask<string> HandleAsync(
69197
""",
70198
DriverReferenceAssemblies.Normal
71199
).RunAsync(TestContext.Current.CancellationToken);
200+
201+
[Fact]
202+
public async Task BehaviorTypeWithIncorrectTResponse_Alerts() =>
203+
await AnalyzerTestHelpers.CreateAnalyzerTest<BehaviorsAnalyzer>(
204+
"""
205+
using System;
206+
using System.Collections.Generic;
207+
using System.IO;
208+
using System.Linq;
209+
using System.Net.Http;
210+
using System.Threading;
211+
using System.Threading.Tasks;
212+
using Immediate.Handlers.Shared;
213+
using Normal;
214+
215+
[assembly: Behaviors(
216+
typeof(RequestLoggingBehavior<>)
217+
)]
218+
219+
namespace Normal;
220+
221+
public class User { }
222+
public interface ILogger<T>;
223+
224+
// Single type parameter behavior
225+
public sealed class RequestLoggingBehavior<TRequest>(ILogger<RequestLoggingBehavior<TRequest>> logger)
226+
: Immediate.Handlers.Shared.Behavior<TRequest, double>
227+
{
228+
public override async ValueTask<double> HandleAsync(TRequest request, CancellationToken cancellationToken)
229+
{
230+
_ = logger.ToString();
231+
var response = await Next(request, cancellationToken);
232+
233+
return response;
234+
}
235+
}
236+
237+
public class UsersService(ILogger<UsersService> logger)
238+
{
239+
public ValueTask<string> GetUsers()
240+
{
241+
_ = logger.ToString();
242+
return ValueTask.FromResult("result");
243+
}
244+
}
245+
246+
[Handler]
247+
[Behaviors(
248+
{|IHR0020:typeof(RequestLoggingBehavior<>)|}
249+
)]
250+
public static partial class GetUsersQuery
251+
{
252+
private static ValueTask<string> HandleAsync(
253+
int request,
254+
UsersService usersService,
255+
CancellationToken token)
256+
{
257+
token.ThrowIfCancellationRequested();
258+
return usersService.GetUsers();
259+
}
260+
}
261+
""",
262+
DriverReferenceAssemblies.Normal
263+
).RunAsync(TestContext.Current.CancellationToken);
72264
}

tests/Immediate.Handlers.Tests/GeneratorTests/BehaviorTests.OneTypeParameterBehavior_assemblies=Msdi#IH.Dummy.GetUsersQuery.g.verified.cs renamed to tests/Immediate.Handlers.Tests/GeneratorTests/BehaviorTests.ResponseTypeParameterBehavior_assemblies=Msdi#IH.Dummy.GetUsersQuery.g.verified.cs

File renamed without changes.

tests/Immediate.Handlers.Tests/GeneratorTests/BehaviorTests.OneTypeParameterBehavior_assemblies=Msdi#IH.ServiceCollectionExtensions.g.verified.cs renamed to tests/Immediate.Handlers.Tests/GeneratorTests/BehaviorTests.ResponseTypeParameterBehavior_assemblies=Msdi#IH.ServiceCollectionExtensions.g.verified.cs

File renamed without changes.

tests/Immediate.Handlers.Tests/GeneratorTests/BehaviorTests.OneTypeParameterBehavior_assemblies=Normal#IH.Dummy.GetUsersQuery.g.verified.cs renamed to tests/Immediate.Handlers.Tests/GeneratorTests/BehaviorTests.ResponseTypeParameterBehavior_assemblies=Normal#IH.Dummy.GetUsersQuery.g.verified.cs

File renamed without changes.

tests/Immediate.Handlers.Tests/GeneratorTests/BehaviorTests.cs

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,94 @@ public interface IAuditService
484484
[Theory]
485485
[InlineData(DriverReferenceAssemblies.Normal)]
486486
[InlineData(DriverReferenceAssemblies.Msdi)]
487-
public async Task OneTypeParameterBehavior(DriverReferenceAssemblies assemblies)
487+
public async Task RequestTypeParameterBehavior(DriverReferenceAssemblies assemblies)
488+
{
489+
var result = GeneratorTestHelper.RunGenerator(
490+
"""
491+
using System.Collections.Generic;
492+
using System.Linq;
493+
using System.Threading;
494+
using System.Threading.Tasks;
495+
using Dummy;
496+
using Immediate.Handlers.Shared;
497+
498+
#pragma warning disable CS9113
499+
500+
[assembly: Behaviors(
501+
typeof(ValidationBehavior<>)
502+
)]
503+
504+
namespace Dummy;
505+
506+
public class GetUsersEndpoint(GetUsersQuery.Handler handler)
507+
{
508+
public ValueTask<IEnumerable<User>> GetUsers() =>
509+
handler.HandleAsync(new GetUsersQuery.Query());
510+
}
511+
512+
[Handler]
513+
public partial class GetUsersQuery(UsersService usersService)
514+
{
515+
public record Query;
516+
517+
private ValueTask<IEnumerable<User>> HandleAsync(
518+
Query _,
519+
CancellationToken token)
520+
{
521+
return usersService.GetUsers();
522+
}
523+
}
524+
525+
public class ValidationBehavior<TResponse>(IValidator validator)
526+
: Behavior<GetUsersQuery.Query, TResponse>
527+
{
528+
public override async ValueTask<TResponse> HandleAsync(GetUsersQuery.Query request, CancellationToken cancellationToken)
529+
{
530+
validator.Validate(request);
531+
var response = await Next(request, cancellationToken);
532+
return response;
533+
}
534+
}
535+
536+
public class User { }
537+
538+
public class UsersService
539+
{
540+
public ValueTask<IEnumerable<User>> GetUsers() =>
541+
ValueTask.FromResult(Enumerable.Empty<User>());
542+
}
543+
544+
public interface IValidator
545+
{
546+
void Validate(object request);
547+
}
548+
""",
549+
assemblies
550+
);
551+
552+
Assert.Equal(
553+
[
554+
"Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs",
555+
.. assemblies switch
556+
{
557+
DriverReferenceAssemblies.Normal => Enumerable.Empty<string>(),
558+
DriverReferenceAssemblies.Msdi =>
559+
["Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH.ServiceCollectionExtensions.g.cs"],
560+
561+
DriverReferenceAssemblies.None or _ => throw new UnreachableException(),
562+
},
563+
],
564+
result.GeneratedTrees.Select(t => t.FilePath.Replace('\\', '/'))
565+
);
566+
567+
_ = await Verify(result)
568+
.UseParameters(string.Join('_', assemblies));
569+
}
570+
571+
[Theory]
572+
[InlineData(DriverReferenceAssemblies.Normal)]
573+
[InlineData(DriverReferenceAssemblies.Msdi)]
574+
public async Task ResponseTypeParameterBehavior(DriverReferenceAssemblies assemblies)
488575
{
489576
var result = GeneratorTestHelper.RunGenerator(
490577
"""

0 commit comments

Comments
 (0)