mongoid 4.0.2 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -1
  3. data/README.md +11 -19
  4. data/lib/config/locales/en.yml +33 -30
  5. data/lib/mongoid/atomic.rb +2 -4
  6. data/lib/mongoid/attributes/processing.rb +4 -1
  7. data/lib/mongoid/attributes/readonly.rb +2 -2
  8. data/lib/mongoid/attributes.rb +7 -7
  9. data/lib/mongoid/changeable.rb +4 -6
  10. data/lib/mongoid/clients/factory.rb +78 -0
  11. data/lib/mongoid/{sessions → clients}/options.rb +30 -19
  12. data/lib/mongoid/{sessions → clients}/storage_options.rb +27 -13
  13. data/lib/mongoid/{sessions → clients}/thread_options.rb +6 -3
  14. data/lib/mongoid/{sessions → clients}/validators/storage.rb +5 -2
  15. data/lib/mongoid/clients/validators.rb +2 -0
  16. data/lib/mongoid/clients.rb +141 -0
  17. data/lib/mongoid/composable.rb +3 -3
  18. data/lib/mongoid/config/environment.rb +1 -1
  19. data/lib/mongoid/config/options.rb +1 -1
  20. data/lib/mongoid/config/validators/{session.rb → client.rb} +31 -28
  21. data/lib/mongoid/config/validators/option.rb +1 -1
  22. data/lib/mongoid/config/validators.rb +1 -1
  23. data/lib/mongoid/config.rb +39 -41
  24. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  25. data/lib/mongoid/contextual/atomic.rb +11 -11
  26. data/lib/mongoid/contextual/command.rb +9 -6
  27. data/lib/mongoid/contextual/geo_near.rb +17 -1
  28. data/lib/mongoid/contextual/map_reduce.rb +12 -11
  29. data/lib/mongoid/contextual/memory.rb +2 -5
  30. data/lib/mongoid/contextual/mongo.rb +92 -82
  31. data/lib/mongoid/contextual/none.rb +13 -0
  32. data/lib/mongoid/copyable.rb +6 -1
  33. data/lib/mongoid/criteria.rb +37 -4
  34. data/lib/mongoid/document.rb +3 -4
  35. data/lib/mongoid/errors/{mixed_session_configuration.rb → mixed_client_configuration.rb} +5 -5
  36. data/lib/mongoid/errors/mongoid_error.rb +15 -9
  37. data/lib/mongoid/errors/no_client_config.rb +22 -0
  38. data/lib/mongoid/errors/{no_session_database.rb → no_client_database.rb} +4 -4
  39. data/lib/mongoid/errors/{no_session_hosts.rb → no_client_hosts.rb} +4 -4
  40. data/lib/mongoid/errors/{no_sessions_config.rb → no_clients_config.rb} +4 -4
  41. data/lib/mongoid/errors/no_default_client.rb +23 -0
  42. data/lib/mongoid/errors.rb +6 -6
  43. data/lib/mongoid/extensions/hash.rb +5 -1
  44. data/lib/mongoid/extensions/object.rb +3 -2
  45. data/lib/mongoid/extensions/set.rb +5 -5
  46. data/lib/mongoid/factory.rb +4 -2
  47. data/lib/mongoid/fields.rb +7 -2
  48. data/lib/mongoid/findable.rb +4 -1
  49. data/lib/mongoid/indexable.rb +15 -9
  50. data/lib/mongoid/persistable/creatable.rb +2 -2
  51. data/lib/mongoid/persistable/deletable.rb +3 -3
  52. data/lib/mongoid/persistable/incrementable.rb +1 -1
  53. data/lib/mongoid/persistable/logical.rb +1 -1
  54. data/lib/mongoid/persistable/poppable.rb +1 -1
  55. data/lib/mongoid/persistable/pullable.rb +2 -2
  56. data/lib/mongoid/persistable/pushable.rb +2 -2
  57. data/lib/mongoid/persistable/renamable.rb +1 -1
  58. data/lib/mongoid/persistable/settable.rb +1 -1
  59. data/lib/mongoid/persistable/unsettable.rb +1 -1
  60. data/lib/mongoid/persistable/updatable.rb +2 -2
  61. data/lib/mongoid/persistable/upsertable.rb +1 -1
  62. data/lib/mongoid/persistable.rb +1 -2
  63. data/lib/mongoid/query_cache.rb +98 -104
  64. data/lib/mongoid/railtie.rb +4 -25
  65. data/lib/mongoid/railties/database.rake +1 -1
  66. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +3 -2
  67. data/lib/mongoid/relations/builders.rb +3 -1
  68. data/lib/mongoid/relations/counter_cache.rb +1 -1
  69. data/lib/mongoid/relations/embedded/batchable.rb +3 -10
  70. data/lib/mongoid/relations/embedded/many.rb +4 -2
  71. data/lib/mongoid/relations/embedded/one.rb +1 -0
  72. data/lib/mongoid/relations/many.rb +1 -0
  73. data/lib/mongoid/relations/metadata.rb +14 -0
  74. data/lib/mongoid/relations/proxy.rb +6 -6
  75. data/lib/mongoid/relations/referenced/many.rb +2 -1
  76. data/lib/mongoid/relations/targets/enumerable.rb +11 -11
  77. data/lib/mongoid/relations/touchable.rb +1 -1
  78. data/lib/mongoid/reloadable.rb +2 -2
  79. data/lib/mongoid/scopable.rb +6 -17
  80. data/lib/mongoid/selectable.rb +1 -36
  81. data/lib/mongoid/serializable.rb +2 -2
  82. data/lib/mongoid/stateful.rb +0 -1
  83. data/lib/mongoid/tasks/database.rake +2 -2
  84. data/lib/mongoid/tasks/database.rb +24 -17
  85. data/lib/mongoid/threaded/lifecycle.rb +21 -16
  86. data/lib/mongoid/threaded.rb +54 -33
  87. data/lib/mongoid/traversable.rb +17 -1
  88. data/lib/mongoid/validatable/queryable.rb +1 -1
  89. data/lib/mongoid/validatable/uniqueness.rb +3 -20
  90. data/lib/mongoid/validatable.rb +1 -1
  91. data/lib/mongoid/version.rb +1 -1
  92. data/lib/mongoid.rb +28 -21
  93. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +91 -57
  94. data/lib/rails/mongoid.rb +2 -2
  95. data/spec/app/models/audio.rb +1 -1
  96. data/spec/app/models/band.rb +1 -0
  97. data/spec/app/models/code.rb +6 -0
  98. data/spec/app/models/company.rb +5 -0
  99. data/spec/app/models/label.rb +7 -0
  100. data/spec/app/models/pub.rb +6 -0
  101. data/spec/app/models/staff.rb +7 -0
  102. data/spec/app/models/store_as_dup_test1.rb +5 -0
  103. data/spec/app/models/store_as_dup_test2.rb +5 -0
  104. data/spec/config/mongoid.yml +7 -25
  105. data/spec/mongoid/atomic/paths_spec.rb +3 -11
  106. data/spec/mongoid/attributes/nested_spec.rb +16 -16
  107. data/spec/mongoid/attributes/readonly_spec.rb +80 -18
  108. data/spec/mongoid/attributes_spec.rb +3 -3
  109. data/spec/mongoid/changeable_spec.rb +156 -0
  110. data/spec/mongoid/clients/factory_spec.rb +284 -0
  111. data/spec/mongoid/{sessions → clients}/options_spec.rb +4 -6
  112. data/spec/mongoid/clients_spec.rb +754 -0
  113. data/spec/mongoid/config/environment_spec.rb +14 -11
  114. data/spec/mongoid/config_spec.rb +33 -48
  115. data/spec/mongoid/contextual/atomic_spec.rb +1 -17
  116. data/spec/mongoid/contextual/geo_near_spec.rb +35 -0
  117. data/spec/mongoid/contextual/mongo_spec.rb +26 -83
  118. data/spec/mongoid/contextual/none_spec.rb +15 -0
  119. data/spec/mongoid/copyable_spec.rb +35 -1
  120. data/spec/mongoid/criteria/findable_spec.rb +197 -0
  121. data/spec/mongoid/criteria/modifiable_spec.rb +7 -29
  122. data/spec/mongoid/criteria_spec.rb +74 -91
  123. data/spec/mongoid/document_spec.rb +1 -1
  124. data/spec/mongoid/errors/{mixed_session_configuration_spec.rb → mixed_client_configuration_spec.rb} +1 -1
  125. data/spec/mongoid/errors/mongoid_error_spec.rb +19 -3
  126. data/spec/mongoid/errors/{no_session_config_spec.rb → no_client_config_spec.rb} +4 -4
  127. data/spec/mongoid/errors/{no_session_database_spec.rb → no_client_database_spec.rb} +4 -4
  128. data/spec/mongoid/errors/{no_session_hosts_spec.rb → no_client_hosts_spec.rb} +3 -3
  129. data/spec/mongoid/errors/{no_sessions_config_spec.rb → no_clients_config_spec.rb} +2 -2
  130. data/spec/mongoid/fields/localized_spec.rb +1 -0
  131. data/spec/mongoid/fields_spec.rb +1 -0
  132. data/spec/mongoid/findable_spec.rb +2 -23
  133. data/spec/mongoid/indexable_spec.rb +12 -8
  134. data/spec/mongoid/interceptable_spec.rb +15 -0
  135. data/spec/mongoid/persistable/settable_spec.rb +16 -0
  136. data/spec/mongoid/persistable/updatable_spec.rb +3 -2
  137. data/spec/mongoid/persistable_spec.rb +4 -4
  138. data/spec/mongoid/query_cache_spec.rb +13 -8
  139. data/spec/mongoid/relations/auto_save_spec.rb +1 -1
  140. data/spec/mongoid/relations/counter_cache_spec.rb +34 -0
  141. data/spec/mongoid/relations/eager/belongs_to_spec.rb +9 -0
  142. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +3 -3
  143. data/spec/mongoid/relations/embedded/many_spec.rb +123 -1
  144. data/spec/mongoid/relations/embedded/one_spec.rb +3 -3
  145. data/spec/mongoid/relations/proxy_spec.rb +28 -0
  146. data/spec/mongoid/relations/referenced/in_spec.rb +1 -1
  147. data/spec/mongoid/relations/referenced/many_spec.rb +47 -23
  148. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +1 -1
  149. data/spec/mongoid/relations/referenced/one_spec.rb +1 -1
  150. data/spec/mongoid/relations/targets/enumerable_spec.rb +9 -2
  151. data/spec/mongoid/reloadable_spec.rb +6 -6
  152. data/spec/mongoid/scopable_spec.rb +41 -28
  153. data/spec/mongoid/selectable_spec.rb +6 -16
  154. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  155. data/spec/mongoid/tasks/database_spec.rb +2 -2
  156. data/spec/mongoid/threaded_spec.rb +0 -7
  157. data/spec/mongoid/traversable_spec.rb +2 -2
  158. data/spec/mongoid/validatable/uniqueness_spec.rb +30 -1
  159. data/spec/mongoid_spec.rb +13 -15
  160. data/spec/rails/mongoid_spec.rb +13 -4
  161. data/spec/spec_helper.rb +44 -27
  162. data/spec/support/authorization.rb +12 -0
  163. data/spec/support/expectations.rb +14 -0
  164. metadata +50 -57
  165. data/lib/mongoid/contextual/find_and_modify.rb +0 -69
  166. data/lib/mongoid/contextual/text_search.rb +0 -178
  167. data/lib/mongoid/criteria/#findable.rb# +0 -141
  168. data/lib/mongoid/errors/no_default_session.rb +0 -23
  169. data/lib/mongoid/errors/no_session_config.rb +0 -22
  170. data/lib/mongoid/log_subscriber.rb +0 -55
  171. data/lib/mongoid/positional.rb +0 -71
  172. data/lib/mongoid/sessions/factory.rb +0 -131
  173. data/lib/mongoid/sessions/mongo_uri.rb +0 -93
  174. data/lib/mongoid/sessions/validators.rb +0 -2
  175. data/lib/mongoid/sessions.rb +0 -125
  176. data/lib/mongoid/support/query_counter.rb +0 -23
  177. data/spec/helpers.rb +0 -18
  178. data/spec/mongoid/#atomic_spec.rb# +0 -365
  179. data/spec/mongoid/contextual/find_and_modify_spec.rb +0 -220
  180. data/spec/mongoid/contextual/text_search_spec.rb +0 -209
  181. data/spec/mongoid/log_subscriber_spec.rb +0 -75
  182. data/spec/mongoid/positional_spec.rb +0 -222
  183. data/spec/mongoid/sessions/factory_spec.rb +0 -333
  184. data/spec/mongoid/sessions/mongo_uri_spec.rb +0 -103
  185. data/spec/mongoid/sessions_spec.rb +0 -1252
@@ -1,22 +1,22 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Mongoid::Errors::NoSessionDatabase do
3
+ describe Mongoid::Errors::NoClientDatabase do
4
4
 
5
5
  describe "#message" do
6
6
 
7
7
  let(:error) do
8
- described_class.new(:secondary, { hosts: [ "localhost:27017" ] })
8
+ described_class.new(:secondary, { hosts: [ "127.0.0.1:27017" ] })
9
9
  end
10
10
 
11
11
  it "contains the problem in the message" do
12
12
  expect(error.message).to include(
13
- "No database provided for session configuration: :secondary."
13
+ "No database provided for client configuration: :secondary."
14
14
  )
15
15
  end
16
16
 
17
17
  it "contains the summary in the message" do
18
18
  expect(error.message).to include(
19
- "Each session configuration must provide a database so Mongoid"
19
+ "Each client configuration must provide a database so Mongoid"
20
20
  )
21
21
  end
22
22
 
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Mongoid::Errors::NoSessionHosts do
3
+ describe Mongoid::Errors::NoClientHosts do
4
4
 
5
5
  describe "#message" do
6
6
 
@@ -10,13 +10,13 @@ describe Mongoid::Errors::NoSessionHosts do
10
10
 
11
11
  it "contains the problem in the message" do
12
12
  expect(error.message).to include(
13
- "No hosts provided for session configuration: :secondary."
13
+ "No hosts provided for client configuration: :secondary."
14
14
  )
15
15
  end
16
16
 
17
17
  it "contains the summary in the message" do
18
18
  expect(error.message).to include(
19
- "Each session configuration must provide hosts so Mongoid"
19
+ "Each client configuration must provide hosts so Mongoid"
20
20
  )
21
21
  end
22
22
 
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Mongoid::Errors::NoSessionsConfig do
3
+ describe Mongoid::Errors::NoClientsConfig do
4
4
 
5
5
  describe "#message" do
6
6
 
@@ -10,7 +10,7 @@ describe Mongoid::Errors::NoSessionsConfig do
10
10
 
11
11
  it "contains the problem in the message" do
12
12
  expect(error.message).to include(
13
- "No sessions configuration provided."
13
+ "No clients configuration provided."
14
14
  )
15
15
  end
16
16
 
@@ -81,6 +81,7 @@ describe Mongoid::Fields::Localized do
81
81
  context "when a locale is provided" do
82
82
 
83
83
  before do
84
+ I18n.enforce_available_locales = false
84
85
  ::I18n.locale = :de
85
86
  end
86
87
 
@@ -18,6 +18,7 @@ describe Mongoid::Fields do
18
18
 
19
19
  before do
20
20
  product.description = "test"
21
+ I18n.enforce_available_locales = false
21
22
  ::I18n.locale = :de
22
23
  product.description = "The best"
23
24
  end
@@ -40,14 +40,14 @@ describe Mongoid::Findable do
40
40
  end
41
41
  end
42
42
 
43
- describe ".find_and_modify" do
43
+ describe ".find_one_and_update" do
44
44
 
45
45
  let!(:person) do
46
46
  Person.create(title: "Senior")
47
47
  end
48
48
 
49
49
  it "returns the document" do
50
- expect(Person.find_and_modify(title: "Junior")).to eq(person)
50
+ expect(Person.find_one_and_update(title: "Junior")).to eq(person)
51
51
  end
52
52
  end
53
53
 
@@ -485,25 +485,4 @@ describe Mongoid::Findable do
485
485
  end
486
486
  end
487
487
  end
488
-
489
- describe "#text_search" do
490
-
491
- before do
492
- Word.with(database: "admin").mongo_session.command(setParameter: 1, textSearchEnabled: true)
493
- Word.create_indexes
494
- Word.create!(name: "phase", origin: "latin")
495
- end
496
-
497
- after(:all) do
498
- Word.remove_indexes
499
- end
500
-
501
- let(:search) do
502
- Word.text_search("phase")
503
- end
504
-
505
- it "returns all fields" do
506
- expect(search.first.origin).to eq("latin")
507
- end
508
- end
509
488
  end
@@ -41,13 +41,13 @@ describe Mongoid::Indexable do
41
41
  end
42
42
  end
43
43
 
44
- context "when database specific options exist" do
44
+ context "when database specific options exist", if: non_legacy_server? do
45
45
 
46
46
  let(:klass) do
47
47
  Class.new do
48
48
  include Mongoid::Document
49
49
  store_in collection: "test_db_remove"
50
- index({ test: 1 }, { database: "mia_2" })
50
+ index({ test: 1 }, { database: "mongoid_optional" })
51
51
  index({ name: 1 }, { background: true })
52
52
  end
53
53
  end
@@ -58,7 +58,7 @@ describe Mongoid::Indexable do
58
58
  end
59
59
 
60
60
  let(:indexes) do
61
- klass.with(database: "mia_2").collection.indexes
61
+ klass.with(database: "mongoid_optional").collection.indexes
62
62
  end
63
63
 
64
64
  it "creates the indexes" do
@@ -84,17 +84,17 @@ describe Mongoid::Indexable do
84
84
  end
85
85
 
86
86
  it "creates the indexes" do
87
- expect(klass.collection.indexes[_type: 1]).to_not be_nil
87
+ expect(klass.collection.indexes.get(_type: 1)).to_not be_nil
88
88
  end
89
89
  end
90
90
 
91
- context "when database options are specified" do
91
+ context "when database options are specified", if: non_legacy_server? do
92
92
 
93
93
  let(:klass) do
94
94
  Class.new do
95
95
  include Mongoid::Document
96
96
  store_in collection: "test_db_indexes"
97
- index({ _type: 1 }, { database: "mia_1" })
97
+ index({ _type: 1 }, { database: "mongoid_optional" })
98
98
  end
99
99
  end
100
100
 
@@ -102,12 +102,16 @@ describe Mongoid::Indexable do
102
102
  klass.create_indexes
103
103
  end
104
104
 
105
+ after do
106
+ klass.remove_indexes
107
+ end
108
+
105
109
  let(:indexes) do
106
- klass.with(database: "mia_1").collection.indexes
110
+ klass.with(database: "mongoid_optional").collection.indexes
107
111
  end
108
112
 
109
113
  it "creates the indexes" do
110
- expect(indexes[_type: 1]).to_not be_nil
114
+ expect(indexes.get(_type: 1)).to_not be_nil
111
115
  end
112
116
  end
113
117
  end
@@ -929,6 +929,21 @@ describe Mongoid::Interceptable do
929
929
  expect(band.reload.records.first.before_save_called).to be true
930
930
  end
931
931
  end
932
+
933
+ context "when the child is created" do
934
+
935
+ let!(:band) do
936
+ Band.create
937
+ end
938
+
939
+ let!(:label) do
940
+ band.create_label(name: 'Label')
941
+ end
942
+
943
+ it "only executes callback once" do
944
+ expect(label.before_save_count).to be 1
945
+ end
946
+ end
932
947
  end
933
948
 
934
949
  describe "#before_update" do
@@ -159,4 +159,20 @@ describe Mongoid::Persistable::Settable do
159
159
  expect(person.reload.somethingnew).to eq "somethingnew"
160
160
  end
161
161
  end
162
+
163
+ context "with an attribute with private setter" do
164
+ let(:agent) do
165
+ Agent.create
166
+ end
167
+
168
+ let(:title) do
169
+ "Double-Oh Seven"
170
+ end
171
+
172
+ it "updates the attribute" do
173
+ agent.singleton_class.send :private, :title=
174
+ agent.set(title: title)
175
+ expect(agent.reload.title).to eq title
176
+ end
177
+ end
162
178
  end
@@ -217,6 +217,7 @@ describe Mongoid::Persistable::Updatable do
217
217
  end
218
218
 
219
219
  before do
220
+ I18n.enforce_available_locales = false
220
221
  ::I18n.locale = :de
221
222
  product.update_attribute(:description, "Die Bombe")
222
223
  end
@@ -283,7 +284,7 @@ describe Mongoid::Persistable::Updatable do
283
284
  it "raises an error" do
284
285
  expect {
285
286
  person.update_attributes(map: { "bad.key" => "value" })
286
- }.to raise_error(Moped::Errors::OperationFailure)
287
+ }.to raise_error(Mongo::Error::OperationFailure)
287
288
  end
288
289
  end
289
290
 
@@ -319,7 +320,7 @@ describe Mongoid::Persistable::Updatable do
319
320
  it "raises an error" do
320
321
  expect {
321
322
  person.send(method, map: { "bad.key" => "value" })
322
- }.to raise_error(Moped::Errors::OperationFailure)
323
+ }.to raise_error(Mongo::Error::OperationFailure)
323
324
  end
324
325
  end
325
326
 
@@ -61,7 +61,7 @@ describe Mongoid::Persistable do
61
61
  end
62
62
 
63
63
  before do
64
- expect_any_instance_of(Moped::Query).to receive(:update).with(operations).and_call_original
64
+ expect_any_instance_of(Mongo::Collection::View).to receive(:update_one).with(operations).and_call_original
65
65
  end
66
66
 
67
67
  let!(:update) do
@@ -88,7 +88,7 @@ describe Mongoid::Persistable do
88
88
  end
89
89
 
90
90
  before do
91
- expect_any_instance_of(Moped::Query).to receive(:update).with(operations).and_call_original
91
+ expect_any_instance_of(Mongo::Collection::View).to receive(:update_one).with(operations).and_call_original
92
92
  end
93
93
 
94
94
  let!(:update) do
@@ -116,7 +116,7 @@ describe Mongoid::Persistable do
116
116
  end
117
117
 
118
118
  before do
119
- expect_any_instance_of(Moped::Query).to receive(:update).with(operations).and_call_original
119
+ expect_any_instance_of(Mongo::Collection::View).to receive(:update_one).with(operations).and_call_original
120
120
  end
121
121
 
122
122
  let!(:update) do
@@ -153,7 +153,7 @@ describe Mongoid::Persistable do
153
153
  end
154
154
 
155
155
  before do
156
- expect_any_instance_of(Moped::Query).to receive(:update).with(operations).and_call_original
156
+ expect_any_instance_of(Mongo::Collection::View).to receive(:update_one).with(operations).and_call_original
157
157
  end
158
158
 
159
159
  let!(:update) do
@@ -15,7 +15,7 @@ describe Mongoid::QueryCache do
15
15
  Band.all.send(method)
16
16
  end
17
17
 
18
- context "when query cache disable" do
18
+ context "when query cache is disabled" do
19
19
 
20
20
  before do
21
21
  Mongoid::QueryCache.enabled = false
@@ -54,7 +54,7 @@ describe Mongoid::QueryCache do
54
54
  Band.all.to_a
55
55
  end
56
56
 
57
- context "when query cache disable" do
57
+ context "when query cache is disabled" do
58
58
 
59
59
  before do
60
60
  Mongoid::QueryCache.enabled = false
@@ -76,20 +76,24 @@ describe Mongoid::QueryCache do
76
76
  end
77
77
 
78
78
  context "when querying only the first" do
79
- let(:game) { Game.create!(name: "2048") }
79
+
80
+ let(:game) do
81
+ Game.create!(name: "2048")
82
+ end
80
83
 
81
84
  before do
82
85
  game.ratings.where(:value.gt => 5).asc(:id).all.to_a
83
86
  end
84
87
 
85
- it "queries again" do
86
- expect_query(1) do
88
+ it "does not query again" do
89
+ expect_no_queries do
87
90
  game.ratings.where(:value.gt => 5).asc(:id).first
88
91
  end
89
92
  end
90
93
  end
91
94
 
92
- context "limiting the result" do
95
+ context "when limiting the result" do
96
+
93
97
  it "queries again" do
94
98
  expect_query(1) do
95
99
  Band.limit(2).all.to_a
@@ -97,7 +101,8 @@ describe Mongoid::QueryCache do
97
101
  end
98
102
  end
99
103
 
100
- context "specifying a different skip value" do
104
+ context "when specifying a different skip value" do
105
+
101
106
  before do
102
107
  Band.limit(2).skip(1).all.to_a
103
108
  end
@@ -213,7 +218,7 @@ describe Mongoid::QueryCache do
213
218
 
214
219
  it "does not cache the query" do
215
220
  expect(Mongoid::QueryCache).to receive(:cache_table).never
216
- Band.collection.indexes.create(name: 1)
221
+ Band.collection.indexes.create_one(name: 1)
217
222
  end
218
223
  end
219
224
  end
@@ -150,7 +150,7 @@ describe Mongoid::Relations::AutoSave do
150
150
  end
151
151
  end
152
152
 
153
- context "when updating the child" do
153
+ pending "when updating the child" do
154
154
 
155
155
  before do
156
156
  person.account = account
@@ -287,4 +287,38 @@ describe Mongoid::Relations::CounterCache do
287
287
  end
288
288
  end
289
289
  end
290
+
291
+ describe "#add_counter_cache_callbacks" do
292
+
293
+ let(:person) do
294
+ Person.create
295
+ end
296
+
297
+ let!(:drug) do
298
+ person.drugs.create
299
+ end
300
+
301
+ context "when parent is not frozen" do
302
+
303
+ before do
304
+ drug.destroy
305
+ end
306
+
307
+ it "before_destroy updates counter cache" do
308
+ expect(person.drugs_count).to eq(0)
309
+ end
310
+ end
311
+
312
+ context "when parent is frozen" do
313
+
314
+ before do
315
+ person.destroy
316
+ drug.destroy
317
+ end
318
+
319
+ it "before_destroy doesn't update counter cache" do
320
+ expect(person.drugs_count).to eq(1)
321
+ end
322
+ end
323
+ end
290
324
  end
@@ -150,5 +150,14 @@ describe Mongoid::Relations::Eager::BelongsTo do
150
150
  }.to raise_error(Mongoid::Errors::EagerLoad)
151
151
  end
152
152
  end
153
+
154
+ context "when setting the foreign key id directly" do
155
+
156
+ it "works" do
157
+ id = BSON::ObjectId.new
158
+ game = Game.new(:person_id => id)
159
+ expect(game.person_id).to eql(id)
160
+ end
161
+ end
153
162
  end
154
163
  end
@@ -45,7 +45,7 @@ describe Mongoid::Relations::Eager::HasAndBelongsToMany do
45
45
 
46
46
  it "queries twice" do
47
47
  expect_query(2) do
48
- Person.all.includes(:houses).each do |person|
48
+ Person.asc(:_id).includes(:houses).each do |person|
49
49
  expect(person.houses).to_not be_nil
50
50
 
51
51
  expect(person.houses.length).to be(3)
@@ -54,7 +54,7 @@ describe Mongoid::Relations::Eager::HasAndBelongsToMany do
54
54
  end
55
55
 
56
56
  it "has all items" do
57
- Person.all.includes(:houses).each do |person|
57
+ Person.asc(:_id).includes(:houses).each do |person|
58
58
  expect(person.ivar(:houses).length).to be(3)
59
59
  end
60
60
  end
@@ -63,7 +63,7 @@ describe Mongoid::Relations::Eager::HasAndBelongsToMany do
63
63
  context "when the relation is not polymorphic" do
64
64
 
65
65
  let(:eager) do
66
- Person.includes(:preferences).last
66
+ Person.asc(:_id).includes(:preferences).last
67
67
  end
68
68
 
69
69
  context "when the eager load has returned documents" do
@@ -3873,7 +3873,7 @@ describe Mongoid::Relations::Embedded::Many do
3873
3873
  before do
3874
3874
  band.collection.
3875
3875
  find(_id: band.id).
3876
- update("$set" => { records: [{ name: "Moderat" }]})
3876
+ update_one("$set" => { records: [{ name: "Moderat" }]})
3877
3877
  end
3878
3878
 
3879
3879
  context "when loading the documents" do
@@ -3933,4 +3933,126 @@ describe Mongoid::Relations::Embedded::Many do
3933
3933
  expect(loaded.extension).to eq("Testing")
3934
3934
  end
3935
3935
  end
3936
+
3937
+ context "deleting embedded documents" do
3938
+
3939
+ it "able to delete embedded documents upon condition" do
3940
+ company = Company.new
3941
+ 4.times { |i| company.staffs << Staff.new(age: 50 + i)}
3942
+ 2.times { |i| company.staffs << Staff.new(age: 40)}
3943
+ company.save
3944
+ company.staffs.delete_if {|x| x.age >= 50}
3945
+ expect(company.staffs.count).to eq(2)
3946
+ end
3947
+ end
3948
+
3949
+ context "when substituting polymorphic documents" do
3950
+
3951
+ before(:all) do
3952
+ class DNS; end
3953
+
3954
+ class DNS::Zone
3955
+ include Mongoid::Document
3956
+ embeds_many :rrsets, class_name: 'DNS::RRSet', inverse_of: :zone
3957
+ embeds_one :soa, class_name: 'DNS::Record', as: :container
3958
+ end
3959
+
3960
+ class DNS::RRSet
3961
+ include Mongoid::Document
3962
+ embedded_in :zone, class_name: 'DNS::Zone', inverse_of: :rrsets
3963
+ embeds_many :records, class_name: 'DNS::Record', as: :container
3964
+ end
3965
+
3966
+ class DNS::Record
3967
+ include Mongoid::Document
3968
+ embedded_in :container, polymorphic: true
3969
+ end
3970
+ end
3971
+
3972
+ after(:all) do
3973
+ Object.send(:remove_const, :DNS)
3974
+ end
3975
+
3976
+ context "when the parent is new" do
3977
+
3978
+ let(:zone) do
3979
+ DNS::Zone.new
3980
+ end
3981
+
3982
+ let(:soa_1) do
3983
+ DNS::Record.new
3984
+ end
3985
+
3986
+ context "when replacing the set document" do
3987
+
3988
+ let(:soa_2) do
3989
+ DNS::Record.new
3990
+ end
3991
+
3992
+ before do
3993
+ zone.soa = soa_1
3994
+ end
3995
+
3996
+ it "properly sets the metadata" do
3997
+ expect(zone.soa = soa_2).to eq(soa_2)
3998
+ end
3999
+ end
4000
+
4001
+ context "when deleting the set document" do
4002
+
4003
+ let(:soa_2) do
4004
+ DNS::Record.new
4005
+ end
4006
+
4007
+ before do
4008
+ zone.soa = soa_1
4009
+ end
4010
+
4011
+ it "properly sets the metadata" do
4012
+ expect(zone.soa.delete).to be true
4013
+ end
4014
+ end
4015
+ end
4016
+
4017
+ context "when the parent is persisted" do
4018
+
4019
+ let(:zone) do
4020
+ DNS::Zone.create
4021
+ end
4022
+
4023
+ let(:soa_1) do
4024
+ DNS::Record.new
4025
+ end
4026
+
4027
+ context "when replacing the set document" do
4028
+
4029
+ let(:soa_2) do
4030
+ DNS::Record.new
4031
+ end
4032
+
4033
+ before do
4034
+ zone.soa = soa_1
4035
+ end
4036
+
4037
+ it "properly sets the metadata" do
4038
+ expect(zone.soa = soa_2).to eq(soa_2)
4039
+ end
4040
+ end
4041
+
4042
+ context "when deleting the set document" do
4043
+
4044
+ let(:soa_2) do
4045
+ DNS::Record.new
4046
+ end
4047
+
4048
+ before do
4049
+ zone.soa = soa_1
4050
+ end
4051
+
4052
+ it "properly sets the metadata" do
4053
+ expect(zone.soa.delete).to be true
4054
+ end
4055
+ end
4056
+ end
4057
+ end
3936
4058
  end
@@ -947,7 +947,7 @@ describe Mongoid::Relations::Embedded::One do
947
947
  context "when a parent was removed outside of mongoid" do
948
948
 
949
949
  before do
950
- person.collection.where(_id: person.id).update(
950
+ person.collection.find(_id: person.id).update_one(
951
951
  "$pull" => { "addresses" => { _id: address_one.id }}
952
952
  )
953
953
  end
@@ -963,7 +963,7 @@ describe Mongoid::Relations::Embedded::One do
963
963
  end
964
964
 
965
965
  before do
966
- address_two.code = code
966
+ person.reload.addresses.first.code = code
967
967
  end
968
968
 
969
969
  it "reloads the correct number" do
@@ -982,7 +982,7 @@ describe Mongoid::Relations::Embedded::One do
982
982
  before do
983
983
  band.collection.
984
984
  find(_id: band.id).
985
- update("$set" => { label: { name: "Mute" }})
985
+ update_one("$set" => { label: { name: "Mute" }})
986
986
  end
987
987
 
988
988
  context "when loading the documents" do
@@ -2,6 +2,34 @@ require "spec_helper"
2
2
 
3
3
  describe Mongoid::Relations::Proxy do
4
4
 
5
+ describe "#find" do
6
+ let(:person) do
7
+ Person.create
8
+ end
9
+
10
+ let(:messages) do
11
+ person.messages
12
+ end
13
+
14
+ let(:msg1) do
15
+ messages.create(body: 'msg1')
16
+ end
17
+
18
+ it "returns nil with no arguments" do
19
+ expect(messages.find).to be_nil
20
+ expect(messages.send(:find)).to be_nil
21
+ expect(messages.__send__(:find)).to be_nil
22
+ expect(messages.public_send(:find)).to be_nil
23
+ end
24
+
25
+ it "returns the object corresponding to the id" do
26
+ expect(messages.find(msg1.id)).to eq(msg1)
27
+ expect(messages.send(:find, msg1.id)).to eq(msg1)
28
+ expect(messages.__send__(:find, msg1.id)).to eq(msg1)
29
+ expect(messages.public_send(:find, msg1.id)).to eq(msg1)
30
+ end
31
+ end
32
+
5
33
  describe "#extend" do
6
34
 
7
35
  before(:all) do
@@ -1240,7 +1240,7 @@ describe Mongoid::Relations::Referenced::In do
1240
1240
 
1241
1241
  before do
1242
1242
  Person.collection.find({ _id: person_one.id }).
1243
- update({ "$set" => { title: "Madam" }})
1243
+ update_one({ "$set" => { title: "Madam" }})
1244
1244
  end
1245
1245
 
1246
1246
  let(:reloaded) do