mongo 1.12.5 → 2.0.0.beta

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 (437) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +64 -0
  5. data/LICENSE +1 -1
  6. data/README.md +23 -125
  7. data/Rakefile +26 -21
  8. data/bin/mongo_console +6 -38
  9. data/lib/mongo.rb +23 -82
  10. data/lib/mongo/address.rb +111 -0
  11. data/lib/mongo/address/ipv4.rb +85 -0
  12. data/lib/mongo/address/ipv6.rb +85 -0
  13. data/lib/mongo/address/unix.rb +76 -0
  14. data/lib/mongo/auth.rb +108 -0
  15. data/lib/mongo/auth/cr.rb +44 -0
  16. data/lib/mongo/auth/cr/conversation.rb +119 -0
  17. data/lib/mongo/auth/executable.rb +52 -0
  18. data/lib/mongo/auth/ldap.rb +48 -0
  19. data/lib/mongo/auth/ldap/conversation.rb +92 -0
  20. data/lib/mongo/auth/roles.rb +104 -0
  21. data/lib/mongo/auth/scram.rb +53 -0
  22. data/lib/mongo/auth/scram/conversation.rb +450 -0
  23. data/lib/mongo/auth/user.rb +159 -0
  24. data/lib/mongo/auth/user/view.rb +102 -0
  25. data/lib/mongo/auth/x509.rb +48 -0
  26. data/lib/mongo/auth/x509/conversation.rb +92 -0
  27. data/lib/mongo/{gridfs.rb → bulk.rb} +2 -5
  28. data/lib/mongo/bulk/bulk_write.rb +307 -0
  29. data/lib/mongo/client.rb +233 -0
  30. data/lib/mongo/cluster.rb +203 -0
  31. data/lib/mongo/cluster/topology.rb +60 -0
  32. data/lib/mongo/cluster/topology/replica_set.rb +160 -0
  33. data/lib/mongo/cluster/topology/sharded.rb +132 -0
  34. data/lib/mongo/cluster/topology/standalone.rb +132 -0
  35. data/lib/mongo/cluster/topology/unknown.rb +155 -0
  36. data/lib/mongo/collection.rb +130 -1101
  37. data/lib/mongo/collection/view.rb +169 -0
  38. data/lib/mongo/collection/view/aggregation.rb +108 -0
  39. data/lib/mongo/collection/view/explainable.rb +49 -0
  40. data/lib/mongo/collection/view/immutable.rb +43 -0
  41. data/lib/mongo/collection/view/iterable.rb +48 -0
  42. data/lib/mongo/collection/view/map_reduce.rb +191 -0
  43. data/lib/mongo/collection/view/readable.rb +363 -0
  44. data/lib/mongo/collection/view/writable.rb +169 -0
  45. data/lib/mongo/cursor.rb +79 -680
  46. data/lib/mongo/database.rb +224 -0
  47. data/lib/mongo/database/view.rb +101 -0
  48. data/lib/mongo/error.rb +81 -0
  49. data/lib/mongo/error/bulk_write_failure.rb +41 -0
  50. data/lib/mongo/{utils/thread_local_variable_manager.rb → error/empty_batch.rb} +22 -8
  51. data/{test/functional/db_connection_test.rb → lib/mongo/error/invalid_bulk_operation.rb} +19 -8
  52. data/lib/mongo/error/invalid_collection_name.rb +39 -0
  53. data/lib/mongo/error/invalid_database_name.rb +39 -0
  54. data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
  55. data/lib/mongo/error/invalid_file.rb +38 -0
  56. data/lib/mongo/error/invalid_nonce.rb +46 -0
  57. data/lib/mongo/error/invalid_replacement_document.rb +39 -0
  58. data/lib/mongo/error/invalid_signature.rb +47 -0
  59. data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
  60. data/lib/mongo/error/max_bson_size.rb +40 -0
  61. data/lib/mongo/error/max_message_size.rb +42 -0
  62. data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
  63. data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
  64. data/lib/mongo/error/parser.rb +77 -0
  65. data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
  66. data/lib/mongo/error/socket_timeout_error.rb +23 -0
  67. data/lib/mongo/error/unsupported_features.rb +43 -0
  68. data/lib/mongo/event.rb +40 -0
  69. data/lib/mongo/event/listeners.rb +63 -0
  70. data/lib/mongo/event/primary_elected.rb +53 -0
  71. data/lib/mongo/event/publisher.rb +42 -0
  72. data/lib/mongo/event/server_added.rb +53 -0
  73. data/lib/mongo/event/server_removed.rb +53 -0
  74. data/lib/mongo/event/subscriber.rb +41 -0
  75. data/lib/mongo/grid.rb +16 -0
  76. data/lib/mongo/grid/file.rb +94 -0
  77. data/lib/mongo/grid/file/chunk.rb +184 -0
  78. data/lib/mongo/grid/file/metadata.rb +223 -0
  79. data/lib/mongo/grid/fs.rb +149 -0
  80. data/lib/mongo/index.rb +64 -0
  81. data/lib/mongo/index/view.rb +205 -0
  82. data/lib/mongo/loggable.rb +126 -0
  83. data/lib/mongo/logger.rb +132 -0
  84. data/lib/mongo/operation.rb +26 -0
  85. data/lib/mongo/operation/aggregate.rb +100 -0
  86. data/lib/mongo/operation/aggregate/result.rb +84 -0
  87. data/lib/mongo/operation/batchable.rb +103 -0
  88. data/lib/mongo/operation/bulk_delete/result.rb +197 -0
  89. data/lib/mongo/operation/bulk_insert/result.rb +195 -0
  90. data/lib/mongo/operation/bulk_update/result.rb +295 -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 +116 -0
  96. data/lib/mongo/operation/list_indexes/result.rb +118 -0
  97. data/lib/mongo/operation/map_reduce.rb +96 -0
  98. data/lib/mongo/operation/map_reduce/result.rb +122 -0
  99. data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
  100. data/lib/mongo/operation/read/collections_info.rb +67 -0
  101. data/lib/mongo/operation/read/get_more.rb +71 -0
  102. data/lib/mongo/operation/read/indexes.rb +68 -0
  103. data/lib/mongo/operation/read/list_collections.rb +75 -0
  104. data/lib/mongo/operation/read/list_indexes.rb +77 -0
  105. data/lib/mongo/operation/read/query.rb +71 -0
  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 +380 -0
  109. data/lib/mongo/operation/write.rb +25 -0
  110. data/lib/mongo/operation/write/bulk_delete.rb +158 -0
  111. data/lib/mongo/operation/write/bulk_insert.rb +160 -0
  112. data/lib/mongo/operation/write/bulk_update.rb +167 -0
  113. data/lib/mongo/{connection/socket/socket_util.rb → operation/write/command.rb} +9 -24
  114. data/lib/mongo/operation/write/command/create_user.rb +43 -0
  115. data/lib/mongo/operation/write/command/delete.rb +56 -0
  116. data/lib/mongo/operation/write/command/drop_index.rb +51 -0
  117. data/lib/mongo/operation/write/command/ensure_index.rb +55 -0
  118. data/lib/mongo/operation/write/command/insert.rb +55 -0
  119. data/lib/mongo/operation/write/command/remove_user.rb +42 -0
  120. data/lib/mongo/operation/write/command/update.rb +60 -0
  121. data/lib/mongo/operation/write/command/writable.rb +61 -0
  122. data/lib/mongo/operation/write/create_index.rb +84 -0
  123. data/lib/mongo/operation/write/create_user.rb +75 -0
  124. data/lib/mongo/operation/write/delete.rb +91 -0
  125. data/lib/mongo/operation/write/drop_index.rb +62 -0
  126. data/lib/mongo/operation/write/insert.rb +88 -0
  127. data/lib/mongo/operation/write/remove_user.rb +70 -0
  128. data/lib/mongo/operation/write/update.rb +98 -0
  129. data/lib/mongo/protocol.rb +15 -0
  130. data/lib/mongo/protocol/bit_vector.rb +61 -0
  131. data/lib/mongo/protocol/delete.rb +94 -0
  132. data/lib/mongo/protocol/get_more.rb +99 -0
  133. data/lib/mongo/protocol/insert.rb +99 -0
  134. data/lib/mongo/protocol/kill_cursors.rb +74 -0
  135. data/lib/mongo/protocol/message.rb +252 -0
  136. data/lib/mongo/protocol/query.rb +147 -0
  137. data/lib/mongo/protocol/reply.rb +72 -0
  138. data/lib/mongo/protocol/serializers.rb +180 -0
  139. data/lib/mongo/protocol/update.rb +111 -0
  140. data/lib/mongo/server.rb +163 -0
  141. data/lib/mongo/server/connectable.rb +99 -0
  142. data/lib/mongo/server/connection.rb +133 -0
  143. data/lib/mongo/server/connection_pool.rb +141 -0
  144. data/lib/mongo/server/connection_pool/queue.rb +182 -0
  145. data/lib/mongo/server/context.rb +66 -0
  146. data/lib/mongo/server/description.rb +450 -0
  147. data/lib/mongo/server/description/features.rb +85 -0
  148. data/lib/mongo/server/description/inspector.rb +79 -0
  149. data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
  150. data/lib/mongo/server/description/inspector/server_added.rb +59 -0
  151. data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
  152. data/lib/mongo/server/monitor.rb +160 -0
  153. data/lib/mongo/server/monitor/connection.rb +88 -0
  154. data/lib/mongo/server_selector.rb +81 -0
  155. data/lib/mongo/server_selector/nearest.rb +94 -0
  156. data/lib/mongo/server_selector/primary.rb +88 -0
  157. data/lib/mongo/server_selector/primary_preferred.rb +94 -0
  158. data/lib/mongo/server_selector/secondary.rb +91 -0
  159. data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
  160. data/lib/mongo/server_selector/selectable.rb +209 -0
  161. data/lib/mongo/socket.rb +179 -0
  162. data/lib/mongo/socket/ssl.rb +108 -0
  163. data/lib/mongo/socket/tcp.rb +69 -0
  164. data/lib/mongo/socket/unix.rb +66 -0
  165. data/lib/mongo/uri.rb +504 -0
  166. data/lib/mongo/version.rb +21 -0
  167. data/lib/mongo/write_concern.rb +99 -0
  168. data/lib/mongo/write_concern/acknowledged.rb +38 -0
  169. data/lib/mongo/write_concern/normalizable.rb +73 -0
  170. data/lib/mongo/write_concern/unacknowledged.rb +43 -0
  171. data/mongo.gemspec +17 -14
  172. data/spec/mongo/address/ipv4_spec.rb +74 -0
  173. data/spec/mongo/address/ipv6_spec.rb +74 -0
  174. data/spec/mongo/address/unix_spec.rb +30 -0
  175. data/spec/mongo/address_spec.rb +206 -0
  176. data/spec/mongo/auth/cr_spec.rb +59 -0
  177. data/spec/mongo/auth/ldap_spec.rb +40 -0
  178. data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
  179. data/spec/mongo/auth/scram_spec.rb +55 -0
  180. data/spec/mongo/auth/user/view_spec.rb +76 -0
  181. data/spec/mongo/auth/user_spec.rb +190 -0
  182. data/spec/mongo/auth/x509_spec.rb +40 -0
  183. data/spec/mongo/auth_spec.rb +65 -0
  184. data/spec/mongo/bulk/bulk_write_spec.rb +175 -0
  185. data/spec/mongo/client_spec.rb +564 -0
  186. data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
  187. data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
  188. data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
  189. data/spec/mongo/cluster/topology_spec.rb +65 -0
  190. data/spec/mongo/cluster_spec.rb +129 -0
  191. data/spec/mongo/collection/view/aggregation_spec.rb +135 -0
  192. data/spec/mongo/collection/view/explainable_spec.rb +32 -0
  193. data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
  194. data/spec/mongo/collection/view/readable_spec.rb +603 -0
  195. data/spec/mongo/collection/view/writable_spec.rb +504 -0
  196. data/spec/mongo/collection/view_spec.rb +521 -0
  197. data/spec/mongo/collection_spec.rb +362 -0
  198. data/spec/mongo/cursor_spec.rb +295 -0
  199. data/spec/mongo/database_spec.rb +306 -0
  200. data/spec/mongo/error/parser_spec.rb +119 -0
  201. data/spec/mongo/event/publisher_spec.rb +50 -0
  202. data/spec/mongo/event/subscriber_spec.rb +34 -0
  203. data/spec/mongo/grid/file/chunk_spec.rb +226 -0
  204. data/spec/mongo/grid/file/metadata_spec.rb +69 -0
  205. data/spec/mongo/grid/file_spec.rb +138 -0
  206. data/spec/mongo/grid/fs_spec.rb +129 -0
  207. data/spec/mongo/index/view_spec.rb +226 -0
  208. data/spec/mongo/loggable_spec.rb +62 -0
  209. data/spec/mongo/logger_spec.rb +97 -0
  210. data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
  211. data/spec/mongo/operation/aggregate_spec.rb +135 -0
  212. data/spec/mongo/operation/command_spec.rb +106 -0
  213. data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
  214. data/spec/mongo/operation/limited_spec.rb +50 -0
  215. data/spec/mongo/operation/map_reduce_spec.rb +143 -0
  216. data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
  217. data/spec/mongo/operation/read/get_more_spec.rb +81 -0
  218. data/spec/mongo/operation/read/indexes_spec.rb +31 -0
  219. data/spec/mongo/operation/read/query_spec.rb +84 -0
  220. data/spec/mongo/operation/result_spec.rb +275 -0
  221. data/spec/mongo/operation/specifiable_spec.rb +53 -0
  222. data/spec/mongo/operation/write/bulk_delete_spec.rb +473 -0
  223. data/spec/mongo/operation/write/bulk_insert_spec.rb +466 -0
  224. data/spec/mongo/operation/write/bulk_update_spec.rb +524 -0
  225. data/spec/mongo/operation/write/command/delete_spec.rb +116 -0
  226. data/spec/mongo/operation/write/command/insert_spec.rb +117 -0
  227. data/spec/mongo/operation/write/command/update_spec.rb +123 -0
  228. data/spec/mongo/operation/write/create_user_spec.rb +44 -0
  229. data/spec/mongo/operation/write/delete_spec.rb +178 -0
  230. data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
  231. data/spec/mongo/operation/write/ensure_index_spec.rb +81 -0
  232. data/spec/mongo/operation/write/insert_spec.rb +231 -0
  233. data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
  234. data/spec/mongo/operation/write/response_spec.rb +85 -0
  235. data/spec/mongo/operation/write/update_spec.rb +177 -0
  236. data/spec/mongo/protocol/delete_spec.rb +167 -0
  237. data/spec/mongo/protocol/get_more_spec.rb +146 -0
  238. data/spec/mongo/protocol/insert_spec.rb +161 -0
  239. data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
  240. data/spec/mongo/protocol/query_spec.rb +285 -0
  241. data/spec/mongo/protocol/reply_spec.rb +157 -0
  242. data/spec/mongo/protocol/update_spec.rb +186 -0
  243. data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
  244. data/spec/mongo/server/connection_pool_spec.rb +120 -0
  245. data/spec/mongo/server/connection_spec.rb +289 -0
  246. data/spec/mongo/server/description/features_spec.rb +138 -0
  247. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
  248. data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
  249. data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
  250. data/spec/mongo/server/description_spec.rb +510 -0
  251. data/spec/mongo/server/monitor_spec.rb +130 -0
  252. data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
  253. data/spec/mongo/server_selection_rtt_spec.rb +104 -0
  254. data/spec/mongo/server_selection_spec.rb +89 -0
  255. data/spec/mongo/server_selector/nearest_spec.rb +250 -0
  256. data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
  257. data/spec/mongo/server_selector/primary_spec.rb +114 -0
  258. data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
  259. data/spec/mongo/server_selector/secondary_spec.rb +196 -0
  260. data/spec/mongo/server_selector_spec.rb +101 -0
  261. data/spec/mongo/server_spec.rb +131 -0
  262. data/spec/mongo/uri_spec.rb +517 -0
  263. data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
  264. data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
  265. data/spec/mongo_orchestration_spec.rb +70 -0
  266. data/spec/spec_helper.rb +148 -0
  267. data/spec/support/authorization.rb +245 -0
  268. data/spec/support/helpers.rb +140 -0
  269. data/spec/support/matchers.rb +37 -0
  270. data/spec/support/mongo_orchestration.rb +61 -0
  271. data/spec/support/mongo_orchestration/requestable.rb +109 -0
  272. data/spec/support/mongo_orchestration/standalone.rb +57 -0
  273. data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
  274. data/spec/support/sdam/rs/discover_passives.yml +41 -0
  275. data/spec/support/sdam/rs/discover_primary.yml +40 -0
  276. data/spec/support/sdam/rs/discover_secondary.yml +41 -0
  277. data/spec/support/sdam/rs/discovery.yml +195 -0
  278. data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
  279. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
  280. data/spec/support/sdam/rs/member_reconfig.yml +68 -0
  281. data/spec/support/sdam/rs/member_standalone.yml +60 -0
  282. data/spec/support/sdam/rs/new_primary.yml +74 -0
  283. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
  284. data/spec/support/sdam/rs/non_rs_member.yml +31 -0
  285. data/spec/support/sdam/rs/normalize_case.yml +49 -0
  286. data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
  287. data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
  288. data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
  289. data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
  290. data/spec/support/sdam/rs/response_from_removed.yml +63 -0
  291. data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
  292. data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
  293. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
  294. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
  295. data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
  296. data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
  297. data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
  298. data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
  299. data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
  300. data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
  301. data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
  302. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
  303. data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
  304. data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
  305. data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
  306. data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
  307. data/spec/support/sdam/single/not_ok_response.yml +39 -0
  308. data/spec/support/sdam/single/standalone_removed.yml +32 -0
  309. data/spec/support/sdam/single/unavailable_seed.yml +28 -0
  310. data/spec/support/server_discovery_and_monitoring.rb +167 -0
  311. data/spec/support/server_selection.rb +140 -0
  312. data/spec/support/server_selection/rtt/first_value.yml +4 -0
  313. data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
  314. data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
  315. data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
  316. data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
  317. data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
  318. data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
  319. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +32 -0
  320. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +27 -0
  321. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +23 -0
  322. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +32 -0
  323. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +27 -0
  324. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +32 -0
  325. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +32 -0
  326. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +27 -0
  327. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +27 -0
  328. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +41 -0
  329. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +34 -0
  330. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +33 -0
  331. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +39 -0
  332. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +36 -0
  333. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +32 -0
  334. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +23 -0
  335. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +13 -0
  336. data/spec/support/server_selection_rtt.rb +41 -0
  337. data/spec/support/shared/bulk_write.rb +498 -0
  338. data/spec/support/shared/cursor.rb +38 -0
  339. data/spec/support/shared/operation.rb +77 -0
  340. data/spec/support/shared/protocol.rb +31 -0
  341. data/spec/support/shared/server_selector.rb +111 -0
  342. data/spec/support/shared/socket.rb +82 -0
  343. data/spec/support/travis.rb +14 -0
  344. metadata +523 -189
  345. metadata.gz.sig +0 -0
  346. data/VERSION +0 -1
  347. data/lib/mongo/bulk_write_collection_view.rb +0 -387
  348. data/lib/mongo/collection_writer.rb +0 -364
  349. data/lib/mongo/connection/node.rb +0 -249
  350. data/lib/mongo/connection/pool.rb +0 -340
  351. data/lib/mongo/connection/pool_manager.rb +0 -320
  352. data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
  353. data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
  354. data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
  355. data/lib/mongo/connection/socket/unix_socket.rb +0 -39
  356. data/lib/mongo/db.rb +0 -808
  357. data/lib/mongo/exception.rb +0 -145
  358. data/lib/mongo/functional/authentication.rb +0 -455
  359. data/lib/mongo/functional/logging.rb +0 -85
  360. data/lib/mongo/functional/read_preference.rb +0 -183
  361. data/lib/mongo/functional/scram.rb +0 -556
  362. data/lib/mongo/functional/uri_parser.rb +0 -409
  363. data/lib/mongo/functional/write_concern.rb +0 -66
  364. data/lib/mongo/gridfs/grid.rb +0 -112
  365. data/lib/mongo/gridfs/grid_ext.rb +0 -53
  366. data/lib/mongo/gridfs/grid_file_system.rb +0 -163
  367. data/lib/mongo/gridfs/grid_io.rb +0 -484
  368. data/lib/mongo/legacy.rb +0 -140
  369. data/lib/mongo/mongo_client.rb +0 -697
  370. data/lib/mongo/mongo_replica_set_client.rb +0 -535
  371. data/lib/mongo/mongo_sharded_client.rb +0 -159
  372. data/lib/mongo/networking.rb +0 -372
  373. data/lib/mongo/utils/conversions.rb +0 -110
  374. data/lib/mongo/utils/core_ext.rb +0 -70
  375. data/lib/mongo/utils/server_version.rb +0 -69
  376. data/lib/mongo/utils/support.rb +0 -80
  377. data/test/functional/authentication_test.rb +0 -39
  378. data/test/functional/bulk_api_stress_test.rb +0 -133
  379. data/test/functional/bulk_write_collection_view_test.rb +0 -1198
  380. data/test/functional/client_test.rb +0 -627
  381. data/test/functional/collection_test.rb +0 -2175
  382. data/test/functional/collection_writer_test.rb +0 -83
  383. data/test/functional/conversions_test.rb +0 -163
  384. data/test/functional/cursor_fail_test.rb +0 -57
  385. data/test/functional/cursor_message_test.rb +0 -56
  386. data/test/functional/cursor_test.rb +0 -683
  387. data/test/functional/db_api_test.rb +0 -835
  388. data/test/functional/db_test.rb +0 -348
  389. data/test/functional/grid_file_system_test.rb +0 -285
  390. data/test/functional/grid_io_test.rb +0 -252
  391. data/test/functional/grid_test.rb +0 -273
  392. data/test/functional/pool_test.rb +0 -136
  393. data/test/functional/safe_test.rb +0 -98
  394. data/test/functional/support_test.rb +0 -62
  395. data/test/functional/timeout_test.rb +0 -60
  396. data/test/functional/uri_test.rb +0 -446
  397. data/test/functional/write_concern_test.rb +0 -118
  398. data/test/helpers/general.rb +0 -50
  399. data/test/helpers/test_unit.rb +0 -476
  400. data/test/replica_set/authentication_test.rb +0 -37
  401. data/test/replica_set/basic_test.rb +0 -189
  402. data/test/replica_set/client_test.rb +0 -393
  403. data/test/replica_set/connection_test.rb +0 -138
  404. data/test/replica_set/count_test.rb +0 -66
  405. data/test/replica_set/cursor_test.rb +0 -220
  406. data/test/replica_set/insert_test.rb +0 -157
  407. data/test/replica_set/max_values_test.rb +0 -151
  408. data/test/replica_set/pinning_test.rb +0 -105
  409. data/test/replica_set/query_test.rb +0 -73
  410. data/test/replica_set/read_preference_test.rb +0 -219
  411. data/test/replica_set/refresh_test.rb +0 -211
  412. data/test/replica_set/replication_ack_test.rb +0 -95
  413. data/test/sharded_cluster/basic_test.rb +0 -203
  414. data/test/shared/authentication/basic_auth_shared.rb +0 -260
  415. data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
  416. data/test/shared/authentication/gssapi_shared.rb +0 -176
  417. data/test/shared/authentication/sasl_plain_shared.rb +0 -96
  418. data/test/shared/authentication/scram_shared.rb +0 -92
  419. data/test/shared/ssl_shared.rb +0 -235
  420. data/test/test_helper.rb +0 -61
  421. data/test/threading/basic_test.rb +0 -120
  422. data/test/tools/mongo_config.rb +0 -708
  423. data/test/tools/mongo_config_test.rb +0 -160
  424. data/test/unit/client_test.rb +0 -381
  425. data/test/unit/collection_test.rb +0 -166
  426. data/test/unit/connection_test.rb +0 -335
  427. data/test/unit/cursor_test.rb +0 -307
  428. data/test/unit/db_test.rb +0 -136
  429. data/test/unit/grid_test.rb +0 -76
  430. data/test/unit/mongo_sharded_client_test.rb +0 -48
  431. data/test/unit/node_test.rb +0 -93
  432. data/test/unit/pool_manager_test.rb +0 -111
  433. data/test/unit/read_pref_test.rb +0 -406
  434. data/test/unit/read_test.rb +0 -159
  435. data/test/unit/safe_test.rb +0 -158
  436. data/test/unit/sharding_pool_manager_test.rb +0 -84
  437. data/test/unit/write_concern_test.rb +0 -175
@@ -0,0 +1,135 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Collection::View::Aggregation do
4
+
5
+ let(:pipeline) do
6
+ []
7
+ end
8
+
9
+ let(:view_options) do
10
+ {}
11
+ end
12
+
13
+ let(:options) do
14
+ {}
15
+ end
16
+
17
+ let(:selector) do
18
+ {}
19
+ end
20
+
21
+ let(:view) do
22
+ Mongo::Collection::View.new(authorized_collection, selector, view_options)
23
+ end
24
+
25
+ let(:aggregation) do
26
+ described_class.new(view, pipeline, options)
27
+ end
28
+
29
+ describe '#allow_disk_use' do
30
+
31
+ let(:new_agg) do
32
+ aggregation.allow_disk_use(true)
33
+ end
34
+
35
+ it 'sets the value in the options' do
36
+ expect(new_agg.allow_disk_use).to be true
37
+ end
38
+ end
39
+
40
+ describe '#each' do
41
+
42
+ let(:documents) do
43
+ [
44
+ { city: "Berlin", pop: 18913, neighborhood: "Kreuzberg" },
45
+ { city: "Berlin", pop: 84143, neighborhood: "Mitte" },
46
+ { city: "New York", pop: 40270, neighborhood: "Brooklyn" }
47
+ ]
48
+ end
49
+
50
+ let(:pipeline) do
51
+ [{
52
+ "$group" => {
53
+ "_id" => "$city",
54
+ "totalpop" => { "$sum" => "$pop" }
55
+ }
56
+ }]
57
+ end
58
+
59
+ before do
60
+ authorized_collection.insert_many(documents)
61
+ end
62
+
63
+ after do
64
+ authorized_collection.find.remove_many
65
+ end
66
+
67
+ context 'when a block is provided' do
68
+
69
+ context 'when no batch size is provided' do
70
+
71
+ it 'yields to each document' do
72
+ aggregation.each do |doc|
73
+ expect(doc[:totalpop]).to_not be_nil
74
+ end
75
+ end
76
+ end
77
+
78
+ context 'when a batch size of 0 is provided' do
79
+
80
+ let(:aggregation) do
81
+ described_class.new(view.batch_size(0), pipeline, options)
82
+ end
83
+
84
+ it 'yields to each document' do
85
+ aggregation.each do |doc|
86
+ expect(doc[:totalpop]).to_not be_nil
87
+ end
88
+ end
89
+ end
90
+
91
+ context 'when a batch size of greater than zero is provided' do
92
+
93
+ let(:aggregation) do
94
+ described_class.new(view.batch_size(5), pipeline, options)
95
+ end
96
+
97
+ it 'yields to each document' do
98
+ aggregation.each do |doc|
99
+ expect(doc[:totalpop]).to_not be_nil
100
+ end
101
+ end
102
+ end
103
+ end
104
+
105
+ context 'when no block is provided' do
106
+
107
+ it 'returns an enumerated cursor' do
108
+ expect(aggregation.each).to be_a(Enumerator)
109
+ end
110
+ end
111
+ end
112
+
113
+ describe '#initialize' do
114
+
115
+ let(:options) do
116
+ { :cursor => true }
117
+ end
118
+
119
+ it 'sets the view' do
120
+ expect(aggregation.view).to eq(view)
121
+ end
122
+
123
+ it 'sets the pipeline' do
124
+ expect(aggregation.pipeline).to eq(pipeline)
125
+ end
126
+
127
+ it 'sets the options' do
128
+ expect(aggregation.options).to eq(options)
129
+ end
130
+
131
+ it 'dups the options' do
132
+ expect(aggregation.options).not_to be(options)
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Collection::View::Explainable 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.remove_many
19
+ end
20
+
21
+ describe '#explain' do
22
+
23
+ let(:explain) do
24
+ view.explain
25
+ end
26
+
27
+ it 'executes an explain' do
28
+ expect(explain[:cursor] == 'BasicCursor' ||
29
+ explain[:queryPlanner]).to be_truthy
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,242 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Collection::View::MapReduce do
4
+
5
+ let(:map) do
6
+ %Q{
7
+ function() {
8
+ emit(this.name, { population: this.population });
9
+ }}
10
+ end
11
+
12
+ let(:reduce) do
13
+ %Q{
14
+ function(key, values) {
15
+ var result = { population: 0 };
16
+ values.forEach(function(value) {
17
+ result.population += value.population;
18
+ });
19
+ return result;
20
+ }}
21
+ end
22
+
23
+ let(:documents) do
24
+ [
25
+ { name: 'Berlin', population: 3000000 },
26
+ { name: 'London', population: 9000000 }
27
+ ]
28
+ end
29
+
30
+ let(:selector) do
31
+ {}
32
+ end
33
+
34
+ let(:view_options) do
35
+ {}
36
+ end
37
+
38
+ let(:view) do
39
+ Mongo::Collection::View.new(authorized_collection, selector, view_options)
40
+ end
41
+
42
+ let(:options) do
43
+ {}
44
+ end
45
+
46
+ before do
47
+ authorized_collection.insert_many(documents)
48
+ end
49
+
50
+ after do
51
+ authorized_collection.find.remove_many
52
+ end
53
+
54
+ let(:map_reduce) do
55
+ described_class.new(view, map, reduce, options)
56
+ end
57
+
58
+ describe '#each' do
59
+
60
+ context 'when no options are provided' do
61
+
62
+ it 'iterates over the documents in the result' do
63
+ map_reduce.each do |document|
64
+ expect(document[:value]).to_not be_nil
65
+ end
66
+ end
67
+ end
68
+
69
+ context 'when out is inline' do
70
+
71
+ let(:new_map_reduce) do
72
+ map_reduce.out(inline: 1)
73
+ end
74
+
75
+ it 'iterates over the documents in the result' do
76
+ new_map_reduce.each do |document|
77
+ expect(document[:value]).to_not be_nil
78
+ end
79
+ end
80
+ end
81
+
82
+ context 'when out is a collection' do
83
+
84
+ after do
85
+ authorized_client['output_collection'].find.remove_many
86
+ end
87
+
88
+ context 'when the option is to replace' do
89
+
90
+ let(:new_map_reduce) do
91
+ map_reduce.out(replace: 'output_collection')
92
+ end
93
+
94
+ it 'iterates over the documents in the result' do
95
+ new_map_reduce.each do |document|
96
+ expect(document[:value]).to_not be_nil
97
+ end
98
+ end
99
+
100
+ it 'fetches the results from the collection' do
101
+ expect(new_map_reduce.count).to eq(2)
102
+ end
103
+ end
104
+
105
+ context 'when the option is to merge' do
106
+
107
+ let(:new_map_reduce) do
108
+ map_reduce.out(merge: 'output_collection')
109
+ end
110
+
111
+ it 'iterates over the documents in the result' do
112
+ new_map_reduce.each do |document|
113
+ expect(document[:value]).to_not be_nil
114
+ end
115
+ end
116
+
117
+ it 'fetches the results from the collection' do
118
+ expect(new_map_reduce.count).to eq(2)
119
+ end
120
+ end
121
+
122
+ context 'when the option is to reduce' do
123
+
124
+ let(:new_map_reduce) do
125
+ map_reduce.out(reduce: 'output_collection')
126
+ end
127
+
128
+ it 'iterates over the documents in the result' do
129
+ new_map_reduce.each do |document|
130
+ expect(document[:value]).to_not be_nil
131
+ end
132
+ end
133
+
134
+ it 'fetches the results from the collection' do
135
+ expect(new_map_reduce.count).to eq(2)
136
+ end
137
+ end
138
+ end
139
+
140
+ context 'when the view has a selector' do
141
+
142
+ context 'when the selector is basic' do
143
+
144
+ let(:selector) do
145
+ { name: 'Berlin' }
146
+ end
147
+
148
+ it 'applies the selector to the map/reduce' do
149
+ map_reduce.each do |document|
150
+ expect(document[:_id]).to eq('Berlin')
151
+ end
152
+ end
153
+ end
154
+
155
+ context 'when the selector is advanced' do
156
+
157
+ let(:selector) do
158
+ { :$query => { name: 'Berlin' }}
159
+ end
160
+
161
+ it 'applies the selector to the map/reduce' do
162
+ map_reduce.each do |document|
163
+ expect(document[:_id]).to eq('Berlin')
164
+ end
165
+ end
166
+ end
167
+ end
168
+
169
+ context 'when the view has a limit' do
170
+
171
+ let(:view_options) do
172
+ { limit: 1 }
173
+ end
174
+
175
+ it 'applies the limit to the map/reduce' do
176
+ map_reduce.each do |document|
177
+ expect(document[:_id]).to eq('Berlin')
178
+ end
179
+ end
180
+ end
181
+ end
182
+
183
+ describe '#finalize' do
184
+
185
+ let(:finalize) do
186
+ %Q{
187
+ function(key, value) {
188
+ value.testing = test;
189
+ return value;
190
+ }}
191
+ end
192
+
193
+ let(:new_map_reduce) do
194
+ map_reduce.finalize(finalize)
195
+ end
196
+
197
+ it 'sets the finalize function' do
198
+ expect(new_map_reduce.finalize).to eq(finalize)
199
+ end
200
+ end
201
+
202
+ describe '#js_mode' do
203
+
204
+ let(:new_map_reduce) do
205
+ map_reduce.js_mode(true)
206
+ end
207
+
208
+ it 'sets the js mode value' do
209
+ expect(new_map_reduce.js_mode).to be true
210
+ end
211
+ end
212
+
213
+ describe '#out' do
214
+
215
+ let(:location) do
216
+ { replace: 'testing' }
217
+ end
218
+
219
+ let(:new_map_reduce) do
220
+ map_reduce.out(location)
221
+ end
222
+
223
+ it 'sets the out value' do
224
+ expect(new_map_reduce.out).to eq(location)
225
+ end
226
+ end
227
+
228
+ describe '#scope' do
229
+
230
+ let(:object) do
231
+ { value: 'testing' }
232
+ end
233
+
234
+ let(:new_map_reduce) do
235
+ map_reduce.scope(object)
236
+ end
237
+
238
+ it 'sets the scope object' do
239
+ expect(new_map_reduce.scope).to eq(object)
240
+ end
241
+ end
242
+ end
@@ -0,0 +1,603 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Collection::View::Readable 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.remove_many
19
+ end
20
+
21
+ describe '#allow_partial_results' do
22
+
23
+ let(:new_view) do
24
+ view.allow_partial_results
25
+ end
26
+
27
+ it 'sets the flag' do
28
+ expect(new_view.send(:flags)).to include(:partial)
29
+ end
30
+
31
+ it 'returns a new View' do
32
+ expect(new_view).not_to be(view)
33
+ end
34
+ end
35
+
36
+ describe '#aggregate' do
37
+
38
+ let(:documents) do
39
+ [
40
+ { city: "Berlin", pop: 18913, neighborhood: "Kreuzberg" },
41
+ { city: "Berlin", pop: 84143, neighborhood: "Mitte" },
42
+ { city: "New York", pop: 40270, neighborhood: "Brooklyn" }
43
+ ]
44
+ end
45
+
46
+ let(:pipeline) do
47
+ [{
48
+ "$group" => {
49
+ "_id" => "$city",
50
+ "totalpop" => { "$sum" => "$pop" }
51
+ }
52
+ }]
53
+ end
54
+
55
+ before do
56
+ authorized_collection.insert_many(documents)
57
+ end
58
+
59
+ let(:aggregation) do
60
+ view.aggregate(pipeline)
61
+ end
62
+
63
+ context 'when not iterating the aggregation' do
64
+
65
+ it 'returns the aggregation object' do
66
+ expect(aggregation).to be_a(Mongo::Collection::View::Aggregation)
67
+ end
68
+ end
69
+
70
+ context 'when iterating the aggregation' do
71
+
72
+ it 'yields to each document' do
73
+ aggregation.each do |doc|
74
+ expect(doc[:totalpop]).to_not be_nil
75
+ end
76
+ end
77
+ end
78
+ end
79
+
80
+ describe '#map_reduce' do
81
+
82
+ let(:map) do
83
+ %Q{
84
+ function() {
85
+ emit(this.name, { population: this.population });
86
+ }}
87
+ end
88
+
89
+ let(:reduce) do
90
+ %Q{
91
+ function(key, values) {
92
+ var result = { population: 0 };
93
+ values.forEach(function(value) {
94
+ result.population += value.population;
95
+ });
96
+ return result;
97
+ }}
98
+ end
99
+
100
+ let(:documents) do
101
+ [
102
+ { name: 'Berlin', population: 3000000 },
103
+ { name: 'London', population: 9000000 }
104
+ ]
105
+ end
106
+
107
+ before do
108
+ authorized_collection.insert_many(documents)
109
+ end
110
+
111
+ let(:map_reduce) do
112
+ view.map_reduce(map, reduce)
113
+ end
114
+
115
+ context 'when not iterating the map/reduce' do
116
+
117
+ it 'returns the map/reduce object' do
118
+ expect(map_reduce).to be_a(Mongo::Collection::View::MapReduce)
119
+ end
120
+ end
121
+
122
+ context 'when iterating the map/reduce' do
123
+
124
+ it 'yields to each document' do
125
+ map_reduce.each do |doc|
126
+ expect(doc[:_id]).to_not be_nil
127
+ end
128
+ end
129
+ end
130
+ end
131
+
132
+ describe '#batch_size' do
133
+
134
+ let(:options) do
135
+ { :batch_size => 13 }
136
+ end
137
+
138
+ context 'when a batch size is specified' do
139
+
140
+ let(:new_batch_size) do
141
+ 15
142
+ end
143
+
144
+ it 'sets the batch size' do
145
+ new_view = view.batch_size(new_batch_size)
146
+ expect(new_view.batch_size).to eq(new_batch_size)
147
+ end
148
+
149
+ it 'returns a new View' do
150
+ expect(view.batch_size(new_batch_size)).not_to be(view)
151
+ end
152
+ end
153
+
154
+ context 'when a batch size is not specified' do
155
+
156
+ it 'returns the batch_size' do
157
+ expect(view.batch_size).to eq(options[:batch_size])
158
+ end
159
+ end
160
+ end
161
+
162
+ describe '#comment' do
163
+
164
+ let(:options) do
165
+ { :comment => 'test1' }
166
+ end
167
+
168
+ context 'when a comment is specified' do
169
+
170
+ let(:new_comment) do
171
+ 'test2'
172
+ end
173
+
174
+ it 'sets the comment' do
175
+ new_view = view.comment(new_comment)
176
+ expect(new_view.comment).to eq(new_comment)
177
+ end
178
+
179
+ it 'returns a new View' do
180
+ expect(view.comment(new_comment)).not_to be(view)
181
+ end
182
+ end
183
+
184
+ context 'when a comment is not specified' do
185
+
186
+ it 'returns the comment' do
187
+ expect(view.comment).to eq(options[:comment])
188
+ end
189
+ end
190
+ end
191
+
192
+ describe '#count' do
193
+
194
+ let(:documents) do
195
+ (1..10).map{ |i| { field: "test#{i}" }}
196
+ end
197
+
198
+ before do
199
+ authorized_collection.insert_many(documents)
200
+ end
201
+
202
+ after do
203
+ authorized_collection.find.remove_many
204
+ end
205
+
206
+ context 'when a selector is provided' do
207
+
208
+ let(:selector) do
209
+ { field: 'test1' }
210
+ end
211
+
212
+ it 'returns the count of matching documents' do
213
+ expect(view.count).to eq(1)
214
+ end
215
+ end
216
+
217
+ context 'when no selector is provided' do
218
+
219
+ it 'returns the count of matching documents' do
220
+ expect(view.count).to eq(10)
221
+ end
222
+ end
223
+
224
+ it 'takes a read preference option' do
225
+ expect(view.count(read: { mode: :secondary })).to eq(10)
226
+ end
227
+ end
228
+
229
+ describe '#distinct' do
230
+
231
+ context 'when a selector is provided' do
232
+
233
+ let(:selector) do
234
+ { field: 'test' }
235
+ end
236
+
237
+ let(:documents) do
238
+ (1..3).map{ |i| { field: "test" }}
239
+ end
240
+
241
+ before do
242
+ authorized_collection.insert_many(documents)
243
+ end
244
+
245
+ context 'when the field is a symbol' do
246
+
247
+ let(:distinct) do
248
+ view.distinct(:field)
249
+ end
250
+
251
+ it 'returns the distinct values' do
252
+ expect(distinct).to eq([ 'test' ])
253
+ end
254
+ end
255
+
256
+ context 'when the field is a string' do
257
+
258
+ let(:distinct) do
259
+ view.distinct('field')
260
+ end
261
+
262
+ it 'returns the distinct values' do
263
+ expect(distinct).to eq([ 'test' ])
264
+ end
265
+ end
266
+
267
+ context 'when the field is nil' do
268
+
269
+ let(:distinct) do
270
+ view.distinct(nil)
271
+ end
272
+
273
+ it 'returns an empty array' do
274
+ expect(distinct).to be_empty
275
+ end
276
+ end
277
+ end
278
+
279
+ context 'when no selector is provided' do
280
+
281
+ let(:documents) do
282
+ (1..3).map{ |i| { field: "test#{i}" }}
283
+ end
284
+
285
+ before do
286
+ authorized_collection.insert_many(documents)
287
+ end
288
+
289
+ context 'when the field is a symbol' do
290
+
291
+ let(:distinct) do
292
+ view.distinct(:field)
293
+ end
294
+
295
+ it 'returns the distinct values' do
296
+ expect(distinct).to eq([ 'test1', 'test2', 'test3' ])
297
+ end
298
+ end
299
+
300
+ context 'when the field is a string' do
301
+
302
+ let(:distinct) do
303
+ view.distinct('field')
304
+ end
305
+
306
+ it 'returns the distinct values' do
307
+ expect(distinct).to eq([ 'test1', 'test2', 'test3' ])
308
+ end
309
+ end
310
+
311
+ context 'when the field is nil' do
312
+
313
+ let(:distinct) do
314
+ view.distinct(nil)
315
+ end
316
+
317
+ it 'returns an empty array' do
318
+ expect(distinct).to be_empty
319
+ end
320
+ end
321
+ end
322
+
323
+ context 'when a read preference is specified' do
324
+
325
+ let(:documents) do
326
+ (1..3).map{ |i| { field: "test#{i}" }}
327
+ end
328
+
329
+ before do
330
+ authorized_collection.insert_many(documents)
331
+ end
332
+
333
+ let(:distinct) do
334
+ view.distinct(:field, read: { mode: :secondary })
335
+ end
336
+
337
+ it 'returns the distinct values' do
338
+ expect(distinct).to eq([ 'test1', 'test2', 'test3' ])
339
+ end
340
+ end
341
+ end
342
+
343
+ describe '#hint' do
344
+
345
+ context 'when a hint is specified' do
346
+
347
+ let(:options) do
348
+ { :hint => { 'x' => Mongo::Index::ASCENDING } }
349
+ end
350
+
351
+ let(:new_hint) do
352
+ { 'x' => Mongo::Index::DESCENDING }
353
+ end
354
+
355
+ it 'sets the hint' do
356
+ new_view = view.hint(new_hint)
357
+ expect(new_view.hint).to eq(new_hint)
358
+ end
359
+
360
+ it 'returns a new View' do
361
+ expect(view.hint(new_hint)).not_to be(view)
362
+ end
363
+ end
364
+
365
+ context 'when a hint is not specified' do
366
+
367
+ let(:options) do
368
+ { :hint => 'x' }
369
+ end
370
+
371
+ it 'returns the hint' do
372
+ expect(view.hint).to eq(options[:hint])
373
+ end
374
+ end
375
+ end
376
+
377
+ describe '#limit' do
378
+
379
+ context 'when a limit is specified' do
380
+
381
+ let(:options) do
382
+ { :limit => 5 }
383
+ end
384
+
385
+ let(:new_limit) do
386
+ 10
387
+ end
388
+
389
+ it 'sets the limit' do
390
+ new_view = view.limit(new_limit)
391
+ expect(new_view.limit).to eq(new_limit)
392
+ end
393
+
394
+ it 'returns a new View' do
395
+ expect(view.limit(new_limit)).not_to be(view)
396
+ end
397
+ end
398
+
399
+ context 'when a limit is not specified' do
400
+
401
+ let(:options) do
402
+ { :limit => 5 }
403
+ end
404
+
405
+ it 'returns the limit' do
406
+ expect(view.limit).to eq(options[:limit])
407
+ end
408
+ end
409
+ end
410
+
411
+ describe '#max_scan' do
412
+
413
+ let(:new_view) do
414
+ view.max_scan(10)
415
+ end
416
+
417
+ it 'sets the value in the options' do
418
+ expect(new_view.max_scan).to eq(10)
419
+ end
420
+ end
421
+
422
+ describe '#no_cursor_timeout' do
423
+
424
+ let(:new_view) do
425
+ view.no_cursor_timeout
426
+ end
427
+
428
+ it 'sets the flag' do
429
+ expect(new_view.send(:flags)).to include(:no_cursor_timeout)
430
+ end
431
+
432
+ it 'returns a new View' do
433
+ expect(new_view).not_to be(view)
434
+ end
435
+ end
436
+
437
+ describe '#projection' do
438
+
439
+ context 'when projection are specified' do
440
+
441
+ let(:options) do
442
+ { :projection => { 'x' => 1 } }
443
+ end
444
+
445
+ let(:new_projection) do
446
+ { 'y' => 1 }
447
+ end
448
+
449
+ it 'sets the projection' do
450
+ new_view = view.projection(new_projection)
451
+ expect(new_view.projection).to eq(new_projection)
452
+ end
453
+
454
+ it 'returns a new View' do
455
+ expect(view.projection(new_projection)).not_to be(view)
456
+ end
457
+ end
458
+
459
+ context 'when projection are not specified' do
460
+
461
+ let(:options) { { :projection => { 'x' => 1 } } }
462
+
463
+ it 'returns the projection' do
464
+ expect(view.projection).to eq(options[:projection])
465
+ end
466
+ end
467
+ end
468
+
469
+ describe '#read' do
470
+
471
+ context 'when a read pref is specified' do
472
+
473
+ let(:options) do
474
+ { :read => Mongo::ServerSelector.get(:mode => :secondary) }
475
+ end
476
+
477
+ let(:new_read) do
478
+ Mongo::ServerSelector.get(:mode => :secondary_preferred)
479
+ end
480
+
481
+ it 'sets the read preference' do
482
+ new_view = view.read(new_read)
483
+ expect(new_view.read).to eq(new_read)
484
+ end
485
+
486
+ it 'returns a new View' do
487
+ expect(view.read(new_read)).not_to be(view)
488
+ end
489
+ end
490
+
491
+ context 'when a read pref is not specified' do
492
+
493
+ let(:options) do
494
+ { :read => Mongo::ServerSelector.get(:mode => :secondary) }
495
+ end
496
+
497
+ it 'returns the read preference' do
498
+ expect(view.read).to eq(options[:read])
499
+ end
500
+
501
+ context 'when no read pref is set on initialization' do
502
+
503
+ let(:options) do
504
+ {}
505
+ end
506
+
507
+ it 'returns the collection read preference' do
508
+ expect(view.read).to eq(authorized_collection.read_preference)
509
+ end
510
+ end
511
+ end
512
+ end
513
+
514
+ describe '#show_disk_loc' do
515
+
516
+ let(:new_view) do
517
+ view.show_disk_loc(true)
518
+ end
519
+
520
+ it 'sets the value in the options' do
521
+ expect(new_view.show_disk_loc).to be true
522
+ end
523
+ end
524
+
525
+ describe '#skip' do
526
+
527
+ context 'when a skip is specified' do
528
+
529
+ let(:options) do
530
+ { :skip => 5 }
531
+ end
532
+
533
+ let(:new_skip) do
534
+ 10
535
+ end
536
+
537
+ it 'sets the skip value' do
538
+ new_view = view.skip(new_skip)
539
+ expect(new_view.skip).to eq(new_skip)
540
+ end
541
+
542
+ it 'returns a new View' do
543
+ expect(view.skip(new_skip)).not_to be(view)
544
+ end
545
+ end
546
+
547
+ context 'when a skip is not specified' do
548
+
549
+ let(:options) do
550
+ { :skip => 5 }
551
+ end
552
+
553
+ it 'returns the skip value' do
554
+ expect(view.skip).to eq(options[:skip])
555
+ end
556
+ end
557
+ end
558
+
559
+ describe '#snapshot' do
560
+
561
+ let(:new_view) do
562
+ view.snapshot(true)
563
+ end
564
+
565
+ it 'sets the value in the options' do
566
+ expect(new_view.snapshot).to be true
567
+ end
568
+ end
569
+
570
+ describe '#sort' do
571
+
572
+ context 'when a sort is specified' do
573
+
574
+ let(:options) do
575
+ { :sort => { 'x' => Mongo::Index::ASCENDING }}
576
+ end
577
+
578
+ let(:new_sort) do
579
+ { 'x' => Mongo::Index::DESCENDING }
580
+ end
581
+
582
+ it 'sets the sort option' do
583
+ new_view = view.sort(new_sort)
584
+ expect(new_view.sort).to eq(new_sort)
585
+ end
586
+
587
+ it 'returns a new View' do
588
+ expect(view.sort(new_sort)).not_to be(view)
589
+ end
590
+ end
591
+
592
+ context 'when a sort is not specified' do
593
+
594
+ let(:options) do
595
+ { :sort => { 'x' => Mongo::Index::ASCENDING }}
596
+ end
597
+
598
+ it 'returns the sort' do
599
+ expect(view.sort).to eq(options[:sort])
600
+ end
601
+ end
602
+ end
603
+ end