mongo 1.12.5 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (475) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CONTRIBUTING.md +64 -0
  4. data/LICENSE +1 -1
  5. data/README.md +21 -126
  6. data/Rakefile +39 -21
  7. data/bin/mongo_console +6 -38
  8. data/lib/mongo/address/ipv4.rb +85 -0
  9. data/lib/mongo/address/ipv6.rb +85 -0
  10. data/lib/mongo/address/unix.rb +76 -0
  11. data/lib/mongo/address.rb +111 -0
  12. data/lib/mongo/auth/cr/conversation.rb +119 -0
  13. data/lib/mongo/auth/cr.rb +44 -0
  14. data/lib/mongo/auth/executable.rb +52 -0
  15. data/lib/mongo/auth/ldap/conversation.rb +92 -0
  16. data/lib/mongo/auth/ldap.rb +48 -0
  17. data/lib/mongo/auth/roles.rb +104 -0
  18. data/lib/mongo/auth/scram/conversation.rb +450 -0
  19. data/lib/mongo/auth/scram.rb +53 -0
  20. data/lib/mongo/auth/user/view.rb +102 -0
  21. data/lib/mongo/auth/user.rb +159 -0
  22. data/lib/mongo/auth/x509/conversation.rb +92 -0
  23. data/lib/mongo/auth/x509.rb +48 -0
  24. data/lib/mongo/auth.rb +108 -0
  25. data/lib/mongo/bulk_write/bulk_writable.rb +191 -0
  26. data/lib/mongo/bulk_write/deletable.rb +60 -0
  27. data/lib/mongo/bulk_write/insertable.rb +52 -0
  28. data/lib/mongo/bulk_write/ordered_bulk_write.rb +48 -0
  29. data/lib/mongo/bulk_write/replacable.rb +57 -0
  30. data/lib/mongo/bulk_write/unordered_bulk_write.rb +46 -0
  31. data/lib/mongo/bulk_write/updatable.rb +68 -0
  32. data/lib/mongo/bulk_write.rb +52 -0
  33. data/lib/mongo/client.rb +246 -0
  34. data/lib/mongo/cluster/topology/replica_set.rb +160 -0
  35. data/lib/mongo/cluster/topology/sharded.rb +132 -0
  36. data/lib/mongo/cluster/topology/standalone.rb +132 -0
  37. data/lib/mongo/cluster/topology/unknown.rb +155 -0
  38. data/lib/mongo/cluster/topology.rb +60 -0
  39. data/lib/mongo/cluster.rb +203 -0
  40. data/lib/mongo/collection/view/aggregation.rb +108 -0
  41. data/lib/mongo/collection/view/explainable.rb +49 -0
  42. data/lib/mongo/collection/view/immutable.rb +43 -0
  43. data/lib/mongo/collection/view/iterable.rb +48 -0
  44. data/lib/mongo/collection/view/map_reduce.rb +191 -0
  45. data/lib/mongo/collection/view/readable.rb +363 -0
  46. data/lib/mongo/collection/view/writable.rb +185 -0
  47. data/lib/mongo/collection/view.rb +169 -0
  48. data/lib/mongo/collection.rb +130 -1101
  49. data/lib/mongo/cursor.rb +78 -681
  50. data/lib/mongo/database/view.rb +101 -0
  51. data/lib/mongo/database.rb +224 -0
  52. data/lib/mongo/error/bulk_write_error.rb +41 -0
  53. data/lib/mongo/error/invalid_bulk_operation.rb +36 -0
  54. data/lib/mongo/error/invalid_bulk_operation_type.rb +36 -0
  55. data/lib/mongo/error/invalid_collection_name.rb +39 -0
  56. data/lib/mongo/error/invalid_database_name.rb +39 -0
  57. data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
  58. data/lib/mongo/error/invalid_file.rb +38 -0
  59. data/lib/mongo/error/invalid_nonce.rb +46 -0
  60. data/lib/mongo/error/invalid_replacement_document.rb +39 -0
  61. data/lib/mongo/error/invalid_signature.rb +47 -0
  62. data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
  63. data/lib/mongo/error/max_bson_size.rb +40 -0
  64. data/lib/mongo/error/max_message_size.rb +42 -0
  65. data/{test/functional/db_connection_test.rb → lib/mongo/error/multi_index_drop.rb} +17 -8
  66. data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
  67. data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
  68. data/lib/mongo/error/parser.rb +77 -0
  69. data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
  70. data/lib/mongo/error/socket_timeout_error.rb +23 -0
  71. data/lib/mongo/error/unsupported_features.rb +43 -0
  72. data/lib/mongo/error.rb +82 -0
  73. data/lib/mongo/event/listeners.rb +63 -0
  74. data/lib/mongo/event/primary_elected.rb +53 -0
  75. data/lib/mongo/event/publisher.rb +42 -0
  76. data/lib/mongo/event/server_added.rb +53 -0
  77. data/lib/mongo/event/server_removed.rb +53 -0
  78. data/lib/mongo/event/subscriber.rb +41 -0
  79. data/lib/mongo/event.rb +40 -0
  80. data/lib/mongo/grid/file/chunk.rb +184 -0
  81. data/lib/mongo/grid/file/metadata.rb +229 -0
  82. data/lib/mongo/grid/file.rb +106 -0
  83. data/lib/mongo/grid/fs.rb +149 -0
  84. data/lib/mongo/{gridfs.rb → grid.rb} +3 -5
  85. data/lib/mongo/index/view.rb +261 -0
  86. data/lib/mongo/index.rb +64 -0
  87. data/lib/mongo/loggable.rb +126 -0
  88. data/lib/mongo/logger.rb +132 -0
  89. data/lib/mongo/operation/aggregate/result.rb +88 -0
  90. data/lib/mongo/operation/aggregate.rb +100 -0
  91. data/lib/mongo/operation/command.rb +62 -0
  92. data/lib/mongo/operation/executable.rb +105 -0
  93. data/lib/mongo/operation/kill_cursors.rb +39 -0
  94. data/lib/mongo/operation/limited.rb +37 -0
  95. data/lib/mongo/operation/list_collections/result.rb +114 -0
  96. data/lib/mongo/operation/list_indexes/result.rb +118 -0
  97. data/lib/mongo/operation/map_reduce/result.rb +122 -0
  98. data/lib/mongo/operation/map_reduce.rb +96 -0
  99. data/lib/mongo/operation/read/collections_info.rb +67 -0
  100. data/lib/mongo/operation/read/get_more.rb +71 -0
  101. data/lib/mongo/operation/read/indexes.rb +68 -0
  102. data/lib/mongo/operation/read/list_collections.rb +75 -0
  103. data/lib/mongo/operation/read/list_indexes.rb +77 -0
  104. data/lib/mongo/operation/read/query.rb +71 -0
  105. data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
  106. data/lib/mongo/operation/read_preferrable.rb +34 -0
  107. data/lib/mongo/operation/result.rb +259 -0
  108. data/lib/mongo/operation/specifiable.rb +397 -0
  109. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +75 -0
  110. data/lib/mongo/operation/write/bulk/bulk_delete.rb +144 -0
  111. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +68 -0
  112. data/lib/mongo/operation/write/bulk/bulk_insert.rb +129 -0
  113. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +67 -0
  114. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +162 -0
  115. data/lib/mongo/operation/write/bulk/bulk_update.rb +153 -0
  116. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +83 -0
  117. data/lib/mongo/operation/write/bulk.rb +17 -0
  118. data/lib/mongo/operation/write/command/create_index.rb +50 -0
  119. data/lib/mongo/operation/write/command/create_user.rb +43 -0
  120. data/lib/mongo/operation/write/command/delete.rb +56 -0
  121. data/lib/mongo/operation/write/command/drop_index.rb +51 -0
  122. data/lib/mongo/operation/write/command/insert.rb +55 -0
  123. data/lib/mongo/operation/write/command/remove_user.rb +42 -0
  124. data/lib/mongo/operation/write/command/update.rb +60 -0
  125. data/lib/mongo/operation/write/command/writable.rb +61 -0
  126. data/lib/mongo/operation/write/command.rb +22 -0
  127. data/lib/mongo/operation/write/create_index.rb +89 -0
  128. data/lib/mongo/operation/write/create_user.rb +75 -0
  129. data/lib/mongo/operation/write/delete/result.rb +40 -0
  130. data/lib/mongo/operation/write/delete.rb +93 -0
  131. data/lib/mongo/operation/write/drop_index.rb +62 -0
  132. data/lib/mongo/{utils/thread_local_variable_manager.rb → operation/write/insert/result.rb} +15 -8
  133. data/lib/mongo/operation/write/insert.rb +90 -0
  134. data/lib/mongo/operation/write/remove_user.rb +70 -0
  135. data/lib/mongo/operation/write/update/result.rb +160 -0
  136. data/lib/mongo/operation/write/update.rb +103 -0
  137. data/lib/mongo/{connection/socket/socket_util.rb → operation/write.rb} +10 -24
  138. data/lib/mongo/operation.rb +25 -0
  139. data/lib/mongo/options/mapper.rb +78 -0
  140. data/lib/mongo/options.rb +15 -0
  141. data/lib/mongo/protocol/bit_vector.rb +61 -0
  142. data/lib/mongo/protocol/delete.rb +94 -0
  143. data/lib/mongo/protocol/get_more.rb +99 -0
  144. data/lib/mongo/protocol/insert.rb +99 -0
  145. data/lib/mongo/protocol/kill_cursors.rb +74 -0
  146. data/lib/mongo/protocol/message.rb +252 -0
  147. data/lib/mongo/protocol/query.rb +147 -0
  148. data/lib/mongo/protocol/reply.rb +72 -0
  149. data/lib/mongo/protocol/serializers.rb +180 -0
  150. data/lib/mongo/protocol/update.rb +111 -0
  151. data/lib/mongo/protocol.rb +15 -0
  152. data/lib/mongo/server/connectable.rb +110 -0
  153. data/lib/mongo/server/connection.rb +134 -0
  154. data/lib/mongo/server/connection_pool/queue.rb +182 -0
  155. data/lib/mongo/server/connection_pool.rb +141 -0
  156. data/lib/mongo/server/context.rb +66 -0
  157. data/lib/mongo/server/description/features.rb +85 -0
  158. data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
  159. data/lib/mongo/server/description/inspector/server_added.rb +59 -0
  160. data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
  161. data/lib/mongo/server/description/inspector.rb +79 -0
  162. data/lib/mongo/server/description.rb +450 -0
  163. data/lib/mongo/server/monitor/connection.rb +89 -0
  164. data/lib/mongo/server/monitor.rb +176 -0
  165. data/lib/mongo/server.rb +163 -0
  166. data/lib/mongo/server_selector/nearest.rb +94 -0
  167. data/lib/mongo/server_selector/primary.rb +88 -0
  168. data/lib/mongo/server_selector/primary_preferred.rb +94 -0
  169. data/lib/mongo/server_selector/secondary.rb +91 -0
  170. data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
  171. data/lib/mongo/server_selector/selectable.rb +209 -0
  172. data/lib/mongo/server_selector.rb +81 -0
  173. data/lib/mongo/socket/ssl.rb +130 -0
  174. data/lib/mongo/socket/tcp.rb +69 -0
  175. data/lib/mongo/socket/unix.rb +64 -0
  176. data/lib/mongo/socket.rb +179 -0
  177. data/lib/mongo/uri.rb +504 -0
  178. data/lib/mongo/version.rb +21 -0
  179. data/lib/mongo/write_concern/acknowledged.rb +52 -0
  180. data/lib/mongo/write_concern/normalizable.rb +51 -0
  181. data/lib/mongo/write_concern/unacknowledged.rb +55 -0
  182. data/lib/mongo/write_concern.rb +99 -0
  183. data/lib/mongo.rb +24 -82
  184. data/mongo.gemspec +17 -14
  185. data/spec/certificates/ca.pem +17 -0
  186. data/spec/certificates/client.pem +101 -0
  187. data/spec/certificates/crl.pem +10 -0
  188. data/spec/certificates/crl_client_revoked.pem +12 -0
  189. data/spec/certificates/password_protected.pem +51 -0
  190. data/spec/certificates/server.pem +34 -0
  191. data/spec/mongo/address/ipv4_spec.rb +74 -0
  192. data/spec/mongo/address/ipv6_spec.rb +74 -0
  193. data/spec/mongo/address/unix_spec.rb +30 -0
  194. data/spec/mongo/address_spec.rb +206 -0
  195. data/spec/mongo/auth/cr_spec.rb +59 -0
  196. data/spec/mongo/auth/ldap_spec.rb +40 -0
  197. data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
  198. data/spec/mongo/auth/scram_spec.rb +55 -0
  199. data/spec/mongo/auth/user/view_spec.rb +76 -0
  200. data/spec/mongo/auth/user_spec.rb +190 -0
  201. data/spec/mongo/auth/x509_spec.rb +40 -0
  202. data/spec/mongo/auth_spec.rb +65 -0
  203. data/spec/mongo/bulk/bulk_write_spec.rb +262 -0
  204. data/spec/mongo/client_spec.rb +564 -0
  205. data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
  206. data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
  207. data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
  208. data/spec/mongo/cluster/topology_spec.rb +65 -0
  209. data/spec/mongo/cluster_spec.rb +129 -0
  210. data/spec/mongo/collection/view/aggregation_spec.rb +148 -0
  211. data/spec/mongo/collection/view/explainable_spec.rb +32 -0
  212. data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
  213. data/spec/mongo/collection/view/readable_spec.rb +603 -0
  214. data/spec/mongo/collection/view/writable_spec.rb +679 -0
  215. data/spec/mongo/collection/view_spec.rb +530 -0
  216. data/spec/mongo/collection_spec.rb +362 -0
  217. data/spec/mongo/crud_spec.rb +42 -0
  218. data/spec/mongo/cursor_spec.rb +295 -0
  219. data/spec/mongo/database_spec.rb +302 -0
  220. data/spec/mongo/error/parser_spec.rb +119 -0
  221. data/spec/mongo/event/publisher_spec.rb +50 -0
  222. data/spec/mongo/event/subscriber_spec.rb +34 -0
  223. data/spec/mongo/grid/file/chunk_spec.rb +226 -0
  224. data/spec/mongo/grid/file/metadata_spec.rb +92 -0
  225. data/spec/mongo/grid/file_spec.rb +172 -0
  226. data/spec/mongo/grid/fs_spec.rb +129 -0
  227. data/spec/mongo/index/view_spec.rb +330 -0
  228. data/spec/mongo/loggable_spec.rb +62 -0
  229. data/spec/mongo/logger_spec.rb +97 -0
  230. data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
  231. data/spec/mongo/operation/aggregate_spec.rb +127 -0
  232. data/spec/mongo/operation/command_spec.rb +98 -0
  233. data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
  234. data/spec/mongo/operation/limited_spec.rb +50 -0
  235. data/spec/mongo/operation/map_reduce_spec.rb +143 -0
  236. data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
  237. data/spec/mongo/operation/read/get_more_spec.rb +81 -0
  238. data/spec/mongo/operation/read/indexes_spec.rb +31 -0
  239. data/spec/mongo/operation/read/query_spec.rb +84 -0
  240. data/spec/mongo/operation/result_spec.rb +275 -0
  241. data/spec/mongo/operation/specifiable_spec.rb +53 -0
  242. data/spec/mongo/operation/write/bulk_delete_spec.rb +235 -0
  243. data/spec/mongo/operation/write/bulk_insert_spec.rb +235 -0
  244. data/spec/mongo/operation/write/bulk_update_spec.rb +236 -0
  245. data/spec/mongo/operation/write/command/delete_spec.rb +103 -0
  246. data/spec/mongo/operation/write/command/insert_spec.rb +103 -0
  247. data/spec/mongo/operation/write/command/update_spec.rb +109 -0
  248. data/spec/mongo/operation/write/create_index_spec.rb +63 -0
  249. data/spec/mongo/operation/write/create_user_spec.rb +44 -0
  250. data/spec/mongo/operation/write/delete_spec.rb +186 -0
  251. data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
  252. data/spec/mongo/operation/write/insert_spec.rb +244 -0
  253. data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
  254. data/spec/mongo/operation/write/response_spec.rb +85 -0
  255. data/spec/mongo/operation/write/update_spec.rb +228 -0
  256. data/spec/mongo/protocol/delete_spec.rb +167 -0
  257. data/spec/mongo/protocol/get_more_spec.rb +146 -0
  258. data/spec/mongo/protocol/insert_spec.rb +161 -0
  259. data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
  260. data/spec/mongo/protocol/query_spec.rb +285 -0
  261. data/spec/mongo/protocol/reply_spec.rb +157 -0
  262. data/spec/mongo/protocol/update_spec.rb +186 -0
  263. data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
  264. data/spec/mongo/server/connection_pool_spec.rb +120 -0
  265. data/spec/mongo/server/connection_spec.rb +312 -0
  266. data/spec/mongo/server/description/features_spec.rb +138 -0
  267. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
  268. data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
  269. data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
  270. data/spec/mongo/server/description_spec.rb +510 -0
  271. data/spec/mongo/server/monitor_spec.rb +144 -0
  272. data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
  273. data/spec/mongo/server_selection_rtt_spec.rb +104 -0
  274. data/spec/mongo/server_selection_spec.rb +89 -0
  275. data/spec/mongo/server_selector/nearest_spec.rb +250 -0
  276. data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
  277. data/spec/mongo/server_selector/primary_spec.rb +114 -0
  278. data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
  279. data/spec/mongo/server_selector/secondary_spec.rb +196 -0
  280. data/spec/mongo/server_selector_spec.rb +101 -0
  281. data/spec/mongo/server_spec.rb +131 -0
  282. data/spec/mongo/uri_spec.rb +517 -0
  283. data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
  284. data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
  285. data/spec/spec_helper.rb +133 -0
  286. data/spec/support/authorization.rb +247 -0
  287. data/spec/support/crud/read.rb +144 -0
  288. data/spec/support/crud/write.rb +214 -0
  289. data/spec/support/crud.rb +203 -0
  290. data/spec/support/crud_tests/read/aggregate.yml +43 -0
  291. data/spec/support/crud_tests/read/count.yml +37 -0
  292. data/spec/support/crud_tests/read/distinct.yml +33 -0
  293. data/spec/support/crud_tests/read/find.yml +50 -0
  294. data/spec/support/crud_tests/write/deleteMany.yml +36 -0
  295. data/spec/support/crud_tests/write/deleteOne.yml +49 -0
  296. data/spec/support/crud_tests/write/findOneAndDelete.yml +54 -0
  297. data/spec/support/crud_tests/write/findOneAndReplace.yml +153 -0
  298. data/spec/support/crud_tests/write/findOneAndUpdate.yml +161 -0
  299. data/spec/support/crud_tests/write/insertMany.yml +24 -0
  300. data/spec/support/crud_tests/write/insertOne.yml +19 -0
  301. data/spec/support/crud_tests/write/replaceOne.yml +96 -0
  302. data/spec/support/crud_tests/write/updateMany.yml +83 -0
  303. data/spec/support/crud_tests/write/updateOne.yml +80 -0
  304. data/spec/support/helpers.rb +140 -0
  305. data/spec/support/matchers.rb +37 -0
  306. data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
  307. data/spec/support/sdam/rs/discover_passives.yml +41 -0
  308. data/spec/support/sdam/rs/discover_primary.yml +40 -0
  309. data/spec/support/sdam/rs/discover_secondary.yml +41 -0
  310. data/spec/support/sdam/rs/discovery.yml +195 -0
  311. data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
  312. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
  313. data/spec/support/sdam/rs/member_reconfig.yml +68 -0
  314. data/spec/support/sdam/rs/member_standalone.yml +60 -0
  315. data/spec/support/sdam/rs/new_primary.yml +74 -0
  316. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
  317. data/spec/support/sdam/rs/non_rs_member.yml +31 -0
  318. data/spec/support/sdam/rs/normalize_case.yml +49 -0
  319. data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
  320. data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
  321. data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
  322. data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
  323. data/spec/support/sdam/rs/response_from_removed.yml +63 -0
  324. data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
  325. data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
  326. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
  327. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
  328. data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
  329. data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
  330. data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
  331. data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
  332. data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
  333. data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
  334. data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
  335. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
  336. data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
  337. data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
  338. data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
  339. data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
  340. data/spec/support/sdam/single/not_ok_response.yml +39 -0
  341. data/spec/support/sdam/single/standalone_removed.yml +32 -0
  342. data/spec/support/sdam/single/unavailable_seed.yml +28 -0
  343. data/spec/support/server_discovery_and_monitoring.rb +167 -0
  344. data/spec/support/server_selection/rtt/first_value.yml +4 -0
  345. data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
  346. data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
  347. data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
  348. data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
  349. data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
  350. data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
  351. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +26 -0
  352. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +21 -0
  353. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +21 -0
  354. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +26 -0
  355. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +21 -0
  356. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +26 -0
  357. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +26 -0
  358. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +21 -0
  359. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +21 -0
  360. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +33 -0
  361. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +26 -0
  362. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +29 -0
  363. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +29 -0
  364. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +29 -0
  365. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml +31 -0
  366. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +31 -0
  367. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +29 -0
  368. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +26 -0
  369. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +26 -0
  370. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +19 -0
  371. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +11 -0
  372. data/spec/support/server_selection.rb +157 -0
  373. data/spec/support/server_selection_rtt.rb +41 -0
  374. data/spec/support/shared/bulk_write.rb +535 -0
  375. data/spec/support/shared/cursor.rb +38 -0
  376. data/spec/support/shared/operation.rb +77 -0
  377. data/spec/support/shared/protocol.rb +31 -0
  378. data/spec/support/shared/server_selector.rb +111 -0
  379. data/spec/support/shared/socket.rb +82 -0
  380. data/spec/support/travis.rb +14 -0
  381. data.tar.gz.sig +2 -3
  382. metadata +583 -186
  383. metadata.gz.sig +0 -0
  384. data/VERSION +0 -1
  385. data/lib/mongo/bulk_write_collection_view.rb +0 -387
  386. data/lib/mongo/collection_writer.rb +0 -364
  387. data/lib/mongo/connection/node.rb +0 -249
  388. data/lib/mongo/connection/pool.rb +0 -340
  389. data/lib/mongo/connection/pool_manager.rb +0 -320
  390. data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
  391. data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
  392. data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
  393. data/lib/mongo/connection/socket/unix_socket.rb +0 -39
  394. data/lib/mongo/db.rb +0 -808
  395. data/lib/mongo/exception.rb +0 -145
  396. data/lib/mongo/functional/authentication.rb +0 -455
  397. data/lib/mongo/functional/logging.rb +0 -85
  398. data/lib/mongo/functional/read_preference.rb +0 -183
  399. data/lib/mongo/functional/scram.rb +0 -556
  400. data/lib/mongo/functional/uri_parser.rb +0 -409
  401. data/lib/mongo/functional/write_concern.rb +0 -66
  402. data/lib/mongo/gridfs/grid.rb +0 -112
  403. data/lib/mongo/gridfs/grid_ext.rb +0 -53
  404. data/lib/mongo/gridfs/grid_file_system.rb +0 -163
  405. data/lib/mongo/gridfs/grid_io.rb +0 -484
  406. data/lib/mongo/legacy.rb +0 -140
  407. data/lib/mongo/mongo_client.rb +0 -697
  408. data/lib/mongo/mongo_replica_set_client.rb +0 -535
  409. data/lib/mongo/mongo_sharded_client.rb +0 -159
  410. data/lib/mongo/networking.rb +0 -372
  411. data/lib/mongo/utils/conversions.rb +0 -110
  412. data/lib/mongo/utils/core_ext.rb +0 -70
  413. data/lib/mongo/utils/server_version.rb +0 -69
  414. data/lib/mongo/utils/support.rb +0 -80
  415. data/test/functional/authentication_test.rb +0 -39
  416. data/test/functional/bulk_api_stress_test.rb +0 -133
  417. data/test/functional/bulk_write_collection_view_test.rb +0 -1198
  418. data/test/functional/client_test.rb +0 -627
  419. data/test/functional/collection_test.rb +0 -2175
  420. data/test/functional/collection_writer_test.rb +0 -83
  421. data/test/functional/conversions_test.rb +0 -163
  422. data/test/functional/cursor_fail_test.rb +0 -57
  423. data/test/functional/cursor_message_test.rb +0 -56
  424. data/test/functional/cursor_test.rb +0 -683
  425. data/test/functional/db_api_test.rb +0 -835
  426. data/test/functional/db_test.rb +0 -348
  427. data/test/functional/grid_file_system_test.rb +0 -285
  428. data/test/functional/grid_io_test.rb +0 -252
  429. data/test/functional/grid_test.rb +0 -273
  430. data/test/functional/pool_test.rb +0 -136
  431. data/test/functional/safe_test.rb +0 -98
  432. data/test/functional/support_test.rb +0 -62
  433. data/test/functional/timeout_test.rb +0 -60
  434. data/test/functional/uri_test.rb +0 -446
  435. data/test/functional/write_concern_test.rb +0 -118
  436. data/test/helpers/general.rb +0 -50
  437. data/test/helpers/test_unit.rb +0 -476
  438. data/test/replica_set/authentication_test.rb +0 -37
  439. data/test/replica_set/basic_test.rb +0 -189
  440. data/test/replica_set/client_test.rb +0 -393
  441. data/test/replica_set/connection_test.rb +0 -138
  442. data/test/replica_set/count_test.rb +0 -66
  443. data/test/replica_set/cursor_test.rb +0 -220
  444. data/test/replica_set/insert_test.rb +0 -157
  445. data/test/replica_set/max_values_test.rb +0 -151
  446. data/test/replica_set/pinning_test.rb +0 -105
  447. data/test/replica_set/query_test.rb +0 -73
  448. data/test/replica_set/read_preference_test.rb +0 -219
  449. data/test/replica_set/refresh_test.rb +0 -211
  450. data/test/replica_set/replication_ack_test.rb +0 -95
  451. data/test/sharded_cluster/basic_test.rb +0 -203
  452. data/test/shared/authentication/basic_auth_shared.rb +0 -260
  453. data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
  454. data/test/shared/authentication/gssapi_shared.rb +0 -176
  455. data/test/shared/authentication/sasl_plain_shared.rb +0 -96
  456. data/test/shared/authentication/scram_shared.rb +0 -92
  457. data/test/shared/ssl_shared.rb +0 -235
  458. data/test/test_helper.rb +0 -61
  459. data/test/threading/basic_test.rb +0 -120
  460. data/test/tools/mongo_config.rb +0 -708
  461. data/test/tools/mongo_config_test.rb +0 -160
  462. data/test/unit/client_test.rb +0 -381
  463. data/test/unit/collection_test.rb +0 -166
  464. data/test/unit/connection_test.rb +0 -335
  465. data/test/unit/cursor_test.rb +0 -307
  466. data/test/unit/db_test.rb +0 -136
  467. data/test/unit/grid_test.rb +0 -76
  468. data/test/unit/mongo_sharded_client_test.rb +0 -48
  469. data/test/unit/node_test.rb +0 -93
  470. data/test/unit/pool_manager_test.rb +0 -111
  471. data/test/unit/read_pref_test.rb +0 -406
  472. data/test/unit/read_test.rb +0 -159
  473. data/test/unit/safe_test.rb +0 -158
  474. data/test/unit/sharding_pool_manager_test.rb +0 -84
  475. data/test/unit/write_concern_test.rb +0 -175
@@ -0,0 +1,330 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Index::View do
4
+
5
+ let(:view) do
6
+ described_class.new(authorized_collection)
7
+ end
8
+
9
+ describe '#drop_one' do
10
+
11
+ let(:spec) do
12
+ { another: -1 }
13
+ end
14
+
15
+ before do
16
+ view.create_one(spec, unique: true)
17
+ end
18
+
19
+ context 'when the index exists' do
20
+
21
+ let(:result) do
22
+ view.drop_one('another_-1')
23
+ end
24
+
25
+ it 'drops the index' do
26
+ expect(result).to be_successful
27
+ end
28
+ end
29
+
30
+ context 'when passing a * as the name' do
31
+
32
+ it 'raises an exception' do
33
+ expect {
34
+ view.drop_one('*')
35
+ }.to raise_error(Mongo::Error::MultiIndexDrop)
36
+ end
37
+ end
38
+ end
39
+
40
+ describe '#drop_all' do
41
+
42
+ let(:spec) do
43
+ { another: -1 }
44
+ end
45
+
46
+ before do
47
+ view.create_one(spec, unique: true)
48
+ end
49
+
50
+ context 'when indexes exists' do
51
+
52
+ let(:result) do
53
+ view.drop_all
54
+ end
55
+
56
+ it 'drops the index' do
57
+ expect(result).to be_successful
58
+ end
59
+ end
60
+ end
61
+
62
+ describe '#create_many' do
63
+
64
+ context 'when the indexes are created' do
65
+
66
+ context 'when passing multi-args' do
67
+
68
+ let(:result) do
69
+ view.create_many(
70
+ { key: { random: 1 }, unique: true },
71
+ { key: { testing: -1 }, unique: true }
72
+ )
73
+ end
74
+
75
+ after do
76
+ view.drop_one('random_1')
77
+ view.drop_one('testing_-1')
78
+ end
79
+
80
+ it 'returns ok' do
81
+ expect(result).to be_successful
82
+ end
83
+ end
84
+
85
+ context 'when passing an array' do
86
+
87
+ let(:result) do
88
+ view.create_many([
89
+ { key: { random: 1 }, unique: true },
90
+ { key: { testing: -1 }, unique: true }
91
+ ])
92
+ end
93
+
94
+ after do
95
+ view.drop_one('random_1')
96
+ view.drop_one('testing_-1')
97
+ end
98
+
99
+ it 'returns ok' do
100
+ expect(result).to be_successful
101
+ end
102
+ end
103
+
104
+ context 'when index creation fails' do
105
+
106
+ let(:spec) do
107
+ { name: 1 }
108
+ end
109
+
110
+ before do
111
+ view.create_one(spec, unique: true)
112
+ end
113
+
114
+ after do
115
+ view.drop_one('name_1')
116
+ end
117
+
118
+ it 'raises an exception', if: write_command_enabled? do
119
+ expect {
120
+ view.create_many([{ key: { name: 1 }, unique: false }])
121
+ }.to raise_error(Mongo::Error::OperationFailure)
122
+ end
123
+
124
+ it 'does not raise an exception', unless: write_command_enabled? do
125
+ expect(view.create_many([{ key: { name: 1 }, unique: false }])).to be_successful
126
+ end
127
+ end
128
+ end
129
+ end
130
+
131
+ describe '#create_one' do
132
+
133
+ context 'when the index is created' do
134
+
135
+ let(:spec) do
136
+ { random: 1 }
137
+ end
138
+
139
+ let(:result) do
140
+ view.create_one(spec, unique: true)
141
+ end
142
+
143
+ after do
144
+ view.drop_one('random_1')
145
+ end
146
+
147
+ it 'returns ok' do
148
+ expect(result).to be_successful
149
+ end
150
+ end
151
+
152
+ context 'when index creation fails' do
153
+
154
+ let(:spec) do
155
+ { name: 1 }
156
+ end
157
+
158
+ before do
159
+ view.create_one(spec, unique: true)
160
+ end
161
+
162
+ after do
163
+ view.drop_one('name_1')
164
+ end
165
+
166
+ it 'raises an exception', if: write_command_enabled? do
167
+ expect {
168
+ view.create_one(spec, unique: false)
169
+ }.to raise_error(Mongo::Error::OperationFailure)
170
+ end
171
+
172
+ it 'does not raise an exception', unless: write_command_enabled? do
173
+ expect(view.create_one(spec, unique: false)).to be_successful
174
+ end
175
+ end
176
+
177
+ context 'when providing an index name' do
178
+
179
+ let(:spec) do
180
+ { random: 1 }
181
+ end
182
+
183
+ let!(:result) do
184
+ view.create_one(spec, unique: true, name: 'random_name')
185
+ end
186
+
187
+ after do
188
+ view.drop_one('random_name')
189
+ end
190
+
191
+ it 'returns ok' do
192
+ expect(result).to be_successful
193
+ end
194
+
195
+ it 'defines the index with the provided name' do
196
+ expect(view.get('random_name')).to_not be_nil
197
+ end
198
+ end
199
+ end
200
+
201
+ describe '#get' do
202
+
203
+ let(:spec) do
204
+ { random: 1 }
205
+ end
206
+
207
+ let!(:result) do
208
+ view.create_one(spec, unique: true, name: 'random_name')
209
+ end
210
+
211
+ after do
212
+ view.drop_one('random_name')
213
+ end
214
+
215
+ context 'when providing a name' do
216
+
217
+ let(:index) do
218
+ view.get('random_name')
219
+ end
220
+
221
+ it 'returns the index' do
222
+ expect(index['name']).to eq('random_name')
223
+ end
224
+ end
225
+
226
+ context 'when providing a spec' do
227
+
228
+ let(:index) do
229
+ view.get(random: 1)
230
+ end
231
+
232
+ it 'returns the index' do
233
+ expect(index['name']).to eq('random_name')
234
+ end
235
+ end
236
+
237
+ context 'when the index does not exist' do
238
+
239
+ it 'returns nil' do
240
+ expect(view.get(other: 1)).to be_nil
241
+ end
242
+ end
243
+ end
244
+
245
+ describe '#each' do
246
+
247
+ context 'when the collection exists' do
248
+
249
+ let(:spec) do
250
+ { name: 1 }
251
+ end
252
+
253
+ before do
254
+ view.create_one(spec, unique: true)
255
+ end
256
+
257
+ after do
258
+ view.drop_one('name_1')
259
+ end
260
+
261
+ let(:indexes) do
262
+ view.each
263
+ end
264
+
265
+ it 'returns all the indexes for the database' do
266
+ expect(indexes.to_a.count).to eq(2)
267
+ end
268
+ end
269
+
270
+ context 'when the collection does not exist' do
271
+
272
+ let(:nonexistant_collection) do
273
+ authorized_client[:not_a_collection]
274
+ end
275
+
276
+ let(:nonexistant_view) do
277
+ described_class.new(nonexistant_collection)
278
+ end
279
+
280
+ it 'raises a nonexistant collection error', if: list_command_enabled? do
281
+ expect {
282
+ nonexistant_view.each.to_a
283
+ }.to raise_error(Mongo::Error::OperationFailure)
284
+ end
285
+ end
286
+ end
287
+
288
+ describe '#normalize_models' do
289
+
290
+ context 'when providing options' do
291
+
292
+ let(:options) do
293
+ {
294
+ :key => { :name => 1 },
295
+ :bucket_size => 5,
296
+ :default_language => 'deutsch',
297
+ :expire_after => 10,
298
+ :language_override => 'language',
299
+ :sphere_version => 1,
300
+ :storage_engine => 'wiredtiger',
301
+ :text_version => 2,
302
+ :version => 1
303
+ }
304
+ end
305
+
306
+ let(:models) do
307
+ view.send(:normalize_models, [ options ])
308
+ end
309
+
310
+ let(:expected) do
311
+ {
312
+ :key => { :name => 1 },
313
+ :name => 'name_1',
314
+ :bucketSize => 5,
315
+ :default_language => 'deutsch',
316
+ :expireAfterSeconds => 10,
317
+ :language_override => 'language',
318
+ :'2dsphereIndexVersion' => 1,
319
+ :storageEngine => 'wiredtiger',
320
+ :textIndexVersion => 2,
321
+ :v => 1
322
+ }
323
+ end
324
+
325
+ it 'maps the ruby options to the server options' do
326
+ expect(models).to eq([ expected ])
327
+ end
328
+ end
329
+ end
330
+ end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Loggable do
4
+
5
+ let(:operation) do
6
+ Class.new do
7
+ def log_message
8
+ 'test'
9
+ end
10
+ end.new
11
+ end
12
+
13
+ describe '#log' do
14
+
15
+ let(:loggable) do
16
+ Class.new do
17
+ include Mongo::Loggable
18
+ end.new
19
+ end
20
+
21
+ let(:operation) do
22
+ double('operation')
23
+ end
24
+
25
+ before do
26
+ expect(operation).to receive(:log_message).and_return('test')
27
+ expect(Mongo::Logger).to receive(:debug).with('MONGO', 'test', anything())
28
+ end
29
+
30
+ context 'when a block is provided' do
31
+
32
+ context 'when an exception occurs' do
33
+
34
+ it 'logs the message' do
35
+ expect {
36
+ loggable.log(:debug, 'MONGO', [ operation ]) do
37
+ raise RuntimeError
38
+ end
39
+ }.to raise_error(RuntimeError)
40
+ end
41
+ end
42
+
43
+ context 'when no exception occurs' do
44
+
45
+ it 'executes the block and logs the message' do
46
+ expect(
47
+ loggable.log(:debug, 'MONGO', [ operation ]) do
48
+ 'testing'
49
+ end
50
+ ).to eq('testing')
51
+ end
52
+ end
53
+ end
54
+
55
+ context 'when no block is provided' do
56
+
57
+ it 'logs the message' do
58
+ expect(loggable.log(:debug, 'MONGO', [ operation ])).to be_nil
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Logger do
4
+
5
+ let(:logger) do
6
+ described_class.logger
7
+ end
8
+
9
+ describe '.debug' do
10
+
11
+ it 'logs a debug message' do
12
+ expect(logger).to receive(:debug).with("mongo.query | message | runtime: 10ms")
13
+ described_class.debug('mongo.query', 'message', '10ms')
14
+ end
15
+ end
16
+
17
+ describe '.error' do
18
+
19
+ it 'logs a error message' do
20
+ expect(logger).to receive(:error).with("mongo.query | message | runtime: 10ms")
21
+ described_class.error('mongo.query', 'message', '10ms')
22
+ end
23
+ end
24
+
25
+ describe '.fatal' do
26
+
27
+ it 'logs a fatal message' do
28
+ expect(logger).to receive(:fatal).with("mongo.query | message | runtime: 10ms")
29
+ described_class.fatal('mongo.query', 'message', '10ms')
30
+ end
31
+ end
32
+
33
+ describe '.info' do
34
+
35
+ it 'logs a info message' do
36
+ expect(logger).to receive(:info).with("mongo.query | message | runtime: 10ms")
37
+ described_class.info('mongo.query', 'message', '10ms')
38
+ end
39
+ end
40
+
41
+ describe '.logger' do
42
+
43
+ context 'when no logger has been set' do
44
+
45
+ let(:test_logger) do
46
+ Mongo::Logger.logger
47
+ end
48
+
49
+ before do
50
+ Mongo::Logger.logger = nil
51
+ end
52
+
53
+ after do
54
+ Mongo::Logger.logger = test_logger
55
+ end
56
+
57
+ it 'returns the default logger' do
58
+ expect(logger.level).to eq(Logger::DEBUG)
59
+ end
60
+ end
61
+
62
+ context 'when a logger has been set' do
63
+
64
+ let(:info) do
65
+ Logger.new($stdout).tap do |log|
66
+ log.level = Logger::INFO
67
+ end
68
+ end
69
+
70
+ let(:debug) do
71
+ Logger.new($stdout).tap do |log|
72
+ log.level = Logger::DEBUG
73
+ end
74
+ end
75
+
76
+ before do
77
+ described_class.logger = debug
78
+ end
79
+
80
+ after do
81
+ described_class.logger = info
82
+ end
83
+
84
+ it 'returns the provided logger' do
85
+ expect(logger.level).to eq(Logger::DEBUG)
86
+ end
87
+ end
88
+ end
89
+
90
+ describe '.warn' do
91
+
92
+ it 'logs a warn message' do
93
+ expect(logger).to receive(:warn).with("mongo.query | message | runtime: 10ms")
94
+ described_class.warn('mongo.query', 'message', '10ms')
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,80 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Operation::Aggregate::Result do
4
+
5
+ let(:result) do
6
+ described_class.new(reply)
7
+ end
8
+
9
+ let(:cursor_id) { 0 }
10
+ let(:documents) { [] }
11
+ let(:flags) { [] }
12
+ let(:starting_from) { 0 }
13
+
14
+ let(:reply) do
15
+ Mongo::Protocol::Reply.new.tap do |reply|
16
+ reply.instance_variable_set(:@flags, flags)
17
+ reply.instance_variable_set(:@cursor_id, cursor_id)
18
+ reply.instance_variable_set(:@starting_from, starting_from)
19
+ reply.instance_variable_set(:@number_returned, documents.size)
20
+ reply.instance_variable_set(:@documents, documents)
21
+ end
22
+ end
23
+
24
+ let(:aggregate) do
25
+ [
26
+ { '_id' => 'New York', 'totalpop' => 40270 },
27
+ { '_id' => 'Berlin', 'totalpop' => 103056 }
28
+ ]
29
+ end
30
+
31
+ describe '#cursor_id' do
32
+
33
+ context 'when the result is not using a cursor' do
34
+
35
+ let(:documents) do
36
+ [{ 'result' => aggregate, 'ok' => 1.0 }]
37
+ end
38
+
39
+ it 'returns zero' do
40
+ expect(result.cursor_id).to eq(0)
41
+ end
42
+ end
43
+
44
+ context 'when the result is using a cursor' do
45
+
46
+ let(:documents) do
47
+ [{ 'cursor' => { 'id' => 15, 'ns' => 'test', 'firstBatch' => aggregate }, 'ok' => 1.0 }]
48
+ end
49
+
50
+ it 'returns the cursor id' do
51
+ expect(result.cursor_id).to eq(15)
52
+ end
53
+ end
54
+ end
55
+
56
+ describe '#documents' do
57
+
58
+ context 'when the result is not using a cursor' do
59
+
60
+ let(:documents) do
61
+ [{ 'result' => aggregate, 'ok' => 1.0 }]
62
+ end
63
+
64
+ it 'returns the documents' do
65
+ expect(result.documents).to eq(aggregate)
66
+ end
67
+ end
68
+
69
+ context 'when the result is using a cursor' do
70
+
71
+ let(:documents) do
72
+ [{ 'cursor' => { 'id' => 15, 'ns' => 'test', 'firstBatch' => aggregate }, 'ok' => 1.0 }]
73
+ end
74
+
75
+ it 'returns the documents' do
76
+ expect(result.documents).to eq(aggregate)
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,127 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Operation::Aggregate do
4
+ include_context 'operation'
5
+
6
+ let(:selector) do
7
+ { :aggregate => coll_name,
8
+ :pipeline => [],
9
+ }
10
+ end
11
+ let(:spec) do
12
+ { :selector => selector,
13
+ :options => {},
14
+ :db_name => db_name
15
+ }
16
+ end
17
+ let(:op) { described_class.new(spec) }
18
+
19
+
20
+ describe '#initialize' do
21
+
22
+ context 'spec' do
23
+
24
+ it 'sets the spec' do
25
+ expect(op.spec).to be(spec)
26
+ end
27
+ end
28
+ end
29
+
30
+ describe '#==' do
31
+
32
+ context ' when two ops have different specs' do
33
+ let(:other_selector) do
34
+ { :aggregate => 'another_test_coll',
35
+ :pipeline => [],
36
+ }
37
+ end
38
+ let(:other_spec) do
39
+ { :selector => other_selector,
40
+ :options => options,
41
+ :db_name => db_name,
42
+ }
43
+ end
44
+ let(:other) { described_class.new(other_spec) }
45
+
46
+ it 'returns false' do
47
+ expect(op).not_to eq(other)
48
+ end
49
+ end
50
+ end
51
+
52
+ context '#merge' do
53
+ let(:other_op) { described_class.new(spec) }
54
+
55
+ it 'is not allowed' do
56
+ expect{ op.merge(other_op) }.to raise_exception
57
+ end
58
+ end
59
+
60
+ context '#merge!' do
61
+ let(:other_op) { described_class.new(spec) }
62
+
63
+ it 'is not allowed' do
64
+ expect{ op.merge!(other_op) }.to raise_exception
65
+ end
66
+ end
67
+
68
+ describe '#execute' do
69
+
70
+ context 'when the aggregation fails' do
71
+
72
+ let(:selector) do
73
+ { :aggregate => coll_name,
74
+ :pipeline => [{ '$invalid' => 'operator' }],
75
+ }
76
+ end
77
+
78
+ it 'raises an exception' do
79
+ expect {
80
+ op.execute(authorized_primary.context)
81
+ }.to raise_error(Mongo::Error::OperationFailure)
82
+ end
83
+ end
84
+
85
+ context 'rerouting' do
86
+
87
+ before do
88
+ allow_any_instance_of(Mongo::Operation::Aggregate::Result).to receive(:validate!) do
89
+ true
90
+ end
91
+ end
92
+
93
+ context 'when out is specified and server is a secondary' do
94
+ let(:selector) do
95
+ { :aggregate => 'test_coll',
96
+ :pipeline => [{ '$out' => 'test_coll' }],
97
+ }
98
+ end
99
+
100
+ it 'raises an error' do
101
+ allow_any_instance_of(Mongo::ServerSelector::Primary).to receive(:server) do
102
+ primary_server
103
+ end
104
+ expect {
105
+ op.execute(secondary_context)
106
+ }.to raise_error(Mongo::Error::NeedPrimaryServer)
107
+ end
108
+ end
109
+
110
+ context 'when out is specified and server is a primary' do
111
+ let(:selector) do
112
+ { :aggregate => 'test_coll',
113
+ :pipeline => [{ '$out' => 'test_coll' }],
114
+ }
115
+ end
116
+
117
+ it 'sends the operation to the primary' do
118
+ allow_any_instance_of(Mongo::ServerSelector::Primary).to receive(:server) do
119
+ primary_server
120
+ end
121
+ expect(primary_context).to receive(:with_connection)
122
+ op.execute(primary_context)
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end