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,226 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Grid::File::Chunk do
4
+
5
+ let(:data) do
6
+ BSON::Binary.new('testing')
7
+ end
8
+
9
+ let(:file_id) do
10
+ BSON::ObjectId.new
11
+ end
12
+
13
+ let(:metadata) do
14
+ Mongo::Grid::File::Metadata.new(:files_id => file_id)
15
+ end
16
+
17
+ describe '#==' do
18
+
19
+ let(:chunk) do
20
+ described_class.new(:data => data, :files_id => file_id, :n => 5)
21
+ end
22
+
23
+ context 'when the other is not a chunk' do
24
+
25
+ it 'returns false' do
26
+ expect(chunk).to_not eq('test')
27
+ end
28
+ end
29
+
30
+ context 'when the other object is a chunk' do
31
+
32
+ context 'when the documents are equal' do
33
+
34
+ it 'returns true' do
35
+ expect(chunk).to eq(chunk)
36
+ end
37
+ end
38
+
39
+ context 'when the documents are not equal' do
40
+
41
+ let(:other) do
42
+ described_class.new(:data => data, :files_id => file_id, :n => 6)
43
+ end
44
+
45
+ it 'returns false' do
46
+ expect(chunk).to_not eq(other)
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ describe '.assemble' do
53
+
54
+ let(:data_size) do
55
+ Mongo::Grid::File::Chunk::DEFAULT_SIZE * 3
56
+ end
57
+
58
+ let(:raw_data) do
59
+ 'testing'
60
+ end
61
+
62
+ let(:data) do
63
+ BSON::Binary.new(raw_data)
64
+ end
65
+
66
+ let(:assembled) do
67
+ described_class.assemble(chunks)
68
+ end
69
+
70
+ before do
71
+ (1..data_size).each{ |i| raw_data << '1' }
72
+ end
73
+
74
+ let(:chunks) do
75
+ described_class.split(raw_data, metadata)
76
+ end
77
+
78
+ it 'returns the chunks assembled into the raw data' do
79
+ expect(assembled).to eq(raw_data)
80
+ end
81
+ end
82
+
83
+ describe '#document' do
84
+
85
+ let(:chunk) do
86
+ described_class.new(:data => data, :files_id => file_id, :n => 5)
87
+ end
88
+
89
+ let(:document) do
90
+ chunk.document
91
+ end
92
+
93
+ it 'sets the data' do
94
+ expect(document[:data]).to eq(data)
95
+ end
96
+
97
+ it 'sets the files_id' do
98
+ expect(document[:files_id]).to eq(file_id)
99
+ end
100
+
101
+ it 'sets the position' do
102
+ expect(document[:n]).to eq(5)
103
+ end
104
+
105
+ it 'sets an object id' do
106
+ expect(document[:_id]).to be_a(BSON::ObjectId)
107
+ end
108
+
109
+ context 'when asking for the document multiple times' do
110
+
111
+ it 'returns the same document' do
112
+ expect(document[:_id]).to eq(chunk.document[:_id])
113
+ end
114
+ end
115
+ end
116
+
117
+ describe '#initialize' do
118
+
119
+ let(:chunk) do
120
+ described_class.new(:data => data, :files_id => file_id, :n => 5)
121
+ end
122
+
123
+ it 'sets the document' do
124
+ expect(chunk.data).to eq(data)
125
+ end
126
+
127
+ it 'sets a default id' do
128
+ expect(chunk.id).to be_a(BSON::ObjectId)
129
+ end
130
+ end
131
+
132
+ describe '#to_bson' do
133
+
134
+ let(:chunk) do
135
+ described_class.new(:data => data, :files_id => file_id, :n => 5)
136
+ end
137
+
138
+ let(:document) do
139
+ chunk.document
140
+ end
141
+
142
+ it 'returns the document as bson' do
143
+ expect(chunk.to_bson).to eq(document.to_bson)
144
+ end
145
+ end
146
+
147
+ describe '.split' do
148
+
149
+ context 'when the data is smaller than the default size' do
150
+
151
+ let(:raw_data) do
152
+ 'testing'
153
+ end
154
+
155
+ let(:data) do
156
+ BSON::Binary.new(raw_data)
157
+ end
158
+
159
+ let(:chunks) do
160
+ described_class.split(raw_data, metadata)
161
+ end
162
+
163
+ let(:chunk) do
164
+ chunks.first
165
+ end
166
+
167
+ it 'returns a single chunk' do
168
+ expect(chunks.size).to eq(1)
169
+ end
170
+
171
+ it 'sets the correct chunk position' do
172
+ expect(chunk.n).to eq(0)
173
+ end
174
+
175
+ it 'sets the correct chunk data' do
176
+ expect(chunk.data).to eq(data)
177
+ end
178
+ end
179
+
180
+ context 'when the data is larger that the default size' do
181
+
182
+ let(:data_size) do
183
+ Mongo::Grid::File::Chunk::DEFAULT_SIZE * 3
184
+ end
185
+
186
+ let(:raw_data) do
187
+ 'testing'
188
+ end
189
+
190
+ let(:data) do
191
+ BSON::Binary.new(raw_data)
192
+ end
193
+
194
+ let(:assembled) do
195
+ full_data = ''
196
+ chunks.each do |chunk|
197
+ full_data << chunk.data.data
198
+ end
199
+ full_data
200
+ end
201
+
202
+ before do
203
+ (1..data_size).each{ |i| raw_data << '1' }
204
+ end
205
+
206
+ let(:chunks) do
207
+ described_class.split(raw_data, metadata)
208
+ end
209
+
210
+ it 'returns the correct number of chunks' do
211
+ expect(chunks.size).to eq(4)
212
+ end
213
+
214
+ it 'sets the correct chunk positions' do
215
+ expect(chunks[0].n).to eq(0)
216
+ expect(chunks[1].n).to eq(1)
217
+ expect(chunks[2].n).to eq(2)
218
+ expect(chunks[3].n).to eq(3)
219
+ end
220
+
221
+ it 'does to miss any bytes' do
222
+ expect(assembled).to eq(raw_data)
223
+ end
224
+ end
225
+ end
226
+ end
@@ -0,0 +1,92 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Grid::File::Metadata do
4
+
5
+ describe '#==' do
6
+
7
+ let(:upload_date) do
8
+ Time.now.utc
9
+ end
10
+
11
+ let(:metadata) do
12
+ described_class.new(:filename => 'test.txt', :length => 7, :uploadDate => upload_date)
13
+ end
14
+
15
+ context 'when the other is not metadata' do
16
+
17
+ it 'returns false' do
18
+ expect(metadata).to_not eq('test')
19
+ end
20
+ end
21
+
22
+ context 'when the other object is metadata' do
23
+
24
+ context 'when the documents are equal' do
25
+
26
+ it 'returns true' do
27
+ expect(metadata).to eq(metadata)
28
+ end
29
+ end
30
+
31
+ context 'when the documents are not equal' do
32
+
33
+ let(:other) do
34
+ described_class.new(:filename => 'testing.txt')
35
+ end
36
+
37
+ it 'returns false' do
38
+ expect(metadata).to_not eq(other)
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ describe '#initialize' do
45
+
46
+ context 'when provided only a filename and length' do
47
+
48
+ let(:metadata) do
49
+ described_class.new(:filename => 'test.txt', :length => 7)
50
+ end
51
+
52
+ it 'sets the default id' do
53
+ expect(metadata.id).to be_a(BSON::ObjectId)
54
+ end
55
+
56
+ it 'sets the upload date' do
57
+ expect(metadata.upload_date).to be_a(Time)
58
+ end
59
+
60
+ it 'sets the chunk size' do
61
+ expect(metadata.chunk_size).to eq(Mongo::Grid::File::Chunk::DEFAULT_SIZE)
62
+ end
63
+
64
+ it 'sets the content type' do
65
+ expect(metadata.content_type).to eq(Mongo::Grid::File::Metadata::DEFAULT_CONTENT_TYPE)
66
+ end
67
+ end
68
+ end
69
+
70
+ describe '#inspect' do
71
+
72
+ let(:metadata) do
73
+ described_class.new(:filename => 'test.txt', :length => 7)
74
+ end
75
+
76
+ it 'includes the chunk size' do
77
+ expect(metadata.inspect).to include(metadata.chunk_size.to_s)
78
+ end
79
+
80
+ it 'includes the filename' do
81
+ expect(metadata.inspect).to include(metadata.filename)
82
+ end
83
+
84
+ it 'includes the md5' do
85
+ expect(metadata.inspect).to include(metadata.md5.to_s)
86
+ end
87
+
88
+ it 'includes the id' do
89
+ expect(metadata.inspect).to include(metadata.id.to_s)
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,172 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Grid::File do
4
+
5
+ describe '#==' do
6
+
7
+ let(:file) do
8
+ described_class.new('test', :filename => 'test.txt')
9
+ end
10
+
11
+ context 'when the object is not a file' do
12
+
13
+ it 'returns false' do
14
+ expect(file).to_not eq('testing')
15
+ end
16
+ end
17
+
18
+ context 'when the object is a file' do
19
+
20
+ context 'when the objects are equal' do
21
+
22
+ it 'returns true' do
23
+ expect(file).to eq(file)
24
+ end
25
+ end
26
+
27
+ context 'when the objects are not equal' do
28
+
29
+ let(:other) do
30
+ described_class.new('tester', :filename => 'test.txt')
31
+ end
32
+
33
+ it 'returns false' do
34
+ expect(file).to_not eq(other)
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ describe '#initialize' do
41
+
42
+ let(:data_size) do
43
+ Mongo::Grid::File::Chunk::DEFAULT_SIZE * 3
44
+ end
45
+
46
+ let(:data) do
47
+ 'testing'
48
+ end
49
+
50
+ before do
51
+ (1..data_size).each{ |i| data << '1' }
52
+ end
53
+
54
+ context 'when provided data and metadata' do
55
+
56
+ let(:file) do
57
+ described_class.new(data, :filename => 'test.txt')
58
+ end
59
+
60
+ it 'sets the data' do
61
+ expect(file.data).to eq(data)
62
+ end
63
+
64
+ it 'creates the chunks' do
65
+ expect(file.chunks.size).to eq(4)
66
+ end
67
+ end
68
+
69
+ context 'when data is a ruby file' do
70
+
71
+ let(:ruby_file) do
72
+ File.open(__FILE__)
73
+ end
74
+
75
+ let(:data) do
76
+ ruby_file.read
77
+ end
78
+
79
+ let(:file) do
80
+ described_class.new(data, :filename => File.basename(ruby_file.path))
81
+ end
82
+
83
+ it 'sets the data' do
84
+ expect(file.data).to eq(data)
85
+ end
86
+
87
+ it 'creates the chunks' do
88
+ expect(file.chunks.size).to eq(4)
89
+ end
90
+ end
91
+
92
+ context 'when using idiomatic ruby field names' do
93
+
94
+ let(:time) do
95
+ Time.now.utc
96
+ end
97
+
98
+ let(:file) do
99
+ described_class.new(
100
+ data,
101
+ :filename => 'test.txt',
102
+ :chunk_size => 100,
103
+ :upload_date => time,
104
+ :content_type => 'text/plain'
105
+ )
106
+ end
107
+
108
+ it 'normalizes the chunk size name' do
109
+ expect(file.chunk_size).to eq(100)
110
+ end
111
+
112
+ it 'normalizes the upload date name' do
113
+ expect(file.upload_date).to eq(time)
114
+ end
115
+
116
+ it 'normalizes the content type name' do
117
+ expect(file.content_type).to eq('text/plain')
118
+ end
119
+ end
120
+
121
+ context 'when provided chunks and metadata' do
122
+
123
+ let(:file_id) do
124
+ BSON::ObjectId.new
125
+ end
126
+
127
+ let(:metadata) do
128
+ BSON::Document.new(
129
+ :_id => file_id,
130
+ :uploadDate => Time.now.utc,
131
+ :filename => 'test.txt',
132
+ :chunkSize => Mongo::Grid::File::Chunk::DEFAULT_SIZE,
133
+ :length => data.length,
134
+ :contentType => Mongo::Grid::File::Metadata::DEFAULT_CONTENT_TYPE
135
+ )
136
+ end
137
+
138
+ let(:chunks) do
139
+ Mongo::Grid::File::Chunk.split(
140
+ data, Mongo::Grid::File::Metadata.new(metadata)
141
+ ).map{ |chunk| chunk.document }
142
+ end
143
+
144
+ let(:file) do
145
+ described_class.new(chunks, metadata)
146
+ end
147
+
148
+ it 'sets the chunks' do
149
+ expect(file.chunks.size).to eq(4)
150
+ end
151
+
152
+ it 'assembles to data' do
153
+ expect(file.data).to eq(data)
154
+ end
155
+
156
+ it 'sets the metadata' do
157
+ expect(file.metadata.id).to eq(metadata[:_id])
158
+ end
159
+ end
160
+ end
161
+
162
+ describe '#inspect' do
163
+
164
+ let(:file) do
165
+ described_class.new('Hi', :filename => 'test.txt')
166
+ end
167
+
168
+ it 'includes the filename' do
169
+ expect(file.inspect).to include('test.txt')
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,129 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Grid::FS do
4
+
5
+ describe '#initialize' do
6
+
7
+ let(:fs) do
8
+ described_class.new(authorized_client.database)
9
+ end
10
+
11
+ let(:index) do
12
+ fs.chunks_collection.indexes.get(:files_id => 1, :n => 1)
13
+ end
14
+
15
+ it 'sets the files collection' do
16
+ expect(fs.files_collection.name).to eq('fs.files')
17
+ end
18
+
19
+ it 'sets the chunks collection' do
20
+ expect(fs.chunks_collection.name).to eq('fs.chunks')
21
+ end
22
+
23
+ it 'creates the index on the chunks collection' do
24
+ expect(index[:name]).to eq('files_id_1_n_1')
25
+ end
26
+ end
27
+
28
+ describe '#find_one' do
29
+
30
+ let(:fs) do
31
+ described_class.new(authorized_client.database)
32
+ end
33
+
34
+ let(:file) do
35
+ Mongo::Grid::File.new('hello world!', :filename => 'test.txt')
36
+ end
37
+
38
+ before do
39
+ fs.insert_one(file)
40
+ end
41
+
42
+ after do
43
+ fs.files_collection.find.delete_many
44
+ fs.chunks_collection.find.delete_many
45
+ end
46
+
47
+ let(:from_db) do
48
+ fs.find_one(:filename => 'test.txt')
49
+ end
50
+
51
+ it 'returns the assembled file from the db' do
52
+ expect(from_db.filename).to eq(file.metadata.filename)
53
+ end
54
+ end
55
+
56
+ describe '#insert_one' do
57
+
58
+ let(:fs) do
59
+ described_class.new(authorized_client.database)
60
+ end
61
+
62
+ let(:file) do
63
+ Mongo::Grid::File.new('Hello!', :filename => 'test.txt')
64
+ end
65
+
66
+ context 'when inserting the file once' do
67
+
68
+ before do
69
+ fs.insert_one(file)
70
+ end
71
+
72
+ after do
73
+ fs.files_collection.find.delete_many
74
+ fs.chunks_collection.find.delete_many
75
+ end
76
+
77
+ let(:from_db) do
78
+ fs.find_one(:filename => 'test.txt')
79
+ end
80
+
81
+ it 'inserts the file into the database' do
82
+ expect(from_db.filename).to eq(file.metadata.filename)
83
+ end
84
+
85
+ it 'includes the chunks and data with the file' do
86
+ expect(from_db.data).to eq('Hello!')
87
+ end
88
+ end
89
+
90
+ context 'when inserting the file more than once' do
91
+
92
+ after do
93
+ fs.files_collection.find.delete_many
94
+ fs.chunks_collection.find.delete_many
95
+ end
96
+
97
+ it 'raises an error' do
98
+ expect {
99
+ fs.insert_one(file)
100
+ fs.insert_one(file)
101
+ }.to raise_error(Mongo::Error::OperationFailure)
102
+ end
103
+ end
104
+ end
105
+
106
+ describe '#delete_one' do
107
+
108
+ let(:fs) do
109
+ described_class.new(authorized_client.database)
110
+ end
111
+
112
+ let(:file) do
113
+ Mongo::Grid::File.new('Hello!', :filename => 'test.txt')
114
+ end
115
+
116
+ before do
117
+ fs.insert_one(file)
118
+ fs.delete_one(file)
119
+ end
120
+
121
+ let(:from_db) do
122
+ fs.find_one(:filename => 'test.txt')
123
+ end
124
+
125
+ it 'removes the file from the db' do
126
+ expect(from_db).to be_nil
127
+ end
128
+ end
129
+ end