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,362 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Collection do
4
+
5
+ describe '#==' do
6
+
7
+ let(:database) do
8
+ Mongo::Database.new(authorized_client, :test)
9
+ end
10
+
11
+ let(:collection) do
12
+ described_class.new(database, :users)
13
+ end
14
+
15
+ context 'when the names are the same' do
16
+
17
+ context 'when the databases are the same' do
18
+
19
+ let(:other) do
20
+ described_class.new(database, :users)
21
+ end
22
+
23
+ it 'returns true' do
24
+ expect(collection).to eq(other)
25
+ end
26
+ end
27
+
28
+ context 'when the databases are not the same' do
29
+
30
+ let(:other_db) do
31
+ Mongo::Database.new(authorized_client, :testing)
32
+ end
33
+
34
+ let(:other) do
35
+ described_class.new(other_db, :users)
36
+ end
37
+
38
+ it 'returns false' do
39
+ expect(collection).to_not eq(other)
40
+ end
41
+ end
42
+
43
+ context 'when the options are the same' do
44
+
45
+ let(:other) do
46
+ described_class.new(database, :users)
47
+ end
48
+
49
+ it 'returns true' do
50
+ expect(collection).to eq(other)
51
+ end
52
+ end
53
+
54
+ context 'when the options are not the same' do
55
+
56
+ let(:other) do
57
+ described_class.new(database, :users, :capped => true)
58
+ end
59
+
60
+ it 'returns false' do
61
+ expect(collection).to_not eq(other)
62
+ end
63
+ end
64
+ end
65
+
66
+ context 'when the names are not the same' do
67
+
68
+ let(:other) do
69
+ described_class.new(database, :sounds)
70
+ end
71
+
72
+ it 'returns false' do
73
+ expect(collection).to_not eq(other)
74
+ end
75
+ end
76
+
77
+ context 'when the object is not a collection' do
78
+
79
+ it 'returns false' do
80
+ expect(collection).to_not eq('test')
81
+ end
82
+ end
83
+ end
84
+
85
+ describe '#capped?' do
86
+
87
+ let(:database) do
88
+ authorized_client.database
89
+ end
90
+
91
+ context 'when the collection is capped' do
92
+
93
+ let(:collection) do
94
+ described_class.new(database, :specs, :capped => true, :size => 1024)
95
+ end
96
+
97
+ before do
98
+ collection.create
99
+ end
100
+
101
+ after do
102
+ collection.drop
103
+ end
104
+
105
+ it 'returns true' do
106
+ expect(collection).to be_capped
107
+ end
108
+ end
109
+
110
+ context 'when the collection is not capped' do
111
+
112
+ let(:collection) do
113
+ described_class.new(database, :specs)
114
+ end
115
+
116
+ before do
117
+ collection.create
118
+ end
119
+
120
+ after do
121
+ collection.drop
122
+ end
123
+
124
+ it 'returns false' do
125
+ expect(collection).to_not be_capped
126
+ end
127
+ end
128
+ end
129
+
130
+ describe '#create' do
131
+
132
+ let(:database) do
133
+ authorized_client.database
134
+ end
135
+
136
+ context 'when the collection has no options' do
137
+
138
+ let(:collection) do
139
+ described_class.new(database, :specs)
140
+ end
141
+
142
+ let!(:response) do
143
+ collection.create
144
+ end
145
+
146
+ after do
147
+ collection.drop
148
+ end
149
+
150
+ it 'executes the command' do
151
+ expect(response).to be_successful
152
+ end
153
+
154
+ it 'creates the collection in the database' do
155
+ expect(database.collection_names).to include('specs')
156
+ end
157
+ end
158
+
159
+ context 'when the collection has options' do
160
+
161
+ context 'when the collection is capped' do
162
+
163
+ shared_examples 'a capped collection command' do
164
+
165
+ let!(:response) do
166
+ collection.create
167
+ end
168
+
169
+ after do
170
+ collection.drop
171
+ end
172
+
173
+ it 'executes the command' do
174
+ expect(response).to be_successful
175
+ end
176
+
177
+ it 'sets the collection as capped' do
178
+ expect(collection).to be_capped
179
+ end
180
+
181
+ it 'creates the collection in the database' do
182
+ expect(database.collection_names).to include('specs')
183
+ end
184
+ end
185
+
186
+ context 'when instantiating a collection directly' do
187
+
188
+ let(:collection) do
189
+ described_class.new(database, :specs, :capped => true, :size => 1024)
190
+ end
191
+
192
+ it_behaves_like 'a capped collection command'
193
+ end
194
+
195
+ context 'when instantiating a collection through the database' do
196
+
197
+ let(:collection) do
198
+ authorized_client[:specs, :capped => true, :size => 1024]
199
+ end
200
+
201
+ it_behaves_like 'a capped collection command'
202
+ end
203
+ end
204
+ end
205
+ end
206
+
207
+ describe '#drop' do
208
+
209
+ let(:database) do
210
+ authorized_client.database
211
+ end
212
+
213
+ let(:collection) do
214
+ described_class.new(database, :specs)
215
+ end
216
+
217
+ before do
218
+ collection.create
219
+ end
220
+
221
+ let!(:response) do
222
+ collection.drop
223
+ end
224
+
225
+ it 'executes the command' do
226
+ expect(response).to be_successful
227
+ end
228
+
229
+ it 'drops the collection from the database' do
230
+ expect(database.collection_names).to_not include('specs')
231
+ end
232
+ end
233
+
234
+ describe '#find' do
235
+
236
+ context 'when provided a selector' do
237
+
238
+ let(:view) do
239
+ authorized_collection.find(name: 1)
240
+ end
241
+
242
+ it 'returns a authorized_collection view for the selector' do
243
+ expect(view.selector).to eq(name: 1)
244
+ end
245
+ end
246
+
247
+ context 'when provided no selector' do
248
+
249
+ let(:view) do
250
+ authorized_collection.find
251
+ end
252
+
253
+ it 'returns a authorized_collection view with an empty selector' do
254
+ expect(view.selector).to be_empty
255
+ end
256
+ end
257
+
258
+ context 'when iterating the authorized_collection view' do
259
+
260
+ before do
261
+ authorized_collection.insert_many([{ field: 'test1' }, { field: 'test2' }])
262
+ end
263
+
264
+ after do
265
+ authorized_collection.find.delete_many
266
+ end
267
+
268
+ let(:view) do
269
+ authorized_collection.find
270
+ end
271
+
272
+ it 'iterates over the documents' do
273
+ view.each do |document|
274
+ expect(document).to_not be_nil
275
+ end
276
+ end
277
+ end
278
+ end
279
+
280
+ describe '#insert_many' do
281
+
282
+ after do
283
+ authorized_collection.find.delete_many
284
+ end
285
+
286
+ let(:result) do
287
+ authorized_collection.insert_many([{ name: 'test1' }, { name: 'test2' }])
288
+ end
289
+
290
+ it 'inserts the documents into the collection', if: write_command_enabled? do
291
+ expect(result.written_count).to eq(2)
292
+ end
293
+
294
+ it 'inserts the documents into the collection', unless: write_command_enabled? do
295
+ expect(result.written_count).to eq(0)
296
+ end
297
+ end
298
+
299
+ describe '#insert_one' do
300
+
301
+ after do
302
+ authorized_collection.find.delete_many
303
+ end
304
+
305
+ let(:result) do
306
+ authorized_collection.insert_one({ name: 'testing' })
307
+ end
308
+
309
+ it 'inserts the document into the collection', if: write_command_enabled? do
310
+ expect(result.written_count).to eq(1)
311
+ end
312
+
313
+ it 'inserts the document into the collection', unless: write_command_enabled? do
314
+ expect(result.written_count).to eq(0)
315
+ end
316
+ end
317
+
318
+ describe '#inspect' do
319
+
320
+ it 'includes the object id' do
321
+ expect(authorized_collection.inspect).to include(authorized_collection.object_id.to_s)
322
+ end
323
+
324
+ it 'includes the namespace' do
325
+ expect(authorized_collection.inspect).to include(authorized_collection.namespace)
326
+ end
327
+ end
328
+
329
+ describe '#indexes' do
330
+
331
+ let(:index_spec) do
332
+ { name: 1 }
333
+ end
334
+
335
+ let(:batch_size) { nil }
336
+
337
+ let(:index_names) do
338
+ authorized_collection.indexes(batch_size: batch_size).collect { |i| i['name'] }
339
+ end
340
+
341
+ before do
342
+ authorized_collection.indexes.create_one(index_spec, unique: true)
343
+ end
344
+
345
+ after do
346
+ authorized_collection.indexes.drop_one('name_1')
347
+ end
348
+
349
+ it 'returns a list of indexes' do
350
+ expect(index_names).to include(*'name_1', '_id_')
351
+ end
352
+
353
+ context 'when batch size is specified' do
354
+
355
+ let(:batch_size) { 1 }
356
+
357
+ it 'returns a list of indexes' do
358
+ expect(index_names).to include(*'name_1', '_id_')
359
+ end
360
+ end
361
+ end
362
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'CRUD' do
4
+
5
+ CRUD_TESTS.each do |file|
6
+
7
+ spec = Mongo::CRUD::Spec.new(file)
8
+
9
+ context(spec.description) do
10
+
11
+ spec.tests.each do |test|
12
+
13
+ context(test.description) do
14
+
15
+ before(:each) do
16
+ authorized_collection.find.delete_many
17
+ end
18
+
19
+ after(:each) do
20
+ authorized_collection.find.delete_many
21
+ end
22
+
23
+ let(:results) do
24
+ test.run(authorized_collection)
25
+ end
26
+
27
+ it "returns the correct result" do
28
+ skip 'Test results only match with server version >= 2.6' if test.requires_2_6?(write_command_enabled?,
29
+ authorized_collection)
30
+ expect(results).to eq(test.result)
31
+ end
32
+
33
+ it 'has the correct data in the collection' do
34
+ skip 'Test results only match with server version >= 2.6' if test.requires_2_6?(write_command_enabled?,
35
+ authorized_collection)
36
+ expect(test.run(authorized_collection)).to match_collection_data(test)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,295 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Cursor do
4
+
5
+ describe '#each' do
6
+
7
+ let(:reply) do
8
+ Mongo::Operation::Read::Query.new(query_spec).execute(authorized_primary.context)
9
+ end
10
+
11
+ let(:cursor) do
12
+ described_class.new(view, reply, authorized_primary)
13
+ end
14
+
15
+ context 'when no options are provided to the view' do
16
+
17
+ let(:view) do
18
+ Mongo::Collection::View.new(authorized_collection)
19
+ end
20
+
21
+ let(:query_spec) do
22
+ { :selector => {}, :options => {}, :db_name => TEST_DB, :coll_name => TEST_COLL }
23
+ end
24
+
25
+ context 'when the initial query retieves all documents' do
26
+
27
+ let(:documents) do
28
+ (1..10).map{ |i| { field: "test#{i}" }}
29
+ end
30
+
31
+ before do
32
+ authorized_collection.insert_many(documents)
33
+ end
34
+
35
+ after do
36
+ authorized_collection.find.delete_many
37
+ end
38
+
39
+ it 'returns the correct amount' do
40
+ expect(cursor.to_a.count).to eq(10)
41
+ end
42
+
43
+ it 'iterates the documents' do
44
+ cursor.each do |doc|
45
+ expect(doc).to have_key('field')
46
+ end
47
+ end
48
+ end
49
+
50
+ context 'when the initial query does not retrieve all documents' do
51
+
52
+ let(:documents) do
53
+ (1..102).map{ |i| { field: "test#{i}" }}
54
+ end
55
+
56
+ before do
57
+ authorized_collection.insert_many(documents)
58
+ end
59
+
60
+ after do
61
+ authorized_collection.find.delete_many
62
+ end
63
+
64
+ it 'returns the correct amount' do
65
+ expect(cursor.to_a.count).to eq(102)
66
+ end
67
+
68
+ it 'iterates the documents' do
69
+ cursor.each do |doc|
70
+ expect(doc).to have_key('field')
71
+ end
72
+ end
73
+ end
74
+ end
75
+
76
+ context 'when options are provided to the view' do
77
+
78
+ let(:documents) do
79
+ (1..10).map{ |i| { field: "test#{i}" }}
80
+ end
81
+
82
+ before do
83
+ authorized_collection.insert_many(documents)
84
+ end
85
+
86
+ after do
87
+ authorized_collection.find.delete_many
88
+ end
89
+
90
+ context 'when a limit is provided' do
91
+
92
+ context 'when no batch size is provided' do
93
+
94
+ context 'when the limit is positive' do
95
+
96
+ let(:view) do
97
+ Mongo::Collection::View.new(authorized_collection, {}, :limit => 2)
98
+ end
99
+
100
+ let(:query_spec) do
101
+ {
102
+ :selector => {},
103
+ :options => { :limit => 2 },
104
+ :db_name => TEST_DB,
105
+ :coll_name => TEST_COLL
106
+ }
107
+ end
108
+
109
+ it 'returns the correct amount' do
110
+ expect(cursor.to_a.count).to eq(2)
111
+ end
112
+
113
+ it 'iterates the documents' do
114
+ cursor.each do |doc|
115
+ expect(doc).to have_key('field')
116
+ end
117
+ end
118
+ end
119
+
120
+ context 'when the limit is negative' do
121
+
122
+ let(:view) do
123
+ Mongo::Collection::View.new(authorized_collection, {}, :limit => -2)
124
+ end
125
+
126
+ let(:query_spec) do
127
+ {
128
+ :selector => {},
129
+ :options => { :limit => -2 },
130
+ :db_name => TEST_DB,
131
+ :coll_name => TEST_COLL
132
+ }
133
+ end
134
+
135
+ it 'returns the positive number of documents' do
136
+ expect(cursor.to_a.count).to eq(2)
137
+ end
138
+
139
+ it 'iterates the documents' do
140
+ cursor.each do |doc|
141
+ expect(doc).to have_key('field')
142
+ end
143
+ end
144
+ end
145
+
146
+ context 'when the limit is zero' do
147
+
148
+ let(:view) do
149
+ Mongo::Collection::View.new(authorized_collection, {}, :limit => 0)
150
+ end
151
+
152
+ let(:query_spec) do
153
+ {
154
+ :selector => {},
155
+ :options => { :limit => 0 },
156
+ :db_name => TEST_DB,
157
+ :coll_name => TEST_COLL
158
+ }
159
+ end
160
+
161
+ it 'returns all documents' do
162
+ expect(cursor.to_a.count).to eq(10)
163
+ end
164
+
165
+ it 'iterates the documents' do
166
+ cursor.each do |doc|
167
+ expect(doc).to have_key('field')
168
+ end
169
+ end
170
+ end
171
+ end
172
+
173
+ context 'when a batch size is provided' do
174
+
175
+ context 'when the batch size is less than the limit' do
176
+
177
+ let(:view) do
178
+ Mongo::Collection::View.new(
179
+ authorized_collection,
180
+ {},
181
+ :limit => 5, :batch_size => 3
182
+ )
183
+ end
184
+
185
+ let(:query_spec) do
186
+ {
187
+ :selector => {},
188
+ :options => { :limit => 5, :batch_size => 3 },
189
+ :db_name => TEST_DB,
190
+ :coll_name => TEST_COLL
191
+ }
192
+ end
193
+
194
+ it 'returns the limited number of documents' do
195
+ expect(cursor.to_a.count).to eq(5)
196
+ end
197
+
198
+ it 'iterates the documents' do
199
+ cursor.each do |doc|
200
+ expect(doc).to have_key('field')
201
+ end
202
+ end
203
+ end
204
+
205
+ context 'when the batch size is more than the limit' do
206
+
207
+ let(:view) do
208
+ Mongo::Collection::View.new(
209
+ authorized_collection,
210
+ {},
211
+ :limit => 5, :batch_size => 7
212
+ )
213
+ end
214
+
215
+ let(:query_spec) do
216
+ {
217
+ :selector => {},
218
+ :options => { :limit => 5, :batch_size => 7 },
219
+ :db_name => TEST_DB,
220
+ :coll_name => TEST_COLL
221
+ }
222
+ end
223
+
224
+ it 'returns the limited number of documents' do
225
+ expect(cursor.to_a.count).to eq(5)
226
+ end
227
+
228
+ it 'iterates the documents' do
229
+ cursor.each do |doc|
230
+ expect(doc).to have_key('field')
231
+ end
232
+ end
233
+ end
234
+
235
+ context 'when the batch size is the same as the limit' do
236
+
237
+ let(:view) do
238
+ Mongo::Collection::View.new(
239
+ authorized_collection,
240
+ {},
241
+ :limit => 5, :batch_size => 5
242
+ )
243
+ end
244
+
245
+ let(:query_spec) do
246
+ {
247
+ :selector => {},
248
+ :options => { :limit => 5, :batch_size => 5 },
249
+ :db_name => TEST_DB,
250
+ :coll_name => TEST_COLL
251
+ }
252
+ end
253
+
254
+ it 'returns the limited number of documents' do
255
+ expect(cursor.to_a.count).to eq(5)
256
+ end
257
+
258
+ it 'iterates the documents' do
259
+ cursor.each do |doc|
260
+ expect(doc).to have_key('field')
261
+ end
262
+ end
263
+ end
264
+ end
265
+ end
266
+ end
267
+ end
268
+
269
+ describe '#inspect' do
270
+
271
+ let(:view) do
272
+ Mongo::Collection::View.new(authorized_collection)
273
+ end
274
+
275
+ let(:query_spec) do
276
+ { :selector => {}, :options => {}, :db_name => TEST_DB, :coll_name => TEST_COLL }
277
+ end
278
+
279
+ let(:reply) do
280
+ Mongo::Operation::Read::Query.new(query_spec)
281
+ end
282
+
283
+ let(:cursor) do
284
+ described_class.new(view, reply, authorized_primary)
285
+ end
286
+
287
+ it 'returns a string' do
288
+ expect(cursor.inspect).to be_a(String)
289
+ end
290
+
291
+ it 'returns a string containing the collection view inspect string' do
292
+ expect(cursor.inspect).to match(/.*#{view.inspect}.*/)
293
+ end
294
+ end
295
+ end