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,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.delete_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.delete_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