@@ -9,55 +9,43 @@ public abstract class QueryExpressionInterceptionTestBase(InterceptionTestBase.I
9
9
: InterceptionTestBase ( fixture )
10
10
{
11
11
[ ConditionalTheory ]
12
- [ InlineData ( false , false ) ]
13
- [ InlineData ( true , false ) ]
14
- [ InlineData ( false , true ) ]
15
- [ InlineData ( true , true ) ]
16
- public virtual async Task Intercept_query_passively ( bool async , bool inject )
12
+ [ MemberData ( nameof ( IsAsyncData ) ) ]
13
+ public virtual async Task Intercept_query_passively ( bool async )
17
14
{
18
- var ( context , interceptor ) = await CreateContextAsync < TestQueryExpressionInterceptor > ( inject ) ;
15
+ var ( context , interceptor ) = await CreateContextAsync < TestQueryExpressionInterceptor > ( inject : true ) ;
19
16
20
17
using var _ = context ;
21
18
22
19
var query = context . Set < Singularity > ( ) . Where ( e => e . Type == "Black Hole" ) ;
23
- var results = async ? await query . ToListAsync ( ) : query . ToList ( ) ;
20
+ var result = async ? await query . SingleAsync ( ) : query . Single ( ) ;
24
21
25
- Assert . Single ( results ) ;
26
- Assert . Equal ( "Black Hole" , results [ 0 ] . Type ) ;
22
+ Assert . Equal ( "Black Hole" , result . Type ) ;
27
23
28
24
AssertNormalOutcome ( context , interceptor ) ;
29
25
30
- Assert . Contains ( @" .Where(e => e.Type == "" Black Hole"") ", interceptor . QueryExpression ) ;
26
+ Assert . Contains ( """ .Where(e => e.Type == "Black Hole")"" ", interceptor . QueryExpression ) ;
31
27
}
32
28
33
29
[ ConditionalTheory ]
34
- [ InlineData ( false , false ) ]
35
- [ InlineData ( true , false ) ]
36
- [ InlineData ( false , true ) ]
37
- [ InlineData ( true , true ) ]
38
- public virtual async Task Intercept_query_with_multiple_interceptors ( bool async , bool inject )
30
+ [ MemberData ( nameof ( IsAsyncData ) ) ]
31
+ public virtual async Task Intercept_query_with_multiple_interceptors ( bool async )
39
32
{
40
33
var interceptor1 = new TestQueryExpressionInterceptor ( ) ;
41
34
var interceptor2 = new QueryChangingExpressionInterceptor ( ) ;
42
- var interceptor3 = new TestQueryExpressionInterceptor ( ) ;
43
- var interceptor4 = new TestQueryExpressionInterceptor ( ) ;
44
35
45
36
using var context = await CreateContextAsync (
46
- new IInterceptor [ ] { new TestQueryExpressionInterceptor ( ) , interceptor1 , interceptor2 } ,
47
- new IInterceptor [ ] { interceptor3 , interceptor4 , new TestQueryExpressionInterceptor ( ) } ) ;
37
+ appInterceptor : null ,
38
+ [ interceptor1 , interceptor2 ] ) ;
48
39
49
40
using var listener = Fixture . SubscribeToDiagnosticListener ( context . ContextId ) ;
50
41
51
42
var query = context . Set < Singularity > ( ) . Where ( e => e . Type == "Bing Bang" ) ;
52
- var results = async ? await query . ToListAsync ( ) : query . ToList ( ) ;
43
+ var result = async ? await query . SingleAsync ( ) : query . Single ( ) ;
53
44
54
- Assert . Single ( results ) ;
55
- Assert . Equal ( "Bing Bang" , results [ 0 ] . Type ) ;
45
+ Assert . Equal ( "Bing Bang" , result . Type ) ;
56
46
57
47
AssertNormalOutcome ( context , interceptor1 ) ;
58
48
AssertNormalOutcome ( context , interceptor2 ) ;
59
- AssertNormalOutcome ( context , interceptor3 ) ;
60
- AssertNormalOutcome ( context , interceptor4 ) ;
61
49
62
50
listener . AssertEventsInOrder (
63
51
CoreEventId . QueryCompilationStarting . Name ,
@@ -67,25 +55,48 @@ public virtual async Task Intercept_query_with_multiple_interceptors(bool async,
67
55
}
68
56
69
57
[ ConditionalTheory ]
70
- [ InlineData ( false , false ) ]
71
- [ InlineData ( true , false ) ]
72
- [ InlineData ( false , true ) ]
73
- [ InlineData ( true , true ) ]
74
- public virtual async Task Intercept_to_change_query_expression ( bool async , bool inject )
58
+ [ MemberData ( nameof ( IsAsyncData ) ) ]
59
+ public virtual async Task Intercept_to_change_query_expression ( bool async )
75
60
{
76
- var ( context , interceptor ) = await CreateContextAsync < QueryChangingExpressionInterceptor > ( inject ) ;
61
+ var ( context , interceptor ) = await CreateContextAsync < QueryChangingExpressionInterceptor > ( inject : true ) ;
77
62
78
63
using var _ = context ;
79
64
80
65
var query = context . Set < Singularity > ( ) . Where ( e => e . Type == "Black Hole" ) ;
81
- var results = async ? await query . ToListAsync ( ) : query . ToList ( ) ;
66
+ var result = async ? await query . SingleAsync ( ) : query . Single ( ) ;
82
67
83
- Assert . Single ( results ) ;
84
- Assert . Equal ( "Bing Bang" , results [ 0 ] . Type ) ;
68
+ Assert . Equal ( "Bing Bang" , result . Type ) ;
85
69
86
70
AssertNormalOutcome ( context , interceptor ) ;
87
71
88
- Assert . Contains ( @".Where(e => e.Type == ""Bing Bang"")" , interceptor . QueryExpression ) ;
72
+ Assert . Contains ( """.Where(e => e.Type == "Bing Bang")""" , interceptor . QueryExpression ) ;
73
+ }
74
+
75
+ [ ConditionalTheory ]
76
+ [ MemberData ( nameof ( IsAsyncData ) ) ]
77
+ public virtual async Task Interceptor_does_not_leak_across_contexts ( bool async )
78
+ {
79
+ // Create one context with QueryChangingExpressionInterceptor, and another with TestQueryExpressionInterceptor (which is a no-op).
80
+ // Note that we don't use the regular suite infra for creating the contexts, as that creates separate service providers for each
81
+ // one, but that's exactly what we want to test here.
82
+ using var context1 = new UniverseContext (
83
+ Fixture . AddOptions (
84
+ Fixture . TestStore . AddProviderOptions (
85
+ new DbContextOptionsBuilder < DbContext > ( ) . AddInterceptors ( new QueryChangingExpressionInterceptor ( ) ) ) )
86
+ . Options ) ;
87
+ using var context2 = new UniverseContext (
88
+ Fixture . AddOptions (
89
+ Fixture . TestStore . AddProviderOptions (
90
+ new DbContextOptionsBuilder < DbContext > ( ) . AddInterceptors ( new TestQueryExpressionInterceptor ( ) ) ) )
91
+ . Options ) ;
92
+
93
+ var query1 = context1 . Set < Singularity > ( ) . Where ( e => e . Type == "Black Hole" ) ;
94
+ var result1 = async ? await query1 . SingleAsync ( ) : query1 . Single ( ) ;
95
+ Assert . Equal ( "Bing Bang" , result1 . Type ) ;
96
+
97
+ var query2 = context2 . Set < Singularity > ( ) . Where ( e => e . Type == "Black Hole" ) ;
98
+ var result2 = async ? await query2 . SingleAsync ( ) : query2 . Single ( ) ;
99
+ Assert . Equal ( "Black Hole" , result2 . Type ) ;
89
100
}
90
101
91
102
protected class QueryChangingExpressionInterceptor : TestQueryExpressionInterceptor
@@ -128,4 +139,6 @@ public virtual Expression QueryCompilationStarting(
128
139
return queryExpression ;
129
140
}
130
141
}
142
+
143
+ public static readonly IEnumerable < object [ ] > IsAsyncData = [ [ false ] , [ true ] ] ;
131
144
}
0 commit comments