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
@@ -0,0 +1,350 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe 'Range field persistence' do
6
+ let!(:person) { Person.create!(field => value).reload }
7
+ subject { person.send(field) }
8
+ let(:now_utc) { Time.now }
9
+ let(:later_utc) { now_utc + 10.minutes }
10
+ let(:now_in_zone) { now_utc.in_time_zone('Asia/Tokyo') }
11
+ let(:later_in_zone) { later_utc.in_time_zone('Asia/Tokyo') }
12
+
13
+ context 'static field' do
14
+ let(:field) { :range }
15
+
16
+ context 'when Integer' do
17
+ let(:value) { 1..3 }
18
+ it do
19
+ expect(subject).to eq(1..3)
20
+ end
21
+ end
22
+
23
+ context 'when Integer exclude_end' do
24
+ let(:value) { 1...3 }
25
+ it { expect(subject).to eq(1...3) }
26
+ end
27
+
28
+ context 'when endless' do
29
+ ruby_version_gte '2.6'
30
+ let(:value) { eval('3..') }
31
+ it { expect(subject).to eq(eval('3..')) }
32
+ end
33
+
34
+ context 'when endless exclude_end' do
35
+ ruby_version_gte '2.6'
36
+ let(:value) { eval('3...') }
37
+ it { expect(subject).to eq(eval('3...')) }
38
+ end
39
+
40
+ context 'when beginning-less' do
41
+ ruby_version_gte '2.7'
42
+ let(:value) { eval('..3') }
43
+ it { expect(subject).to eq(eval('..3')) }
44
+ end
45
+
46
+ context 'when beginning-less exclude_end' do
47
+ ruby_version_gte '2.7'
48
+ let(:value) { eval('...3') }
49
+ it { expect(subject).to eq(eval('...3')) }
50
+ end
51
+
52
+ context 'when Hash<String, Integer>' do
53
+ let(:value) { { 'min' => 1, 'max' => 3 } }
54
+ it { expect(subject).to eq(1..3) }
55
+ end
56
+
57
+ context 'when Hash<String, Integer> exclude_end' do
58
+ let(:value) { { 'min' => 1, 'max' => 3, 'exclude_end' => true } }
59
+ it { expect(subject).to eq(1...3) }
60
+ end
61
+
62
+ context 'when Hash<Symbol, Integer>' do
63
+ let(:value) { { min: 1, max: 3 } }
64
+ it { expect(subject).to eq(1..3) }
65
+ end
66
+
67
+ context 'when Hash<Symbol, Integer> exclude_end' do
68
+ let(:value) { { min: 1, max: 3, exclude_end: true } }
69
+ it { expect(subject).to eq(1...3) }
70
+ end
71
+
72
+ context 'when Time' do
73
+ let(:value) { now_utc..later_utc }
74
+
75
+ it do
76
+ expect(subject).to be_a Range
77
+ expect(subject.exclude_end?).to eq false
78
+ expect(subject.first).to be_within(0.01.second).of(now_utc)
79
+ expect(subject.last).to be_within(0.01.second).of(later_utc)
80
+ expect(subject.first.class).to eq Time
81
+ expect(subject.last.class).to eq Time
82
+ end
83
+ end
84
+
85
+ context 'when Time exclude_end' do
86
+ let(:value) { now_utc...later_utc }
87
+
88
+ it do
89
+ expect(subject).to be_a Range
90
+ expect(subject.exclude_end?).to eq true
91
+ expect(subject.first).to be_within(0.01.second).of(now_utc)
92
+ expect(subject.last).to be_within(0.01.second).of(later_utc)
93
+ expect(subject.first.class).to eq Time
94
+ expect(subject.last.class).to eq Time
95
+ end
96
+ end
97
+
98
+ context 'when Hash<String, Time>' do
99
+ let(:value) { { 'min' => now_utc, 'max' => later_utc } }
100
+
101
+ it do
102
+ expect(subject).to be_a Range
103
+ expect(subject.exclude_end?).to eq false
104
+ expect(subject.first).to be_within(0.01.second).of(now_utc)
105
+ expect(subject.last).to be_within(0.01.second).of(later_utc)
106
+ expect(subject.first.class).to eq Time
107
+ expect(subject.last.class).to eq Time
108
+ end
109
+ end
110
+
111
+ context 'when Hash<String, Time> exclude_end' do
112
+ let(:value) { { 'min' => now_utc, 'max' => later_utc, 'exclude_end' => true } }
113
+
114
+ it do
115
+ expect(subject).to be_a Range
116
+ expect(subject.exclude_end?).to eq true
117
+ expect(subject.first).to be_within(0.01.second).of(now_utc)
118
+ expect(subject.last).to be_within(0.01.second).of(later_utc)
119
+ expect(subject.first.class).to eq Time
120
+ expect(subject.last.class).to eq Time
121
+ end
122
+ end
123
+
124
+ context 'when ActiveSupport::TimeWithZone' do
125
+ let(:value) { now_in_zone..later_in_zone }
126
+
127
+ it do
128
+ expect(subject).to be_a Range
129
+ expect(subject.exclude_end?).to eq false
130
+ expect(subject.first).to be_within(0.01.second).of(now_utc)
131
+ expect(subject.last).to be_within(0.01.second).of(later_utc)
132
+ expect(subject.first.class).to eq Time
133
+ expect(subject.last.class).to eq Time
134
+ end
135
+ end
136
+
137
+ context 'when ActiveSupport::TimeWithZone exclude_end' do
138
+ let(:value) { now_in_zone...later_in_zone }
139
+
140
+ it do
141
+ expect(subject).to be_a Range
142
+ expect(subject.exclude_end?).to eq true
143
+ expect(subject.first).to be_within(0.01.second).of(now_utc)
144
+ expect(subject.last).to be_within(0.01.second).of(later_utc)
145
+ expect(subject.first.class).to eq Time
146
+ expect(subject.last.class).to eq Time
147
+ end
148
+ end
149
+
150
+ context 'when Hash<String, ActiveSupport::TimeWithZone>' do
151
+ let(:value) { { 'min' => now_in_zone, 'max' => later_in_zone } }
152
+
153
+ it do
154
+ expect(subject).to be_a Range
155
+ expect(subject.exclude_end?).to eq false
156
+ expect(subject.first).to be_within(0.01.second).of(now_utc)
157
+ expect(subject.last).to be_within(0.01.second).of(later_utc)
158
+ expect(subject.first.class).to eq Time
159
+ expect(subject.last.class).to eq Time
160
+ end
161
+ end
162
+
163
+ context 'when Hash<String, ActiveSupport::TimeWithZone> exclude_end' do
164
+ let(:value) { { 'min' => now_in_zone, 'max' => later_in_zone, 'exclude_end' => true } }
165
+
166
+ it do
167
+ expect(subject).to be_a Range
168
+ expect(subject.exclude_end?).to eq true
169
+ expect(subject.first).to be_within(0.01.second).of(now_utc)
170
+ expect(subject.last).to be_within(0.01.second).of(later_utc)
171
+ expect(subject.first.class).to eq Time
172
+ expect(subject.last.class).to eq Time
173
+ end
174
+ end
175
+ end
176
+
177
+ context 'dynamic field' do
178
+ let(:field) { :dynamic }
179
+
180
+ context 'when Integer' do
181
+ let(:value) { 1..3 }
182
+ it do
183
+ expect(subject).to eq('max' => 3, 'min' => 1)
184
+ end
185
+ end
186
+
187
+ context 'when Integer exclude_end' do
188
+ let(:value) { 1...3 }
189
+ it { expect(subject).to eq('max' => 3, 'min' => 1, 'exclude_end' => true) }
190
+ end
191
+
192
+ context 'when descending' do
193
+ let(:value) { 3..1 }
194
+ it { expect(subject).to eq('max' => 1, 'min' => 3) }
195
+ end
196
+
197
+ context 'when descending exclude_end' do
198
+ let(:value) { 3...1 }
199
+ it { expect(subject).to eq('max' => 1, 'min' => 3, 'exclude_end' => true) }
200
+ end
201
+
202
+ context 'when endless' do
203
+ ruby_version_gte '2.6'
204
+ let(:value) { eval('3..') }
205
+ it { expect(subject).to eq('min' => 3) }
206
+ end
207
+
208
+ context 'when endless exclude_end' do
209
+ ruby_version_gte '2.6'
210
+ let(:value) { eval('3...') }
211
+ it { expect(subject).to eq('min' => 3, 'exclude_end' => true) }
212
+ end
213
+
214
+ context 'when beginning-less' do
215
+ ruby_version_gte '2.7'
216
+ let(:value) { eval('..3') }
217
+ it { expect(subject).to eq('max' => 3) }
218
+ end
219
+
220
+ context 'when beginning-less exclude_end' do
221
+ ruby_version_gte '2.7'
222
+ let(:value) { eval('...3') }
223
+ it { expect(subject).to eq('max' => 3, 'exclude_end' => true) }
224
+ end
225
+
226
+ context 'when Hash<String, Integer>' do
227
+ let(:value) { { 'min' => 1, 'max' => 3 } }
228
+ it { expect(subject).to eq('max' => 3, 'min' => 1) }
229
+ end
230
+
231
+ context 'when Hash<String, Integer> exclude_end' do
232
+ let(:value) { { 'min' => 1, 'max' => 3, 'exclude_end' => true } }
233
+ it { expect(subject).to eq('max' => 3, 'min' => 1, 'exclude_end' => true) }
234
+ end
235
+
236
+ context 'when Hash<Symbol, Integer>' do
237
+ let(:value) { { min: 1, max: 3 } }
238
+ it { expect(subject).to eq('max' => 3, 'min' => 1) }
239
+ end
240
+
241
+ context 'when Hash<Symbol, Integer> exclude_end' do
242
+ let(:value) { { min: 1, max: 3, exclude_end: true } }
243
+ it { expect(subject).to eq('max' => 3, 'min' => 1, 'exclude_end' => true) }
244
+ end
245
+
246
+ context 'when Time' do
247
+ let(:value) { now_utc..later_utc }
248
+
249
+ it do
250
+ expect(subject).to be_a Hash
251
+ expect(subject['exclude_end']).to eq nil
252
+ expect(subject['min']).to be_within(0.01.second).of(now_utc)
253
+ expect(subject['max']).to be_within(0.01.second).of(later_utc)
254
+ expect(subject['min'].class).to eq Time
255
+ expect(subject['max'].class).to eq Time
256
+ end
257
+ end
258
+
259
+ context 'when Time exclude_end' do
260
+ let(:value) { now_utc...later_utc }
261
+
262
+ it do
263
+ expect(subject).to be_a Hash
264
+ expect(subject['exclude_end']).to eq true
265
+ expect(subject['min']).to be_within(0.01.second).of(now_utc)
266
+ expect(subject['max']).to be_within(0.01.second).of(later_utc)
267
+ expect(subject['min'].class).to eq Time
268
+ expect(subject['max'].class).to eq Time
269
+ end
270
+ end
271
+
272
+ context 'when Hash<String, Time>' do
273
+ let(:value) { { 'min' => now_utc, 'max' => later_utc } }
274
+
275
+ it do
276
+ expect(subject).to be_a Hash
277
+ expect(subject['exclude_end']).to eq nil
278
+ expect(subject['min']).to be_within(0.01.second).of(now_utc)
279
+ expect(subject['max']).to be_within(0.01.second).of(later_utc)
280
+ expect(subject['min'].class).to eq Time
281
+ expect(subject['max'].class).to eq Time
282
+ end
283
+ end
284
+
285
+ context 'when Hash<String, Time> exclude_end' do
286
+ let(:value) { { 'min' => now_utc, 'max' => later_utc, 'exclude_end' => true } }
287
+
288
+ it do
289
+ expect(subject).to be_a Hash
290
+ expect(subject['exclude_end']).to eq true
291
+ expect(subject['min']).to be_within(0.01.second).of(now_utc)
292
+ expect(subject['max']).to be_within(0.01.second).of(later_utc)
293
+ expect(subject['min'].class).to eq Time
294
+ expect(subject['max'].class).to eq Time
295
+ end
296
+ end
297
+
298
+ context 'when ActiveSupport::TimeWithZone' do
299
+ let(:value) { now_in_zone..later_in_zone }
300
+
301
+ it do
302
+ expect(subject).to be_a Hash
303
+ expect(subject['exclude_end']).to eq nil
304
+ expect(subject['min']).to be_within(0.01.second).of(now_utc)
305
+ expect(subject['max']).to be_within(0.01.second).of(later_utc)
306
+ expect(subject['min'].class).to eq Time
307
+ expect(subject['max'].class).to eq Time
308
+ end
309
+ end
310
+
311
+ context 'when ActiveSupport::TimeWithZone exclude_end' do
312
+ let(:value) { now_in_zone...later_in_zone }
313
+
314
+ it do
315
+ expect(subject).to be_a Hash
316
+ expect(subject['exclude_end']).to eq true
317
+ expect(subject['min']).to be_within(0.01.second).of(now_utc)
318
+ expect(subject['max']).to be_within(0.01.second).of(later_utc)
319
+ expect(subject['min'].class).to eq Time
320
+ expect(subject['max'].class).to eq Time
321
+ end
322
+ end
323
+
324
+ context 'when Hash<String, ActiveSupport::TimeWithZone>' do
325
+ let(:value) { { 'min' => now_in_zone, 'max' => later_in_zone } }
326
+
327
+ it do
328
+ expect(subject).to be_a Hash
329
+ expect(subject['exclude_end']).to eq nil
330
+ expect(subject['min']).to be_within(0.01.second).of(now_utc)
331
+ expect(subject['max']).to be_within(0.01.second).of(later_utc)
332
+ expect(subject['min'].class).to eq Time
333
+ expect(subject['max'].class).to eq Time
334
+ end
335
+ end
336
+
337
+ context 'when Hash<String, ActiveSupport::TimeWithZone> exclude_end' do
338
+ let(:value) { { 'min' => now_in_zone, 'max' => later_in_zone, 'exclude_end' => true } }
339
+
340
+ it do
341
+ expect(subject).to be_a Hash
342
+ expect(subject['exclude_end']).to eq true
343
+ expect(subject['min']).to be_within(0.01.second).of(now_utc)
344
+ expect(subject['max']).to be_within(0.01.second).of(later_utc)
345
+ expect(subject['min'].class).to eq Time
346
+ expect(subject['max'].class).to eq Time
347
+ end
348
+ end
349
+ end
350
+ end
@@ -133,7 +133,7 @@ describe Mongoid::Association::Referenced::CounterCache do
133
133
  it "expect to raise an error" do
134
134
  expect {
135
135
  Person.reset_counters "1", :drugs
136
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
136
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Person with id\(s\)/)
137
137
  end
138
138
  end
139
139
 
@@ -73,7 +73,7 @@ describe Mongoid::Association::Depending do
73
73
  r = DependentReportCard.create!(dependent_student: s)
74
74
  s.destroy!
75
75
 
76
- expect { DependentReportCard.find(r.id) }.to raise_error(Mongoid::Errors::DocumentNotFound)
76
+ expect { DependentReportCard.find(r.id) }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class DependentReportCard with id\(s\)/)
77
77
  end
78
78
 
79
79
  it 'facilitates proper transitive destroying of the object' do
@@ -84,7 +84,7 @@ describe Mongoid::Association::Depending do
84
84
  r = DependentReportCard.create!(dependent_student: s)
85
85
  s.destroy!
86
86
 
87
- expect { DependentReportCard.find(r.id) }.to raise_error(Mongoid::Errors::DocumentNotFound)
87
+ expect { DependentReportCard.find(r.id) }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class DependentReportCard with id\(s\)/)
88
88
  end
89
89
 
90
90
  it 'adds the dependent to subclasses' do
@@ -105,7 +105,7 @@ describe Mongoid::Association::Depending do
105
105
  r = DependentReportCard.create!(dependent_student: s)
106
106
  s.destroy!
107
107
 
108
- expect { DependentReportCard.find(r.id) }.to raise_error(Mongoid::Errors::DocumentNotFound)
108
+ expect { DependentReportCard.find(r.id) }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class DependentReportCard with id\(s\)/)
109
109
  end
110
110
 
111
111
  it "doesn't add the dependent to sibling classes" do
@@ -177,7 +177,7 @@ describe Mongoid::Association::Depending do
177
177
 
178
178
  expect {
179
179
  DependentOwnedOne.find(owned.id)
180
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
180
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class DependentOwnedOne with id\(s\)/)
181
181
  end
182
182
  end
183
183
 
@@ -250,7 +250,7 @@ describe Mongoid::Association::Depending do
250
250
  dep = Dep.create!(double_assoc: two)
251
251
  two.destroy!
252
252
 
253
- expect { Dep.find(dep.id) }.to raise_error(Mongoid::Errors::DocumentNotFound)
253
+ expect { Dep.find(dep.id) }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Dep with id\(s\)/)
254
254
  end
255
255
  end
256
256
  end
@@ -362,7 +362,7 @@ describe Mongoid::Association::Depending do
362
362
  it "deletes the associated documents" do
363
363
  expect {
364
364
  child.class.find(child.id)
365
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
365
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class #{child.class.to_s} with id\(s\)/)
366
366
  end
367
367
  end
368
368
 
@@ -674,7 +674,7 @@ describe Mongoid::Association::Depending do
674
674
  it "persists the deletion" do
675
675
  expect {
676
676
  home.reload
677
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
677
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Home with id\(s\)/)
678
678
  end
679
679
  end
680
680
 
@@ -733,13 +733,13 @@ describe Mongoid::Association::Depending do
733
733
  it "persists the first deletion" do
734
734
  expect {
735
735
  post_one.reload
736
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
736
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Post with id\(s\)/)
737
737
  end
738
738
 
739
739
  it "persists the second deletion" do
740
740
  expect {
741
741
  post_two.reload
742
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
742
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Post with id\(s\)/)
743
743
  end
744
744
  end
745
745
  end
@@ -244,7 +244,8 @@ describe Mongoid::Association::EagerLoadable do
244
244
  end
245
245
 
246
246
  it "runs the has_one preload" do
247
- expect(Mongoid::Association::Referenced::HasOne::Eager).to receive(:new).with([book_association, cat_association], docs).once.and_call_original
247
+ expect(Mongoid::Association::Referenced::HasOne::Eager).to receive(:new).with([ book_association ], docs).once.and_call_original
248
+ expect(Mongoid::Association::Referenced::HasOne::Eager).to receive(:new).with([ cat_association ], docs).once.and_call_original
248
249
  context.eager_load(docs)
249
250
  end
250
251
  end
@@ -58,7 +58,8 @@ describe Mongoid::Association::Embedded::EmbeddedIn::Binding do
58
58
  end
59
59
 
60
60
  it "does nothing" do
61
- expect(name).to receive(:namable=).never
61
+ expect(name).to receive(:namable=).with(person).never
62
+ expect(name).to receive(:namable=).with(nil).once
62
63
  binding.bind_one
63
64
  end
64
65
  end
@@ -33,4 +33,58 @@ describe Mongoid::Association::Embedded::EmbeddedIn::Buildable do
33
33
  end
34
34
  end
35
35
  end
36
+
37
+ context 'when the object is already associated with another object' do
38
+
39
+ context "when inverse is embeds_many" do
40
+
41
+ let(:appointment1) do
42
+ Appointment.new
43
+ end
44
+
45
+ let(:appointment2) do
46
+ Appointment.new
47
+ end
48
+
49
+ let(:person) do
50
+ Person.create!
51
+ end
52
+
53
+ before do
54
+ appointment1.person = person
55
+ appointment2.person = person
56
+ end
57
+
58
+ it 'does not clear the object of its previous association' do
59
+ expect(appointment1.person).to eq(person)
60
+ expect(appointment2.person).to eq(person)
61
+ expect(person.appointments).to eq([appointment1, appointment2])
62
+ end
63
+ end
64
+
65
+ context "when inverse is embeds_one" do
66
+
67
+ let(:scribe1) do
68
+ Scribe.new
69
+ end
70
+
71
+ let(:scribe2) do
72
+ Scribe.new
73
+ end
74
+
75
+ let(:owner) do
76
+ Owner.create!
77
+ end
78
+
79
+ before do
80
+ scribe1.owner = owner
81
+ scribe2.owner = owner
82
+ end
83
+
84
+ it 'clears the object of its previous association' do
85
+ expect(scribe1.owner).to be_nil
86
+ expect(scribe2.owner).to eq(owner)
87
+ end
88
+ end
89
+ end
36
90
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "spec_helper"
4
+ require_relative '../embeds_many_models'
4
5
 
5
6
  describe Mongoid::Association::Embedded::EmbeddedIn::Proxy do
6
7
 
@@ -507,7 +508,7 @@ describe Mongoid::Association::Embedded::EmbeddedIn::Proxy do
507
508
  end
508
509
  end
509
510
 
510
- context "when the same class is embedded multiple times" do
511
+ context "when the same class is embedded multiple times; embeds_one" do
511
512
 
512
513
  let(:customer) do
513
514
  Customer.new
@@ -516,7 +517,6 @@ describe Mongoid::Association::Embedded::EmbeddedIn::Proxy do
516
517
  context "assignment after saving" do
517
518
 
518
519
  it "correctly sets the association for the embedded class" do
519
- pending 'MONGOID-5039'
520
520
 
521
521
  customer.home_address = CustomerAddress.new
522
522
  customer.work_address = CustomerAddress.new
@@ -537,22 +537,82 @@ describe Mongoid::Association::Embedded::EmbeddedIn::Proxy do
537
537
 
538
538
  expect(customer.home_address.instance_eval { _association.store_as }).to eq("home_address")
539
539
  expect(customer.work_address.instance_eval { _association.store_as }).to eq("work_address")
540
+
541
+ expect(customer.home_address.addressable).to eq(customer)
542
+ expect(customer.work_address.addressable).to eq(customer)
540
543
  end
541
544
  end
542
545
 
543
546
  context "inverse assignment" do
544
547
 
548
+ it "raises an error when trying to set the association" do
549
+ customer.work_address = CustomerAddress.new
550
+
551
+ expect do
552
+ customer.work_address.addressable = customer
553
+ end.to raise_error(Mongoid::Errors::InvalidSetPolymorphicRelation)
554
+ end
555
+ end
556
+
557
+ context "when there is an explicit inverse_of" do
558
+
559
+ let(:customer) { EmmCustomer.new }
560
+
545
561
  it "correctly sets the association for the embedded class" do
546
- pending 'MONGOID-5039'
562
+ customer.work_address = EmmCustomerAddress.new
547
563
 
548
- customer.work_address = CustomerAddress.new
549
- customer.work_address.addressable = customer
564
+ expect do
565
+ customer.work_address.addressable = customer
566
+ end.to_not raise_error
550
567
 
551
- expect(customer.home_address._association.store_as).to eq("home_address")
552
- expect(customer.work_address._association.store_as).to eq("work_address")
568
+ expect(customer.work_address.addressable).to eq(customer)
569
+ end
570
+ end
571
+ end
553
572
 
554
- expect(customer.home_address.instance_eval { _association.store_as }).to eq("home_address")
555
- expect(customer.work_address.instance_eval { _association.store_as }).to eq("work_address")
573
+ context "when the same class is embedded multiple times; embeds_many" do
574
+
575
+ let(:customer) do
576
+ EmmCustomer.new
577
+ end
578
+
579
+ context "assignment after saving" do
580
+
581
+ it "correctly sets the association for the embedded class" do
582
+
583
+ customer.close_friends = [EmmFriend.new]
584
+ customer.acquaintances = [EmmFriend.new]
585
+
586
+ expect(customer.close_friends._association.store_as).to eq("close_friends")
587
+ expect(customer.acquaintances._association.store_as).to eq("acquaintances")
588
+
589
+ expect(customer.close_friends[0].instance_eval { _association.store_as }).to eq("close_friends")
590
+ expect(customer.acquaintances[0].instance_eval { _association.store_as }).to eq("acquaintances")
591
+
592
+ customer.save!
593
+
594
+ customer.close_friends = [EmmFriend.new]
595
+ customer.acquaintances = [EmmFriend.new]
596
+
597
+ expect(customer.close_friends._association.store_as).to eq("close_friends")
598
+ expect(customer.acquaintances._association.store_as).to eq("acquaintances")
599
+
600
+ expect(customer.close_friends[0].instance_eval { _association.store_as }).to eq("close_friends")
601
+ expect(customer.acquaintances[0].instance_eval { _association.store_as }).to eq("acquaintances")
602
+
603
+ expect(customer.close_friends[0].befriendable).to eq(customer)
604
+ expect(customer.acquaintances[0].befriendable).to eq(customer)
605
+ end
606
+ end
607
+
608
+ context "inverse assignment" do
609
+
610
+ it "raises an error when trying to set the association" do
611
+ customer.acquaintances = [EmmFriend.new]
612
+
613
+ expect do
614
+ customer.acquaintances[0].befriendable = customer
615
+ end.to raise_error(Mongoid::Errors::InvalidSetPolymorphicRelation)
556
616
  end
557
617
  end
558
618
  end