mongoid 7.6.0 → 8.0.1

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 (313) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +2 -0
  3. data/README.md +3 -3
  4. data/Rakefile +21 -85
  5. data/lib/config/locales/en.yml +46 -30
  6. data/lib/mongoid/association/accessors.rb +32 -3
  7. data/lib/mongoid/association/bindable.rb +48 -0
  8. data/lib/mongoid/association/builders.rb +4 -2
  9. data/lib/mongoid/association/eager_loadable.rb +29 -7
  10. data/lib/mongoid/association/embedded/batchable.rb +28 -5
  11. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  12. data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
  13. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  14. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  15. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
  16. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  17. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
  18. data/lib/mongoid/association/macros.rb +2 -1
  19. data/lib/mongoid/association/many.rb +5 -0
  20. data/lib/mongoid/association/nested/many.rb +2 -1
  21. data/lib/mongoid/association/proxy.rb +12 -0
  22. data/lib/mongoid/association/referenced/auto_save.rb +3 -2
  23. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  24. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  25. data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
  26. data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
  27. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
  28. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
  29. data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -18
  30. data/lib/mongoid/association/referenced/has_many/proxy.rb +12 -9
  31. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  32. data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
  33. data/lib/mongoid/association/referenced/syncable.rb +2 -2
  34. data/lib/mongoid/association/relatable.rb +38 -4
  35. data/lib/mongoid/attributes/processing.rb +9 -2
  36. data/lib/mongoid/attributes.rb +30 -27
  37. data/lib/mongoid/cacheable.rb +2 -2
  38. data/lib/mongoid/changeable.rb +37 -2
  39. data/lib/mongoid/clients/options.rb +4 -0
  40. data/lib/mongoid/clients/sessions.rb +2 -14
  41. data/lib/mongoid/config.rb +15 -11
  42. data/lib/mongoid/contextual/aggregable/memory.rb +23 -15
  43. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  44. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  45. data/lib/mongoid/contextual/memory.rb +55 -28
  46. data/lib/mongoid/contextual/mongo.rb +173 -287
  47. data/lib/mongoid/contextual/none.rb +33 -15
  48. data/lib/mongoid/copyable.rb +32 -8
  49. data/lib/mongoid/criteria/includable.rb +24 -20
  50. data/lib/mongoid/criteria/marshalable.rb +10 -2
  51. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
  52. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  53. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
  54. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  55. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  56. data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -16
  57. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  58. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  59. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  60. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
  61. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  62. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  63. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  64. data/lib/mongoid/criteria/queryable/optional.rb +3 -9
  65. data/lib/mongoid/criteria/queryable/options.rb +1 -1
  66. data/lib/mongoid/criteria/queryable/selectable.rb +2 -24
  67. data/lib/mongoid/criteria/queryable/selector.rb +90 -5
  68. data/lib/mongoid/criteria/queryable/smash.rb +39 -6
  69. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  70. data/lib/mongoid/criteria/queryable.rb +11 -6
  71. data/lib/mongoid/criteria.rb +1 -28
  72. data/lib/mongoid/deprecable.rb +36 -0
  73. data/lib/mongoid/deprecation.rb +25 -0
  74. data/lib/mongoid/document.rb +88 -33
  75. data/lib/mongoid/equality.rb +4 -4
  76. data/lib/mongoid/errors/document_not_found.rb +6 -2
  77. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  78. data/lib/mongoid/errors/invalid_field.rb +5 -1
  79. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  80. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  81. data/lib/mongoid/errors.rb +2 -2
  82. data/lib/mongoid/extensions/array.rb +8 -6
  83. data/lib/mongoid/extensions/big_decimal.rb +29 -10
  84. data/lib/mongoid/extensions/binary.rb +42 -0
  85. data/lib/mongoid/extensions/boolean.rb +8 -2
  86. data/lib/mongoid/extensions/date.rb +26 -20
  87. data/lib/mongoid/extensions/date_time.rb +1 -1
  88. data/lib/mongoid/extensions/float.rb +4 -5
  89. data/lib/mongoid/extensions/hash.rb +12 -5
  90. data/lib/mongoid/extensions/integer.rb +4 -5
  91. data/lib/mongoid/extensions/object.rb +2 -0
  92. data/lib/mongoid/extensions/range.rb +41 -10
  93. data/lib/mongoid/extensions/regexp.rb +11 -4
  94. data/lib/mongoid/extensions/set.rb +11 -4
  95. data/lib/mongoid/extensions/string.rb +2 -13
  96. data/lib/mongoid/extensions/symbol.rb +3 -14
  97. data/lib/mongoid/extensions/time.rb +27 -16
  98. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  99. data/lib/mongoid/extensions.rb +1 -0
  100. data/lib/mongoid/factory.rb +42 -7
  101. data/lib/mongoid/fields/foreign_key.rb +7 -0
  102. data/lib/mongoid/fields/validators/macro.rb +3 -9
  103. data/lib/mongoid/fields.rb +49 -7
  104. data/lib/mongoid/findable.rb +21 -16
  105. data/lib/mongoid/indexable/specification.rb +1 -1
  106. data/lib/mongoid/indexable/validators/options.rb +4 -1
  107. data/lib/mongoid/interceptable.rb +69 -9
  108. data/lib/mongoid/persistable/creatable.rb +14 -5
  109. data/lib/mongoid/persistable/updatable.rb +12 -5
  110. data/lib/mongoid/persistence_context.rb +8 -42
  111. data/lib/mongoid/query_cache.rb +6 -258
  112. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  113. data/lib/mongoid/reloadable.rb +7 -3
  114. data/lib/mongoid/scopable.rb +9 -11
  115. data/lib/mongoid/selectable.rb +1 -2
  116. data/lib/mongoid/shardable.rb +11 -35
  117. data/lib/mongoid/stateful.rb +27 -1
  118. data/lib/mongoid/timestamps/created.rb +1 -1
  119. data/lib/mongoid/timestamps/updated.rb +1 -1
  120. data/lib/mongoid/touchable.rb +2 -3
  121. data/lib/mongoid/traversable.rb +1 -0
  122. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  123. data/lib/mongoid/version.rb +1 -5
  124. data/lib/mongoid/warnings.rb +3 -4
  125. data/lib/mongoid.rb +1 -0
  126. data/spec/config/mongoid.yml +16 -0
  127. data/spec/integration/app_spec.rb +8 -12
  128. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  129. data/spec/integration/associations/embedded_spec.rb +15 -0
  130. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  131. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  132. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  133. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  134. data/spec/integration/associations/has_one_spec.rb +97 -1
  135. data/spec/integration/associations/scope_option_spec.rb +1 -1
  136. data/spec/integration/callbacks_models.rb +95 -1
  137. data/spec/integration/callbacks_spec.rb +226 -4
  138. data/spec/integration/criteria/range_spec.rb +95 -1
  139. data/spec/integration/discriminator_key_spec.rb +115 -76
  140. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  141. data/spec/integration/i18n_fallbacks_spec.rb +1 -15
  142. data/spec/integration/matcher_examples_spec.rb +20 -13
  143. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  144. data/spec/integration/matcher_operator_spec.rb +3 -5
  145. data/spec/integration/persistence/range_field_spec.rb +350 -0
  146. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  147. data/spec/mongoid/association/depending_spec.rb +9 -9
  148. data/spec/mongoid/association/eager_spec.rb +2 -1
  149. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  150. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  151. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  152. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  153. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +198 -8
  154. data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
  155. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  156. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  157. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  158. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  159. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  160. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  161. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  162. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  163. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  164. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  165. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +38 -5
  166. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  167. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  168. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  169. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  170. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +62 -13
  171. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  172. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  173. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  174. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  175. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  176. data/spec/mongoid/association/syncable_spec.rb +14 -0
  177. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  178. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  179. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  180. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  181. data/spec/mongoid/attributes_spec.rb +480 -27
  182. data/spec/mongoid/cacheable_spec.rb +3 -3
  183. data/spec/mongoid/changeable_spec.rb +130 -13
  184. data/spec/mongoid/clients/factory_spec.rb +23 -30
  185. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  186. data/spec/mongoid/clients_spec.rb +2 -2
  187. data/spec/mongoid/config_spec.rb +52 -15
  188. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  189. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  190. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  191. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  192. data/spec/mongoid/contextual/memory_spec.rb +521 -14
  193. data/spec/mongoid/contextual/mongo_spec.rb +566 -426
  194. data/spec/mongoid/contextual/none_spec.rb +11 -19
  195. data/spec/mongoid/copyable_spec.rb +451 -2
  196. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  197. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  198. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  199. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  200. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  201. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  202. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +1 -2
  203. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  204. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  205. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +1 -2
  206. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  207. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  208. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  209. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  210. data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
  211. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  212. data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
  213. data/spec/mongoid/criteria/queryable/selector_spec.rb +16 -77
  214. data/spec/mongoid/criteria/queryable/storable_spec.rb +0 -72
  215. data/spec/mongoid/criteria_spec.rb +469 -1201
  216. data/spec/mongoid/document_fields_spec.rb +173 -24
  217. data/spec/mongoid/document_spec.rb +32 -41
  218. data/spec/mongoid/equality_spec.rb +12 -12
  219. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  220. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  221. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  222. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  223. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  224. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  225. data/spec/mongoid/extensions/array_spec.rb +16 -2
  226. data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
  227. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  228. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  229. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  230. data/spec/mongoid/extensions/date_spec.rb +71 -1
  231. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  232. data/spec/mongoid/extensions/float_spec.rb +48 -76
  233. data/spec/mongoid/extensions/hash_spec.rb +30 -0
  234. data/spec/mongoid/extensions/integer_spec.rb +45 -66
  235. data/spec/mongoid/extensions/range_spec.rb +255 -54
  236. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  237. data/spec/mongoid/extensions/set_spec.rb +106 -0
  238. data/spec/mongoid/extensions/string_spec.rb +53 -25
  239. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  240. data/spec/mongoid/extensions/time_spec.rb +634 -66
  241. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  242. data/spec/mongoid/factory_spec.rb +61 -1
  243. data/spec/mongoid/fields_spec.rb +321 -50
  244. data/spec/mongoid/findable_spec.rb +64 -29
  245. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  246. data/spec/mongoid/indexable_spec.rb +16 -19
  247. data/spec/mongoid/interceptable_spec.rb +584 -5
  248. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  249. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  250. data/spec/mongoid/mongoizable_spec.rb +285 -0
  251. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  252. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  253. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  254. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  255. data/spec/mongoid/persistence_context_spec.rb +24 -0
  256. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  257. data/spec/mongoid/query_cache_spec.rb +1 -156
  258. data/spec/mongoid/reloadable_spec.rb +35 -2
  259. data/spec/mongoid/scopable_spec.rb +36 -34
  260. data/spec/mongoid/serializable_spec.rb +14 -7
  261. data/spec/mongoid/shardable_models.rb +0 -14
  262. data/spec/mongoid/shardable_spec.rb +61 -153
  263. data/spec/mongoid/stateful_spec.rb +28 -0
  264. data/spec/mongoid/timestamps_spec.rb +390 -0
  265. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  266. data/spec/mongoid/touchable_spec.rb +116 -0
  267. data/spec/mongoid/touchable_spec_models.rb +12 -8
  268. data/spec/mongoid/traversable_spec.rb +4 -11
  269. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  270. data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
  271. data/spec/mongoid/warnings_spec.rb +35 -0
  272. data/spec/mongoid_spec.rb +1 -7
  273. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  274. data/spec/rails/mongoid_spec.rb +4 -16
  275. data/spec/shared/lib/mrss/docker_runner.rb +1 -8
  276. data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
  277. data/spec/shared/lib/mrss/lite_constraints.rb +2 -10
  278. data/spec/shared/lib/mrss/server_version_registry.rb +24 -17
  279. data/spec/shared/lib/mrss/spec_organizer.rb +3 -32
  280. data/spec/shared/lib/mrss/utils.rb +6 -28
  281. data/spec/shared/share/Dockerfile.erb +107 -33
  282. data/spec/shared/shlib/distro.sh +0 -10
  283. data/spec/shared/shlib/server.sh +33 -64
  284. data/spec/shared/shlib/set_env.sh +71 -12
  285. data/spec/support/constraints.rb +24 -0
  286. data/spec/support/expectations.rb +17 -20
  287. data/spec/support/macros.rb +30 -0
  288. data/spec/support/models/augmentation.rb +12 -0
  289. data/spec/support/models/band.rb +3 -0
  290. data/spec/support/models/catalog.rb +24 -0
  291. data/spec/support/models/circus.rb +3 -0
  292. data/spec/support/models/fanatic.rb +8 -0
  293. data/spec/support/models/implant.rb +9 -0
  294. data/spec/support/models/label.rb +2 -0
  295. data/spec/support/models/passport.rb +9 -0
  296. data/spec/support/models/person.rb +1 -0
  297. data/spec/support/models/player.rb +2 -0
  298. data/spec/support/models/powerup.rb +12 -0
  299. data/spec/support/models/registry.rb +1 -0
  300. data/spec/support/models/school.rb +14 -0
  301. data/spec/support/models/shield.rb +18 -0
  302. data/spec/support/models/student.rb +14 -0
  303. data/spec/support/models/weapon.rb +12 -0
  304. data.tar.gz.sig +0 -0
  305. metadata +695 -641
  306. metadata.gz.sig +0 -0
  307. data/lib/mongoid/errors/eager_load.rb +0 -23
  308. data/lib/mongoid/errors/invalid_value.rb +0 -17
  309. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  310. data/spec/shared/CANDIDATE.md +0 -28
  311. data/spec/shared/lib/mrss/release/candidate.rb +0 -281
  312. data/spec/shared/lib/mrss/release/product_data.rb +0 -144
  313. data/spec/shared/lib/tasks/candidate.rake +0 -64
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "spec_helper"
4
+ require_relative './attributes/nested_spec_models'
4
5
 
5
6
  describe Mongoid::Attributes do
6
7
 
@@ -1077,8 +1078,8 @@ describe Mongoid::Attributes do
1077
1078
  context "after the attribute has been assigned" do
1078
1079
 
1079
1080
  it "returns the default value" do
1080
- person.age = "old"
1081
- expect(person.age_before_type_cast).to eq("old")
1081
+ person.age = "42"
1082
+ expect(person.age_before_type_cast).to eq("42")
1082
1083
  end
1083
1084
  end
1084
1085
 
@@ -1265,15 +1266,15 @@ describe Mongoid::Attributes do
1265
1266
 
1266
1267
  context "before the attribute has been assigned" do
1267
1268
 
1268
- it "returns false" do
1269
- expect(person.has_attribute_before_type_cast?(:age)).to be false
1269
+ it "returns true" do
1270
+ expect(person.has_attribute_before_type_cast?(:age)).to be true
1270
1271
  end
1271
1272
  end
1272
1273
 
1273
1274
  context "after the attribute has been assigned" do
1274
1275
 
1275
1276
  it "returns true" do
1276
- person.age = 'old'
1277
+ person.age = '42'
1277
1278
  expect(person.has_attribute_before_type_cast?(:age)).to be true
1278
1279
  end
1279
1280
  end
@@ -1528,12 +1529,13 @@ describe Mongoid::Attributes do
1528
1529
  end
1529
1530
 
1530
1531
  context "when setting an attribute that needs type casting" do
1532
+
1531
1533
  let(:person) do
1532
- Person.new(age: "old")
1534
+ Person.new(age: "42")
1533
1535
  end
1534
1536
 
1535
1537
  it "should store the attribute before type cast" do
1536
- expect(person.age_before_type_cast).to eq("old")
1538
+ expect(person.age_before_type_cast).to eq("42")
1537
1539
  end
1538
1540
  end
1539
1541
 
@@ -1581,16 +1583,14 @@ describe Mongoid::Attributes do
1581
1583
  context "when attribute is a Hash" do
1582
1584
  let(:person) { Person.new map: { somekey: "somevalue" } }
1583
1585
 
1584
- it "raises an error when trying to set a value of invalid type - array" do
1585
- expect do
1586
- person.map = []
1587
- end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type Array cannot be written to a field of type Hash/)
1586
+ it "writes nil when trying to set a value of invalid type - array" do
1587
+ person.map = []
1588
+ expect(person.map).to be_nil
1588
1589
  end
1589
1590
 
1590
- it "raises an error when trying to set a value of invalid type - boolean" do
1591
- expect do
1592
- person.map = false
1593
- end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type FalseClass cannot be written to a field of type Hash/)
1591
+ it "writes nil when trying to set a value of invalid type - boolean" do
1592
+ person.map = false
1593
+ expect(person.map).to be_nil
1594
1594
  end
1595
1595
 
1596
1596
  it "can set a Hash value" do
@@ -1605,16 +1605,14 @@ describe Mongoid::Attributes do
1605
1605
  expect(person.aliases).to eq([ :alias_1 ])
1606
1606
  end
1607
1607
 
1608
- it "raises an error when trying to set a value of invalid type - hash" do
1609
- expect do
1610
- person.aliases = {}
1611
- end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type Hash cannot be written to a field of type Array/)
1608
+ it "writes nil when trying to set a value of invalid type - hash" do
1609
+ person.aliases = {}
1610
+ expect(person.aliases).to be_nil
1612
1611
  end
1613
1612
 
1614
- it "raises an error when trying to set a value of invalid type - boolean" do
1615
- expect do
1616
- person.aliases = false
1617
- end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type FalseClass cannot be written to a field of type Array/)
1613
+ it "writes nil when trying to set a value of invalid type - boolean" do
1614
+ person.aliases = false
1615
+ expect(person.aliases).to be_nil
1618
1616
  end
1619
1617
  end
1620
1618
 
@@ -1899,11 +1897,11 @@ describe Mongoid::Attributes do
1899
1897
  end
1900
1898
 
1901
1899
  it "has 3 new entries" do
1902
- expect(pet.vet_visits.count).to eq(3)
1900
+ expect(pet.vet_visits.count).to eq 3
1903
1901
  end
1904
1902
 
1905
1903
  it "persists the changes" do
1906
- expect(pet.reload.vet_visits.count).to eq(3)
1904
+ expect(pet.reload.vet_visits.count).to eq 3
1907
1905
  end
1908
1906
  end
1909
1907
 
@@ -2073,8 +2071,8 @@ describe Mongoid::Attributes do
2073
2071
  end
2074
2072
 
2075
2073
  it "aliases *_before_type_cast" do
2076
- product.cost = "expensive"
2077
- expect(product.cost_before_type_cast).to eq("expensive")
2074
+ product.cost = "42"
2075
+ expect(product.cost_before_type_cast).to eq("42")
2078
2076
  end
2079
2077
  end
2080
2078
 
@@ -2258,4 +2256,459 @@ describe Mongoid::Attributes do
2258
2256
  end
2259
2257
  end
2260
2258
  end
2259
+
2260
+ context "when an attribute is removed then set" do
2261
+ let(:cat) { Cat.create!(name: "Neil") }
2262
+
2263
+ before do
2264
+ cat.remove_attribute("name")
2265
+ cat.name = "Nissim"
2266
+ cat.save!
2267
+ cat.reload
2268
+ end
2269
+
2270
+ it "correctly sets the attribute" do
2271
+ expect(cat.name).to eq("Nissim")
2272
+ end
2273
+ end
2274
+
2275
+ describe "attributes after setting an association without reloading" do
2276
+
2277
+ context "on embeds_many" do
2278
+
2279
+ context "when not setting anything" do
2280
+ let(:doc) { NestedBook.create! }
2281
+
2282
+ it "doesn't add attributes" do
2283
+ expect(doc.attributes).to_not have_key("pages")
2284
+ end
2285
+
2286
+ it "has the same attributes after reloading" do
2287
+ expect(doc.attributes).to eq(doc.reload.attributes)
2288
+ end
2289
+ end
2290
+
2291
+ context "when using nested attributes" do
2292
+ let(:doc) { NestedBook.create! }
2293
+
2294
+ before do
2295
+ doc.update_attributes({ pages_attributes: [ {} ] })
2296
+ end
2297
+
2298
+ it "updates the attributes" do
2299
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2300
+ end
2301
+
2302
+ it "has the same attributes after reloading" do
2303
+ expect(doc.attributes).to eq(doc.reload.attributes)
2304
+ end
2305
+ end
2306
+
2307
+ context "when doing assignments" do
2308
+ let(:doc) { NestedBook.create! }
2309
+ before do
2310
+ doc.pages = [NestedPage.new]
2311
+ end
2312
+
2313
+ it "updates the attributes" do
2314
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2315
+ end
2316
+
2317
+ it "has the same attributes after reloading" do
2318
+ expect(doc.attributes).to eq(doc.reload.attributes)
2319
+ end
2320
+ end
2321
+
2322
+ context "when replacing assignments" do
2323
+ let(:doc) { NestedBook.create! }
2324
+ before do
2325
+ doc.pages = [NestedPage.new(number: 1)]
2326
+ doc.pages = [NestedPage.new(number: 2)]
2327
+ end
2328
+
2329
+ it "updates the attributes" do
2330
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id, "number" => 2 }])
2331
+ end
2332
+
2333
+ it "has the same attributes after reloading" do
2334
+ expect(doc.attributes).to eq(doc.reload.attributes)
2335
+ end
2336
+ end
2337
+
2338
+ context "when setting to nil" do
2339
+ let(:doc) { NestedBook.create! }
2340
+ before do
2341
+ doc.pages = [NestedPage.new(number: 1)]
2342
+ doc.pages = nil
2343
+ end
2344
+
2345
+ it "updates the attributes" do
2346
+ expect(doc.attributes).to_not have_key("pages")
2347
+ end
2348
+
2349
+ it "has the same attributes after reloading" do
2350
+ expect({ "pages" => [] }.merge(doc.attributes)).to eq(doc.reload.attributes)
2351
+ end
2352
+ end
2353
+
2354
+ context "when setting to nil and back" do
2355
+ let(:doc) { NestedBook.create! }
2356
+ let(:page) { NestedPage.new }
2357
+ before do
2358
+ doc.pages = [page]
2359
+ doc.pages = nil
2360
+ doc.pages = [page]
2361
+ end
2362
+
2363
+ it "updates the attributes" do
2364
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2365
+ end
2366
+
2367
+ it "has the same attributes after reloading" do
2368
+ expect(doc.attributes).to eq(doc.reload.attributes)
2369
+ end
2370
+ end
2371
+
2372
+ context "when pushing" do
2373
+ let(:doc) { NestedBook.create! }
2374
+ before do
2375
+ doc.pages << NestedPage.new
2376
+ end
2377
+
2378
+ it "updates the attributes" do
2379
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2380
+ end
2381
+
2382
+ it "has the same attributes after reloading" do
2383
+ expect(doc.attributes).to eq(doc.reload.attributes)
2384
+ end
2385
+ end
2386
+
2387
+ [:shift, :pop].each do |meth|
2388
+ context "when performing #{meth}" do
2389
+ let(:doc) { NestedBook.create! }
2390
+ before do
2391
+ doc.pages << NestedPage.new
2392
+ doc.pages << NestedPage.new
2393
+ doc.pages << NestedPage.new
2394
+
2395
+ doc.pages.send(meth, 2)
2396
+ end
2397
+
2398
+ it "updates the attributes" do
2399
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2400
+ end
2401
+
2402
+ it "has the same attributes after reloading" do
2403
+ expect(doc.attributes).to eq(doc.reload.attributes)
2404
+ end
2405
+ end
2406
+ end
2407
+
2408
+ context "when concatting" do
2409
+ let(:doc) { NestedBook.create! }
2410
+ before do
2411
+ doc.pages << NestedPage.new
2412
+ doc.pages.concat([NestedPage.new, NestedPage.new])
2413
+ end
2414
+
2415
+ it "updates the attributes" do
2416
+ expect(doc.attributes["pages"].count).to eq 3
2417
+ end
2418
+
2419
+ it "has the same attributes after reloading" do
2420
+ expect(doc.attributes).to eq(doc.reload.attributes)
2421
+ end
2422
+ end
2423
+
2424
+ [:build, :create].each do |meth|
2425
+ context "when preforming #{meth}" do
2426
+ let(:doc) { NestedBook.create! }
2427
+ before do
2428
+ doc.pages.send(meth)
2429
+ end
2430
+
2431
+ it "updates the attributes" do
2432
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2433
+ end
2434
+
2435
+ it "has the same attributes after reloading" do
2436
+ doc.pages.first.save
2437
+ expect(doc.attributes).to eq(doc.reload.attributes)
2438
+ end
2439
+ end
2440
+ end
2441
+
2442
+ context "when clearing" do
2443
+ let(:doc) { NestedBook.create! }
2444
+ before do
2445
+ doc.pages << NestedPage.new
2446
+ doc.pages << NestedPage.new
2447
+ doc.pages << NestedPage.new
2448
+
2449
+ doc.pages.clear
2450
+ end
2451
+
2452
+ it "updates the attributes" do
2453
+ expect(doc.attributes).to_not have_key("pages")
2454
+ end
2455
+
2456
+ it "has the same attributes after reloading" do
2457
+ expect(doc.attributes).to eq(doc.reload.attributes)
2458
+ end
2459
+ end
2460
+
2461
+ [:delete_all, :destroy_all, :remove_all].each do |meth|
2462
+ context "when performing: #{meth}" do
2463
+ let(:doc) { NestedBook.create! }
2464
+ before do
2465
+ doc.pages << NestedPage.new
2466
+ doc.pages << NestedPage.new
2467
+ doc.pages << NestedPage.new
2468
+
2469
+ doc.pages.send(meth)
2470
+ end
2471
+
2472
+ it "updates the attributes" do
2473
+ expect(doc.attributes).to_not have_key("pages")
2474
+ end
2475
+
2476
+ it "has the same attributes after reloading" do
2477
+ expect({ "pages" => [] }.merge(doc.attributes)).to eq(doc.reload.attributes)
2478
+ end
2479
+ end
2480
+ end
2481
+
2482
+ context "when deleting" do
2483
+ let(:doc) { NestedBook.create! }
2484
+ let(:page) { NestedPage.new }
2485
+ before do
2486
+ doc.pages << page
2487
+ doc.pages << NestedPage.new
2488
+ doc.pages << NestedPage.new
2489
+
2490
+ doc.pages.delete(page)
2491
+ end
2492
+
2493
+ it "updates the attributes" do
2494
+ expect(doc.attributes["pages"].count).to eq 2
2495
+ end
2496
+
2497
+ it "has the same attributes after reloading" do
2498
+ expect(doc.attributes).to eq(doc.reload.attributes)
2499
+ end
2500
+ end
2501
+
2502
+ context "when doing delete_one" do
2503
+ let(:doc) { NestedBook.create! }
2504
+ let(:page) { NestedPage.new }
2505
+ before do
2506
+ doc.pages << page
2507
+ doc.pages << NestedPage.new
2508
+ doc.pages << NestedPage.new
2509
+
2510
+ doc.pages.send(:delete_one, page)
2511
+ end
2512
+
2513
+ it "updates the attributes" do
2514
+ expect(doc.attributes["pages"].count).to eq 2
2515
+ end
2516
+ end
2517
+
2518
+ context "when assigning an array of hashes" do
2519
+ let(:doc) { NestedBook.create! }
2520
+ before do
2521
+ doc.pages = [{}]
2522
+ end
2523
+
2524
+ it "updates the attributes" do
2525
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2526
+ end
2527
+
2528
+ it "has the same attributes after reloading" do
2529
+ expect(doc.attributes).to eq(doc.reload.attributes)
2530
+ end
2531
+ end
2532
+
2533
+ context "when assigning twice" do
2534
+ let(:doc) { NestedBook.create! }
2535
+ before do
2536
+ doc.pages = [{ number: 1 }]
2537
+ doc.pages = [{}]
2538
+ end
2539
+
2540
+ it "updates the attributes" do
2541
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2542
+ end
2543
+
2544
+ it "has the same attributes after reloading" do
2545
+ expect(doc.attributes).to eq(doc.reload.attributes)
2546
+ end
2547
+ end
2548
+ end
2549
+
2550
+ context "on embeds_one" do
2551
+
2552
+ let(:attrs) { { "title" => "Title" } }
2553
+
2554
+ context "when using nested attributes" do
2555
+ let(:doc) { NestedBook.create! }
2556
+
2557
+ before do
2558
+ doc.update_attributes({ cover_attributes: attrs })
2559
+ end
2560
+
2561
+ it "updates the attributes" do
2562
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2563
+ end
2564
+
2565
+ it "has the same attributes after reloading" do
2566
+ expect(doc.attributes).to eq(doc.reload.attributes)
2567
+ end
2568
+ end
2569
+
2570
+ context "when doing assignments" do
2571
+ let(:doc) { NestedBook.create! }
2572
+ before do
2573
+ doc.cover = NestedCover.new(attrs)
2574
+ end
2575
+
2576
+ it "updates the attributes" do
2577
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2578
+ end
2579
+
2580
+ it "has the same attributes after reloading" do
2581
+ expect(doc.attributes).to eq(doc.reload.attributes)
2582
+ end
2583
+ end
2584
+
2585
+ context "when replacing assignments" do
2586
+ let(:doc) { NestedBook.create! }
2587
+ before do
2588
+ doc.cover = NestedCover.new("title" => "Title1")
2589
+ doc.cover = NestedCover.new(attrs)
2590
+ end
2591
+
2592
+ it "updates the attributes" do
2593
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2594
+ end
2595
+
2596
+ it "has the same attributes after reloading" do
2597
+ expect(doc.attributes).to eq(doc.reload.attributes)
2598
+ end
2599
+ end
2600
+
2601
+ context "when setting to nil" do
2602
+ let(:doc) { NestedBook.create! }
2603
+ before do
2604
+ doc.cover = NestedCover.new(attrs)
2605
+ doc.cover = nil
2606
+ end
2607
+
2608
+ it "updates the attributes" do
2609
+ expect(doc.attributes.key?("cover")).to be false
2610
+ end
2611
+
2612
+ it "has the same attributes after reloading" do
2613
+ expect(doc.attributes).to eq(doc.reload.attributes)
2614
+ end
2615
+ end
2616
+
2617
+ context "when setting to nil and back" do
2618
+ let(:doc) { NestedBook.create! }
2619
+ before do
2620
+ doc.cover = NestedCover.new(attrs)
2621
+ doc.cover = nil
2622
+ doc.cover = NestedCover.new(attrs)
2623
+ end
2624
+
2625
+ it "updates the attributes" do
2626
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2627
+ end
2628
+
2629
+
2630
+ it "has the same attributes after reloading" do
2631
+ expect(doc.attributes).to eq(doc.reload.attributes)
2632
+ end
2633
+ end
2634
+
2635
+ [:build, :create].each do |meth|
2636
+ context "when preforming #{meth}" do
2637
+ let(:doc) { NestedBook.create! }
2638
+ before do
2639
+ doc.send("#{meth}_cover", attrs)
2640
+ end
2641
+
2642
+ it "updates the attributes" do
2643
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2644
+ end
2645
+
2646
+ it "has the same attributes after reloading" do
2647
+ doc.cover.save
2648
+ expect(doc.attributes).to eq(doc.reload.attributes)
2649
+ end
2650
+ end
2651
+ end
2652
+
2653
+ context "when assigning a hash" do
2654
+ let(:doc) { NestedBook.create! }
2655
+ before do
2656
+ doc.cover = attrs
2657
+ end
2658
+
2659
+ it "updates the attributes" do
2660
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2661
+ end
2662
+
2663
+ it "has the same attributes after reloading" do
2664
+ expect(doc.attributes).to eq(doc.reload.attributes)
2665
+ end
2666
+ end
2667
+
2668
+ context "when assigning twice" do
2669
+ let(:doc) { NestedBook.create! }
2670
+ before do
2671
+ doc.cover = { "title" => "1984" }
2672
+ doc.cover = attrs
2673
+ end
2674
+
2675
+ it "updates the attributes" do
2676
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2677
+ end
2678
+
2679
+ it "has the same attributes after reloading" do
2680
+ expect(doc.attributes).to eq(doc.reload.attributes)
2681
+ end
2682
+ end
2683
+ end
2684
+ end
2685
+
2686
+ context "when modifiying a hash referenced with the [] notation" do
2687
+ let(:church) { Church.create!(location: { x: 1 }) }
2688
+
2689
+ before do
2690
+ church[:location].merge!(y: 2)
2691
+ church.save!
2692
+ church.reload
2693
+ end
2694
+
2695
+ it "persists the updated hash" do
2696
+ church.location.should == { "x" => 1, "y" => 2 }
2697
+ end
2698
+ end
2699
+
2700
+ context "when modifiying a set referenced with the [] notation" do
2701
+ let(:catalog) { Catalog.create!(set_field: [ 1 ].to_set) }
2702
+
2703
+ before do
2704
+ catalog[:set_field] << 2
2705
+ catalog.save!
2706
+ catalog.reload
2707
+ end
2708
+
2709
+ it "persists the updated hash" do
2710
+ pending "MONGOID-2951"
2711
+ catalog.set_field.should == Set.new([ 1, 2 ])
2712
+ end
2713
+ end
2261
2714
  end
@@ -45,7 +45,7 @@ describe Mongoid::Cacheable do
45
45
  context "with the default cache_timestamp_format" do
46
46
 
47
47
  let!(:updated_at) do
48
- document.updated_at.utc.to_formatted_s(:nsec)
48
+ document.updated_at.utc.to_s(:nsec)
49
49
  end
50
50
 
51
51
  it "has the id and updated_at key name" do
@@ -64,7 +64,7 @@ describe Mongoid::Cacheable do
64
64
  end
65
65
 
66
66
  let!(:updated_at) do
67
- document.updated_at.utc.to_formatted_s(:number)
67
+ document.updated_at.utc.to_s(:number)
68
68
  end
69
69
 
70
70
  it "has the id and updated_at key name" do
@@ -103,7 +103,7 @@ describe Mongoid::Cacheable do
103
103
  end
104
104
 
105
105
  let!(:updated_at) do
106
- agent.updated_at.utc.to_formatted_s(:nsec)
106
+ agent.updated_at.utc.to_s(:nsec)
107
107
  end
108
108
 
109
109
  it "has the id and updated_at key name" do