PageRenderTime 48ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/src/MongoDB.Driver.Core.Tests/Core/Operations/GroupOperationTests.cs

http://github.com/mongodb/mongo-csharp-driver
C# | 377 lines | 308 code | 55 blank | 14 comment | 0 complexity | 2947a671a6191fa61755f753d6a8a367 MD5 | raw file
Possible License(s): Apache-2.0
  1. /* Copyright 2013-2014 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 FluentAssertions;
  17. using MongoDB.Bson;
  18. using MongoDB.Bson.Serialization;
  19. using MongoDB.Driver.Core.WireProtocol.Messages.Encoders;
  20. using NSubstitute;
  21. using NUnit.Framework;
  22. namespace MongoDB.Driver.Core.Operations
  23. {
  24. [TestFixture]
  25. public class GroupOperationTests
  26. {
  27. [Test]
  28. public void constructor_with_key_should_initialize_subject()
  29. {
  30. var collectionNamespace = new CollectionNamespace("databaseName", "collectionName");
  31. var key = new BsonDocument("key", 1);
  32. var initial = new BsonDocument("x", 1);
  33. var reduceFunction = new BsonJavaScript("reduceFunction");
  34. var filter = new BsonDocument("y", 1);
  35. var messageEncoderSettings = new MessageEncoderSettings();
  36. var subject = new GroupOperation<BsonDocument>(collectionNamespace, key, initial, reduceFunction, filter, messageEncoderSettings);
  37. subject.CollectionNamespace.Should().Be(collectionNamespace);
  38. subject.Filter.Should().Be(filter);
  39. subject.FinalizeFunction.Should().BeNull();
  40. subject.Initial.Should().Be(initial);
  41. subject.Key.Should().Be(key);
  42. subject.KeyFunction.Should().BeNull();
  43. subject.MaxTime.Should().Be(default(TimeSpan?));
  44. Assert.That(subject.MessageEncoderSettings, Is.EqualTo(messageEncoderSettings));
  45. subject.ReduceFunction.Should().Be(reduceFunction);
  46. subject.ResultSerializer.Should().BeNull();
  47. }
  48. [Test]
  49. public void constructor_with_key_should_throw_when_collectionNamespace_is_null()
  50. {
  51. var key = new BsonDocument("key", 1);
  52. var initial = new BsonDocument("x", 1);
  53. var reduceFunction = new BsonJavaScript("reduceFunction");
  54. var filter = new BsonDocument("y", 1);
  55. var messageEncoderSettings = new MessageEncoderSettings();
  56. Action action = () => new GroupOperation<BsonDocument>(null, key, initial, reduceFunction, filter, messageEncoderSettings);
  57. action.ShouldThrow<ArgumentNullException>();
  58. }
  59. [Test]
  60. public void constructor_with_key_should_throw_when_initial_is_null()
  61. {
  62. var collectionNamespace = new CollectionNamespace("databaseName", "collectionName");
  63. var key = new BsonDocument("key", 1);
  64. var reduceFunction = new BsonJavaScript("reduceFunction");
  65. var filter = new BsonDocument("y", 1);
  66. var messageEncoderSettings = new MessageEncoderSettings();
  67. Action action = () => new GroupOperation<BsonDocument>(collectionNamespace, key, null, reduceFunction, filter, messageEncoderSettings);
  68. action.ShouldThrow<ArgumentNullException>();
  69. }
  70. [Test]
  71. public void constructor_with_key_should_throw_when_key_is_null()
  72. {
  73. var collectionNamespace = new CollectionNamespace("databaseName", "collectionName");
  74. var initial = new BsonDocument("x", 1);
  75. var reduceFunction = new BsonJavaScript("reduceFunction");
  76. var filter = new BsonDocument("y", 1);
  77. var messageEncoderSettings = new MessageEncoderSettings();
  78. Action action = () => new GroupOperation<BsonDocument>(collectionNamespace, (BsonDocument)null, initial, reduceFunction, filter, messageEncoderSettings);
  79. action.ShouldThrow<ArgumentNullException>();
  80. }
  81. [Test]
  82. public void constructor_with_key_should_throw_when_reduceFunction_is_null()
  83. {
  84. var collectionNamespace = new CollectionNamespace("databaseName", "collectionName");
  85. var key = new BsonDocument("key", 1);
  86. var initial = new BsonDocument("x", 1);
  87. var filter = new BsonDocument("y", 1);
  88. var messageEncoderSettings = new MessageEncoderSettings();
  89. Action action = () => new GroupOperation<BsonDocument>(collectionNamespace, key, initial, null, filter, messageEncoderSettings);
  90. action.ShouldThrow<ArgumentNullException>();
  91. }
  92. [Test]
  93. public void constructor_with_keyFunction_should_initialize_subject()
  94. {
  95. var collectionNamespace = new CollectionNamespace("databaseName", "collectionName");
  96. var keyFunction = new BsonJavaScript("keyFunction");
  97. var initial = new BsonDocument("x", 1);
  98. var reduceFunction = new BsonJavaScript("reduceFunction");
  99. var filter = new BsonDocument("y", 1);
  100. var messageEncoderSettings = new MessageEncoderSettings();
  101. var subject = new GroupOperation<BsonDocument>(collectionNamespace, keyFunction, initial, reduceFunction, filter, messageEncoderSettings);
  102. subject.CollectionNamespace.Should().Be(collectionNamespace);
  103. subject.Filter.Should().Be(filter);
  104. subject.FinalizeFunction.Should().BeNull();
  105. subject.Initial.Should().Be(initial);
  106. subject.Key.Should().BeNull();
  107. subject.KeyFunction.Should().Be(keyFunction);
  108. subject.MaxTime.Should().Be(default(TimeSpan?));
  109. Assert.That(subject.MessageEncoderSettings, Is.EqualTo(messageEncoderSettings));
  110. subject.ReduceFunction.Should().Be(reduceFunction);
  111. subject.ResultSerializer.Should().BeNull();
  112. }
  113. [Test]
  114. public void constructor_with_keyFunction_should_throw_when_collectionNamespace_is_null()
  115. {
  116. var keyFunction = new BsonJavaScript("keyFunction");
  117. var initial = new BsonDocument("x", 1);
  118. var reduceFunction = new BsonJavaScript("reduceFunction");
  119. var filter = new BsonDocument("y", 1);
  120. var messageEncoderSettings = new MessageEncoderSettings();
  121. Action action = () => new GroupOperation<BsonDocument>(null, keyFunction, initial, reduceFunction, filter, messageEncoderSettings);
  122. action.ShouldThrow<ArgumentNullException>();
  123. }
  124. [Test]
  125. public void constructor_with_keyFunction_should_throw_when_keyFunction_is_null()
  126. {
  127. var collectionNamespace = new CollectionNamespace("databaseName", "collectionName");
  128. var initial = new BsonDocument("x", 1);
  129. var reduceFunction = new BsonJavaScript("reduceFunction");
  130. var filter = new BsonDocument("y", 1);
  131. var messageEncoderSettings = new MessageEncoderSettings();
  132. Action action = () => new GroupOperation<BsonDocument>(collectionNamespace, (BsonJavaScript)null, initial, reduceFunction, filter, messageEncoderSettings);
  133. action.ShouldThrow<ArgumentNullException>();
  134. }
  135. [Test]
  136. public void constructor_with_keyFunction_should_throw_when_initial_is_null()
  137. {
  138. var collectionNamespace = new CollectionNamespace("databaseName", "collectionName");
  139. var keyFunction = new BsonJavaScript("keyFunction");
  140. var reduceFunction = new BsonJavaScript("reduceFunction");
  141. var filter = new BsonDocument("y", 1);
  142. var messageEncoderSettings = new MessageEncoderSettings();
  143. Action action = () => new GroupOperation<BsonDocument>(collectionNamespace, keyFunction, null, reduceFunction, filter, messageEncoderSettings);
  144. action.ShouldThrow<ArgumentNullException>();
  145. }
  146. [Test]
  147. public void constructor_with_keyFunction_should_throw_when_reduceFunction_is_null()
  148. {
  149. var collectionNamespace = new CollectionNamespace("databaseName", "collectionName");
  150. var keyFunction = new BsonJavaScript("keyFunction");
  151. var initial = new BsonDocument("x", 1);
  152. var filter = new BsonDocument("y", 1);
  153. var messageEncoderSettings = new MessageEncoderSettings();
  154. Action action = () => new GroupOperation<BsonDocument>(collectionNamespace, keyFunction, initial, null, filter, messageEncoderSettings);
  155. action.ShouldThrow<ArgumentNullException>();
  156. }
  157. [Test]
  158. public void CreateCommand_should_return_expected_result()
  159. {
  160. var collectionNamespace = new CollectionNamespace("databaseName", "collectionName");
  161. var key = new BsonDocument("key", 1);
  162. var initial = new BsonDocument("x", 1);
  163. var reduceFunction = new BsonJavaScript("reduceFunction");
  164. var messageEncoderSettings = new MessageEncoderSettings();
  165. var subject = new GroupOperation<BsonDocument>(collectionNamespace, key, initial, reduceFunction, null, messageEncoderSettings);
  166. var expectedResult = new BsonDocument
  167. {
  168. { "group", new BsonDocument
  169. {
  170. { "ns", collectionNamespace.CollectionName },
  171. { "key", key },
  172. { "$reduce", reduceFunction },
  173. { "initial", initial }
  174. }
  175. }
  176. };
  177. var result = subject.CreateCommand();
  178. result.Should().Be(expectedResult);
  179. }
  180. [Test]
  181. public void CreateCommand_should_return_expected_result_when_filter_was_provided()
  182. {
  183. var collectionNamespace = new CollectionNamespace("databaseName", "collectionName");
  184. var key = new BsonDocument("key", 1);
  185. var initial = new BsonDocument("x", 1);
  186. var reduceFunction = new BsonJavaScript("reduceFunction");
  187. var filter = new BsonDocument("y", 1);
  188. var messageEncoderSettings = new MessageEncoderSettings();
  189. var subject = new GroupOperation<BsonDocument>(collectionNamespace, key, initial, reduceFunction, filter, messageEncoderSettings);
  190. var expectedResult = new BsonDocument
  191. {
  192. { "group", new BsonDocument
  193. {
  194. { "ns", collectionNamespace.CollectionName },
  195. { "key", key },
  196. { "$reduce", reduceFunction },
  197. { "initial", initial },
  198. { "cond", filter }
  199. }
  200. }
  201. };
  202. var result = subject.CreateCommand();
  203. result.Should().Be(expectedResult);
  204. }
  205. [Test]
  206. public void CreateCommand_should_return_expected_result_when_finalizeFunction_was_provided()
  207. {
  208. var collectionNamespace = new CollectionNamespace("databaseName", "collectionName");
  209. var key = new BsonDocument("key", 1);
  210. var initial = new BsonDocument("x", 1);
  211. var reduceFunction = new BsonJavaScript("reduceFunction");
  212. var messageEncoderSettings = new MessageEncoderSettings();
  213. var finalizeFunction = new BsonJavaScript("finalizeFunction");
  214. var subject = new GroupOperation<BsonDocument>(collectionNamespace, key, initial, reduceFunction, null, messageEncoderSettings);
  215. subject.FinalizeFunction = finalizeFunction;
  216. var expectedResult = new BsonDocument
  217. {
  218. { "group", new BsonDocument
  219. {
  220. { "ns", collectionNamespace.CollectionName },
  221. { "key", key },
  222. { "$reduce", reduceFunction },
  223. { "initial", initial },
  224. { "finalize", finalizeFunction }
  225. }
  226. }
  227. };
  228. var result = subject.CreateCommand();
  229. result.Should().Be(expectedResult);
  230. }
  231. [Test]
  232. public void CreateCommand_should_return_expected_result_when_keyFunction_was_provided()
  233. {
  234. var collectionNamespace = new CollectionNamespace("databaseName", "collectionName");
  235. var keyFunction = new BsonJavaScript("keyFunction");
  236. var initial = new BsonDocument("x", 1);
  237. var reduceFunction = new BsonJavaScript("reduceFunction");
  238. var messageEncoderSettings = new MessageEncoderSettings();
  239. var subject = new GroupOperation<BsonDocument>(collectionNamespace, keyFunction, initial, reduceFunction, null, messageEncoderSettings);
  240. var expectedResult = new BsonDocument
  241. {
  242. { "group", new BsonDocument
  243. {
  244. { "ns", collectionNamespace.CollectionName },
  245. { "$keyf", keyFunction },
  246. { "$reduce", reduceFunction },
  247. { "initial", initial }
  248. }
  249. }
  250. };
  251. var result = subject.CreateCommand();
  252. result.Should().Be(expectedResult);
  253. }
  254. [Test]
  255. public void CreateCommand_should_return_expected_result_when_maxTime_was_provided()
  256. {
  257. var collectionNamespace = new CollectionNamespace("databaseName", "collectionName");
  258. var key = new BsonDocument("key", 1);
  259. var initial = new BsonDocument("x", 1);
  260. var reduceFunction = new BsonJavaScript("reduceFunction");
  261. var messageEncoderSettings = new MessageEncoderSettings();
  262. var subject = new GroupOperation<BsonDocument>(collectionNamespace, key, initial, reduceFunction, null, messageEncoderSettings);
  263. subject.MaxTime = TimeSpan.FromSeconds(1);
  264. var expectedResult = new BsonDocument
  265. {
  266. { "group", new BsonDocument
  267. {
  268. { "ns", collectionNamespace.CollectionName },
  269. { "key", key },
  270. { "$reduce", reduceFunction },
  271. { "initial", initial }
  272. }
  273. },
  274. { "maxTimeMS", 1000 }
  275. };
  276. var result = subject.CreateCommand();
  277. result.Should().Be(expectedResult);
  278. }
  279. [Test]
  280. public void FinalizeFunction_should_work()
  281. {
  282. var collectionNamespace = new CollectionNamespace("databaseName", "collectionName");
  283. var key = new BsonDocument("key", 1);
  284. var initial = new BsonDocument("x", 1);
  285. var reduceFunction = new BsonJavaScript("reduceFunction");
  286. var filter = new BsonDocument("y", 1);
  287. var messageEncoderSettings = new MessageEncoderSettings();
  288. var subject = new GroupOperation<BsonDocument>(collectionNamespace, key, initial, reduceFunction, filter, messageEncoderSettings);
  289. var finalizeFunction = new BsonJavaScript("finalizeFunction");
  290. subject.FinalizeFunction = finalizeFunction;
  291. subject.FinalizeFunction.Should().Be(finalizeFunction);
  292. }
  293. [Test]
  294. public void MaxTime_should_work()
  295. {
  296. var collectionNamespace = new CollectionNamespace("databaseName", "collectionName");
  297. var key = new BsonDocument("key", 1);
  298. var initial = new BsonDocument("x", 1);
  299. var reduceFunction = new BsonJavaScript("reduceFunction");
  300. var filter = new BsonDocument("y", 1);
  301. var messageEncoderSettings = new MessageEncoderSettings();
  302. var subject = new GroupOperation<BsonDocument>(collectionNamespace, key, initial, reduceFunction, filter, messageEncoderSettings);
  303. var maxTime = TimeSpan.FromSeconds(1);
  304. subject.MaxTime = maxTime;
  305. subject.MaxTime.Should().Be(maxTime);
  306. }
  307. [Test]
  308. public void ResultSerializer_should_work()
  309. {
  310. var collectionNamespace = new CollectionNamespace("databaseName", "collectionName");
  311. var key = new BsonDocument("key", 1);
  312. var initial = new BsonDocument("x", 1);
  313. var reduceFunction = new BsonJavaScript("reduceFunction");
  314. var filter = new BsonDocument("y", 1);
  315. var messageEncoderSettings = new MessageEncoderSettings();
  316. var subject = new GroupOperation<BsonDocument>(collectionNamespace, key, initial, reduceFunction, filter, messageEncoderSettings);
  317. var resultSerializer = Substitute.For<IBsonSerializer<BsonDocument>>();
  318. subject.ResultSerializer = resultSerializer;
  319. subject.ResultSerializer.Should().BeSameAs(resultSerializer);
  320. }
  321. }
  322. }