mongoid 6.4.8 → 7.0.13

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 (376) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/LICENSE +1 -0
  4. data/README.md +4 -3
  5. data/Rakefile +33 -7
  6. data/lib/config/locales/en.yml +17 -0
  7. data/lib/mongoid/association/accessors.rb +339 -0
  8. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  9. data/lib/mongoid/association/builders.rb +92 -0
  10. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  11. data/lib/mongoid/association/depending.rb +137 -0
  12. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  13. data/lib/mongoid/{relations → association}/embedded/batchable.rb +19 -19
  14. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  15. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  16. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  17. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  18. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  19. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  20. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  21. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +552 -0
  22. data/lib/mongoid/association/embedded/embeds_many.rb +211 -0
  23. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  24. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  25. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  26. data/lib/mongoid/association/embedded/embeds_one.rb +174 -0
  27. data/lib/mongoid/association/embedded.rb +4 -0
  28. data/lib/mongoid/association/macros.rb +204 -0
  29. data/lib/mongoid/{relations → association}/many.rb +19 -49
  30. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  31. data/lib/mongoid/association/nested/many.rb +200 -0
  32. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  33. data/lib/mongoid/association/nested/one.rb +127 -0
  34. data/lib/mongoid/association/nested.rb +15 -0
  35. data/lib/mongoid/{relations → association}/one.rb +6 -6
  36. data/lib/mongoid/association/options.rb +152 -0
  37. data/lib/mongoid/{relations → association}/proxy.rb +45 -59
  38. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  39. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  40. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  41. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  42. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  43. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  44. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  45. data/lib/mongoid/association/referenced/eager.rb +162 -0
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +312 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  51. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  52. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  53. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  54. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  55. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  56. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  57. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  58. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  59. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  60. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  62. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  63. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  64. data/lib/mongoid/association/referenced.rb +7 -0
  65. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  66. data/lib/mongoid/association/relatable.rb +511 -0
  67. data/lib/mongoid/{relations.rb → association.rb} +57 -56
  68. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  69. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  70. data/lib/mongoid/atomic/paths/embedded.rb +1 -1
  71. data/lib/mongoid/atomic.rb +14 -4
  72. data/lib/mongoid/attributes/dynamic.rb +16 -15
  73. data/lib/mongoid/attributes/nested.rb +22 -11
  74. data/lib/mongoid/attributes/processing.rb +2 -2
  75. data/lib/mongoid/attributes/readonly.rb +2 -4
  76. data/lib/mongoid/attributes.rb +55 -31
  77. data/lib/mongoid/changeable.rb +1 -1
  78. data/lib/mongoid/clients/options.rb +7 -5
  79. data/lib/mongoid/clients/sessions.rb +20 -4
  80. data/lib/mongoid/composable.rb +4 -4
  81. data/lib/mongoid/config/environment.rb +21 -8
  82. data/lib/mongoid/config.rb +1 -0
  83. data/lib/mongoid/contextual/atomic.rb +1 -1
  84. data/lib/mongoid/contextual/geo_near.rb +1 -1
  85. data/lib/mongoid/contextual/memory.rb +21 -3
  86. data/lib/mongoid/contextual/mongo.rb +10 -8
  87. data/lib/mongoid/copyable.rb +11 -6
  88. data/lib/mongoid/criteria/includable.rb +14 -14
  89. data/lib/mongoid/criteria/modifiable.rb +8 -3
  90. data/lib/mongoid/criteria/options.rb +2 -2
  91. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  92. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  93. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  94. data/lib/mongoid/criteria/queryable/extensions/time.rb +1 -1
  95. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
  96. data/lib/mongoid/criteria/queryable/key.rb +67 -8
  97. data/lib/mongoid/criteria/queryable/mergeable.rb +5 -4
  98. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  99. data/lib/mongoid/criteria/queryable/selectable.rb +5 -3
  100. data/lib/mongoid/criteria/queryable/selector.rb +9 -31
  101. data/lib/mongoid/criteria.rb +9 -3
  102. data/lib/mongoid/document.rb +14 -4
  103. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  104. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  105. data/lib/mongoid/errors/unknown_model.rb +25 -0
  106. data/lib/mongoid/errors.rb +3 -0
  107. data/lib/mongoid/extensions/array.rb +5 -5
  108. data/lib/mongoid/extensions/hash.rb +9 -4
  109. data/lib/mongoid/extensions/object.rb +4 -4
  110. data/lib/mongoid/extensions/range.rb +1 -0
  111. data/lib/mongoid/extensions/regexp.rb +1 -1
  112. data/lib/mongoid/extensions/string.rb +2 -2
  113. data/lib/mongoid/extensions.rb +0 -4
  114. data/lib/mongoid/factory.rb +13 -3
  115. data/lib/mongoid/fields/foreign_key.rb +5 -5
  116. data/lib/mongoid/fields/standard.rb +2 -14
  117. data/lib/mongoid/fields/validators/macro.rb +1 -1
  118. data/lib/mongoid/fields.rb +5 -4
  119. data/lib/mongoid/indexable.rb +4 -1
  120. data/lib/mongoid/interceptable.rb +8 -6
  121. data/lib/mongoid/matchable/all.rb +4 -3
  122. data/lib/mongoid/matchable/and.rb +1 -1
  123. data/lib/mongoid/matchable/default.rb +71 -24
  124. data/lib/mongoid/matchable/elem_match.rb +9 -3
  125. data/lib/mongoid/matchable/eq.rb +22 -0
  126. data/lib/mongoid/matchable/ne.rb +1 -1
  127. data/lib/mongoid/matchable/regexp.rb +2 -2
  128. data/lib/mongoid/matchable.rb +17 -16
  129. data/lib/mongoid/persistable/deletable.rb +7 -6
  130. data/lib/mongoid/persistable/incrementable.rb +1 -1
  131. data/lib/mongoid/persistable/logical.rb +1 -1
  132. data/lib/mongoid/persistable/pushable.rb +11 -2
  133. data/lib/mongoid/persistable/settable.rb +57 -12
  134. data/lib/mongoid/persistable.rb +4 -5
  135. data/lib/mongoid/persistence_context.rb +26 -11
  136. data/lib/mongoid/positional.rb +1 -1
  137. data/lib/mongoid/query_cache.rb +4 -2
  138. data/lib/mongoid/serializable.rb +4 -4
  139. data/lib/mongoid/shardable.rb +1 -1
  140. data/lib/mongoid/touchable.rb +102 -0
  141. data/lib/mongoid/traversable.rb +3 -3
  142. data/lib/mongoid/validatable/macros.rb +1 -1
  143. data/lib/mongoid/validatable/presence.rb +2 -2
  144. data/lib/mongoid/validatable/uniqueness.rb +5 -5
  145. data/lib/mongoid/validatable.rb +8 -8
  146. data/lib/mongoid/version.rb +2 -1
  147. data/lib/mongoid.rb +1 -0
  148. data/lib/rails/generators/mongoid/config/config_generator.rb +8 -1
  149. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
  150. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  151. data/spec/README.md +18 -0
  152. data/spec/app/models/animal.rb +2 -1
  153. data/spec/app/models/bomb.rb +1 -1
  154. data/spec/app/models/customer.rb +11 -0
  155. data/spec/app/models/customer_address.rb +12 -0
  156. data/spec/app/models/message.rb +1 -1
  157. data/spec/app/models/minim.rb +7 -0
  158. data/spec/app/models/other_owner_object.rb +2 -0
  159. data/spec/app/models/person.rb +5 -2
  160. data/spec/app/models/shipment_address.rb +1 -0
  161. data/spec/app/models/store_as_dup_test3.rb +7 -0
  162. data/spec/app/models/store_as_dup_test4.rb +7 -0
  163. data/spec/app/models/updatable.rb +7 -0
  164. data/spec/app/models/vertex.rb +6 -0
  165. data/spec/app/models/wiki_page.rb +1 -1
  166. data/spec/config/mongoid.yml +13 -3
  167. data/spec/integration/app_spec.rb +341 -0
  168. data/spec/integration/associations/belongs_to_spec.rb +13 -0
  169. data/spec/integration/associations/embedded_spec.rb +176 -0
  170. data/spec/integration/callbacks_models.rb +49 -0
  171. data/spec/integration/callbacks_spec.rb +216 -0
  172. data/spec/integration/criteria/date_field_spec.rb +41 -0
  173. data/spec/integration/criteria/time_with_zone_spec.rb +32 -0
  174. data/spec/integration/matchable_spec.rb +680 -0
  175. data/spec/lite_spec_helper.rb +71 -0
  176. data/spec/mongoid/{relations → association}/accessors_spec.rb +40 -1
  177. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  178. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  179. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  180. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  181. data/spec/mongoid/association/depending_spec.rb +866 -0
  182. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  183. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  184. data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
  185. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  186. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  187. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +55 -77
  188. data/spec/mongoid/association/embedded/embedded_in_spec.rb +901 -0
  189. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  190. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  191. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +124 -182
  192. data/spec/mongoid/association/embedded/embeds_many_models.rb +53 -0
  193. data/spec/mongoid/association/embedded/embeds_many_spec.rb +862 -0
  194. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  195. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  196. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  197. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +6 -0
  198. data/spec/mongoid/association/embedded/embeds_one_models.rb +51 -0
  199. data/spec/mongoid/association/embedded/embeds_one_spec.rb +954 -0
  200. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
  201. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  202. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  203. data/spec/mongoid/association/options_spec.rb +1321 -0
  204. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +66 -34
  205. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  206. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  207. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +33 -14
  208. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  209. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2023 -0
  210. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  211. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  212. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +26 -7
  213. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +56 -0
  214. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +247 -99
  215. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -0
  216. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  217. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  218. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  219. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  220. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +227 -1
  221. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  222. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +30 -94
  223. data/spec/mongoid/association/referenced/has_many_models.rb +37 -0
  224. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  225. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  226. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  227. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  228. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  229. data/spec/mongoid/association/referenced/has_one_models.rb +48 -0
  230. data/spec/mongoid/association/referenced/has_one_spec.rb +1360 -0
  231. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  232. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  233. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  234. data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
  235. data/spec/mongoid/atomic/paths_spec.rb +41 -0
  236. data/spec/mongoid/atomic_spec.rb +4 -4
  237. data/spec/mongoid/attributes/dynamic_spec.rb +153 -0
  238. data/spec/mongoid/attributes/nested_spec.rb +29 -11
  239. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  240. data/spec/mongoid/attributes_spec.rb +298 -9
  241. data/spec/mongoid/clients/factory_spec.rb +20 -38
  242. data/spec/mongoid/clients/options_spec.rb +64 -50
  243. data/spec/mongoid/clients/sessions_spec.rb +9 -5
  244. data/spec/mongoid/clients/transactions_spec.rb +390 -0
  245. data/spec/mongoid/clients_spec.rb +70 -10
  246. data/spec/mongoid/config_spec.rb +27 -1
  247. data/spec/mongoid/contextual/atomic_spec.rb +37 -14
  248. data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
  249. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
  250. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  251. data/spec/mongoid/contextual/mongo_spec.rb +107 -56
  252. data/spec/mongoid/copyable_spec.rb +90 -6
  253. data/spec/mongoid/copyable_spec_models.rb +17 -0
  254. data/spec/mongoid/criteria/modifiable_spec.rb +173 -1
  255. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +54 -0
  256. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
  257. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +44 -1
  258. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
  259. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
  260. data/spec/mongoid/criteria/queryable/key_spec.rb +48 -6
  261. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  262. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +762 -0
  263. data/spec/mongoid/criteria/queryable/selectable_spec.rb +5 -224
  264. data/spec/mongoid/criteria/queryable/selector_spec.rb +37 -0
  265. data/spec/mongoid/criteria_spec.rb +36 -19
  266. data/spec/mongoid/document_fields_spec.rb +88 -0
  267. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  268. data/spec/mongoid/document_spec.rb +29 -4
  269. data/spec/mongoid/extensions/array_spec.rb +11 -15
  270. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  271. data/spec/mongoid/extensions/object_spec.rb +7 -11
  272. data/spec/mongoid/extensions/range_spec.rb +7 -0
  273. data/spec/mongoid/factory_spec.rb +21 -3
  274. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  275. data/spec/mongoid/fields_spec.rb +1 -1
  276. data/spec/mongoid/indexable_spec.rb +24 -12
  277. data/spec/mongoid/interceptable_spec.rb +22 -1
  278. data/spec/mongoid/matchable/default_spec.rb +10 -3
  279. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  280. data/spec/mongoid/matchable/eq_spec.rb +48 -0
  281. data/spec/mongoid/matchable/regexp_spec.rb +2 -2
  282. data/spec/mongoid/matchable_spec.rb +2 -2
  283. data/spec/mongoid/persistable/pushable_spec.rb +55 -1
  284. data/spec/mongoid/persistable/savable_spec.rb +5 -5
  285. data/spec/mongoid/persistable/settable_spec.rb +125 -10
  286. data/spec/mongoid/persistable_spec.rb +21 -6
  287. data/spec/mongoid/persistence_context_spec.rb +1 -1
  288. data/spec/mongoid/query_cache_spec.rb +65 -27
  289. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  290. data/spec/mongoid/scopable_spec.rb +2 -1
  291. data/spec/mongoid/shardable_spec.rb +32 -12
  292. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  293. data/spec/mongoid/tasks/database_spec.rb +1 -1
  294. data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +40 -1
  295. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  296. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  297. data/spec/mongoid/validatable/uniqueness_spec.rb +33 -6
  298. data/spec/mongoid/validatable_spec.rb +1 -1
  299. data/spec/shared/LICENSE +20 -0
  300. data/spec/shared/bin/get-mongodb-download-url +17 -0
  301. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  302. data/spec/shared/lib/mrss/cluster_config.rb +221 -0
  303. data/spec/shared/lib/mrss/constraints.rb +354 -0
  304. data/spec/shared/lib/mrss/docker_runner.rb +265 -0
  305. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  306. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  307. data/spec/shared/lib/mrss/spec_organizer.rb +162 -0
  308. data/spec/shared/lib/mrss/utils.rb +15 -0
  309. data/spec/shared/share/Dockerfile.erb +231 -0
  310. data/spec/shared/shlib/distro.sh +73 -0
  311. data/spec/shared/shlib/server.sh +290 -0
  312. data/spec/shared/shlib/set_env.sh +128 -0
  313. data/spec/spec_helper.rb +34 -49
  314. data/spec/support/cluster_config.rb +3 -3
  315. data/spec/support/constraints.rb +21 -76
  316. data/spec/support/expectations.rb +17 -3
  317. data/spec/support/spec_config.rb +20 -7
  318. data.tar.gz.sig +0 -0
  319. metadata +646 -541
  320. metadata.gz.sig +1 -5
  321. data/lib/mongoid/relations/accessors.rb +0 -267
  322. data/lib/mongoid/relations/auto_save.rb +0 -94
  323. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  324. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  325. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  326. data/lib/mongoid/relations/bindings.rb +0 -9
  327. data/lib/mongoid/relations/builder.rb +0 -57
  328. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  329. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  330. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  331. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  332. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  333. data/lib/mongoid/relations/builders.rb +0 -106
  334. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  335. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  336. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  337. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  338. data/lib/mongoid/relations/cascading.rb +0 -56
  339. data/lib/mongoid/relations/conversions.rb +0 -34
  340. data/lib/mongoid/relations/counter_cache.rb +0 -160
  341. data/lib/mongoid/relations/cyclic.rb +0 -107
  342. data/lib/mongoid/relations/eager/base.rb +0 -153
  343. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  344. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  345. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  346. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  347. data/lib/mongoid/relations/embedded/in.rb +0 -241
  348. data/lib/mongoid/relations/embedded/many.rb +0 -683
  349. data/lib/mongoid/relations/embedded/one.rb +0 -235
  350. data/lib/mongoid/relations/macros.rb +0 -367
  351. data/lib/mongoid/relations/metadata.rb +0 -1179
  352. data/lib/mongoid/relations/nested_builder.rb +0 -74
  353. data/lib/mongoid/relations/options.rb +0 -49
  354. data/lib/mongoid/relations/polymorphic.rb +0 -39
  355. data/lib/mongoid/relations/referenced/in.rb +0 -304
  356. data/lib/mongoid/relations/referenced/many.rb +0 -812
  357. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  358. data/lib/mongoid/relations/referenced/one.rb +0 -290
  359. data/lib/mongoid/relations/synchronization.rb +0 -169
  360. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  361. data/lib/mongoid/relations/targets.rb +0 -2
  362. data/lib/mongoid/relations/touchable.rb +0 -97
  363. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  364. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  365. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  366. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  367. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  368. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  369. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  370. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  371. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  372. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  373. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  374. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  375. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  376. data/spec/mongoid/relations/options_spec.rb +0 -35
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Mongoid::Relations::Reflections do
3
+ describe Mongoid::Association::Reflections do
4
4
 
5
5
  class TestClass
6
6
  include Mongoid::Document
@@ -20,17 +20,6 @@ describe Mongoid::Relations::Reflections do
20
20
  klass.embeds_many(:addresses)
21
21
  end
22
22
 
23
- context "when the name exists" do
24
-
25
- let(:relation) do
26
- klass.reflect_on_association(:addresses)
27
- end
28
-
29
- it "returns the association metadata" do
30
- expect(relation.macro).to eq(:embeds_many)
31
- end
32
- end
33
-
34
23
  context "when the name does not exist" do
35
24
 
36
25
  let(:relation) do
@@ -1,10 +1,12 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Mongoid::Relations::Synchronization do
3
+ describe "Syncable Association" do
4
4
 
5
5
  before(:all) do
6
6
  Mongoid.raise_not_found_error = true
7
7
  Person._synced(Person.relations["preferences"])
8
+ Person.has_and_belongs_to_many :preferences
9
+ Preference.has_and_belongs_to_many :people
8
10
  end
9
11
 
10
12
  after(:all) do
@@ -27,7 +29,7 @@ describe Mongoid::Relations::Synchronization do
27
29
  field :_synced?
28
30
  end
29
31
  end
30
-
32
+
31
33
  let(:model_syncable?) do
32
34
  class TestModel
33
35
  include Mongoid::Document
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Mongoid::Relations do
3
+ describe Mongoid::Association do
4
4
 
5
5
  before(:all) do
6
6
  Person.field(
@@ -212,7 +212,7 @@ describe Mongoid::Atomic::Modifiers do
212
212
  it "adds the push all modifiers" do
213
213
  expect(modifiers).to eq(
214
214
  { "$push" =>
215
- { "addresses" => { '$each' => [
215
+ { "addresses" => { '$each' => [
216
216
  { "street" => "Oxford St" }
217
217
  ] }
218
218
  }
@@ -303,7 +303,7 @@ describe Mongoid::Atomic::Modifiers do
303
303
  conflicts: { "$push" =>
304
304
  { "addresses" => { '$each' => [
305
305
  { "street" => "Oxford St" }
306
- ] }
306
+ ]}
307
307
  }
308
308
  }
309
309
  }
@@ -265,5 +265,46 @@ describe Mongoid::Atomic::Paths do
265
265
  end
266
266
  end
267
267
  end
268
+
269
+ context "when the same class is embedded in multiple associations" do
270
+
271
+ let(:customer) do
272
+ Customer.new
273
+ end
274
+
275
+ context "assignment after saving" do
276
+
277
+ it "correctly sets the association for the embedded class" do
278
+ pending 'MONGOID-5039'
279
+
280
+ customer.home_address = CustomerAddress.new
281
+ customer.work_address = CustomerAddress.new
282
+
283
+ expect(customer.home_address.atomic_path).to eq("home_address")
284
+ expect(customer.work_address.atomic_path).to eq("work_address")
285
+
286
+ customer.save!
287
+
288
+ customer.home_address = CustomerAddress.new
289
+ customer.work_address = CustomerAddress.new
290
+
291
+ expect(customer.home_address.atomic_path).to eq("home_address")
292
+ expect(customer.work_address.atomic_path).to eq("work_address")
293
+ end
294
+ end
295
+
296
+ context "inverse assignment" do
297
+
298
+ it "correctly returns the path for each embedded class" do
299
+ pending 'MONGOID-5039'
300
+
301
+ customer.work_address = CustomerAddress.new
302
+ customer.work_address.addressable = customer
303
+
304
+ expect(customer.home_address.atomic_path).to eq("home_address")
305
+ expect(customer.work_address.atomic_path).to eq("work_address")
306
+ end
307
+ end
308
+ end
268
309
  end
269
310
  end
@@ -76,13 +76,13 @@ describe Mongoid::Atomic do
76
76
  person.addresses.build(street: "Oxford St")
77
77
  end
78
78
 
79
- it "returns a $set and $push for modifications" do
79
+ it "returns a $set and $push with $each for modifications" do
80
80
  expect(person.atomic_updates).to eq(
81
81
  {
82
82
  "$set" => { "title" => "Sir" },
83
- "$push" => { "addresses" => { '$each' => [
83
+ "$push" => { "addresses" => { "$each" => [
84
84
  { "_id" => "oxford-st", "street" => "Oxford St" }
85
- ]} }
85
+ ] } }
86
86
  }
87
87
  )
88
88
  end
@@ -271,7 +271,7 @@ describe Mongoid::Atomic do
271
271
  "_id" => location.id,
272
272
  "name" => "Home"
273
273
  ]
274
- }] }
274
+ }]}
275
275
  }
276
276
  }
277
277
  }
@@ -0,0 +1,153 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require "spec_helper"
5
+
6
+ describe Mongoid::Attributes::Dynamic do
7
+ shared_examples_for 'dynamic field' do
8
+ let(:raw_attributes) do
9
+ {attr_name => 'foo bar'}
10
+ end
11
+
12
+ context 'when reading attributes' do
13
+ context 'an unsaved model' do
14
+ it 'can be read' do
15
+ bar = Bar.new(raw_attributes)
16
+ expect(bar.send(attr_name)).to eq('foo bar')
17
+ end
18
+ end
19
+
20
+ context 'saved model' do
21
+ it 'can be read' do
22
+ bar = Bar.new(raw_attributes)
23
+ bar.save!
24
+
25
+ bar = Bar.find(bar.id)
26
+ expect(bar.send(attr_name)).to eq('foo bar')
27
+ end
28
+ end
29
+
30
+ context 'when attribute is not set' do
31
+ it 'cannot be read' do
32
+ bar = Bar.new
33
+ expect do
34
+ bar.send(attr_name)
35
+ end.to raise_error(NoMethodError)
36
+ end
37
+
38
+ context 'reading via read_attribute' do
39
+ it 'returns nil' do
40
+ bar = Bar.new
41
+ expect(bar.read_attribute(:foo)).to be nil
42
+ end
43
+ end
44
+
45
+ context 'reading via []' do
46
+ it 'returns nil' do
47
+ bar = Bar.new
48
+ expect(bar[:foo]).to be nil
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ context 'when writing attributes via constructor' do
55
+ it 'can be written' do
56
+ bar = Bar.new(raw_attributes)
57
+ bar.save!
58
+
59
+ bar = Bar.find(bar.id)
60
+ expect(bar.send(attr_name)).to eq('foo bar')
61
+ end
62
+ end
63
+
64
+ context 'when writing attributes via attributes=' do
65
+ it 'can be written' do
66
+ bar = Bar.new
67
+ bar.attributes = raw_attributes
68
+ bar.save!
69
+
70
+ bar = Bar.find(bar.id)
71
+ expect(bar.send(attr_name)).to eq('foo bar')
72
+ end
73
+ end
74
+
75
+ context 'when writing attributes via write_attribute' do
76
+ it 'can be written' do
77
+ bar = Bar.new
78
+ bar.write_attribute(attr_name, 'foo bar')
79
+ bar.save!
80
+
81
+ bar = Bar.find(bar.id)
82
+ expect(bar.send(attr_name)).to eq('foo bar')
83
+ end
84
+ end
85
+
86
+ context 'when writing attributes via []=' do
87
+ context 'string key' do
88
+ it 'can be written' do
89
+ bar = Bar.new
90
+ bar[attr_name.to_s] = 'foo bar'
91
+ bar.save!
92
+
93
+ bar = Bar.find(bar.id)
94
+ expect(bar.send(attr_name)).to eq('foo bar')
95
+ end
96
+ end
97
+
98
+ context 'symbol key' do
99
+ it 'can be written' do
100
+ bar = Bar.new
101
+ bar[attr_name.to_sym] = 'foo bar'
102
+ bar.save!
103
+
104
+ bar = Bar.find(bar.id)
105
+ expect(bar.send(attr_name)).to eq('foo bar')
106
+ end
107
+ end
108
+ end
109
+
110
+ context 'when writing attributes via #{attribute}=' do
111
+ context 'when attribute is not already set' do
112
+ let(:bar) { Bar.new }
113
+
114
+ it 'cannot be written' do
115
+ expect do
116
+ bar.send("#{attr_name}=", 'foo bar')
117
+ bar.save!
118
+ end.to raise_error(NoMethodError)
119
+ end
120
+ end
121
+
122
+ context 'when attribute is already set' do
123
+ let(:bar) { Bar.new(attr_name => 'foo bar') }
124
+
125
+ it 'can be written' do
126
+ bar.send("#{attr_name}=", 'new foo bar')
127
+ bar.save!
128
+
129
+ _bar = Bar.find(bar.id)
130
+ expect(_bar.send(attr_name)).to eq('new foo bar')
131
+ end
132
+ end
133
+ end
134
+ end
135
+
136
+ context 'when attribute name is alphanumeric' do
137
+ let(:attr_name) { 'foo' }
138
+
139
+ it_behaves_like 'dynamic field'
140
+ end
141
+
142
+ context 'when attribute name contains spaces' do
143
+ let(:attr_name) { 'hello world' }
144
+
145
+ it_behaves_like 'dynamic field'
146
+ end
147
+
148
+ context 'when attribute name contains special characters' do
149
+ let(:attr_name) { 'hello%world' }
150
+
151
+ it_behaves_like 'dynamic field'
152
+ end
153
+ end
@@ -12,10 +12,12 @@ describe Mongoid::Attributes::Nested do
12
12
 
13
13
  before do
14
14
  Person.accepts_nested_attributes_for :favorites
15
+ Person.accepts_nested_attributes_for :children
15
16
  end
16
17
 
17
18
  after do
18
19
  Person.send(:undef_method, :favorites_attributes=)
20
+ Person.send(:undef_method, :children_attributes=)
19
21
  Person.nested_attributes.clear
20
22
  end
21
23
 
@@ -23,9 +25,18 @@ describe Mongoid::Attributes::Nested do
23
25
  expect(person).to respond_to(:favorites_attributes=)
24
26
  end
25
27
 
28
+ it "does not autosave if the association is embedded" do
29
+ expect(person).not_to respond_to(:autosave_documents_for_favorites)
30
+ end
31
+
32
+ it "autosaves if the association is not embedded" do
33
+ expect(person).to respond_to(:autosave_documents_for_children)
34
+ end
35
+
26
36
  it "adds the method name to the nested attributes list" do
27
37
  expect(Person.nested_attributes).to eq({
28
- "favorites_attributes" => "favorites_attributes="
38
+ "favorites_attributes" => "favorites_attributes=",
39
+ "children_attributes" => "children_attributes="
29
40
  })
30
41
  end
31
42
  end
@@ -41,12 +52,12 @@ describe Mongoid::Attributes::Nested do
41
52
  Account.nested_attributes.clear
42
53
  end
43
54
 
44
- let(:metadata) do
55
+ let(:association) do
45
56
  Account.reflect_on_association(:alerts)
46
57
  end
47
58
 
48
59
  it "keeps autosave set to false" do
49
- expect(metadata).to_not be_autosave
60
+ expect(association).to_not be_autosave
50
61
  end
51
62
  end
52
63
  end
@@ -202,11 +213,12 @@ describe Mongoid::Attributes::Nested do
202
213
  context "when the relation is a referenced in" do
203
214
 
204
215
  before do
205
- Post.accepts_nested_attributes_for :person
216
+ Post.accepts_nested_attributes_for :person, autosave: false
206
217
  end
207
218
 
208
219
  after do
209
- Post.reset_callbacks(:save)
220
+ Post.send(:undef_method, :person_attributes=)
221
+ Post.nested_attributes.clear
210
222
  end
211
223
 
212
224
  let(:post) do
@@ -4381,12 +4393,11 @@ describe Mongoid::Attributes::Nested do
4381
4393
 
4382
4394
  context "when nesting multiple levels and parent is timestamped" do
4383
4395
 
4384
- before do
4385
- class Address
4386
- after_save do
4387
- addressable.touch
4388
- end
4389
- end
4396
+ around do |example|
4397
+ original_relations = Location.relations
4398
+ Location.embedded_in :address, touch: true
4399
+ example.run
4400
+ Location.relations = original_relations
4390
4401
  end
4391
4402
 
4392
4403
  after do
@@ -4766,6 +4777,13 @@ describe Mongoid::Attributes::Nested do
4766
4777
  user.update_attributes(params)
4767
4778
  end
4768
4779
 
4780
+ around do |example|
4781
+ original_relations = User.relations
4782
+ User.has_many :posts, foreign_key: :author_id, validate: false, autosave: true
4783
+ example.run
4784
+ user.relations = original_relations
4785
+ end
4786
+
4769
4787
  let(:post) do
4770
4788
  user.posts.first
4771
4789
  end
@@ -96,30 +96,14 @@ describe Mongoid::Attributes::Readonly do
96
96
  context "when updating via the setter" do
97
97
 
98
98
  it "does not update the first field" do
99
- expect {
100
- person.title = 'mr'
101
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
102
- expect(person.title).to eq("sir")
103
- end
104
-
105
- it "does not update the second field" do
106
- expect {
107
- person.aliased_timestamp = Time.at(43)
108
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
109
- expect(person.aliased_timestamp).to eq(Time.at(42))
110
- end
111
-
112
- it "does not persist the first field" do
113
- expect {
114
- person.title = 'mr'
115
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
99
+ person.title = 'mr'
100
+ person.save
116
101
  expect(person.reload.title).to eq("sir")
117
102
  end
118
103
 
119
- it "does not persist the second field" do
120
- expect {
121
- person.aliased_timestamp = Time.at(43)
122
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
104
+ it "does not update the second field" do
105
+ person.aliased_timestamp = Time.at(43)
106
+ person.save
123
107
  expect(person.reload.aliased_timestamp).to eq(Time.at(42))
124
108
  end
125
109
  end
@@ -128,19 +112,20 @@ describe Mongoid::Attributes::Readonly do
128
112
 
129
113
  context 'with single field operation' do
130
114
 
131
- it "raises an error " do
132
- expect {
133
- person.inc(score: 1)
134
- }.to raise_error(Mongoid::Errors::ReadonlyAttribute)
115
+ it "updates the field" do
116
+ person.inc(score: 1)
117
+ person.save
118
+ expect(person.reload.score).to eq(2)
135
119
  end
136
120
  end
137
121
 
138
122
  context 'with multiple fields operation' do
139
123
 
140
- it "raises an error " do
141
- expect {
142
- person.inc(score: 1, age: 1)
143
- }.to raise_error(Mongoid::Errors::ReadonlyAttribute)
124
+ it "updates the fields" do
125
+ person.inc(score: 1, age: 1)
126
+ person.save
127
+ expect(person.reload.score).to eq(2)
128
+ expect(person.reload.age).to eq(101)
144
129
  end
145
130
  end
146
131
  end
@@ -149,21 +134,20 @@ describe Mongoid::Attributes::Readonly do
149
134
 
150
135
  context 'with single field operation' do
151
136
 
152
- it "raises an error " do
153
- expect {
154
- person.bit(score: { or: 13 })
155
- }.to raise_error(Mongoid::Errors::ReadonlyAttribute)
137
+ it "does the update" do
138
+ person.bit(score: { or: 13 })
139
+ person.save
140
+ expect(person.reload.score).to eq(13)
156
141
  end
157
142
  end
158
143
 
159
144
  context 'with multiple fields operation' do
160
145
 
161
- it "raises an error " do
162
- expect {
163
- person.bit(
164
- age: { and: 13 }, score: { or: 13 }, inte: { and: 13, or: 10 }
165
- )
166
- }.to raise_error(Mongoid::Errors::ReadonlyAttribute)
146
+ it "udpates the attribute" do
147
+ person.bit(age: {and: 13}, score: {or: 13})
148
+ person.save
149
+ expect(person.reload.score).to eq(13)
150
+ expect(person.reload.age).to eq(4)
167
151
  end
168
152
  end
169
153
  end
@@ -171,30 +155,14 @@ describe Mongoid::Attributes::Readonly do
171
155
  context "when updating via []=" do
172
156
 
173
157
  it "does not update the first field" do
174
- expect {
175
- person[:title] = "mr"
176
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
177
- expect(person.title).to eq("sir")
178
- end
179
-
180
- it "does not update the second field" do
181
- expect {
182
- person[:aliased_timestamp] = Time.at(43)
183
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
184
- expect(person.aliased_timestamp).to eq(Time.at(42))
185
- end
186
-
187
- it "does not persist the first field" do
188
- expect {
189
- person[:title] = "mr"
190
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
158
+ person[:title] = "mr"
159
+ person.save
191
160
  expect(person.reload.title).to eq("sir")
192
161
  end
193
162
 
194
- it "does not persist the second field" do
195
- expect {
196
- person[:aliased_timestamp] = Time.at(43)
197
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
163
+ it "does not update the second field" do
164
+ person[:aliased_timestamp] = Time.at(43)
165
+ person.save
198
166
  expect(person.reload.aliased_timestamp).to eq(Time.at(42))
199
167
  end
200
168
  end
@@ -202,30 +170,14 @@ describe Mongoid::Attributes::Readonly do
202
170
  context "when updating via write_attribute" do
203
171
 
204
172
  it "does not update the first field" do
205
- expect {
206
- person.write_attribute(:title, "mr")
207
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
208
- expect(person.title).to eq("sir")
209
- end
210
-
211
- it "does not update the second field" do
212
- expect {
213
- person.write_attribute(:aliased_timestamp, Time.at(43))
214
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
215
- expect(person.aliased_timestamp).to eq(Time.at(42))
216
- end
217
-
218
- it "does not persist the first field" do
219
- expect {
220
- person.write_attribute(:title, "mr")
221
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
173
+ person.write_attribute(:title, "mr")
174
+ person.save
222
175
  expect(person.reload.title).to eq("sir")
223
176
  end
224
177
 
225
- it "does not persist the second field" do
226
- expect {
227
- person.write_attribute(:aliased_timestamp, Time.at(43))
228
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
178
+ it "does not update the second field" do
179
+ person.write_attribute(:aliased_timestamp, Time.at(43))
180
+ person.save
229
181
  expect(person.reload.aliased_timestamp).to eq(Time.at(42))
230
182
  end
231
183
  end
@@ -233,30 +185,14 @@ describe Mongoid::Attributes::Readonly do
233
185
  context "when updating via update_attributes" do
234
186
 
235
187
  it "does not update the first field" do
236
- expect {
237
- person.update_attributes(title: "mr", aliased_timestamp: Time.at(43))
238
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
239
- expect(person.title).to eq("sir")
240
- end
241
-
242
- it "does not update the second field" do
243
- expect {
244
- person.update_attributes(title: "mr", aliased_timestamp: Time.at(43))
245
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
246
- expect(person.aliased_timestamp).to eq(Time.at(42))
247
- end
248
-
249
- it "does not persist the first field" do
250
- expect {
251
- person.update_attributes(title: "mr", aliased_timestamp: Time.at(43))
252
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
188
+ person.update_attributes(title: "mr", aliased_timestamp: Time.at(43))
189
+ person.save
253
190
  expect(person.reload.title).to eq("sir")
254
191
  end
255
192
 
256
- it "does not persist the second field" do
257
- expect {
258
- person.update_attributes(title: "mr", aliased_timestamp: Time.at(43))
259
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
193
+ it "does not update the second field" do
194
+ person.update_attributes(title: "mr", aliased_timestamp: Time.at(43))
195
+ person.save
260
196
  expect(person.reload.aliased_timestamp).to eq(Time.at(42))
261
197
  end
262
198
  end
@@ -264,30 +200,14 @@ describe Mongoid::Attributes::Readonly do
264
200
  context "when updating via update_attributes!" do
265
201
 
266
202
  it "does not update the first field" do
267
- expect {
268
- person.update_attributes!(title: "mr", aliased_timestamp: Time.at(43))
269
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
270
- expect(person.title).to eq("sir")
271
- end
272
-
273
- it "does not update the second field" do
274
- expect {
275
- person.update_attributes!(title: "mr", aliased_timestamp: Time.at(43))
276
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
277
- expect(person.aliased_timestamp).to eq(Time.at(42))
278
- end
279
-
280
- it "does not persist the first field" do
281
- expect {
282
- person.update_attributes!(title: "mr", aliased_timestamp: Time.at(43))
283
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
203
+ person.update_attributes!(title: "mr", aliased_timestamp: Time.at(43))
204
+ person.save
284
205
  expect(person.reload.title).to eq("sir")
285
206
  end
286
207
 
287
- it "does not persist the second field" do
288
- expect {
289
- person.update_attributes!(title: "mr", aliased_timestamp: Time.at(43))
290
- }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
208
+ it "does not update the second field" do
209
+ person.update_attributes!(title: "mr", aliased_timestamp: Time.at(43))
210
+ person.save
291
211
  expect(person.reload.aliased_timestamp).to eq(Time.at(42))
292
212
  end
293
213
  end
@@ -297,7 +217,7 @@ describe Mongoid::Attributes::Readonly do
297
217
  it "raises an error" do
298
218
  expect {
299
219
  person.update_attribute(:title, "mr")
300
- }.to raise_error(Mongoid::Errors::ReadonlyAttribute)
220
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
301
221
  end
302
222
  end
303
223
 
@@ -306,9 +226,44 @@ describe Mongoid::Attributes::Readonly do
306
226
  it "raises an error" do
307
227
  expect {
308
228
  person.remove_attribute(:title)
309
- }.to raise_error(Mongoid::Errors::ReadonlyAttribute)
229
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
310
230
  end
311
231
  end
312
232
  end
233
+
234
+ context 'when a foreign_key is defined as readonly' do
235
+
236
+ let(:attributes) do
237
+ :mother_id
238
+ end
239
+
240
+ context 'when the relation exists' do
241
+
242
+ let(:mother) do
243
+ Person.create
244
+ end
245
+
246
+ let(:child) do
247
+ Person.create(mother: mother)
248
+ Person.find_by(mother: mother)
249
+ end
250
+
251
+ it 'the relation can still be accessed' do
252
+ expect(child.mother).to eq(mother)
253
+ end
254
+ end
255
+
256
+ context 'when the relation does not exist' do
257
+
258
+ let(:child) do
259
+ Person.create
260
+ end
261
+
262
+ it 'the relation is nil' do
263
+ expect(child.mother).to be_nil
264
+ end
265
+ end
266
+
267
+ end
313
268
  end
314
269
  end