PageRenderTime 176ms CodeModel.GetById 28ms RepoModel.GetById 11ms app.codeStats 0ms

/tests/MongoDB.Driver.Tests/IMongoCollectionExtensionsTests.cs

http://github.com/mongodb/mongo-csharp-driver
C# | 1214 lines | 1148 code | 44 blank | 22 comment | 110 complexity | 33cb6f4544fee56938bf10f8772baac7 MD5 | raw file
Possible License(s): Apache-2.0

Large files files are truncated, but you can click here to view the full file

  1. /* Copyright 2010-present MongoDB Inc.
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. using System;
  16. using System.Linq.Expressions;
  17. using System.Threading;
  18. using FluentAssertions;
  19. using MongoDB.Bson;
  20. using MongoDB.Bson.TestHelpers.XunitExtensions;
  21. using MongoDB.Driver.Linq;
  22. using MongoDB.Driver.Tests.Linq;
  23. using Moq;
  24. using Xunit;
  25. namespace MongoDB.Driver.Tests
  26. {
  27. public class IMongoCollectionExtensionsTests
  28. {
  29. [Theory]
  30. [ParameterAttributeData]
  31. public void Aggregate_should_return_expected_result(
  32. [Values(false, true)] bool usingSession)
  33. {
  34. var collection = CreateMockCollection().Object;
  35. var session = usingSession ? new Mock<IClientSessionHandle>().Object : null;
  36. var options = new AggregateOptions();
  37. IAggregateFluent<Person> result;
  38. if (usingSession)
  39. {
  40. result = collection.Aggregate(session, options);
  41. }
  42. else
  43. {
  44. result = collection.Aggregate(options);
  45. }
  46. var fluent = result.Should().BeOfType<CollectionAggregateFluent<Person, Person>>().Subject;
  47. fluent._collection().Should().BeSameAs(collection);
  48. fluent._options().Should().BeSameAs(options);
  49. fluent._pipeline().Should().BeOfType<EmptyPipelineDefinition<Person>>();
  50. fluent._session().Should().BeSameAs(session);
  51. }
  52. [Fact]
  53. public void AsQueryable_should_return_expected_result()
  54. {
  55. var collection = CreateMockCollection().Object;
  56. var options = new AggregateOptions();
  57. var result = collection.AsQueryable(options);
  58. var queryable = result.Should().BeOfType<MongoQueryableImpl<Person, Person>>().Subject;
  59. var provider = queryable.Provider.Should().BeOfType<MongoQueryProviderImpl<Person>>().Subject;
  60. provider._collection().Should().BeSameAs(collection);
  61. provider._options().Should().BeSameAs(options);
  62. }
  63. [Theory]
  64. [ParameterAttributeData]
  65. public void Count_should_call_collection_with_expected_arguments(
  66. [Values(false, true)] bool usingSession,
  67. [Values(false, true)] bool async)
  68. {
  69. var mockCollection = CreateMockCollection();
  70. var collection = mockCollection.Object;
  71. var session = new Mock<IClientSessionHandle>().Object;
  72. var filterExpression = (Expression<Func<Person, bool>>)(x => x.FirstName == "Jack");
  73. var options = new CountOptions();
  74. var cancellationToken = new CancellationTokenSource().Token;
  75. if (usingSession)
  76. {
  77. if (async)
  78. {
  79. #pragma warning disable 618
  80. IMongoCollectionExtensions.CountAsync(collection, session, filterExpression, options, cancellationToken);
  81. mockCollection.Verify(s => s.CountAsync(session, It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  82. #pragma warning restore
  83. }
  84. else
  85. {
  86. #pragma warning disable 618
  87. IMongoCollectionExtensions.Count(collection, session, filterExpression, options, cancellationToken);
  88. mockCollection.Verify(s => s.Count(session, It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  89. #pragma warning restore
  90. }
  91. }
  92. else
  93. {
  94. if (async)
  95. {
  96. #pragma warning disable 618
  97. IMongoCollectionExtensions.CountAsync(collection, filterExpression, options, cancellationToken);
  98. mockCollection.Verify(s => s.CountAsync(It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  99. #pragma warning restore
  100. }
  101. else
  102. {
  103. #pragma warning disable 618
  104. IMongoCollectionExtensions.Count(collection, filterExpression, options, cancellationToken);
  105. mockCollection.Verify(s => s.Count(It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  106. #pragma warning restore
  107. }
  108. }
  109. }
  110. [Theory]
  111. [ParameterAttributeData]
  112. public void CountDocuments_should_call_collection_with_expected_arguments(
  113. [Values(false, true)] bool usingSession,
  114. [Values(false, true)] bool async)
  115. {
  116. var mockCollection = CreateMockCollection();
  117. var collection = mockCollection.Object;
  118. var session = new Mock<IClientSessionHandle>().Object;
  119. var filterExpression = (Expression<Func<Person, bool>>)(x => x.FirstName == "Jack");
  120. var options = new CountOptions();
  121. var cancellationToken = new CancellationTokenSource().Token;
  122. if (usingSession)
  123. {
  124. if (async)
  125. {
  126. IMongoCollectionExtensions.CountDocumentsAsync(collection, session, filterExpression, options, cancellationToken);
  127. mockCollection.Verify(s => s.CountDocumentsAsync(session, It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  128. }
  129. else
  130. {
  131. IMongoCollectionExtensions.CountDocuments(collection, session, filterExpression, options, cancellationToken);
  132. mockCollection.Verify(s => s.CountDocuments(session, It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  133. }
  134. }
  135. else
  136. {
  137. if (async)
  138. {
  139. IMongoCollectionExtensions.CountDocumentsAsync(collection, filterExpression, options, cancellationToken);
  140. mockCollection.Verify(s => s.CountDocumentsAsync(It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  141. }
  142. else
  143. {
  144. IMongoCollectionExtensions.CountDocuments(collection, filterExpression, options, cancellationToken);
  145. mockCollection.Verify(s => s.CountDocuments(It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  146. }
  147. }
  148. }
  149. [Theory]
  150. [ParameterAttributeData]
  151. public void DeleteMany_should_call_collection_with_expected_arguments(
  152. [Values(false, true)] bool usingSession,
  153. [Values(false, true)] bool usingOptions,
  154. [Values(false, true)] bool async)
  155. {
  156. var mockCollection = CreateMockCollection();
  157. var collection = mockCollection.Object;
  158. var session = new Mock<IClientSessionHandle>().Object;
  159. var filterExpression = (Expression<Func<Person, bool>>)(x => x.FirstName == "Jack");
  160. var options = new DeleteOptions();
  161. var cancellationToken = new CancellationTokenSource().Token;
  162. if (usingSession)
  163. {
  164. if (async)
  165. {
  166. IMongoCollectionExtensions.DeleteManyAsync(collection, session, filterExpression, options, cancellationToken);
  167. mockCollection.Verify(s => s.DeleteManyAsync(session, It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  168. }
  169. else
  170. {
  171. IMongoCollectionExtensions.DeleteMany(collection, session, filterExpression, options, cancellationToken);
  172. mockCollection.Verify(s => s.DeleteMany(session, It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  173. }
  174. }
  175. else
  176. {
  177. if (usingOptions)
  178. {
  179. if (async)
  180. {
  181. IMongoCollectionExtensions.DeleteManyAsync(collection, filterExpression, options, cancellationToken);
  182. mockCollection.Verify(s => s.DeleteManyAsync(It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  183. }
  184. else
  185. {
  186. IMongoCollectionExtensions.DeleteMany(collection, filterExpression, options, cancellationToken);
  187. mockCollection.Verify(s => s.DeleteMany(It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  188. }
  189. }
  190. else
  191. {
  192. if (async)
  193. {
  194. IMongoCollectionExtensions.DeleteManyAsync(collection, filterExpression, cancellationToken);
  195. mockCollection.Verify(s => s.DeleteManyAsync(It.IsAny<ExpressionFilterDefinition<Person>>(), cancellationToken), Times.Once);
  196. }
  197. else
  198. {
  199. IMongoCollectionExtensions.DeleteMany(collection, filterExpression, cancellationToken);
  200. mockCollection.Verify(s => s.DeleteMany(It.IsAny<ExpressionFilterDefinition<Person>>(), cancellationToken), Times.Once);
  201. }
  202. }
  203. }
  204. }
  205. [Theory]
  206. [ParameterAttributeData]
  207. public void DeleteOne_should_call_collection_with_expected_arguments(
  208. [Values(false, true)] bool usingSession,
  209. [Values(false, true)] bool usingOptions,
  210. [Values(false, true)] bool async)
  211. {
  212. var mockCollection = CreateMockCollection();
  213. var collection = mockCollection.Object;
  214. var session = new Mock<IClientSessionHandle>().Object;
  215. var filterExpression = (Expression<Func<Person, bool>>)(x => x.FirstName == "Jack");
  216. var options = new DeleteOptions();
  217. var cancellationToken = new CancellationTokenSource().Token;
  218. if (usingSession)
  219. {
  220. if (async)
  221. {
  222. IMongoCollectionExtensions.DeleteOneAsync(collection, session, filterExpression, options, cancellationToken);
  223. mockCollection.Verify(s => s.DeleteOneAsync(session, It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  224. }
  225. else
  226. {
  227. IMongoCollectionExtensions.DeleteOne(collection, session, filterExpression, options, cancellationToken);
  228. mockCollection.Verify(s => s.DeleteOne(session, It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  229. }
  230. }
  231. else
  232. {
  233. if (usingOptions)
  234. {
  235. if (async)
  236. {
  237. IMongoCollectionExtensions.DeleteOneAsync(collection, filterExpression, options, cancellationToken);
  238. mockCollection.Verify(s => s.DeleteOneAsync(It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  239. }
  240. else
  241. {
  242. IMongoCollectionExtensions.DeleteOne(collection, filterExpression, options, cancellationToken);
  243. mockCollection.Verify(s => s.DeleteOne(It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  244. }
  245. }
  246. else
  247. {
  248. if (async)
  249. {
  250. IMongoCollectionExtensions.DeleteOneAsync(collection, filterExpression, cancellationToken);
  251. mockCollection.Verify(s => s.DeleteOneAsync(It.IsAny<ExpressionFilterDefinition<Person>>(), cancellationToken), Times.Once);
  252. }
  253. else
  254. {
  255. IMongoCollectionExtensions.DeleteOne(collection, filterExpression, cancellationToken);
  256. mockCollection.Verify(s => s.DeleteOne(It.IsAny<ExpressionFilterDefinition<Person>>(), cancellationToken), Times.Once);
  257. }
  258. }
  259. }
  260. }
  261. [Theory]
  262. [ParameterAttributeData]
  263. public void Distinct_should_call_collection_with_expected_arguments(
  264. [Values(false, true)] bool usingSession,
  265. [Values(false, true)] bool usingFieldExpression,
  266. [Values(false, true)] bool usingFilterExpression,
  267. [Values(false, true)] bool async)
  268. {
  269. var mockCollection = CreateMockCollection();
  270. var collection = mockCollection.Object;
  271. var session = new Mock<IClientSessionHandle>().Object;
  272. var fieldDefinition = (FieldDefinition<Person, string>)"LastName";
  273. var fieldExpression = (Expression<Func<Person, string>>)(x => x.LastName);
  274. var filterDefinition = Builders<Person>.Filter.Eq(x => x.FirstName, "Jack");
  275. var filterExpression = (Expression<Func<Person, bool>>)(x => x.FirstName == "Jack");
  276. var options = new DistinctOptions();
  277. var cancellationToken = new CancellationTokenSource().Token;
  278. if (usingSession)
  279. {
  280. if (usingFieldExpression)
  281. {
  282. if (usingFilterExpression)
  283. {
  284. if (async)
  285. {
  286. collection.DistinctAsync(session, fieldExpression, filterExpression, options, cancellationToken);
  287. mockCollection.Verify(
  288. s => s.DistinctAsync(session, It.IsAny<ExpressionFieldDefinition<Person, string>>(), It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken),
  289. Times.Once);
  290. }
  291. else
  292. {
  293. collection.Distinct(session, fieldExpression, filterExpression, options, cancellationToken);
  294. mockCollection.Verify(
  295. s => s.Distinct(session, It.IsAny<ExpressionFieldDefinition<Person, string>>(), It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken),
  296. Times.Once);
  297. }
  298. }
  299. else
  300. {
  301. if (async)
  302. {
  303. collection.DistinctAsync(session, fieldExpression, filterDefinition, options, cancellationToken);
  304. mockCollection.Verify(
  305. s => s.DistinctAsync(session, It.IsAny<ExpressionFieldDefinition<Person, string>>(), filterDefinition, options, cancellationToken),
  306. Times.Once);
  307. }
  308. else
  309. {
  310. collection.Distinct(session, fieldExpression, filterDefinition, options, cancellationToken);
  311. mockCollection.Verify(
  312. s => s.Distinct(session, It.IsAny<ExpressionFieldDefinition<Person, string>>(), filterDefinition, options, cancellationToken),
  313. Times.Once);
  314. }
  315. }
  316. }
  317. else
  318. {
  319. if (usingFilterExpression)
  320. {
  321. if (async)
  322. {
  323. IMongoCollectionExtensions.DistinctAsync(collection, session, fieldDefinition, filterExpression, options, cancellationToken);
  324. mockCollection.Verify(
  325. s => s.DistinctAsync(session, fieldDefinition, It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken),
  326. Times.Once);
  327. }
  328. else
  329. {
  330. IMongoCollectionExtensions.Distinct(collection, session, fieldDefinition, filterExpression, options, cancellationToken);
  331. mockCollection.Verify(
  332. s => s.Distinct(session, fieldDefinition, It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken),
  333. Times.Once);
  334. }
  335. }
  336. else
  337. {
  338. // no extensions methods for these combinations
  339. }
  340. }
  341. }
  342. else
  343. {
  344. if (usingFieldExpression)
  345. {
  346. if (usingFilterExpression)
  347. {
  348. if (async)
  349. {
  350. collection.DistinctAsync(fieldExpression, filterExpression, options, cancellationToken);
  351. mockCollection.Verify(
  352. s => s.DistinctAsync(It.IsAny<ExpressionFieldDefinition<Person, string>>(), It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken),
  353. Times.Once);
  354. }
  355. else
  356. {
  357. collection.Distinct(fieldExpression, filterExpression, options, cancellationToken);
  358. mockCollection.Verify(
  359. s => s.Distinct(It.IsAny<ExpressionFieldDefinition<Person, string>>(), It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken),
  360. Times.Once);
  361. }
  362. }
  363. else
  364. {
  365. if (async)
  366. {
  367. collection.DistinctAsync(fieldExpression, filterDefinition, options, cancellationToken);
  368. mockCollection.Verify(
  369. s => s.DistinctAsync(It.IsAny<ExpressionFieldDefinition<Person, string>>(), filterDefinition, options, cancellationToken),
  370. Times.Once);
  371. }
  372. else
  373. {
  374. collection.Distinct(fieldExpression, filterDefinition, options, cancellationToken);
  375. mockCollection.Verify(
  376. s => s.Distinct(It.IsAny<ExpressionFieldDefinition<Person, string>>(), filterDefinition, options, cancellationToken),
  377. Times.Once);
  378. }
  379. }
  380. }
  381. else
  382. {
  383. if (usingFilterExpression)
  384. {
  385. if (async)
  386. {
  387. IMongoCollectionExtensions.DistinctAsync(collection, fieldDefinition, filterExpression, options, cancellationToken);
  388. mockCollection.Verify(
  389. s => s.DistinctAsync(fieldDefinition, It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken),
  390. Times.Once);
  391. }
  392. else
  393. {
  394. IMongoCollectionExtensions.Distinct(collection, fieldDefinition, filterExpression, options, cancellationToken);
  395. mockCollection.Verify(
  396. s => s.Distinct(fieldDefinition, It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken),
  397. Times.Once);
  398. }
  399. }
  400. else
  401. {
  402. // no extension methods for these combinations
  403. }
  404. }
  405. }
  406. }
  407. [Theory]
  408. [ParameterAttributeData]
  409. public void Find_should_return_expected_result(
  410. [Values(false, true)] bool usingSession,
  411. [Values(false, true)] bool usingFilterExpression)
  412. {
  413. var mockCollection = CreateMockCollection();
  414. var collection = mockCollection.Object;
  415. var session = usingSession ? new Mock<IClientSessionHandle>().Object : null;
  416. var filterDefinition = Builders<Person>.Filter.Eq("FirstName", "Jack");
  417. var filterExpression = (Expression<Func<Person, bool>>)(x => x.FirstName == "Jack");
  418. var options = new FindOptions
  419. {
  420. AllowDiskUse = true,
  421. AllowPartialResults = true,
  422. BatchSize = 123,
  423. Collation = new Collation("en-us"),
  424. Comment = "comment",
  425. CursorType = CursorType.Tailable,
  426. MaxAwaitTime = TimeSpan.FromSeconds(1),
  427. MaxTime = TimeSpan.FromSeconds(2),
  428. #pragma warning disable 618
  429. Modifiers = new BsonDocument("modifier", 1),
  430. #pragma warning restore 618
  431. NoCursorTimeout = true,
  432. #pragma warning disable 618
  433. OplogReplay = true
  434. #pragma warning restore 618
  435. };
  436. FindFluent<Person, Person> fluent;
  437. if (usingSession)
  438. {
  439. if (usingFilterExpression)
  440. {
  441. var result = collection.Find(session, filterExpression, options);
  442. fluent = result.Should().BeOfType<FindFluent<Person, Person>>().Subject;
  443. fluent._filter().Should().BeOfType<ExpressionFilterDefinition<Person>>();
  444. }
  445. else
  446. {
  447. var result = collection.Find(session, filterDefinition, options);
  448. fluent = result.Should().BeOfType<FindFluent<Person, Person>>().Subject;
  449. fluent._filter().Should().BeSameAs(filterDefinition);
  450. }
  451. }
  452. else
  453. {
  454. if (usingFilterExpression)
  455. {
  456. var result = collection.Find(filterExpression, options);
  457. fluent = result.Should().BeOfType<FindFluent<Person, Person>>().Subject;
  458. fluent._filter().Should().BeOfType<ExpressionFilterDefinition<Person>>();
  459. }
  460. else
  461. {
  462. var result = collection.Find(filterDefinition, options);
  463. fluent = result.Should().BeOfType<FindFluent<Person, Person>>().Subject;
  464. fluent._filter().Should().BeSameAs(filterDefinition);
  465. }
  466. }
  467. fluent._collection().Should().BeSameAs(collection);
  468. fluent._session().Should().BeSameAs(session);
  469. var actualOptions = fluent._options();
  470. actualOptions.AllowDiskUse.Should().Be(options.AllowDiskUse);
  471. actualOptions.AllowPartialResults.Should().Be(options.AllowPartialResults);
  472. actualOptions.BatchSize.Should().Be(options.BatchSize);
  473. actualOptions.Collation.Should().Be(options.Collation);
  474. actualOptions.Comment.Should().Be(options.Comment);
  475. actualOptions.CursorType.Should().Be(options.CursorType);
  476. actualOptions.MaxAwaitTime.Should().Be(options.MaxAwaitTime);
  477. actualOptions.MaxTime.Should().Be(options.MaxTime);
  478. #pragma warning disable 618
  479. actualOptions.Modifiers.Should().Be(options.Modifiers);
  480. #pragma warning restore 618
  481. actualOptions.NoCursorTimeout.Should().Be(options.NoCursorTimeout);
  482. #pragma warning disable 618
  483. actualOptions.OplogReplay.Should().Be(options.OplogReplay);
  484. #pragma warning restore 618
  485. }
  486. [Theory]
  487. [ParameterAttributeData]
  488. public void FindSync_should_call_collection_FindSync_with_expected_arguments(
  489. [Values(false, true)] bool usingSession,
  490. [Values(false, true)] bool usingFilterExpression,
  491. [Values(false, true)] bool async)
  492. {
  493. var mockCollection = CreateMockCollection();
  494. var collection = mockCollection.Object;
  495. var session = new Mock<IClientSessionHandle>().Object;
  496. var filterDefinition = Builders<Person>.Filter.Eq("FirstName", "Jack");
  497. var filterExpression = (Expression<Func<Person, bool>>)(x => x.FirstName == "Jack");
  498. var options = new FindOptions<Person>(); // no projection
  499. var cancellationToken = new CancellationTokenSource().Token;
  500. if (usingSession)
  501. {
  502. if (usingFilterExpression)
  503. {
  504. if (async)
  505. {
  506. IMongoCollectionExtensions.FindAsync(collection, session, filterExpression, options, cancellationToken);
  507. mockCollection.Verify(m => m.FindAsync(session, It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  508. }
  509. else
  510. {
  511. IMongoCollectionExtensions.FindSync(collection, session, filterExpression, options, cancellationToken);
  512. mockCollection.Verify(m => m.FindSync(session, It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  513. }
  514. }
  515. else
  516. {
  517. if (async)
  518. {
  519. IMongoCollectionExtensions.FindAsync(collection, session, filterDefinition, options, cancellationToken);
  520. mockCollection.Verify(m => m.FindAsync(session, filterDefinition, options, cancellationToken), Times.Once);
  521. }
  522. else
  523. {
  524. IMongoCollectionExtensions.FindSync(collection, session, filterDefinition, options, cancellationToken);
  525. mockCollection.Verify(m => m.FindSync(session, filterDefinition, options, cancellationToken), Times.Once);
  526. }
  527. }
  528. }
  529. else
  530. {
  531. if (usingFilterExpression)
  532. {
  533. if (async)
  534. {
  535. IMongoCollectionExtensions.FindAsync(collection, filterExpression, options, cancellationToken);
  536. mockCollection.Verify(m => m.FindAsync(It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  537. }
  538. else
  539. {
  540. IMongoCollectionExtensions.FindSync(collection, filterExpression, options, cancellationToken);
  541. mockCollection.Verify(m => m.FindSync(It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  542. }
  543. }
  544. else
  545. {
  546. if (async)
  547. {
  548. IMongoCollectionExtensions.FindAsync(collection, filterDefinition, options, cancellationToken);
  549. mockCollection.Verify(m => m.FindAsync(filterDefinition, options, cancellationToken), Times.Once);
  550. }
  551. else
  552. {
  553. IMongoCollectionExtensions.FindSync(collection, filterDefinition, options, cancellationToken);
  554. mockCollection.Verify(m => m.FindSync(filterDefinition, options, cancellationToken), Times.Once);
  555. }
  556. }
  557. }
  558. }
  559. [Theory]
  560. [ParameterAttributeData]
  561. public void FindOneAndDelete_should_call_collection_with_expected_arguments(
  562. [Values(false, true)] bool usingSession,
  563. [Values(false, true)] bool usingFilterExpression,
  564. [Values(false, true)] bool usingProjection,
  565. [Values(false, true)] bool async)
  566. {
  567. var mockCollection = CreateMockCollection();
  568. var collection = mockCollection.Object;
  569. var session = new Mock<IClientSessionHandle>().Object;
  570. var filterDefinition = Builders<Person>.Filter.Eq("LastName", "Jack");
  571. var filterExpression = (Expression<Func<Person, bool>>)(x => x.FirstName == "Jack");
  572. var options = new FindOneAndDeleteOptions<Person>();
  573. var optionsWithProjection = new FindOneAndDeleteOptions<Person, BsonDocument>();
  574. var cancellationToken = new CancellationTokenSource().Token;
  575. if (usingSession)
  576. {
  577. if (usingFilterExpression)
  578. {
  579. if (usingProjection)
  580. {
  581. if (async)
  582. {
  583. IMongoCollectionExtensions.FindOneAndDeleteAsync(collection, session, filterExpression, optionsWithProjection, cancellationToken);
  584. mockCollection.Verify(m => m.FindOneAndDeleteAsync(session, It.IsAny<ExpressionFilterDefinition<Person>>(), optionsWithProjection, cancellationToken), Times.Once);
  585. }
  586. else
  587. {
  588. IMongoCollectionExtensions.FindOneAndDelete(collection, session, filterExpression, optionsWithProjection, cancellationToken);
  589. mockCollection.Verify(m => m.FindOneAndDelete(session, It.IsAny<ExpressionFilterDefinition<Person>>(), optionsWithProjection, cancellationToken), Times.Once);
  590. }
  591. }
  592. else
  593. {
  594. if (async)
  595. {
  596. IMongoCollectionExtensions.FindOneAndDeleteAsync<Person>(collection, session, filterExpression, options, cancellationToken);
  597. mockCollection.Verify(m => m.FindOneAndDeleteAsync(session, It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  598. }
  599. else
  600. {
  601. IMongoCollectionExtensions.FindOneAndDelete<Person>(collection, session, filterExpression, options, cancellationToken);
  602. mockCollection.Verify(m => m.FindOneAndDelete(session, It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  603. }
  604. }
  605. }
  606. else
  607. {
  608. if (usingProjection)
  609. {
  610. // no extension methods for these combinations
  611. }
  612. else
  613. {
  614. if (async)
  615. {
  616. IMongoCollectionExtensions.FindOneAndDeleteAsync(collection, session, filterDefinition, options, cancellationToken);
  617. mockCollection.Verify(m => m.FindOneAndDeleteAsync(session, filterDefinition, options, cancellationToken), Times.Once);
  618. }
  619. else
  620. {
  621. IMongoCollectionExtensions.FindOneAndDelete(collection, session, filterDefinition, options, cancellationToken);
  622. mockCollection.Verify(m => m.FindOneAndDelete(session, filterDefinition, options, cancellationToken), Times.Once);
  623. }
  624. }
  625. }
  626. }
  627. else
  628. {
  629. if (usingFilterExpression)
  630. {
  631. if (usingProjection)
  632. {
  633. if (async)
  634. {
  635. IMongoCollectionExtensions.FindOneAndDeleteAsync(collection, filterExpression, optionsWithProjection, cancellationToken);
  636. mockCollection.Verify(m => m.FindOneAndDeleteAsync(It.IsAny<ExpressionFilterDefinition<Person>>(), optionsWithProjection, cancellationToken), Times.Once);
  637. }
  638. else
  639. {
  640. IMongoCollectionExtensions.FindOneAndDelete(collection, filterExpression, optionsWithProjection, cancellationToken);
  641. mockCollection.Verify(m => m.FindOneAndDelete(It.IsAny<ExpressionFilterDefinition<Person>>(), optionsWithProjection, cancellationToken), Times.Once);
  642. }
  643. }
  644. else
  645. {
  646. if (async)
  647. {
  648. IMongoCollectionExtensions.FindOneAndDeleteAsync<Person>(collection, filterExpression, options, cancellationToken);
  649. mockCollection.Verify(m => m.FindOneAndDeleteAsync(It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  650. }
  651. else
  652. {
  653. IMongoCollectionExtensions.FindOneAndDelete<Person>(collection, filterExpression, options, cancellationToken);
  654. mockCollection.Verify(m => m.FindOneAndDelete(It.IsAny<ExpressionFilterDefinition<Person>>(), options, cancellationToken), Times.Once);
  655. }
  656. }
  657. }
  658. else
  659. {
  660. if (usingProjection)
  661. {
  662. // no extension methods for these combinations
  663. }
  664. else
  665. {
  666. if (async)
  667. {
  668. IMongoCollectionExtensions.FindOneAndDeleteAsync(collection, filterDefinition, options, cancellationToken);
  669. mockCollection.Verify(m => m.FindOneAndDeleteAsync(filterDefinition, options, cancellationToken), Times.Once);
  670. }
  671. else
  672. {
  673. IMongoCollectionExtensions.FindOneAndDelete(collection, filterDefinition, options, cancellationToken);
  674. mockCollection.Verify(m => m.FindOneAndDelete(filterDefinition, options, cancellationToken), Times.Once);
  675. }
  676. }
  677. }
  678. }
  679. }
  680. [Theory]
  681. [ParameterAttributeData]
  682. public void FindOneAndReplace_should_call_collection_with_expected_arguments(
  683. [Values(false, true)] bool usingSession,
  684. [Values(false, true)] bool usingFilterExpression,
  685. [Values(false, true)] bool usingProjection,
  686. [Values(false, true)] bool async)
  687. {
  688. var mockCollection = CreateMockCollection();
  689. var collection = mockCollection.Object;
  690. var session = new Mock<IClientSessionHandle>().Object;
  691. var filterDefinition = Builders<Person>.Filter.Eq("FirstName", "Jack");
  692. var filterExpression = (Expression<Func<Person, bool>>)(x => x.FirstName == "Jack");
  693. var replacement = new Person();
  694. var options = new FindOneAndReplaceOptions<Person>();
  695. var optionsWithProjection = new FindOneAndReplaceOptions<Person, BsonDocument>();
  696. var cancellationToken = new CancellationTokenSource().Token;
  697. if (usingSession)
  698. {
  699. if (usingFilterExpression)
  700. {
  701. if (usingProjection)
  702. {
  703. if (async)
  704. {
  705. IMongoCollectionExtensions.FindOneAndReplaceAsync(collection, session, filterExpression, replacement, optionsWithProjection, cancellationToken);
  706. mockCollection.Verify(m => m.FindOneAndReplaceAsync(session, It.IsAny<ExpressionFilterDefinition<Person>>(), replacement, optionsWithProjection, cancellationToken), Times.Once);
  707. }
  708. else
  709. {
  710. IMongoCollectionExtensions.FindOneAndReplace(collection, session, filterExpression, replacement, optionsWithProjection, cancellationToken);
  711. mockCollection.Verify(m => m.FindOneAndReplace(session, It.IsAny<ExpressionFilterDefinition<Person>>(), replacement, optionsWithProjection, cancellationToken), Times.Once);
  712. }
  713. }
  714. else
  715. {
  716. if (async)
  717. {
  718. IMongoCollectionExtensions.FindOneAndReplaceAsync(collection, session, filterExpression, replacement, options, cancellationToken);
  719. mockCollection.Verify(m => m.FindOneAndReplaceAsync(session, It.IsAny<ExpressionFilterDefinition<Person>>(), replacement, options, cancellationToken), Times.Once);
  720. }
  721. else
  722. {
  723. IMongoCollectionExtensions.FindOneAndReplace<Person>(collection, session, filterExpression, replacement, options, cancellationToken);
  724. mockCollection.Verify(m => m.FindOneAndReplace(session, It.IsAny<ExpressionFilterDefinition<Person>>(), replacement, options, cancellationToken), Times.Once);
  725. }
  726. }
  727. }
  728. else
  729. {
  730. if (usingProjection)
  731. {
  732. // no extension methods for these combinations
  733. }
  734. else
  735. {
  736. if (async)
  737. {
  738. IMongoCollectionExtensions.FindOneAndReplaceAsync(collection, session, filterDefinition, replacement, options, cancellationToken);
  739. mockCollection.Verify(m => m.FindOneAndReplaceAsync(session, filterDefinition, replacement, options, cancellationToken), Times.Once);
  740. }
  741. else
  742. {
  743. IMongoCollectionExtensions.FindOneAndReplace(collection, session, filterDefinition, replacement, options, cancellationToken);
  744. mockCollection.Verify(m => m.FindOneAndReplace(session, filterDefinition, replacement, options, cancellationToken), Times.Once);
  745. }
  746. }
  747. }
  748. }
  749. else
  750. {
  751. if (usingFilterExpression)
  752. {
  753. if (usingProjection)
  754. {
  755. if (async)
  756. {
  757. IMongoCollectionExtensions.FindOneAndReplaceAsync(collection, filterExpression, replacement, optionsWithProjection, cancellationToken);
  758. mockCollection.Verify(m => m.FindOneAndReplaceAsync(It.IsAny<ExpressionFilterDefinition<Person>>(), replacement, optionsWithProjection, cancellationToken), Times.Once);
  759. }
  760. else
  761. {
  762. IMongoCollectionExtensions.FindOneAndReplace(collection, filterExpression, replacement, optionsWithProjection, cancellationToken);
  763. mockCollection.Verify(m => m.FindOneAndReplace(It.IsAny<ExpressionFilterDefinition<Person>>(), replacement, optionsWithProjection, cancellationToken), Times.Once);
  764. }
  765. }
  766. else
  767. {
  768. if (async)
  769. {
  770. IMongoCollectionExtensions.FindOneAndReplaceAsync<Person>(collection, filterExpression, replacement, options, cancellationToken);
  771. mockCollection.Verify(m => m.FindOneAndReplaceAsync(It.IsAny<ExpressionFilterDefinition<Person>>(), replacement, options, cancellationToken), Times.Once);
  772. }
  773. else
  774. {
  775. IMongoCollectionExtensions.FindOneAndReplace<Person>(collection, filterExpression, replacement, options, cancellationToken);
  776. mockCollection.Verify(m => m.FindOneAndReplace(It.IsAny<ExpressionFilterDefinition<Person>>(), replacement, options, cancellationToken), Times.Once);
  777. }
  778. }
  779. }
  780. else
  781. {
  782. if (usingProjection)
  783. {
  784. // no extension methods for these combinations
  785. }
  786. else
  787. {
  788. if (async)
  789. {
  790. IMongoCollectionExtensions.FindOneAndReplaceAsync(collection, filterDefinition, replacement, options, cancellationToken);
  791. mockCollection.Verify(m => m.FindOneAndReplaceAsync(filterDefinition, replacement, options, cancellationToken), Times.Once);
  792. }
  793. else
  794. {
  795. IMongoCollectionExtensions.FindOneAndReplace(collection, filterDefinition, replacement, options, cancellationToken);
  796. mockCollection.Verify(m => m.FindOneAndReplace(filterDefinition, replacement, options, cancellationToken), Times.Once);
  797. }
  798. }
  799. }
  800. }
  801. }
  802. [Theory]
  803. [ParameterAttributeData]
  804. public void FindOneAndUpdate_should_call_collection_with_expected_arguments(
  805. [Values(false, true)] bool usingSession,
  806. [Values(false, true)] bool usingProjection,
  807. [Values(false, true)] bool usingFilterExpression,
  808. [Values(false, true)] bool async)
  809. {
  810. var mockCollection = CreateMockCollection();
  811. var collection = mockCollection.Object;
  812. var session = new Mock<IClientSessionHandle>().Object;
  813. var filterDefinition = Builders<Person>.Filter.Eq("FirstName", "Jack");
  814. var filterExpression = (Expression<Func<Person, bool>>)(x => x.FirstName == "Jack");
  815. var update = Builders<Person>.Update.Set("FirstName", "John");
  816. var options = new FindOneAndUpdateOptions<Person>();
  817. var optionsWithProjection = new FindOneAndUpdateOptions<Person, BsonDocument>();
  818. var cancellationToken = new CancellationTokenSource().Token;
  819. if (usingSession)
  820. {
  821. if (usingProjection)
  822. {
  823. if (usingFilterExpression)
  824. {
  825. if (async)
  826. {
  827. IMongoCollectionExtensions.FindOneAndUpdateAsync(collection, session, filterExpression, update, optionsWithProjection, cancellationToken);
  828. mockCollection.Verify(m => m.FindOneAndUpdateAsync(session, It.IsAny<ExpressionFilterDefinition<Person>>(), update, optionsWithProjection, cancellationToken), Times.Once);
  829. }
  830. else
  831. {
  832. IMongoCollectionExtensions.FindOneAndUpdate(collection, session, filterExpression, update, optionsWithProjection, cancellationToken);
  833. mockCollection.Verify(m => m.FindOneAndUpdate(session, It.IsAny<ExpressionFilterDefinition<Person>>(), update, optionsWithProjection, cancellationToken), Times.Once);
  834. }
  835. }
  836. else
  837. {
  838. // no extension methods for these combinations
  839. }
  840. }
  841. else
  842. {
  843. if (usingFilterExpression)
  844. {
  845. if (async)
  846. {
  847. IMongoCollectionExtensions.FindOneAndUpdateAsync<Person>(collection, session, filterExpression, update, options, cancellationToken);
  848. mockCollection.Verify(m => m.FindOneAndUpdateAsync(session, It.IsAny<ExpressionFilterDefinition<Person>>(), update, options, cancellationToken), Times.Once);
  849. }
  850. else
  851. {
  852. IMongoCollectionExtensions.FindOneAndUpdate<Person>(collection, session, filterExpression, update, options, cancellationToken);
  853. mockCollection.Verify(m => m.FindOneAndUpdate(session, It.IsAny<ExpressionFilterDefinition<Person>>(), update, options, cancellationToken), Times.Once);
  854. }
  855. }
  856. else
  857. {
  858. if (async)
  859. {
  860. IMongoCollectionExtensions.FindOneAndUpdateAsync(collection, session, filterDefinition, update, options, cancellationToken);
  861. mockCollection.Verify(m => m.FindOneAndUpdateAsync(session, filterDefinition, update, options, cancellationToken), Times.Once);
  862. }
  863. else
  864. {
  865. IMongoCollectionExtensions.FindOneAndUpdate(collection, session, filterDefinition, update, options, cancellationToken);
  866. mockCollection.Verify(m => m.FindOneAndUpdate(session, filterDefinition, update, options, cancellationToken), Times.Once);
  867. }
  868. }
  869. }
  870. }
  871. else
  872. {
  873. if (usingProjection)
  874. {
  875. if (usingFilterExpression)
  876. {
  877. if (async)
  878. {
  879. IMongoCollectionExtensions.FindOneAndUpdateAsync(collection, filterExpression, update, optionsWithProjection, cancellationToken);
  880. mockCollection.Verify(m => m.FindOneAndUpdateAsync(It.IsAny<ExpressionFilterDefinition<Person>>(), update, optionsWithProjection, cancellationToken), Times.Once);
  881. }
  882. else
  883. {
  884. IMongoCollectionExtensions.FindOneAndUpdate(collection, filterExpression, update, optionsWithProjection, cancellationToken);
  885. mockCollection.Verify(m => m.FindOneAndUpdate(It.IsAny<ExpressionFilterDefinition<Person>>(), update, optionsWithProjection, cancellationToken), Times.Once);
  886. }
  887. }
  888. else
  889. {
  890. // no extension methods for these combinations
  891. }
  892. }
  893. else
  894. {
  895. if (usingFilterExpression)
  896. {
  897. if (async)
  898. {
  899. IMongoCollectionExtensions.FindOneAndUpdateAsync<Person>(collection, filterExpression, update, options, cancellationToken);
  900. mockCollection.Verify(m => m.FindOneAndUpdateAsync(It.IsAny<ExpressionFilterDefinition<Person>>(), update, options, cancellationToken), Times.Once);
  901. }
  902. else
  903. {
  904. IMongoCollectionExtensions.FindOneAndUpdate<Person>(collection, filterExpression, update, options, cancellationToken);
  905. mockCollection.Verify(m => m.FindOneAndUpdate(It.IsAny<ExpressionFilterDefinition<Person>>(), update, options, cancellationToken), Times.Once);
  906. }
  907. }
  908. else
  909. {
  910. if (async)
  911. {
  912. IMongoCollectionExtensions.FindOneAndUpdateAsync(collection, filterDefinition, update, options, cancellationToken);
  913. mockCollection.Verify(m => m.FindOneAndUpdateAsync(filterDefinition, update, options, cancellationToken), Times.Once);
  914. }
  915. else
  916. {
  917. IMongoCollectionExtensions.FindOneAndUpdate(collection, filterDefinition, update, options, cancellationToken);
  918. mockCollection.Verify(m => m.FindOneAndUpdate(filterDefinition, update, options, cancellationToken), Times.Once);
  919. }
  920. }
  921. }
  922. }
  923. }
  924. [Theory]
  925. [ParameterAttributeData]
  926. public void ReplaceOne_should_call_collection_with_expected_arguments(
  927. [Values(false, true)] bool usingSession,
  928. [Values(false, true)] bool async)
  929. {
  930. var mockCollection = CreateMockCollection();
  931. var coll

Large files files are truncated, but you can click here to view the full file