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,679 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Collection::View::Writable do
4
+
5
+ let(:selector) do
6
+ {}
7
+ end
8
+
9
+ let(:options) do
10
+ {}
11
+ end
12
+
13
+ let(:view) do
14
+ Mongo::Collection::View.new(authorized_collection, selector, options)
15
+ end
16
+
17
+ after do
18
+ authorized_collection.find.delete_many
19
+ end
20
+
21
+ describe '#find_one_and_delete' do
22
+
23
+ before do
24
+ authorized_collection.insert_many([{ field: 'test1' }])
25
+ end
26
+
27
+ context 'when a matching document is found' do
28
+
29
+ let(:selector) do
30
+ { field: 'test1' }
31
+ end
32
+
33
+ context 'when no options are provided' do
34
+
35
+ let!(:document) do
36
+ view.find_one_and_delete
37
+ end
38
+
39
+ it 'deletes the document from the database' do
40
+ expect(view.to_a).to be_empty
41
+ end
42
+
43
+ it 'returns the document' do
44
+ expect(document['field']).to eq('test1')
45
+ end
46
+ end
47
+
48
+ context 'when a projection is provided' do
49
+
50
+ let!(:document) do
51
+ view.projection(_id: 1).find_one_and_delete
52
+ end
53
+
54
+ it 'deletes the document from the database' do
55
+ expect(view.to_a).to be_empty
56
+ end
57
+
58
+ it 'returns the document with limited fields' do
59
+ expect(document['field']).to be_nil
60
+ expect(document['_id']).to_not be_nil
61
+ end
62
+ end
63
+
64
+ context 'when a sort is provided' do
65
+
66
+ let!(:document) do
67
+ view.sort(field: 1).find_one_and_delete
68
+ end
69
+
70
+ it 'deletes the document from the database' do
71
+ expect(view.to_a).to be_empty
72
+ end
73
+
74
+ it 'returns the document with limited fields' do
75
+ expect(document['field']).to eq('test1')
76
+ end
77
+ end
78
+ end
79
+
80
+ context 'when no matching document is found' do
81
+
82
+ let(:selector) do
83
+ { field: 'test5' }
84
+ end
85
+
86
+ let!(:document) do
87
+ view.find_one_and_delete
88
+ end
89
+
90
+ it 'returns nil' do
91
+ expect(document).to be_nil
92
+ end
93
+ end
94
+ end
95
+
96
+ describe '#find_one_and_replace' do
97
+
98
+ before do
99
+ authorized_collection.insert_many([{ field: 'test1', other: 'sth' }])
100
+ end
101
+
102
+ context 'when a matching document is found' do
103
+
104
+ let(:selector) do
105
+ { field: 'test1' }
106
+ end
107
+
108
+ context 'when no options are provided' do
109
+
110
+ let(:document) do
111
+ view.find_one_and_replace({ field: 'testing' })
112
+ end
113
+
114
+ it 'returns the original document' do
115
+ expect(document['field']).to eq('test1')
116
+ end
117
+ end
118
+
119
+ context 'when return_document options are provided' do
120
+
121
+ let(:document) do
122
+ view.find_one_and_replace({ field: 'testing' }, :return_document => :after)
123
+ end
124
+
125
+ it 'returns the new document' do
126
+ expect(document['field']).to eq('testing')
127
+ end
128
+
129
+ it 'replaces the document' do
130
+ expect(document['other']).to be_nil
131
+ end
132
+ end
133
+
134
+ context 'when a projection is provided' do
135
+
136
+ let(:document) do
137
+ view.projection(_id: 1).find_one_and_replace({ field: 'testing' })
138
+ end
139
+
140
+ it 'returns the document with limited fields' do
141
+ expect(document['field']).to be_nil
142
+ expect(document['_id']).to_not be_nil
143
+ end
144
+ end
145
+
146
+ context 'when a sort is provided' do
147
+
148
+ let(:document) do
149
+ view.sort(field: 1).find_one_and_replace({ field: 'testing' })
150
+ end
151
+
152
+ it 'returns the original document' do
153
+ expect(document['field']).to eq('test1')
154
+ end
155
+ end
156
+ end
157
+
158
+ context 'when no matching document is found' do
159
+
160
+ context 'when no upsert options are provided' do
161
+
162
+ let(:selector) do
163
+ { field: 'test5' }
164
+ end
165
+
166
+ let(:document) do
167
+ view.find_one_and_replace({ field: 'testing' })
168
+ end
169
+
170
+ it 'returns nil' do
171
+ expect(document).to be_nil
172
+ end
173
+ end
174
+
175
+ context 'when upsert options are provided' do
176
+
177
+ let(:selector) do
178
+ { field: 'test5' }
179
+ end
180
+
181
+ let(:document) do
182
+ view.find_one_and_replace({ field: 'testing' }, :upsert => true, :return_document => :after)
183
+ end
184
+
185
+ it 'returns the new document' do
186
+ expect(document['field']).to eq('testing')
187
+ end
188
+ end
189
+ end
190
+ end
191
+
192
+ describe '#find_one_and_update' do
193
+
194
+ before do
195
+ authorized_collection.insert_many([{ field: 'test1' }])
196
+ end
197
+
198
+ context 'when a matching document is found' do
199
+
200
+ let(:selector) do
201
+ { field: 'test1' }
202
+ end
203
+
204
+ context 'when no options are provided' do
205
+
206
+ let(:document) do
207
+ view.find_one_and_update({ '$set' => { field: 'testing' }})
208
+ end
209
+
210
+ it 'returns the original document' do
211
+ expect(document['field']).to eq('test1')
212
+ end
213
+ end
214
+
215
+ context 'when return_document options are provided' do
216
+
217
+ let(:document) do
218
+ view.find_one_and_update({ '$set' => { field: 'testing' }}, :return_document => :after)
219
+ end
220
+
221
+ it 'returns the new document' do
222
+ expect(document['field']).to eq('testing')
223
+ end
224
+ end
225
+
226
+ context 'when a projection is provided' do
227
+
228
+ let(:document) do
229
+ view.projection(_id: 1).find_one_and_update({ '$set' => { field: 'testing' }})
230
+ end
231
+
232
+ it 'returns the document with limited fields' do
233
+ expect(document['field']).to be_nil
234
+ expect(document['_id']).to_not be_nil
235
+ end
236
+ end
237
+
238
+ context 'when a sort is provided' do
239
+
240
+ let(:document) do
241
+ view.sort(field: 1).find_one_and_update({ '$set' => { field: 'testing' }})
242
+ end
243
+
244
+ it 'returns the original document' do
245
+ expect(document['field']).to eq('test1')
246
+ end
247
+ end
248
+ end
249
+
250
+ context 'when no matching document is found' do
251
+
252
+ let(:selector) do
253
+ { field: 'test5' }
254
+ end
255
+
256
+ let(:document) do
257
+ view.find_one_and_update({ '$set' => { field: 'testing' }})
258
+ end
259
+
260
+ it 'returns nil' do
261
+ expect(document).to be_nil
262
+ end
263
+ end
264
+ end
265
+
266
+ describe '#delete_many' do
267
+
268
+ context 'when a selector was provided' do
269
+
270
+ let(:selector) do
271
+ { field: 'test1' }
272
+ end
273
+
274
+ before do
275
+ authorized_collection.insert_many([{ field: 'test1' }, { field: 'test2' }])
276
+ end
277
+
278
+ let(:response) do
279
+ view.delete_many
280
+ end
281
+
282
+ it 'deletes the matching documents in the collection' do
283
+ expect(response.written_count).to eq(1)
284
+ end
285
+ end
286
+
287
+ context 'when no selector was provided' do
288
+
289
+ before do
290
+ authorized_collection.insert_many([{ field: 'test1' }, { field: 'test2' }])
291
+ end
292
+
293
+ let(:response) do
294
+ view.delete_many
295
+ end
296
+
297
+ it 'deletes all the documents in the collection' do
298
+ expect(response.written_count).to eq(2)
299
+ end
300
+ end
301
+ end
302
+
303
+ describe '#delete_one' do
304
+
305
+ context 'when a selector was provided' do
306
+
307
+ let(:selector) do
308
+ { field: 'test1' }
309
+ end
310
+
311
+ before do
312
+ authorized_collection.insert_many([
313
+ { field: 'test1' },
314
+ { field: 'test1' },
315
+ { field: 'test1' }
316
+ ])
317
+ end
318
+
319
+ let(:response) do
320
+ view.delete_one
321
+ end
322
+
323
+ it 'deletes the first matching document in the collection' do
324
+ expect(response.written_count).to eq(1)
325
+ end
326
+ end
327
+
328
+ context 'when no selector was provided' do
329
+
330
+ before do
331
+ authorized_collection.insert_many([{ field: 'test1' }, { field: 'test2' }])
332
+ end
333
+
334
+ let(:response) do
335
+ view.delete_one
336
+ end
337
+
338
+ it 'deletes the first document in the collection' do
339
+ expect(response.written_count).to eq(1)
340
+ end
341
+ end
342
+ end
343
+
344
+ describe '#replace_one' do
345
+
346
+ context 'when a selector was provided' do
347
+
348
+ let(:selector) do
349
+ { field: 'test1' }
350
+ end
351
+
352
+ before do
353
+ authorized_collection.insert_many([{ field: 'test1' }, { field: 'test1' }])
354
+ end
355
+
356
+ let!(:response) do
357
+ view.replace_one({ field: 'testing' })
358
+ end
359
+
360
+ let(:updated) do
361
+ authorized_collection.find(field: 'testing').first
362
+ end
363
+
364
+ it 'updates the first matching document in the collection' do
365
+ expect(response.written_count).to eq(1)
366
+ end
367
+
368
+ it 'updates the documents in the collection' do
369
+ expect(updated[:field]).to eq('testing')
370
+ end
371
+ end
372
+
373
+ context 'when no selector was provided' do
374
+
375
+ before do
376
+ authorized_collection.insert_many([{ field: 'test1' }, { field: 'test2' }])
377
+ end
378
+
379
+ let!(:response) do
380
+ view.replace_one({ field: 'testing' })
381
+ end
382
+
383
+ let(:updated) do
384
+ authorized_collection.find(field: 'testing').first
385
+ end
386
+
387
+ it 'updates the first document in the collection' do
388
+ expect(response.written_count).to eq(1)
389
+ end
390
+
391
+ it 'updates the documents in the collection' do
392
+ expect(updated[:field]).to eq('testing')
393
+ end
394
+ end
395
+
396
+ context 'when upsert is false' do
397
+
398
+ let!(:response) do
399
+ view.replace_one({ field: 'test1' }, upsert: false)
400
+ end
401
+
402
+ let(:updated) do
403
+ authorized_collection.find(field: 'test1').to_a
404
+ end
405
+
406
+ it 'reports that no documents were written' do
407
+ expect(response.written_count).to eq(0)
408
+ end
409
+
410
+ it 'does not insert the document' do
411
+ expect(updated).to be_empty
412
+ end
413
+ end
414
+
415
+ context 'when upsert is true' do
416
+
417
+ let!(:response) do
418
+ view.replace_one({ field: 'test1' }, upsert: true)
419
+ end
420
+
421
+ let(:updated) do
422
+ authorized_collection.find(field: 'test1').first
423
+ end
424
+
425
+ it 'reports that a document was written' do
426
+ expect(response.written_count).to eq(1)
427
+ end
428
+
429
+ it 'inserts the document' do
430
+ expect(updated[:field]).to eq('test1')
431
+ end
432
+ end
433
+
434
+ context 'when upsert is not specified' do
435
+
436
+ let!(:response) do
437
+ view.replace_one({ field: 'test1' })
438
+ end
439
+
440
+ let(:updated) do
441
+ authorized_collection.find(field: 'test1').to_a
442
+ end
443
+
444
+ it 'reports that no documents were written' do
445
+ expect(response.written_count).to eq(0)
446
+ end
447
+
448
+ it 'does not insert the document' do
449
+ expect(updated).to be_empty
450
+ end
451
+ end
452
+ end
453
+
454
+ describe '#update_many' do
455
+
456
+ context 'when a selector was provided' do
457
+
458
+ let(:selector) do
459
+ { field: 'test1' }
460
+ end
461
+
462
+ before do
463
+ authorized_collection.insert_many([{ field: 'test1' }, { field: 'test2' }])
464
+ end
465
+
466
+ let!(:response) do
467
+ view.update_many('$set'=> { field: 'testing' })
468
+ end
469
+
470
+ let(:updated) do
471
+ authorized_collection.find(field: 'testing').first
472
+ end
473
+
474
+ it 'returns the number updated' do
475
+ expect(response.written_count).to eq(1)
476
+ end
477
+
478
+ it 'updates the documents in the collection' do
479
+ expect(updated[:field]).to eq('testing')
480
+ end
481
+ end
482
+
483
+ context 'when no selector was provided' do
484
+
485
+ before do
486
+ authorized_collection.insert_many([{ field: 'test1' }, { field: 'test2' }])
487
+ end
488
+
489
+ let!(:response) do
490
+ view.update_many('$set'=> { field: 'testing' })
491
+ end
492
+
493
+ let(:updated) do
494
+ authorized_collection.find
495
+ end
496
+
497
+ it 'returns the number updated' do
498
+ expect(response.written_count).to eq(2)
499
+ end
500
+
501
+ it 'updates all the documents in the collection' do
502
+ updated.each do |doc|
503
+ expect(doc[:field]).to eq('testing')
504
+ end
505
+ end
506
+ end
507
+
508
+ context 'when upsert is false' do
509
+
510
+ let(:response) do
511
+ view.update_many({ '$set'=> { field: 'testing' } },
512
+ upsert: false)
513
+ end
514
+
515
+ let(:updated) do
516
+ authorized_collection.find.to_a
517
+ end
518
+
519
+ it 'reports that no documents were updated' do
520
+ expect(response.written_count).to eq(0)
521
+ end
522
+
523
+ it 'updates no documents in the collection' do
524
+ expect(updated).to be_empty
525
+ end
526
+ end
527
+
528
+ context 'when upsert is true' do
529
+
530
+ let!(:response) do
531
+ view.update_many({ '$set'=> { field: 'testing' } },
532
+ upsert: true)
533
+ end
534
+
535
+ let(:updated) do
536
+ authorized_collection.find.first
537
+ end
538
+
539
+ it 'reports that a document was written' do
540
+ expect(response.written_count).to eq(1)
541
+ end
542
+
543
+ it 'inserts a document into the collection' do
544
+ expect(updated[:field]).to eq('testing')
545
+ end
546
+ end
547
+
548
+ context 'when upsert is not specified' do
549
+
550
+ let(:response) do
551
+ view.update_many({ '$set'=> { field: 'testing' } })
552
+ end
553
+
554
+ let(:updated) do
555
+ authorized_collection.find.to_a
556
+ end
557
+
558
+ it 'reports that no documents were updated' do
559
+ expect(response.written_count).to eq(0)
560
+ end
561
+
562
+ it 'updates no documents in the collection' do
563
+ expect(updated).to be_empty
564
+ end
565
+ end
566
+ end
567
+
568
+ describe '#update_one' do
569
+
570
+ context 'when a selector was provided' do
571
+
572
+ let(:selector) do
573
+ { field: 'test1' }
574
+ end
575
+
576
+ before do
577
+ authorized_collection.insert_many([{ field: 'test1' }, { field: 'test1' }])
578
+ end
579
+
580
+ let!(:response) do
581
+ view.update_one('$set'=> { field: 'testing' })
582
+ end
583
+
584
+ let(:updated) do
585
+ authorized_collection.find(field: 'testing').first
586
+ end
587
+
588
+ it 'updates the first matching document in the collection' do
589
+ expect(response.written_count).to eq(1)
590
+ end
591
+
592
+ it 'updates the documents in the collection' do
593
+ expect(updated[:field]).to eq('testing')
594
+ end
595
+ end
596
+
597
+ context 'when no selector was provided' do
598
+
599
+ before do
600
+ authorized_collection.insert_many([{ field: 'test1' }, { field: 'test2' }])
601
+ end
602
+
603
+ let!(:response) do
604
+ view.update_one('$set'=> { field: 'testing' })
605
+ end
606
+
607
+ let(:updated) do
608
+ authorized_collection.find(field: 'testing').first
609
+ end
610
+
611
+ it 'updates the first document in the collection' do
612
+ expect(response.written_count).to eq(1)
613
+ end
614
+
615
+ it 'updates the documents in the collection' do
616
+ expect(updated[:field]).to eq('testing')
617
+ end
618
+ end
619
+
620
+ context 'when upsert is false' do
621
+
622
+ let(:response) do
623
+ view.update_one({ '$set'=> { field: 'testing' } },
624
+ upsert: false)
625
+ end
626
+
627
+ let(:updated) do
628
+ authorized_collection.find.to_a
629
+ end
630
+
631
+ it 'reports that no documents were updated' do
632
+ expect(response.written_count).to eq(0)
633
+ end
634
+
635
+ it 'updates no documents in the collection' do
636
+ expect(updated).to be_empty
637
+ end
638
+ end
639
+
640
+ context 'when upsert is true' do
641
+
642
+ let!(:response) do
643
+ view.update_one({ '$set'=> { field: 'testing' } },
644
+ upsert: true)
645
+ end
646
+
647
+ let(:updated) do
648
+ authorized_collection.find.first
649
+ end
650
+
651
+ it 'reports that a document was written' do
652
+ expect(response.written_count).to eq(1)
653
+ end
654
+
655
+ it 'inserts a document into the collection' do
656
+ expect(updated[:field]).to eq('testing')
657
+ end
658
+ end
659
+
660
+ context 'when upsert is not specified' do
661
+
662
+ let(:response) do
663
+ view.update_one({ '$set'=> { field: 'testing' } })
664
+ end
665
+
666
+ let(:updated) do
667
+ authorized_collection.find.to_a
668
+ end
669
+
670
+ it 'reports that no documents were updated' do
671
+ expect(response.written_count).to eq(0)
672
+ end
673
+
674
+ it 'updates no documents in the collection' do
675
+ expect(updated).to be_empty
676
+ end
677
+ end
678
+ end
679
+ end