mongoid 7.1.11 → 7.2.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 (485) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +10 -3
  4. data/lib/config/locales/en.yml +37 -14
  5. data/lib/mongoid/association/depending.rb +1 -6
  6. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +1 -1
  7. data/lib/mongoid/association/many.rb +3 -3
  8. data/lib/mongoid/association/proxy.rb +1 -1
  9. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  10. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
  11. data/lib/mongoid/association/referenced/has_many/enumerable.rb +37 -2
  12. data/lib/mongoid/association/referenced/has_many/proxy.rb +9 -2
  13. data/lib/mongoid/association/referenced/has_one/buildable.rb +9 -1
  14. data/lib/mongoid/atomic/modifiers.rb +1 -1
  15. data/lib/mongoid/attributes/dynamic.rb +1 -1
  16. data/lib/mongoid/attributes.rb +1 -8
  17. data/lib/mongoid/clients/factory.rb +17 -0
  18. data/lib/mongoid/composable.rb +1 -0
  19. data/lib/mongoid/config/environment.rb +1 -9
  20. data/lib/mongoid/config.rb +3 -0
  21. data/lib/mongoid/contextual/atomic.rb +2 -7
  22. data/lib/mongoid/contextual/mongo.rb +23 -4
  23. data/lib/mongoid/contextual/none.rb +0 -3
  24. data/lib/mongoid/copyable.rb +7 -3
  25. data/lib/mongoid/criteria/queryable/key.rb +1 -1
  26. data/lib/mongoid/criteria/queryable/mergeable.rb +2 -2
  27. data/lib/mongoid/criteria/queryable/selectable.rb +23 -8
  28. data/lib/mongoid/criteria/queryable/selector.rb +7 -3
  29. data/lib/mongoid/criteria/queryable/storable.rb +7 -7
  30. data/lib/mongoid/criteria.rb +58 -8
  31. data/lib/mongoid/document.rb +19 -9
  32. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
  33. data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
  34. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
  35. data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
  36. data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
  37. data/lib/mongoid/errors/invalid_query.rb +41 -0
  38. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  39. data/lib/mongoid/errors.rb +7 -2
  40. data/lib/mongoid/extensions.rb +1 -0
  41. data/lib/mongoid/factory.rb +27 -10
  42. data/lib/mongoid/fields/validators/macro.rb +22 -9
  43. data/lib/mongoid/fields.rb +3 -0
  44. data/lib/mongoid/findable.rb +50 -14
  45. data/lib/mongoid/indexable.rb +2 -2
  46. data/lib/mongoid/interceptable.rb +2 -4
  47. data/lib/mongoid/matchable.rb +1 -149
  48. data/lib/mongoid/matcher/all.rb +22 -0
  49. data/lib/mongoid/matcher/and.rb +21 -0
  50. data/lib/mongoid/matcher/elem_match.rb +35 -0
  51. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  52. data/lib/mongoid/matcher/eq.rb +11 -0
  53. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  54. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  55. data/lib/mongoid/matcher/exists.rb +15 -0
  56. data/lib/mongoid/matcher/expression.rb +40 -0
  57. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  58. data/lib/mongoid/matcher/field_expression.rb +63 -0
  59. data/lib/mongoid/matcher/field_operator.rb +52 -0
  60. data/lib/mongoid/matcher/gt.rb +17 -0
  61. data/lib/mongoid/matcher/gte.rb +17 -0
  62. data/lib/mongoid/matcher/in.rb +25 -0
  63. data/lib/mongoid/matcher/lt.rb +17 -0
  64. data/lib/mongoid/matcher/lte.rb +17 -0
  65. data/lib/mongoid/matcher/ne.rb +16 -0
  66. data/lib/mongoid/matcher/nin.rb +11 -0
  67. data/lib/mongoid/matcher/nor.rb +25 -0
  68. data/lib/mongoid/matcher/not.rb +29 -0
  69. data/lib/mongoid/matcher/or.rb +21 -0
  70. data/lib/mongoid/matcher/regex.rb +41 -0
  71. data/lib/mongoid/matcher/size.rb +26 -0
  72. data/lib/mongoid/matcher.rb +127 -0
  73. data/lib/mongoid/persistable/deletable.rb +1 -1
  74. data/lib/mongoid/persistence_context.rb +1 -3
  75. data/lib/mongoid/query_cache.rb +64 -62
  76. data/lib/mongoid/reloadable.rb +2 -7
  77. data/lib/mongoid/serializable.rb +1 -1
  78. data/lib/mongoid/stringified_symbol.rb +53 -0
  79. data/lib/mongoid/tasks/database.rb +1 -1
  80. data/lib/mongoid/traversable.rb +111 -4
  81. data/lib/mongoid/validatable/associated.rb +1 -1
  82. data/lib/mongoid/validatable/presence.rb +3 -3
  83. data/lib/mongoid/validatable/uniqueness.rb +1 -1
  84. data/lib/mongoid/version.rb +1 -1
  85. data/lib/mongoid.rb +23 -1
  86. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -8
  87. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +1 -1
  88. data/spec/README.md +19 -4
  89. data/spec/integration/app_spec.rb +84 -174
  90. data/spec/integration/associations/embedded_spec.rb +94 -0
  91. data/spec/integration/associations/has_many_spec.rb +67 -14
  92. data/spec/integration/associations/has_one_spec.rb +67 -14
  93. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  94. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  95. data/spec/integration/discriminator_key_spec.rb +354 -0
  96. data/spec/integration/discriminator_value_spec.rb +207 -0
  97. data/spec/integration/document_spec.rb +0 -21
  98. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
  99. data/spec/integration/matcher_operator_data/all.yml +140 -0
  100. data/spec/integration/matcher_operator_data/and.yml +93 -0
  101. data/spec/integration/matcher_operator_data/elem_match.yml +363 -0
  102. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  103. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  104. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  105. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  106. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  107. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  108. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  109. data/spec/integration/matcher_operator_data/implicit_traversal.yml +16 -0
  110. data/spec/integration/matcher_operator_data/in.yml +194 -0
  111. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  112. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  113. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  114. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  115. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  116. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  117. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  118. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  119. data/spec/integration/matcher_operator_data/not.yml +196 -0
  120. data/spec/integration/matcher_operator_data/or.yml +137 -0
  121. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  122. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  123. data/spec/integration/matcher_operator_data/size.yml +174 -0
  124. data/spec/integration/matcher_operator_spec.rb +100 -0
  125. data/spec/integration/matcher_spec.rb +189 -0
  126. data/spec/integration/server_query_spec.rb +142 -0
  127. data/spec/integration/stringified_symbol_field_spec.rb +190 -0
  128. data/spec/lite_spec_helper.rb +4 -3
  129. data/spec/mongoid/association/depending_spec.rb +78 -26
  130. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +0 -50
  131. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +37 -17
  132. data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
  133. data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
  134. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +0 -17
  135. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +460 -186
  136. data/spec/mongoid/association/referenced/has_many_models.rb +21 -0
  137. data/spec/mongoid/association/referenced/has_one_models.rb +21 -0
  138. data/spec/mongoid/association/referenced/has_one_spec.rb +1 -1
  139. data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
  140. data/spec/mongoid/atomic/paths_spec.rb +0 -41
  141. data/spec/mongoid/atomic_spec.rb +23 -0
  142. data/spec/mongoid/attributes/nested_spec.rb +1 -1
  143. data/spec/mongoid/attributes_spec.rb +0 -241
  144. data/spec/mongoid/clients/factory_spec.rb +35 -9
  145. data/spec/mongoid/clients/options_spec.rb +3 -11
  146. data/spec/mongoid/clients/sessions_spec.rb +1 -6
  147. data/spec/mongoid/config/environment_spec.rb +8 -86
  148. data/spec/mongoid/config_spec.rb +28 -0
  149. data/spec/mongoid/contextual/atomic_spec.rb +29 -81
  150. data/spec/mongoid/contextual/geo_near_spec.rb +1 -1
  151. data/spec/mongoid/contextual/mongo_spec.rb +70 -16
  152. data/spec/mongoid/copyable_spec.rb +197 -18
  153. data/spec/mongoid/copyable_spec_models.rb +28 -0
  154. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +0 -36
  155. data/spec/mongoid/criteria/queryable/selectable_spec.rb +84 -82
  156. data/spec/mongoid/criteria_spec.rb +204 -43
  157. data/spec/mongoid/document_query_spec.rb +0 -51
  158. data/spec/mongoid/document_spec.rb +90 -36
  159. data/spec/mongoid/equality_spec.rb +0 -1
  160. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  161. data/spec/mongoid/errors/mongoid_error_spec.rb +8 -20
  162. data/spec/mongoid/extensions/stringified_symbol_spec.rb +85 -0
  163. data/spec/mongoid/factory_spec.rb +261 -28
  164. data/spec/mongoid/fields_spec.rb +48 -2
  165. data/spec/mongoid/findable_spec.rb +32 -0
  166. data/spec/mongoid/indexable_spec.rb +28 -2
  167. data/spec/mongoid/inspectable_spec.rb +29 -2
  168. data/spec/mongoid/interceptable_spec.rb +2 -2
  169. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +259 -0
  170. data/spec/mongoid/matcher/extract_attribute_spec.rb +47 -0
  171. data/spec/mongoid/persistable/creatable_spec.rb +108 -25
  172. data/spec/mongoid/persistable/deletable_spec.rb +86 -0
  173. data/spec/mongoid/persistable/savable_spec.rb +174 -16
  174. data/spec/mongoid/persistable/settable_spec.rb +0 -30
  175. data/spec/mongoid/persistable/updatable_spec.rb +0 -2
  176. data/spec/mongoid/persistable_spec.rb +2 -2
  177. data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
  178. data/spec/mongoid/query_cache_spec.rb +442 -41
  179. data/spec/mongoid/reloadable_spec.rb +72 -0
  180. data/spec/mongoid/serializable_spec.rb +21 -3
  181. data/spec/mongoid/traversable_spec.rb +1100 -0
  182. data/spec/shared/lib/mrss/constraints.rb +10 -92
  183. data/spec/shared/lib/mrss/lite_constraints.rb +0 -16
  184. data/spec/shared/lib/mrss/spec_organizer.rb +2 -32
  185. data/spec/spec_helper.rb +3 -3
  186. data/spec/support/constraints.rb +24 -0
  187. data/spec/support/helpers.rb +1 -1
  188. data/spec/{app → support}/models/actor.rb +1 -1
  189. data/spec/{app → support}/models/address.rb +0 -4
  190. data/spec/support/models/armrest.rb +10 -0
  191. data/spec/{app → support}/models/browser.rb +1 -1
  192. data/spec/{app → support}/models/canvas.rb +1 -1
  193. data/spec/{app → support}/models/coding.rb +1 -1
  194. data/spec/support/models/crate.rb +13 -0
  195. data/spec/support/models/deed.rb +8 -0
  196. data/spec/{app → support}/models/dictionary.rb +0 -6
  197. data/spec/{app → support}/models/driver.rb +1 -1
  198. data/spec/support/models/guitar.rb +5 -0
  199. data/spec/support/models/idnodef.rb +8 -0
  200. data/spec/support/models/instrument.rb +9 -0
  201. data/spec/{app → support}/models/item.rb +1 -1
  202. data/spec/{app → support}/models/mop.rb +0 -10
  203. data/spec/support/models/order.rb +11 -0
  204. data/spec/{app → support}/models/owner.rb +2 -0
  205. data/spec/{app → support}/models/palette.rb +1 -1
  206. data/spec/{app → support}/models/person.rb +1 -10
  207. data/spec/support/models/piano.rb +5 -0
  208. data/spec/support/models/profile.rb +18 -0
  209. data/spec/support/models/publication.rb +5 -0
  210. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
  211. data/spec/support/models/seat.rb +25 -0
  212. data/spec/{app → support}/models/shape.rb +2 -2
  213. data/spec/support/models/system_role.rb +7 -0
  214. data/spec/{app → support}/models/tool.rb +2 -2
  215. data/spec/support/models/toy.rb +10 -0
  216. data/spec/{app → support}/models/truck.rb +2 -0
  217. data/spec/{app → support}/models/vehicle.rb +7 -2
  218. data/spec/{app → support}/models/writer.rb +2 -2
  219. data/spec/support/spec_config.rb +1 -9
  220. data.tar.gz.sig +0 -0
  221. metadata +839 -820
  222. metadata.gz.sig +2 -2
  223. data/lib/mongoid/errors/empty_config_file.rb +0 -26
  224. data/lib/mongoid/errors/invalid_config_file.rb +0 -26
  225. data/lib/mongoid/matchable/all.rb +0 -30
  226. data/lib/mongoid/matchable/and.rb +0 -32
  227. data/lib/mongoid/matchable/default.rb +0 -121
  228. data/lib/mongoid/matchable/elem_match.rb +0 -36
  229. data/lib/mongoid/matchable/eq.rb +0 -23
  230. data/lib/mongoid/matchable/exists.rb +0 -25
  231. data/lib/mongoid/matchable/gt.rb +0 -25
  232. data/lib/mongoid/matchable/gte.rb +0 -25
  233. data/lib/mongoid/matchable/in.rb +0 -26
  234. data/lib/mongoid/matchable/lt.rb +0 -25
  235. data/lib/mongoid/matchable/lte.rb +0 -25
  236. data/lib/mongoid/matchable/ne.rb +0 -23
  237. data/lib/mongoid/matchable/nin.rb +0 -24
  238. data/lib/mongoid/matchable/nor.rb +0 -38
  239. data/lib/mongoid/matchable/or.rb +0 -35
  240. data/lib/mongoid/matchable/regexp.rb +0 -30
  241. data/lib/mongoid/matchable/size.rb +0 -23
  242. data/spec/app/models/customer.rb +0 -11
  243. data/spec/app/models/customer_address.rb +0 -12
  244. data/spec/app/models/publication.rb +0 -5
  245. data/spec/integration/callbacks_models.rb +0 -49
  246. data/spec/integration/callbacks_spec.rb +0 -216
  247. data/spec/integration/contextual/empty_spec.rb +0 -142
  248. data/spec/mongoid/errors/invalid_config_file_spec.rb +0 -32
  249. data/spec/mongoid/matchable/all_spec.rb +0 -34
  250. data/spec/mongoid/matchable/and_spec.rb +0 -190
  251. data/spec/mongoid/matchable/default_spec.rb +0 -140
  252. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  253. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  254. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  255. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  256. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  257. data/spec/mongoid/matchable/in_spec.rb +0 -52
  258. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  259. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  260. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  261. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  262. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  263. data/spec/mongoid/matchable/or_spec.rb +0 -134
  264. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  265. data/spec/mongoid/matchable/size_spec.rb +0 -28
  266. data/spec/mongoid/matchable_spec.rb +0 -856
  267. data/spec/shared/bin/get-mongodb-download-url +0 -17
  268. data/spec/shared/bin/s3-copy +0 -45
  269. data/spec/shared/bin/s3-upload +0 -69
  270. data/spec/shared/lib/mrss/cluster_config.rb +0 -226
  271. data/spec/shared/lib/mrss/docker_runner.rb +0 -271
  272. data/spec/shared/lib/mrss/event_subscriber.rb +0 -200
  273. data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
  274. data/spec/shared/lib/mrss/utils.rb +0 -15
  275. data/spec/shared/share/Dockerfile.erb +0 -323
  276. data/spec/shared/share/haproxy-1.conf +0 -16
  277. data/spec/shared/share/haproxy-2.conf +0 -17
  278. data/spec/shared/shlib/distro.sh +0 -73
  279. data/spec/shared/shlib/server.sh +0 -367
  280. data/spec/shared/shlib/set_env.sh +0 -131
  281. /data/spec/{app → support}/models/account.rb +0 -0
  282. /data/spec/{app → support}/models/acolyte.rb +0 -0
  283. /data/spec/{app → support}/models/actress.rb +0 -0
  284. /data/spec/{app → support}/models/address_component.rb +0 -0
  285. /data/spec/{app → support}/models/address_number.rb +0 -0
  286. /data/spec/{app → support}/models/agency.rb +0 -0
  287. /data/spec/{app → support}/models/agent.rb +0 -0
  288. /data/spec/{app → support}/models/album.rb +0 -0
  289. /data/spec/{app → support}/models/alert.rb +0 -0
  290. /data/spec/{app → support}/models/animal.rb +0 -0
  291. /data/spec/{app → support}/models/answer.rb +0 -0
  292. /data/spec/{app → support}/models/appointment.rb +0 -0
  293. /data/spec/{app → support}/models/array_field.rb +0 -0
  294. /data/spec/{app → support}/models/article.rb +0 -0
  295. /data/spec/{app → support}/models/artist.rb +0 -0
  296. /data/spec/{app → support}/models/artwork.rb +0 -0
  297. /data/spec/{app → support}/models/audio.rb +0 -0
  298. /data/spec/{app → support}/models/augmentation.rb +0 -0
  299. /data/spec/{app → support}/models/author.rb +0 -0
  300. /data/spec/{app → support}/models/baby.rb +0 -0
  301. /data/spec/{app → support}/models/band.rb +0 -0
  302. /data/spec/{app → support}/models/bar.rb +0 -0
  303. /data/spec/{app → support}/models/basic.rb +0 -0
  304. /data/spec/{app → support}/models/bed.rb +0 -0
  305. /data/spec/{app → support}/models/big_palette.rb +0 -0
  306. /data/spec/{app → support}/models/birthday.rb +0 -0
  307. /data/spec/{app → support}/models/bomb.rb +0 -0
  308. /data/spec/{app → support}/models/book.rb +0 -0
  309. /data/spec/{app → support}/models/breed.rb +0 -0
  310. /data/spec/{app → support}/models/building.rb +0 -0
  311. /data/spec/{app → support}/models/building_address.rb +0 -0
  312. /data/spec/{app → support}/models/bus.rb +0 -0
  313. /data/spec/{app → support}/models/business.rb +0 -0
  314. /data/spec/{app → support}/models/callback_test.rb +0 -0
  315. /data/spec/{app → support}/models/car.rb +0 -0
  316. /data/spec/{app → support}/models/cat.rb +0 -0
  317. /data/spec/{app → support}/models/category.rb +0 -0
  318. /data/spec/{app → support}/models/child.rb +0 -0
  319. /data/spec/{app → support}/models/child_doc.rb +0 -0
  320. /data/spec/{app → support}/models/church.rb +0 -0
  321. /data/spec/{app → support}/models/circle.rb +0 -0
  322. /data/spec/{app → support}/models/circuit.rb +0 -0
  323. /data/spec/{app → support}/models/circus.rb +0 -0
  324. /data/spec/{app → support}/models/code.rb +0 -0
  325. /data/spec/{app → support}/models/coding/pull_request.rb +0 -0
  326. /data/spec/{app → support}/models/comment.rb +0 -0
  327. /data/spec/{app → support}/models/company.rb +0 -0
  328. /data/spec/{app → support}/models/consumption_period.rb +0 -0
  329. /data/spec/{app → support}/models/contextable_item.rb +0 -0
  330. /data/spec/{app → support}/models/contractor.rb +0 -0
  331. /data/spec/{app → support}/models/cookie.rb +0 -0
  332. /data/spec/{app → support}/models/country_code.rb +0 -0
  333. /data/spec/{app → support}/models/courier_job.rb +0 -0
  334. /data/spec/{app → support}/models/definition.rb +0 -0
  335. /data/spec/{app → support}/models/delegating_patient.rb +0 -0
  336. /data/spec/{app → support}/models/description.rb +0 -0
  337. /data/spec/{app → support}/models/division.rb +0 -0
  338. /data/spec/{app → support}/models/doctor.rb +0 -0
  339. /data/spec/{app → support}/models/dog.rb +0 -0
  340. /data/spec/{app → support}/models/dokument.rb +0 -0
  341. /data/spec/{app → support}/models/draft.rb +0 -0
  342. /data/spec/{app → support}/models/dragon.rb +0 -0
  343. /data/spec/{app → support}/models/drug.rb +0 -0
  344. /data/spec/{app → support}/models/dungeon.rb +0 -0
  345. /data/spec/{app → support}/models/edit.rb +0 -0
  346. /data/spec/{app → support}/models/email.rb +0 -0
  347. /data/spec/{app → support}/models/employer.rb +0 -0
  348. /data/spec/{app → support}/models/entry.rb +0 -0
  349. /data/spec/{app → support}/models/eraser.rb +0 -0
  350. /data/spec/{app → support}/models/even.rb +0 -0
  351. /data/spec/{app → support}/models/event.rb +0 -0
  352. /data/spec/{app → support}/models/exhibition.rb +0 -0
  353. /data/spec/{app → support}/models/exhibitor.rb +0 -0
  354. /data/spec/{app → support}/models/explosion.rb +0 -0
  355. /data/spec/{app → support}/models/eye.rb +0 -0
  356. /data/spec/{app → support}/models/eye_bowl.rb +0 -0
  357. /data/spec/{app → support}/models/face.rb +0 -0
  358. /data/spec/{app → support}/models/favorite.rb +0 -0
  359. /data/spec/{app → support}/models/filesystem.rb +0 -0
  360. /data/spec/{app → support}/models/fire_hydrant.rb +0 -0
  361. /data/spec/{app → support}/models/firefox.rb +0 -0
  362. /data/spec/{app → support}/models/fish.rb +0 -0
  363. /data/spec/{app → support}/models/folder.rb +0 -0
  364. /data/spec/{app → support}/models/folder_item.rb +0 -0
  365. /data/spec/{app → support}/models/fruits.rb +0 -0
  366. /data/spec/{app → support}/models/game.rb +0 -0
  367. /data/spec/{app → support}/models/ghost.rb +0 -0
  368. /data/spec/{app → support}/models/home.rb +0 -0
  369. /data/spec/{app → support}/models/house.rb +0 -0
  370. /data/spec/{app → support}/models/html_writer.rb +0 -0
  371. /data/spec/{app → support}/models/id_key.rb +0 -0
  372. /data/spec/{app → support}/models/image.rb +0 -0
  373. /data/spec/{app → support}/models/implant.rb +0 -0
  374. /data/spec/{app → support}/models/jar.rb +0 -0
  375. /data/spec/{app → support}/models/kaleidoscope.rb +0 -0
  376. /data/spec/{app → support}/models/kangaroo.rb +0 -0
  377. /data/spec/{app → support}/models/label.rb +0 -0
  378. /data/spec/{app → support}/models/language.rb +0 -0
  379. /data/spec/{app → support}/models/lat_lng.rb +0 -0
  380. /data/spec/{app → support}/models/league.rb +0 -0
  381. /data/spec/{app → support}/models/learner.rb +0 -0
  382. /data/spec/{app → support}/models/line_item.rb +0 -0
  383. /data/spec/{app → support}/models/location.rb +0 -0
  384. /data/spec/{app → support}/models/login.rb +0 -0
  385. /data/spec/{app → support}/models/manufacturer.rb +0 -0
  386. /data/spec/{app → support}/models/meat.rb +0 -0
  387. /data/spec/{app → support}/models/membership.rb +0 -0
  388. /data/spec/{app → support}/models/message.rb +0 -0
  389. /data/spec/{app → support}/models/minim.rb +0 -0
  390. /data/spec/{app → support}/models/mixed_drink.rb +0 -0
  391. /data/spec/{app → support}/models/movie.rb +0 -0
  392. /data/spec/{app → support}/models/my_hash.rb +0 -0
  393. /data/spec/{app → support}/models/name.rb +0 -0
  394. /data/spec/{app → support}/models/name_only.rb +0 -0
  395. /data/spec/{app → support}/models/node.rb +0 -0
  396. /data/spec/{app → support}/models/note.rb +0 -0
  397. /data/spec/{app → support}/models/odd.rb +0 -0
  398. /data/spec/{app → support}/models/ordered_post.rb +0 -0
  399. /data/spec/{app → support}/models/ordered_preference.rb +0 -0
  400. /data/spec/{app → support}/models/oscar.rb +0 -0
  401. /data/spec/{app → support}/models/other_owner_object.rb +0 -0
  402. /data/spec/{app → support}/models/override.rb +0 -0
  403. /data/spec/{app → support}/models/ownable.rb +0 -0
  404. /data/spec/{app → support}/models/pack.rb +0 -0
  405. /data/spec/{app → support}/models/page.rb +0 -0
  406. /data/spec/{app → support}/models/page_question.rb +0 -0
  407. /data/spec/{app → support}/models/parent.rb +0 -0
  408. /data/spec/{app → support}/models/parent_doc.rb +0 -0
  409. /data/spec/{app → support}/models/passport.rb +0 -0
  410. /data/spec/{app → support}/models/patient.rb +0 -0
  411. /data/spec/{app → support}/models/pdf_writer.rb +0 -0
  412. /data/spec/{app → support}/models/pencil.rb +0 -0
  413. /data/spec/{app → support}/models/pet.rb +0 -0
  414. /data/spec/{app → support}/models/pet_owner.rb +0 -0
  415. /data/spec/{app → support}/models/phone.rb +0 -0
  416. /data/spec/{app → support}/models/pizza.rb +0 -0
  417. /data/spec/{app → support}/models/player.rb +0 -0
  418. /data/spec/{app → support}/models/post.rb +0 -0
  419. /data/spec/{app → support}/models/post_genre.rb +0 -0
  420. /data/spec/{app → support}/models/powerup.rb +0 -0
  421. /data/spec/{app → support}/models/preference.rb +0 -0
  422. /data/spec/{app → support}/models/princess.rb +0 -0
  423. /data/spec/{app → support}/models/product.rb +0 -0
  424. /data/spec/{app → support}/models/pronunciation.rb +0 -0
  425. /data/spec/{app → support}/models/pub.rb +0 -0
  426. /data/spec/{app → support}/models/publication/encyclopedia.rb +0 -0
  427. /data/spec/{app → support}/models/publication/review.rb +0 -0
  428. /data/spec/{app → support}/models/purchase.rb +0 -0
  429. /data/spec/{app → support}/models/question.rb +0 -0
  430. /data/spec/{app → support}/models/quiz.rb +0 -0
  431. /data/spec/{app → support}/models/rating.rb +0 -0
  432. /data/spec/{app → support}/models/record.rb +0 -0
  433. /data/spec/{app → support}/models/registry.rb +0 -0
  434. /data/spec/{app → support}/models/role.rb +0 -0
  435. /data/spec/{app → support}/models/root_category.rb +0 -0
  436. /data/spec/{app → support}/models/sandwich.rb +0 -0
  437. /data/spec/{app → support}/models/scheduler.rb +0 -0
  438. /data/spec/{app → support}/models/seo.rb +0 -0
  439. /data/spec/{app → support}/models/series.rb +0 -0
  440. /data/spec/{app → support}/models/server.rb +0 -0
  441. /data/spec/{app → support}/models/service.rb +0 -0
  442. /data/spec/{app → support}/models/shelf.rb +0 -0
  443. /data/spec/{app → support}/models/shipment_address.rb +0 -0
  444. /data/spec/{app → support}/models/shipping_container.rb +0 -0
  445. /data/spec/{app → support}/models/shipping_pack.rb +0 -0
  446. /data/spec/{app → support}/models/shop.rb +0 -0
  447. /data/spec/{app → support}/models/short_agent.rb +0 -0
  448. /data/spec/{app → support}/models/short_quiz.rb +0 -0
  449. /data/spec/{app → support}/models/simple.rb +0 -0
  450. /data/spec/{app → support}/models/slave.rb +0 -0
  451. /data/spec/{app → support}/models/song.rb +0 -0
  452. /data/spec/{app → support}/models/sound.rb +0 -0
  453. /data/spec/{app → support}/models/square.rb +0 -0
  454. /data/spec/{app → support}/models/staff.rb +0 -0
  455. /data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
  456. /data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
  457. /data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  458. /data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  459. /data/spec/{app → support}/models/strategy.rb +0 -0
  460. /data/spec/{app → support}/models/sub_item.rb +0 -0
  461. /data/spec/{app → support}/models/subscription.rb +0 -0
  462. /data/spec/{app → support}/models/survey.rb +0 -0
  463. /data/spec/{app → support}/models/symptom.rb +0 -0
  464. /data/spec/{app → support}/models/tag.rb +0 -0
  465. /data/spec/{app → support}/models/target.rb +0 -0
  466. /data/spec/{app → support}/models/template.rb +0 -0
  467. /data/spec/{app → support}/models/thing.rb +0 -0
  468. /data/spec/{app → support}/models/title.rb +0 -0
  469. /data/spec/{app → support}/models/topping.rb +0 -0
  470. /data/spec/{app → support}/models/track.rb +0 -0
  471. /data/spec/{app → support}/models/translation.rb +0 -0
  472. /data/spec/{app → support}/models/tree.rb +0 -0
  473. /data/spec/{app → support}/models/updatable.rb +0 -0
  474. /data/spec/{app → support}/models/user.rb +0 -0
  475. /data/spec/{app → support}/models/user_account.rb +0 -0
  476. /data/spec/{app → support}/models/validation_callback.rb +0 -0
  477. /data/spec/{app → support}/models/version.rb +0 -0
  478. /data/spec/{app → support}/models/vertex.rb +0 -0
  479. /data/spec/{app → support}/models/vet_visit.rb +0 -0
  480. /data/spec/{app → support}/models/video.rb +0 -0
  481. /data/spec/{app → support}/models/video_game.rb +0 -0
  482. /data/spec/{app → support}/models/weapon.rb +0 -0
  483. /data/spec/{app → support}/models/wiki_page.rb +0 -0
  484. /data/spec/{app → support}/models/word.rb +0 -0
  485. /data/spec/{app → support}/models/word_origin.rb +0 -0
@@ -19,125 +19,103 @@ describe 'Mongoid application tests' do
19
19
  FileUtils.mkdir_p(TMP_BASE)
20
20
  end
21
21
 
22
- context 'demo application' do
23
- context 'sinatra' do
24
- it 'runs' do
25
- clone_application(
26
- 'https://github.com/mongoid/mongoid-demo',
27
- subdir: 'sinatra-minimal',
28
- ) do
29
-
22
+ context 'demo application - sinatra' do
23
+ it 'runs' do
24
+ clone_application(
25
+ 'https://github.com/mongoid/mongoid-demo',
26
+ subdir: 'sinatra-minimal',
27
+ ) do
28
+
29
+ process = ChildProcess.build(*%w(bundle exec ruby app.rb))
30
+ process.environment.update(clean_env)
31
+ process.io.inherit!
32
+ process.start
33
+
34
+ begin
30
35
  # JRuby needs a long timeout
31
- start_app(%w(bundle exec ruby app.rb), 4567, 40) do |port|
32
- uri = URI.parse('http://localhost:4567/posts')
33
- resp = JSON.parse(uri.open.read)
36
+ wait_for_port(4567, 20)
37
+ sleep 1
38
+
39
+ uri = URI.parse('http://localhost:4567/posts')
40
+ resp = JSON.parse(uri.open.read)
41
+ ensure
42
+ Process.kill('TERM', process.pid)
43
+ status = process.wait
44
+ end
34
45
 
35
- resp.should == []
46
+ resp.should == []
36
47
 
37
- end
38
- end
48
+ status.should == 0
39
49
  end
40
50
  end
51
+ end
41
52
 
42
- context 'rails-api' do
43
- it 'runs' do
44
- clone_application(
45
- 'https://github.com/mongoid/mongoid-demo',
46
- subdir: 'rails-api',
47
- ) do
48
-
49
- # JRuby needs a long timeout
50
- start_app(%w(bundle exec rails s), 3000, 50) do |port|
51
- uri = URI.parse('http://localhost:3000/posts')
52
- resp = JSON.parse(uri.open.read)
53
+ context 'demo application - rails-api' do
54
+ ['~> 6.0.0'].each do |rails_version|
55
+ context "with rails #{rails_version}" do
56
+ it 'runs' do
57
+ clone_application(
58
+ 'https://github.com/mongoid/mongoid-demo',
59
+ subdir: 'rails-api',
60
+ rails_version: rails_version,
61
+ ) do
62
+
63
+ process = ChildProcess.build(*%w(bundle exec rails s))
64
+ process.environment.update(clean_env)
65
+ process.io.inherit!
66
+ process.start
67
+
68
+ begin
69
+ # JRuby needs a long timeout
70
+ wait_for_port(3000, 30)
71
+ sleep 1
72
+
73
+ uri = URI.parse('http://localhost:3000/posts')
74
+ resp = JSON.parse(uri.open.read)
75
+ ensure
76
+ Process.kill('TERM', process.pid)
77
+ status = process.wait
78
+ end
53
79
 
54
80
  resp.should == []
81
+
82
+ # 143 = 128 + 15
83
+ [0, 15, 143].should include(status)
55
84
  end
56
85
  end
57
86
  end
58
87
  end
59
88
  end
60
89
 
61
- def start_app(cmd, port, timeout)
62
- process = ChildProcess.build(*cmd)
63
- process.environment.update(clean_env)
64
- process.io.inherit!
65
- process.start
66
-
67
- begin
68
- wait_for_port(port, timeout, process)
69
- sleep 1
70
-
71
- rv = yield port
72
- ensure
73
- # The process may have already died (due to an error exit) -
74
- # in this case killing it will raise an exception.
75
- Process.kill('TERM', process.pid) rescue nil
76
- status = process.wait
77
- end
78
-
79
- # Exit should be either success or SIGTERM
80
- [0, 15, 128 + 15].should include(status)
81
-
82
- rv
83
- end
84
-
85
90
  context 'new application - rails' do
86
- it 'creates' do
87
- install_rails
88
-
89
- Dir.chdir(TMP_BASE) do
90
- FileUtils.rm_rf('mongoid-test')
91
- Mrss::ChildProcessHelper.check_call(%w(rails new mongoid-test --skip-spring --skip-active-record), env: clean_env)
92
-
93
- Dir.chdir('mongoid-test') do
94
- adjust_app_gemfile
95
- Mrss::ChildProcessHelper.check_call(%w(bundle install), env: clean_env)
96
-
97
- Mrss::ChildProcessHelper.check_call(%w(rails g model post), env: clean_env)
98
- Mrss::ChildProcessHelper.check_call(%w(rails g model comment post:belongs_to), env: clean_env)
99
-
100
- # https://jira.mongodb.org/browse/MONGOID-4885
101
- comment_text = File.read('app/models/comment.rb')
102
- comment_text.should =~ /belongs_to :post/
103
- comment_text.should_not =~ /embedded_in :post/
104
- end
105
- end
106
- end
107
-
108
- it 'generates Mongoid config' do
109
- install_rails
110
-
111
- Dir.chdir(TMP_BASE) do
112
- FileUtils.rm_rf('mongoid-test-config')
113
- Mrss::ChildProcessHelper.check_call(%w(rails new mongoid-test-config --skip-spring --skip-active-record), env: clean_env)
114
-
115
- Dir.chdir('mongoid-test-config') do
116
- adjust_app_gemfile
117
- Mrss::ChildProcessHelper.check_call(%w(bundle install), env: clean_env)
118
-
119
- mongoid_config_file = File.join(TMP_BASE,'mongoid-test-config/config/mongoid.yml')
120
-
121
- File.exist?(mongoid_config_file).should be false
122
- Mrss::ChildProcessHelper.check_call(%w(rails g mongoid:config), env: clean_env)
123
- File.exist?(mongoid_config_file).should be true
124
-
125
- config_text = File.read(mongoid_config_file)
126
- config_text.should =~ /mongoid_test_config_development/
127
- config_text.should =~ /mongoid_test_config_test/
91
+ ['~> 5.1.0', '~> 5.2.0', '~> 6.0.0'].each do |rails_version|
92
+ context "with rails #{rails_version}" do
93
+ it 'creates' do
94
+ Mrss::ChildProcessHelper.check_call(%w(gem uni rails -a))
95
+ Mrss::ChildProcessHelper.check_call(%w(gem install rails --no-document -v) + [rails_version])
96
+
97
+ Dir.chdir(TMP_BASE) do
98
+ FileUtils.rm_rf('mongoid-test')
99
+ Mrss::ChildProcessHelper.check_call(%w(rails new mongoid-test --skip-spring --skip-active-record), env: clean_env)
100
+
101
+ Dir.chdir('mongoid-test') do
102
+ adjust_app_gemfile
103
+ Mrss::ChildProcessHelper.check_call(%w(bundle install), env: clean_env)
104
+
105
+ Mrss::ChildProcessHelper.check_call(%w(rails g model post), env: clean_env)
106
+ Mrss::ChildProcessHelper.check_call(%w(rails g model comment post:belongs_to), env: clean_env)
107
+
108
+ # https://jira.mongodb.org/browse/MONGOID-4885
109
+ comment_text = File.read('app/models/comment.rb')
110
+ comment_text.should =~ /belongs_to :post/
111
+ comment_text.should_not =~ /embedded_in :post/
112
+ end
113
+ end
128
114
  end
129
115
  end
130
116
  end
131
117
  end
132
118
 
133
- def install_rails
134
- Mrss::ChildProcessHelper.check_call(%w(gem uni rails -a))
135
- if (rails_version = SpecConfig.instance.rails_version) == 'master'
136
- else
137
- Mrss::ChildProcessHelper.check_call(%w(gem install rails --no-document -v) + [rails_version])
138
- end
139
- end
140
-
141
119
  context 'local test applications' do
142
120
  let(:client) { Mongoid.default_client }
143
121
 
@@ -172,7 +150,7 @@ describe 'Mongoid application tests' do
172
150
  end
173
151
  index.should be nil
174
152
 
175
- Mrss::ChildProcessHelper.check_call(%w(bundle exec rake db:mongoid:create_indexes),
153
+ Mrss::ChildProcessHelper.check_call(%w(rake db:mongoid:create_indexes),
176
154
  cwd: APP_PATH, env: env)
177
155
 
178
156
  index = client['posts'].indexes.detect do |index|
@@ -187,13 +165,12 @@ describe 'Mongoid application tests' do
187
165
  end
188
166
  end
189
167
 
190
- def clone_application(repo_url, subdir: nil)
168
+ def clone_application(repo_url, subdir: nil, rails_version: nil)
191
169
  Dir.chdir(TMP_BASE) do
192
170
  FileUtils.rm_rf(File.basename(repo_url))
193
171
  Mrss::ChildProcessHelper.check_call(%w(git clone) + [repo_url])
194
172
  Dir.chdir(File.join(*[File.basename(repo_url), subdir].compact)) do
195
- adjust_app_gemfile
196
- adjust_rails_defaults
173
+ adjust_app_gemfile(rails_version: rails_version)
197
174
  Mrss::ChildProcessHelper.check_call(%w(bundle install), env: clean_env)
198
175
  puts `git diff`
199
176
 
@@ -204,44 +181,11 @@ describe 'Mongoid application tests' do
204
181
  end
205
182
  end
206
183
 
207
- def parse_mongodb_uri(uri)
208
- pre, query = uri.split('?', 2)
209
- if pre =~ %r,\A(mongodb(?:.*?))://([^/]+)(?:/(.*))?\z,
210
- protocol = $1
211
- hosts = $2
212
- database = $3
213
- if database == ''
214
- database = nil
215
- end
216
- else
217
- raise ArgumentError, "Invalid MongoDB URI: #{uri}"
218
- end
219
- if query == ''
220
- query = nil
221
- end
222
- {
223
- protocol: protocol,
224
- hosts: hosts,
225
- database: database,
226
- query: query,
227
- }
228
- end
229
-
230
- def build_mongodb_uri(parts)
231
- "#{parts.fetch(:protocol)}://#{parts.fetch(:hosts)}/#{parts[:database]}?#{parts[:query]}"
232
- end
233
-
234
184
  def write_mongoid_yml
235
- # HACK: the driver does not provide a MongoDB URI parser and assembler,
236
- # and the Ruby standard library URI module doesn't handle multiple hosts.
237
- parts = parse_mongodb_uri(SpecConfig.instance.uri_str)
238
- parts[:database] = 'mongoid_test'
239
- uri = build_mongodb_uri(parts)
240
- p uri
241
185
  env_config = {'clients' => {'default' => {
242
186
  # TODO massive hack, will fail if uri specifies a database name or
243
187
  # any uri options
244
- 'uri' => uri,
188
+ 'uri' => "#{SpecConfig.instance.uri_str}/mongoid_test",
245
189
  }}}
246
190
  config = {'development' => env_config, 'production' => env_config}
247
191
  File.open('config/mongoid.yml', 'w') do |f|
@@ -249,7 +193,7 @@ describe 'Mongoid application tests' do
249
193
  end
250
194
  end
251
195
 
252
- def adjust_app_gemfile(rails_version: SpecConfig.instance.rails_version)
196
+ def adjust_app_gemfile(rails_version: nil)
253
197
  remove_bundler_req
254
198
 
255
199
  gemfile_lines = IO.readlines('Gemfile')
@@ -261,45 +205,14 @@ describe 'Mongoid application tests' do
261
205
  gemfile_lines.delete_if do |line|
262
206
  line =~ /rails/
263
207
  end
264
- if rails_version == 'master'
265
- gemfile_lines << "gem 'rails', git: 'https://github.com/rails/rails'\n"
266
- else
267
- gemfile_lines << "gem 'rails', '~> #{rails_version}.0'\n"
268
- end
208
+ gemfile_lines << "gem 'rails', '#{rails_version}'\n"
269
209
  end
270
210
  File.open('Gemfile', 'w') do |f|
271
211
  f << gemfile_lines.join
272
212
  end
273
213
  end
274
214
 
275
- def adjust_rails_defaults(rails_version: SpecConfig.instance.rails_version)
276
- if File.exist?('config/application.rb')
277
- lines = IO.readlines('config/application.rb')
278
- lines.each do |line|
279
- line.gsub!(/config.load_defaults \d\.\d/, "config.load_defaults #{rails_version}")
280
- end
281
- File.open('config/application.rb', 'w') do |f|
282
- f << lines.join
283
- end
284
- end
285
-
286
- if rails_version == '5.1'
287
- secrets = {
288
- 'development' => {
289
- 'secret_key_base' => 'abracadabra',
290
- 'my_secret_token' => 'very_secret',
291
- },
292
- }
293
- File.open('config/secrets.yml', 'w') do |f|
294
- f << YAML.dump(secrets)
295
- end
296
- end
297
- end
298
-
299
215
  def remove_bundler_req
300
- return unless File.file?('Gemfile.lock')
301
- # TODO: Remove this method completely when we get rid of .lock files in
302
- # mongoid-demo apps.
303
216
  lock_lines = IO.readlines('Gemfile.lock')
304
217
  # Get rid of the bundled with line so that whatever bundler is installed
305
218
  # on the system is usable with the application.
@@ -324,7 +237,7 @@ describe 'Mongoid application tests' do
324
237
  @clean_env ||= Hash[ENV.keys.grep(/BUNDLE|RUBYOPT/).map { |k| [k, nil ] }]
325
238
  end
326
239
 
327
- def wait_for_port(port, timeout, process)
240
+ def wait_for_port(port, timeout)
328
241
  deadline = Time.now + timeout
329
242
  loop do
330
243
  begin
@@ -332,9 +245,6 @@ describe 'Mongoid application tests' do
332
245
  return
333
246
  end
334
247
  rescue IOError, SystemCallError
335
- unless process.alive?
336
- raise "Process #{process} died while waiting for port #{port}"
337
- end
338
248
  if Time.now > deadline
339
249
  raise
340
250
  end
@@ -172,4 +172,98 @@ describe 'embedded associations' do
172
172
  end
173
173
  end
174
174
  end
175
+
176
+ describe 'updated_at on parent' do
177
+ context 'when child is added' do
178
+ context 'embeds_one' do
179
+ let(:parent) { EomParent.create! }
180
+
181
+ it 'updates' do
182
+ pending 'https://jira.mongodb.org/browse/MONGOID-3252'
183
+
184
+ first_updated_at = parent.updated_at
185
+
186
+ parent.child = EomChild.new
187
+ parent.save!
188
+
189
+ parent.updated_at.should > first_updated_at
190
+ end
191
+ end
192
+
193
+ context 'embeds_many' do
194
+ let(:parent) { EmmCongress.create! }
195
+
196
+ it 'updates' do
197
+ pending 'https://jira.mongodb.org/browse/MONGOID-3252'
198
+
199
+ first_updated_at = parent.updated_at
200
+
201
+ parent.legislators << EmmLegislator.new
202
+ parent.save!
203
+
204
+ parent.updated_at.should > first_updated_at
205
+ end
206
+ end
207
+ end
208
+
209
+ context 'when child is updated' do
210
+ context 'embeds_one' do
211
+ let(:parent) { EomParent.create!(child: EomChild.new) }
212
+
213
+ it 'updates' do
214
+ first_updated_at = parent.updated_at
215
+
216
+ parent.child.a = 42
217
+ parent.save!
218
+
219
+ parent.updated_at.should > first_updated_at
220
+ end
221
+ end
222
+
223
+ context 'embeds_many' do
224
+ let(:parent) { EmmCongress.create!(legislators: [EmmLegislator.new]) }
225
+
226
+ it 'updates' do
227
+ first_updated_at = parent.updated_at
228
+
229
+ parent.legislators.first.a = 42
230
+ parent.save!
231
+
232
+ parent.updated_at.should > first_updated_at
233
+ end
234
+ end
235
+ end
236
+
237
+ context 'when child is removed' do
238
+ context 'embeds_one' do
239
+ let(:parent) { EomParent.create!(child: EomChild.new) }
240
+
241
+ it 'updates' do
242
+ pending 'https://jira.mongodb.org/browse/MONGOID-3252'
243
+
244
+ first_updated_at = parent.updated_at
245
+
246
+ parent.child = nil
247
+ parent.save!
248
+
249
+ parent.updated_at.should > first_updated_at
250
+ end
251
+ end
252
+
253
+ context 'embeds_many' do
254
+ let(:parent) { EmmCongress.create!(legislators: [EmmLegislator.new]) }
255
+
256
+ it 'updates' do
257
+ pending 'https://jira.mongodb.org/browse/MONGOID-3252'
258
+
259
+ first_updated_at = parent.updated_at
260
+
261
+ parent.legislators.clear
262
+ parent.save!
263
+
264
+ parent.updated_at.should > first_updated_at
265
+ end
266
+ end
267
+ end
268
+ end
175
269
  end
@@ -2,33 +2,86 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  require 'spec_helper'
5
+ require 'mongoid/association/referenced/has_many_models'
5
6
 
6
7
  describe 'has_many associations' do
7
8
  context 'destroying parent in transaction with dependent child' do
8
9
  require_transaction_support
9
10
 
10
- let(:artist) { Artist.create! }
11
- let(:album) { Album.create!(artist: artist) }
11
+ let(:company) { HmmCompany.create! }
12
+ let(:address) { HmmAddress.create!(company: company) }
12
13
 
13
14
  before do
14
- Artist.delete_all
15
- Album.delete_all
16
-
17
- album
15
+ Company.delete_all
16
+ Address.delete_all
18
17
  end
19
18
 
20
- it 'works' do
21
- Artist.count.should == 1
22
- Album.count.should == 1
19
+ context 'dependent: :destroy' do
20
+ before do
21
+ HmmCompany.class_eval do
22
+ has_one :address, class_name: 'HmmAddress', dependent: :destroy
23
+ end
24
+ end
25
+
26
+ it 'destroys' do
27
+ address
28
+
29
+ HmmCompany.count.should == 1
30
+ HmmAddress.count.should == 1
23
31
 
24
- artist.with_session do |session|
25
- session.with_transaction do
26
- artist.destroy
32
+ company.with_session do |session|
33
+ session.with_transaction do
34
+ company.destroy!
35
+ end
27
36
  end
37
+
38
+ HmmCompany.count.should == 0
39
+ HmmAddress.count.should == 0
40
+ end
41
+ end
42
+
43
+ context 'dependent: :restrict_with_error' do
44
+ before do
45
+ HmmCompany.class_eval do
46
+ has_one :address, class_name: 'HmmAddress', dependent: :restrict_with_error
47
+ end
48
+ end
49
+
50
+ it 'destroys' do
51
+ address
52
+
53
+ HmmCompany.count.should == 1
54
+ HmmAddress.count.should == 1
55
+
56
+ lambda do
57
+ company.with_session do |session|
58
+ session.with_transaction do
59
+ company.destroy!
60
+ end
61
+ end
62
+ end.should raise_error(Mongoid::Errors::DocumentNotDestroyed)
63
+
64
+ HmmCompany.count.should == 1
65
+ HmmAddress.count.should == 1
28
66
  end
67
+ end
68
+ end
29
69
 
30
- Artist.count.should == 0
31
- Album.count.should == 0
70
+ context 'when child does not have parent association' do
71
+ context 'Child.new' do
72
+ it 'creates a child instance' do
73
+ HmmBusSeat.new.should be_a(HmmBusSeat)
74
+ end
75
+ end
76
+
77
+ context 'assignment to child in parent' do
78
+ let(:parent) { HmmBus.new }
79
+
80
+ it 'raises InverseNotFound' do
81
+ lambda do
82
+ parent.seats << HmmBusSeat.new
83
+ end.should raise_error(Mongoid::Errors::InverseNotFound)
84
+ end
32
85
  end
33
86
  end
34
87
 
@@ -2,33 +2,86 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  require 'spec_helper'
5
+ require 'mongoid/association/referenced/has_one_models'
5
6
 
6
7
  describe 'has_one associations' do
7
8
  context 'destroying parent in transaction with dependent child' do
8
9
  require_transaction_support
9
10
 
10
- let(:person) { Person.create! }
11
- let(:game) { Game.create!(person: person) }
11
+ let(:college) { HomCollege.create! }
12
+ let(:address) { HomAddress.create!(college: college) }
12
13
 
13
14
  before do
14
- Person.delete_all
15
- Game.delete_all
16
-
17
- game
15
+ HomCollege.delete_all
16
+ HomAddress.delete_all
18
17
  end
19
18
 
20
- it 'works' do
21
- Person.count.should == 1
22
- Game.count.should == 1
19
+ context 'dependent: :destroy' do
20
+ before do
21
+ HomCollege.class_eval do
22
+ has_one :address, class_name: 'HomAddress', dependent: :destroy
23
+ end
24
+ end
25
+
26
+ it 'destroys' do
27
+ address
28
+
29
+ HomCollege.count.should == 1
30
+ HomAddress.count.should == 1
23
31
 
24
- Person.with_session do |session|
25
- session.with_transaction do
26
- person.destroy
32
+ HomCollege.with_session do |session|
33
+ session.with_transaction do
34
+ college.destroy!
35
+ end
27
36
  end
37
+
38
+ HomCollege.count.should == 0
39
+ HomAddress.count.should == 0
40
+ end
41
+ end
42
+
43
+ context 'dependent: :restrict_with_error' do
44
+ before do
45
+ HomCollege.class_eval do
46
+ has_one :address, class_name: 'HomAddress', dependent: :restrict_with_error
47
+ end
48
+ end
49
+
50
+ it 'does not destroy' do
51
+ address
52
+
53
+ HomCollege.count.should == 1
54
+ HomAddress.count.should == 1
55
+
56
+ lambda do
57
+ HomCollege.with_session do |session|
58
+ session.with_transaction do
59
+ college.destroy!
60
+ end
61
+ end
62
+ end.should raise_error(Mongoid::Errors::DocumentNotDestroyed)
63
+
64
+ HomCollege.count.should == 1
65
+ HomAddress.count.should == 1
28
66
  end
67
+ end
68
+ end
29
69
 
30
- Person.count.should == 0
31
- Game.count.should == 0
70
+ context 'when child does not have parent association' do
71
+ context 'Child.new' do
72
+ it 'creates a child instance' do
73
+ HomBusDriver.new.should be_a(HomBusDriver)
74
+ end
75
+ end
76
+
77
+ context 'assignment to child in parent' do
78
+ let(:parent) { HomBus.new }
79
+
80
+ it 'raises InverseNotFound' do
81
+ lambda do
82
+ parent.driver = HomBusDriver.new
83
+ end.should raise_error(Mongoid::Errors::InverseNotFound)
84
+ end
32
85
  end
33
86
  end
34
87