14
14
*/
15
15
16
16
using System ;
17
+ using System . Linq ;
17
18
using System . Threading ;
18
19
using System . Threading . Tasks ;
19
20
using FluentAssertions ;
@@ -28,6 +29,64 @@ namespace MongoDB.Driver.Tests
28
29
public class IFindFluentExtensionsTests
29
30
{
30
31
// public methods
32
+ [ Theory ]
33
+ [ ParameterAttributeData ]
34
+ public void Any_should_add_projection_and_limit_and_return_expected_result (
35
+ [ Values ( 0 , 1 , 2 ) ] int count ,
36
+ [ Values ( false , true ) ] bool async )
37
+ {
38
+ var expectedResult = count > 0 ;
39
+
40
+ var mockSubject1 = new Mock < IFindFluent < Person , Person > > ( ) ;
41
+ var mockSubject2 = new Mock < IFindFluent < Person , BsonDocument > > ( ) ;
42
+ var mockSubject3 = new Mock < IFindFluent < Person , BsonDocument > > ( ) ;
43
+ var mockCursor = new Mock < IAsyncCursor < BsonDocument > > ( ) ;
44
+ var firstBatch = Enumerable . Range ( 0 , count ) . Select ( i => new BsonDocument ( "_id" , i ) ) . ToArray ( ) ;
45
+ var cancellationToken = new CancellationTokenSource ( ) . Token ;
46
+
47
+ mockSubject1 . Setup ( s => s . Project ( It . Is < BsonDocumentProjectionDefinition < Person , BsonDocument > > ( p => p . Document [ "_id" ] . AsInt32 == 1 ) ) ) . Returns ( mockSubject2 . Object ) ;
48
+ mockSubject2 . Setup ( s => s . Limit ( 1 ) ) . Returns ( mockSubject3 . Object ) ;
49
+ mockCursor . SetupGet ( c => c . Current ) . Returns ( firstBatch ) ;
50
+
51
+ bool result ;
52
+ if ( async)
53
+ {
54
+ mockSubject3 . Setup ( s => s . ToCursorAsync ( cancellationToken ) ) . Returns ( Task . FromResult ( mockCursor . Object ) ) ;
55
+ mockCursor. Setup ( c => c . MoveNextAsync ( cancellationToken ) ) . Returns ( Task . FromResult ( true ) ) ;
56
+
57
+ result = mockSubject1. Object . AnyAsync ( cancellationToken ) . GetAwaiter ( ) . GetResult ( ) ;
58
+ }
59
+ else
60
+ {
61
+ mockSubject3 . Setup ( s => s . ToCursor ( cancellationToken ) ) . Returns ( mockCursor . Object ) ;
62
+ mockCursor. Setup ( c => c . MoveNext ( cancellationToken ) ) . Returns ( true ) ;
63
+
64
+ result = mockSubject1. Object . Any ( cancellationToken ) ;
65
+ }
66
+
67
+ result. Should ( ) . Be ( expectedResult ) ;
68
+ }
69
+
70
+ [ Theory ]
71
+ [ ParameterAttributeData ]
72
+ public void Any_should_throw_when_find_is_null(
73
+ [ Values ( false , true ) ] bool async)
74
+ {
75
+ IFindFluent < Person , Person > subject = null ;
76
+
77
+ Action action;
78
+ if ( async)
79
+ {
80
+ action = ( ) => subject . AnyAsync ( ) . GetAwaiter ( ) . GetResult ( ) ;
81
+ }
82
+ else
83
+ {
84
+ action = ( ) => subject . Any ( ) ;
85
+ }
86
+
87
+ action . ShouldThrow < ArgumentNullException > ( ) . And . ParamName . Should ( ) . Be ( "find" ) ;
88
+ }
89
+
31
90
[ Theory ]
32
91
[ ParameterAttributeData ]
33
92
public void First_should_add_limit_and_call_ToCursor (
0 commit comments