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,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Operation::Write::RemoveUser do
4
+
5
+ describe '#execute' do
6
+
7
+ before do
8
+ root_authorized_client.database.users.create(
9
+ 'durran',
10
+ password: 'password', roles: [ Mongo::Auth::Roles::READ_WRITE ]
11
+ )
12
+ end
13
+
14
+ let(:operation) do
15
+ described_class.new(user_name: 'durran', db_name: TEST_DB)
16
+ end
17
+
18
+ context 'when user removal was successful' do
19
+
20
+ let!(:response) do
21
+ operation.execute(root_authorized_primary.context)
22
+ end
23
+
24
+ it 'removes the user from the database' do
25
+ expect(response).to be_successful
26
+ end
27
+ end
28
+
29
+ context 'when removal was not successful' do
30
+
31
+ before do
32
+ operation.execute(root_authorized_primary.context)
33
+ end
34
+
35
+ it 'raises an exception', if: write_command_enabled? do
36
+ expect {
37
+ operation.execute(root_authorized_primary.context)
38
+ }.to raise_error(Mongo::Error::OperationFailure)
39
+ end
40
+
41
+ it 'does not raise an exception', unless: write_command_enabled? do
42
+ expect(operation.execute(root_authorized_primary.context).written_count).to eq(0)
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,85 @@
1
+ require 'spec_helper'
2
+
3
+ # describe Mongo::Operation::Write::Response do
4
+
5
+ # describe '#initialize' do
6
+
7
+ # let(:response) do
8
+ # described_class.new(reply)
9
+ # end
10
+
11
+ # context 'when the reply is successful' do
12
+
13
+ # let(:reply) do
14
+ # Mongo::Protocol::Reply.new
15
+ # end
16
+
17
+ # let(:documents) do
18
+ # [{ 'ok' => 1.0, 'n' => 1 }]
19
+ # end
20
+
21
+ # before do
22
+ # reply.instance_variable_set(:@documents, documents)
23
+ # end
24
+
25
+ # it 'sets the documents on the response' do
26
+ # expect(response.documents).to eq(documents)
27
+ # end
28
+
29
+ # it 'sets the written count' do
30
+ # expect(response.n).to eq(1)
31
+ # end
32
+ # end
33
+
34
+ # context 'when the reply is not successful' do
35
+
36
+ # let(:reply) do
37
+ # Mongo::Protocol::Reply.new
38
+ # end
39
+
40
+ # let(:documents) do
41
+ # [{ 'ok' => 0.0, 'n' => 1 }]
42
+ # end
43
+
44
+ # before do
45
+ # reply.instance_variable_set(:@documents, documents)
46
+ # end
47
+
48
+ # it 'raises an exception' do
49
+ # expect { response }.to raise_error
50
+ # end
51
+ # end
52
+
53
+ # context 'when the reply is nil' do
54
+
55
+ # let(:reply) { nil }
56
+
57
+ # it 'does not raise an exception' do
58
+ # expect(response.documents).to be_empty
59
+ # end
60
+
61
+ # it 'does not set the written count' do
62
+ # expect(response.n).to be_nil
63
+ # end
64
+ # end
65
+
66
+ # context 'when providing a count' do
67
+
68
+ # let(:reply) do
69
+ # Mongo::Protocol::Reply.new
70
+ # end
71
+
72
+ # let(:response) do
73
+ # described_class.new(reply, 5)
74
+ # end
75
+
76
+ # before do
77
+ # reply.instance_variable_set(:@documents, [{ 'ok' => 1 }])
78
+ # end
79
+
80
+ # it 'sets the document count' do
81
+ # expect(response.n).to eq(5)
82
+ # end
83
+ # end
84
+ # end
85
+ # end
@@ -0,0 +1,228 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Operation::Write::Update do
4
+
5
+ let(:document) do
6
+ { :q => { :foo => 1 },
7
+ :u => { :$set => { :bar => 1 } },
8
+ :multi => true,
9
+ :upsert => false }
10
+ end
11
+
12
+ let(:spec) do
13
+ { :update => document,
14
+ :db_name => TEST_DB,
15
+ :coll_name => TEST_COLL,
16
+ :write_concern => Mongo::WriteConcern.get(:w => 1),
17
+ :ordered => true
18
+ }
19
+ end
20
+
21
+ let(:update) do
22
+ described_class.new(spec)
23
+ end
24
+
25
+ describe '#initialize' do
26
+
27
+ context 'spec' do
28
+
29
+ it 'sets the spec' do
30
+ expect(update.spec).to eq(spec)
31
+ end
32
+ end
33
+ end
34
+
35
+ describe '#==' do
36
+
37
+ context 'spec' do
38
+
39
+ context 'when two ops have the same specs' do
40
+
41
+ let(:other) { described_class.new(spec) }
42
+
43
+ it 'returns true' do
44
+ expect(update).to eq(other)
45
+ end
46
+ end
47
+
48
+ context 'when two ops have different specs' do
49
+ let(:other_doc) { {:q => { :foo => 1 },
50
+ :u => { :$set => { :bar => 1 } },
51
+ :multi => true,
52
+ :upsert => true } }
53
+ let(:other_spec) do
54
+ { :update => other_doc,
55
+ :db_name => TEST_DB,
56
+ :coll_name => TEST_COLL,
57
+ :write_concern => Mongo::WriteConcern.get(:w => 1),
58
+ :ordered => true
59
+ }
60
+ end
61
+
62
+ let(:other) { described_class.new(other_spec) }
63
+
64
+ it 'returns false' do
65
+ expect(update).not_to eq(other)
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ describe '#execute' do
72
+
73
+ before do
74
+ authorized_collection.insert_many([
75
+ { name: 'test', field: 'test', other: 'test' },
76
+ { name: 'testing', field: 'test', other: 'test' }
77
+ ])
78
+ end
79
+
80
+ after do
81
+ authorized_collection.find.delete_many
82
+ end
83
+
84
+ context 'when updating a single document' do
85
+
86
+ let(:update) do
87
+ described_class.new({
88
+ update: document,
89
+ db_name: TEST_DB,
90
+ coll_name: TEST_COLL,
91
+ write_concern: Mongo::WriteConcern.get(:w => 1)
92
+ })
93
+ end
94
+
95
+ context 'when the update succeeds' do
96
+
97
+ let(:document) do
98
+ { q: { name: 'test' }, u: { '$set' => { field: 'blah' }}, limit: 1 }
99
+ end
100
+
101
+ let(:result) do
102
+ update.execute(authorized_primary.context)
103
+ end
104
+
105
+ it 'updates the document' do
106
+ expect(result.written_count).to eq(1)
107
+ end
108
+
109
+ it 'reports the modified count' do
110
+ expect(result.modified_count).to eq(1)
111
+ end
112
+
113
+ it 'reports the matched count' do
114
+ expect(result.matched_count).to eq(1)
115
+ end
116
+
117
+ it 'reports the upserted id as nil' do
118
+ expect(result.upserted_id).to eq(nil)
119
+ end
120
+ end
121
+
122
+ context 'when the update fails' do
123
+
124
+ let(:document) do
125
+ { q: { name: 'test' }, u: { '$st' => { field: 'blah' } } }
126
+ end
127
+
128
+ it 'raises an exception' do
129
+ expect {
130
+ update.execute(authorized_primary.context)
131
+ }.to raise_error(Mongo::Error::OperationFailure)
132
+ end
133
+ end
134
+ end
135
+
136
+ context 'when updating multiple documents' do
137
+
138
+ let(:update) do
139
+ described_class.new({
140
+ update: document,
141
+ db_name: TEST_DB,
142
+ coll_name: TEST_COLL,
143
+ write_concern: Mongo::WriteConcern.get(:w => 1)
144
+ })
145
+ end
146
+
147
+ context 'when the updates succeed' do
148
+
149
+ let(:document) do
150
+ { q: { field: 'test' }, u: { '$set' => { other: 'blah' }}, multi: true }
151
+ end
152
+
153
+ let(:result) do
154
+ update.execute(authorized_primary.context)
155
+ end
156
+
157
+ it 'updates the documents' do
158
+ expect(result.written_count).to eq(2)
159
+ end
160
+
161
+ it 'reports the modified count' do
162
+ expect(result.modified_count).to eq(2)
163
+ end
164
+
165
+ it 'reports the matched count' do
166
+ expect(result.matched_count).to eq(2)
167
+ end
168
+
169
+ it 'reports the upserted id as nil' do
170
+ expect(result.upserted_id).to eq(nil)
171
+ end
172
+ end
173
+
174
+ context 'when an update fails' do
175
+
176
+ let(:document) do
177
+ { q: { name: 'test' }, u: { '$st' => { field: 'blah' } }, multi: true }
178
+ end
179
+
180
+ it 'raises an exception' do
181
+ expect {
182
+ update.execute(authorized_primary.context)
183
+ }.to raise_error(Mongo::Error::OperationFailure)
184
+ end
185
+ end
186
+
187
+ context 'when a document exceeds max bson size' do
188
+
189
+ let(:document) do
190
+ { q: { name: 't'*17000000}, u: { '$set' => { field: 'blah' } } }
191
+ end
192
+
193
+ it 'raises an error' do
194
+ expect {
195
+ update.execute(authorized_primary.context)
196
+ }.to raise_error(Mongo::Error::MaxBSONSize)
197
+ end
198
+ end
199
+
200
+ context 'when upsert is true' do
201
+
202
+ let(:document) do
203
+ { q: { field: 'non-existent' }, u: { '$set' => { other: 'blah' }}, upsert: true }
204
+ end
205
+
206
+ let(:result) do
207
+ update.execute(authorized_primary.context)
208
+ end
209
+
210
+ it 'inserts the document' do
211
+ expect(result.written_count).to eq(1)
212
+ end
213
+
214
+ it 'reports the modified count' do
215
+ expect(result.modified_count).to eq(0)
216
+ end
217
+
218
+ it 'reports the matched count' do
219
+ expect(result.matched_count).to eq(0)
220
+ end
221
+
222
+ it 'retruns the upserted id' do
223
+ expect(result.upserted_id).to be_a(BSON::ObjectId)
224
+ end
225
+ end
226
+ end
227
+ end
228
+ end
@@ -0,0 +1,167 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Protocol::Delete do
4
+
5
+ let(:opcode) { 2006 }
6
+ let(:db) { TEST_DB }
7
+ let(:coll) { TEST_COLL }
8
+ let(:ns) { "#{db}.#{coll}" }
9
+ let(:selector) { { :name => 'Tyler' } }
10
+ let(:options) { Hash.new }
11
+
12
+ let(:message) do
13
+ described_class.new(db, coll, selector, options)
14
+ end
15
+
16
+ describe '#initialize' do
17
+
18
+ it 'sets the namepsace' do
19
+ expect(message.namespace).to eq(ns)
20
+ end
21
+
22
+ it 'sets the selector' do
23
+ expect(message.selector).to eq(selector)
24
+ end
25
+
26
+ context 'when options are provided' do
27
+
28
+ context 'when flags are provided' do
29
+ let(:options) { { :flags => [:single_remove] } }
30
+
31
+ it 'sets the flags' do
32
+ expect(message.flags).to eq(options[:flags])
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ describe '#==' do
39
+
40
+ context 'when the other is a delete' do
41
+
42
+ context 'when the fields are equal' do
43
+ let(:other) do
44
+ described_class.new(db, coll, selector, options)
45
+ end
46
+
47
+ it 'returns true' do
48
+ expect(message).to eq(other)
49
+ end
50
+ end
51
+
52
+ context 'when the database is not equal' do
53
+ let(:other) do
54
+ described_class.new('tyler', coll, selector, options)
55
+ end
56
+
57
+ it 'returns false' do
58
+ expect(message).not_to eq(other)
59
+ end
60
+ end
61
+
62
+ context 'when the collection is not equal' do
63
+ let(:other) do
64
+ described_class.new(db, 'tyler', selector, options)
65
+ end
66
+
67
+ it 'returns false' do
68
+ expect(message).not_to eq(other)
69
+ end
70
+ end
71
+
72
+ context 'when the selector is not equal' do
73
+ let(:other) do
74
+ described_class.new(db, coll, { :a => 1 }, options)
75
+ end
76
+
77
+ it 'returns false' do
78
+ expect(message).not_to eq(other)
79
+ end
80
+ end
81
+
82
+ context 'when the options are not equal' do
83
+ let(:other) do
84
+ described_class.new(db, coll, selector, :flags => [:single_remove])
85
+ end
86
+
87
+ it 'returns false' do
88
+ expect(message).not_to eq(other)
89
+ end
90
+ end
91
+ end
92
+
93
+ context 'when the other is not a delete' do
94
+ let(:other) do
95
+ expect(message).not_to eq('test')
96
+ end
97
+ end
98
+ end
99
+
100
+ describe '#hash' do
101
+ let(:values) do
102
+ message.send(:fields).map do |field|
103
+ message.instance_variable_get(field[:name])
104
+ end
105
+ end
106
+
107
+ it 'returns a hash of the field values' do
108
+ expect(message.hash).to eq(values.hash)
109
+ end
110
+ end
111
+
112
+ describe '#replyable?' do
113
+
114
+ it 'returns false' do
115
+ expect(message).to_not be_replyable
116
+ end
117
+ end
118
+
119
+ describe '#serialize' do
120
+ let(:bytes) { message.serialize }
121
+
122
+ include_examples 'message with a header'
123
+
124
+ describe 'zero' do
125
+ let(:field) { bytes[16..19] }
126
+
127
+ it 'serializes a zero' do
128
+ expect(field).to be_int32(0)
129
+ end
130
+ end
131
+
132
+ describe 'namespace' do
133
+ let(:field) { bytes[20..36] }
134
+ it 'serializes the namespace' do
135
+ expect(field).to be_cstring(ns)
136
+ end
137
+ end
138
+
139
+ describe 'flags' do
140
+ let(:field) { bytes[37..40] }
141
+
142
+ context 'when no flags are provided' do
143
+ it 'does not set any bits' do
144
+ expect(field).to be_int32(0)
145
+ end
146
+ end
147
+
148
+ context 'when flags are provided' do
149
+ let(:options) { { :flags => flags } }
150
+
151
+ context 'single remove flag' do
152
+ let(:flags) { [:single_remove] }
153
+ it 'sets the first bit' do
154
+ expect(field).to be_int32(1)
155
+ end
156
+ end
157
+ end
158
+ end
159
+
160
+ describe 'selector' do
161
+ let(:field) { bytes[41..-1] }
162
+ it 'serializes the selector' do
163
+ expect(field).to be_bson(selector)
164
+ end
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,146 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Protocol::GetMore do
4
+
5
+ let(:opcode) { 2005 }
6
+ let(:db) { TEST_DB }
7
+ let(:coll) { TEST_COLL }
8
+ let(:ns) { "#{db}.#{coll}" }
9
+ let(:limit) { 25 }
10
+ let(:cursor_id) { 12345 }
11
+
12
+ let(:message) do
13
+ described_class.new(db, coll, limit, cursor_id)
14
+ end
15
+
16
+ describe '#initialize' do
17
+
18
+ it 'sets the namepsace' do
19
+ expect(message.namespace).to eq(ns)
20
+ end
21
+
22
+ it 'sets the number to return' do
23
+ expect(message.number_to_return).to eq(limit)
24
+ end
25
+
26
+ it 'sets the cursor id' do
27
+ expect(message.cursor_id).to eq(cursor_id)
28
+ end
29
+ end
30
+
31
+ describe '#==' do
32
+
33
+ context 'when the other is a getmore' do
34
+
35
+ context 'when the fields are equal' do
36
+ let(:other) do
37
+ described_class.new(db, coll, limit, cursor_id)
38
+ end
39
+
40
+ it 'returns true' do
41
+ expect(message).to eq(other)
42
+ end
43
+ end
44
+
45
+ context 'when the database is not equal' do
46
+ let(:other) do
47
+ described_class.new('tyler', coll, limit, cursor_id)
48
+ end
49
+
50
+ it 'returns false' do
51
+ expect(message).not_to eq(other)
52
+ end
53
+ end
54
+
55
+ context 'when the collection is not equal' do
56
+ let(:other) do
57
+ described_class.new(db, 'tyler', limit, cursor_id)
58
+ end
59
+
60
+ it 'returns false' do
61
+ expect(message).not_to eq(other)
62
+ end
63
+ end
64
+
65
+ context 'when the limit is not equal' do
66
+ let(:other) do
67
+ described_class.new(db, coll, 123, cursor_id)
68
+ end
69
+
70
+ it 'returns false' do
71
+ expect(message).not_to eq(other)
72
+ end
73
+ end
74
+
75
+ context 'when the cursor id is not equal' do
76
+ let(:other) do
77
+ described_class.new(db, coll, limit, 7777)
78
+ end
79
+
80
+ it 'returns false' do
81
+ expect(message).not_to eq(other)
82
+ end
83
+ end
84
+ end
85
+
86
+ context 'when the other is not a getmore' do
87
+ let(:other) do
88
+ expect(message).not_to eq('test')
89
+ end
90
+ end
91
+ end
92
+
93
+ describe '#hash' do
94
+ let(:values) do
95
+ message.send(:fields).map do |field|
96
+ message.instance_variable_get(field[:name])
97
+ end
98
+ end
99
+
100
+ it 'returns a hash of the field values' do
101
+ expect(message.hash).to eq(values.hash)
102
+ end
103
+ end
104
+
105
+ describe '#replyable?' do
106
+
107
+ it 'returns true' do
108
+ expect(message).to be_replyable
109
+ end
110
+ end
111
+
112
+ describe '#serialize' do
113
+ let(:bytes) { message.serialize }
114
+
115
+ include_examples 'message with a header'
116
+
117
+ describe 'zero' do
118
+ let(:field) { bytes[16..19] }
119
+
120
+ it 'does not set any bits' do
121
+ expect(field).to be_int32(0)
122
+ end
123
+ end
124
+
125
+ describe 'namespace' do
126
+ let(:field) { bytes[20..36] }
127
+ it 'serializes the namespace' do
128
+ expect(field).to be_cstring(ns)
129
+ end
130
+ end
131
+
132
+ describe 'number to return' do
133
+ let(:field) { bytes[37..40] }
134
+ it 'serializes the number to return' do
135
+ expect(field).to be_int32(limit)
136
+ end
137
+ end
138
+
139
+ describe 'cursor id' do
140
+ let(:field) { bytes[41..48] }
141
+ it 'serializes the cursor id' do
142
+ expect(field).to be_int64(cursor_id)
143
+ end
144
+ end
145
+ end
146
+ end