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,220 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Contextual::FindAndModify do
4
-
5
- describe "#result" do
6
-
7
- let!(:depeche) do
8
- Band.create(name: "Depeche Mode")
9
- end
10
-
11
- let!(:tool) do
12
- Band.create(name: "Tool")
13
- end
14
-
15
- let!(:collection) do
16
- Band.collection
17
- end
18
-
19
- context "when the selector matches" do
20
-
21
- context "when not providing options" do
22
-
23
- let(:criteria) do
24
- Band.where(name: "Depeche Mode")
25
- end
26
-
27
- let(:context) do
28
- described_class.new(collection, criteria, { "$inc" => { likes: 1 }})
29
- end
30
-
31
- let!(:result) do
32
- context.result
33
- end
34
-
35
- it "returns the first matching document" do
36
- expect(result["name"]).to eq("Depeche Mode")
37
- end
38
-
39
- it "updates the document in the database" do
40
- expect(depeche.reload.likes).to eq(1)
41
- end
42
- end
43
-
44
- context "when providing values that needs to be cast" do
45
-
46
- let(:date_time) do
47
- DateTime.new(1978, 1, 1)
48
- end
49
-
50
- let(:criteria) do
51
- Band.where(name: "Depeche Mode")
52
- end
53
-
54
- let(:context) do
55
- described_class.new(collection, criteria, { "$set" => { created: date_time }})
56
- end
57
-
58
- let!(:result) do
59
- context.result
60
- end
61
-
62
- it "returns the first matching document" do
63
- expect(result["name"]).to eq("Depeche Mode")
64
- end
65
-
66
- it "updates the document in the database" do
67
- expect(depeche.reload.created).to eq(date_time)
68
- end
69
- end
70
-
71
- context "when sorting" do
72
-
73
- let(:criteria) do
74
- Band.desc(:name)
75
- end
76
-
77
- let(:context) do
78
- described_class.new(collection, criteria, { "$inc" => { likes: 1 }})
79
- end
80
-
81
- let!(:result) do
82
- context.result
83
- end
84
-
85
- it "returns the first matching document" do
86
- expect(result["name"]).to eq("Tool")
87
- end
88
-
89
- it "updates the document in the database" do
90
- expect(tool.reload.likes).to eq(1)
91
- end
92
- end
93
-
94
- context "when limiting fields" do
95
-
96
- let(:criteria) do
97
- Band.only(:_id)
98
- end
99
-
100
- let(:context) do
101
- described_class.new(collection, criteria, { "$inc" => { likes: 1 }})
102
- end
103
-
104
- let!(:result) do
105
- context.result
106
- end
107
-
108
- it "returns the first matching document" do
109
- expect(result["_id"]).to eq(depeche.id)
110
- end
111
-
112
- it "limits the returned fields" do
113
- expect(result["name"]).to be_nil
114
- end
115
-
116
- it "updates the document in the database" do
117
- expect(depeche.reload.likes).to eq(1)
118
- end
119
- end
120
-
121
- context "when returning new" do
122
-
123
- let(:criteria) do
124
- Band.where(name: "Depeche Mode")
125
- end
126
-
127
- let(:context) do
128
- described_class.new(collection, criteria, { "$inc" => { likes: 1 }}, new: true)
129
- end
130
-
131
- let!(:result) do
132
- context.result
133
- end
134
-
135
- it "returns the first matching document" do
136
- expect(result["name"]).to eq("Depeche Mode")
137
- end
138
-
139
- it "returns the updated document" do
140
- expect(result["likes"]).to eq(1)
141
- end
142
- end
143
-
144
- context "when removing" do
145
-
146
- let(:criteria) do
147
- Band.where(name: "Depeche Mode")
148
- end
149
-
150
- let(:context) do
151
- described_class.new(collection, criteria, {}, remove: true)
152
- end
153
-
154
- let!(:result) do
155
- context.result
156
- end
157
-
158
- it "returns the first matching document" do
159
- expect(result["name"]).to eq("Depeche Mode")
160
- end
161
-
162
- it "deletes the document from the database" do
163
- expect {
164
- depeche.reload
165
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
166
- end
167
- end
168
-
169
- context "when upserting" do
170
-
171
- let(:criteria) do
172
- Band.where(name: "The Mars Volta")
173
- end
174
-
175
- let(:context) do
176
- described_class.new(collection, criteria, { "$inc" => { likes: 1 }}, upsert: true)
177
- end
178
-
179
- let(:result) do
180
- context.result
181
- end
182
-
183
- it "creates the document if it does not exist" do
184
- expect {
185
- result
186
- }.to change{Band.where(name: "The Mars Volta").count}.from(0).to(1)
187
- end
188
-
189
- it "updates the document in the database if it does exist" do
190
- the_mars_volta = Band.create(name: "The Mars Volta")
191
-
192
- expect {
193
- result
194
- }.to_not change{Band.where(name: "The Mars Volta").count}
195
-
196
- expect(the_mars_volta.reload.likes).to eq(1)
197
- end
198
- end
199
- end
200
-
201
- context "when the selector does not match" do
202
-
203
- let(:criteria) do
204
- Band.where(name: "Placebo")
205
- end
206
-
207
- let(:context) do
208
- described_class.new(collection, criteria, { "$inc" => { likes: 1 }})
209
- end
210
-
211
- let(:result) do
212
- context.result
213
- end
214
-
215
- it "returns nil" do
216
- expect(result).to be_nil
217
- end
218
- end
219
- end
220
- end
@@ -1,209 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Contextual::TextSearch do
4
-
5
- before do
6
- Word.with(database: "admin").mongo_session.command(setParameter: 1, textSearchEnabled: true)
7
- Word.create_indexes
8
- end
9
-
10
- after(:all) do
11
- Word.remove_indexes
12
- end
13
-
14
- describe "#each" do
15
-
16
- let(:collection) do
17
- Word.collection
18
- end
19
-
20
- let(:criteria) do
21
- Word.all
22
- end
23
-
24
- before do
25
- Word.create!(name: "phase", origin: "latin")
26
- Word.create!(name: "phazed", origin: "latin")
27
- end
28
-
29
- context "when the search is projecting" do
30
-
31
- let(:search) do
32
- described_class.new(collection, criteria, "phase").project(name: 1)
33
- end
34
-
35
- let(:documents) do
36
- search.entries
37
- end
38
-
39
- it "limits the fields to the projection" do
40
- expect {
41
- documents.first.origin
42
- }.to raise_error(ActiveModel::MissingAttributeError)
43
- end
44
- end
45
-
46
- context "when the search is not projecting" do
47
-
48
- let(:search) do
49
- described_class.new(collection, criteria, "phase")
50
- end
51
-
52
- let(:documents) do
53
- search.entries
54
- end
55
-
56
- it "returns all fields" do
57
- expect(documents.first.origin).to eq("latin")
58
- end
59
- end
60
- end
61
-
62
- describe "#execute" do
63
-
64
- let(:collection) do
65
- Word.collection
66
- end
67
-
68
- let(:criteria) do
69
- Word.all
70
- end
71
-
72
- let(:search) do
73
- described_class.new(collection, criteria, "phase")
74
- end
75
-
76
- before do
77
- Word.create!(name: "phase", origin: "latin")
78
- Word.create!(name: "phazed", origin: "latin")
79
- end
80
-
81
- let(:results) do
82
- search.execute
83
- end
84
-
85
- it "returns the raw results" do
86
- expect(results).to_not be_empty
87
- end
88
- end
89
-
90
- describe "#initialize" do
91
-
92
- let(:collection) do
93
- Word.collection
94
- end
95
-
96
- let(:criteria) do
97
- Word.limit(100)
98
- end
99
-
100
- let(:search) do
101
- described_class.new(collection, criteria, "phase")
102
- end
103
-
104
- it "sets the collection" do
105
- expect(search.collection).to eq(collection)
106
- end
107
-
108
- it "sets the criteria" do
109
- expect(search.criteria).to eq(criteria)
110
- end
111
-
112
- it "sets the text command" do
113
- expect(search.command[:text]).to eq(collection.name)
114
- end
115
-
116
- it "sets the text search parameter" do
117
- expect(search.command[:search]).to eq("phase")
118
- end
119
-
120
- it "sets the criteria" do
121
- expect(search.command[:filter]).to be_empty
122
- end
123
-
124
- it "sets the limit" do
125
- expect(search.command[:limit]).to eq(100)
126
- end
127
- end
128
-
129
- describe "#language" do
130
-
131
- let(:collection) do
132
- Word.collection
133
- end
134
-
135
- let(:criteria) do
136
- Word.limit(100)
137
- end
138
-
139
- let(:search) do
140
- described_class.new(collection, criteria, "phase")
141
- end
142
-
143
- let!(:text_search) do
144
- search.language("deutsch")
145
- end
146
-
147
- it "sets the search language" do
148
- expect(search.command[:language]).to eq("deutsch")
149
- end
150
-
151
- it "returns the text search" do
152
- expect(text_search).to equal(search)
153
- end
154
- end
155
-
156
- describe "#project" do
157
-
158
- let(:collection) do
159
- Word.collection
160
- end
161
-
162
- let(:criteria) do
163
- Word.limit(100)
164
- end
165
-
166
- let(:search) do
167
- described_class.new(collection, criteria, "phase")
168
- end
169
-
170
- let!(:text_search) do
171
- search.project(name: 1, title: 1)
172
- end
173
-
174
- it "sets the search field limitations" do
175
- expect(search.command[:project]).to eq(name: 1, title: 1)
176
- end
177
-
178
- it "returns the text search" do
179
- expect(text_search).to equal(search)
180
- end
181
- end
182
-
183
- describe "#stats" do
184
-
185
- let(:collection) do
186
- Word.collection
187
- end
188
-
189
- let(:criteria) do
190
- Word.all
191
- end
192
-
193
- let(:search) do
194
- described_class.new(collection, criteria, "phase")
195
- end
196
-
197
- before do
198
- Word.create!(name: "phase", origin: "latin")
199
- end
200
-
201
- let(:stats) do
202
- search.stats
203
- end
204
-
205
- it "returns the raw stats" do
206
- expect(stats["nscanned"]).to eq(1)
207
- end
208
- end
209
- end
@@ -1,75 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::LogSubscriber do
4
-
5
- describe ".query" do
6
-
7
- let!(:subscribe) do
8
- Mongoid::LogSubscriber.log_subscribers.first
9
- end
10
-
11
- before do
12
- @old_level, Moped.logger.level = Moped.logger.level, 0
13
- end
14
-
15
- after do
16
- Moped.logger.level = @old_level
17
- end
18
-
19
- context "when quering the database" do
20
-
21
- it "logs the operation" do
22
- expect(subscribe).to receive(:debug).once
23
- Band.all.to_a
24
- end
25
- end
26
-
27
- context "when creating a new subscriber" do
28
-
29
- class TestLogSubscriber < ActiveSupport::LogSubscriber
30
- attr_reader :debugs
31
-
32
- def initialize
33
- super
34
- @debugs = []
35
- end
36
-
37
- def query(event)
38
- @debugs << event
39
- end
40
-
41
- def logger
42
- Moped.logger
43
- end
44
- end
45
-
46
- let(:test_subscriber) do
47
- TestLogSubscriber.new
48
- end
49
-
50
- before do
51
- ActiveSupport::LogSubscriber.attach_to :moped, test_subscriber
52
- end
53
-
54
- after do
55
- TestLogSubscriber.log_subscribers.pop
56
- end
57
-
58
- it "pushes the new log subscriber" do
59
- expect(Mongoid::LogSubscriber.subscribers.last).to be_a TestLogSubscriber
60
- end
61
-
62
- context "when quering the database" do
63
-
64
- before do
65
- expect(subscribe).to receive(:debug).once
66
- PetOwner.all.to_a
67
- end
68
-
69
- it "sends operations logs to TestLogSubscriber" do
70
- expect(test_subscriber.debugs.size).to eq(1)
71
- end
72
- end
73
- end
74
- end
75
- end
@@ -1,222 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Positional do
4
-
5
- describe "#positionally" do
6
-
7
- let(:positionable) do
8
- Class.new do
9
- include Mongoid::Positional
10
- end.new
11
- end
12
-
13
- let(:updates) do
14
- {
15
- "$set" => {
16
- "field" => "value",
17
- "children.0.field" => "value",
18
- "children.0.children.1.children.3.field" => "value"
19
- },
20
- "$pushAll" => {
21
- "children.0.children.1.children.3.fields" => [ "value", "value" ]
22
- }
23
- }
24
- end
25
-
26
- context "when a child has an embeds many under an embeds one" do
27
-
28
- context "when selector does not include the embeds one" do
29
-
30
- let(:selector) do
31
- { "_id" => 1, "child._id" => 2 }
32
- end
33
-
34
- let(:ops) do
35
- {
36
- "$set" => {
37
- "field" => "value",
38
- "child.children.1.children.3.field" => "value",
39
- }
40
- }
41
- end
42
-
43
- let(:processed) do
44
- positionable.positionally(selector, ops)
45
- end
46
-
47
- it "does not do any replacement" do
48
- expect(processed).to eq(ops)
49
- end
50
- end
51
-
52
- context "when selector includes the embeds one" do
53
-
54
- let(:selector) do
55
- { "_id" => 1, "child._id" => 2, "child.children._id" => 3 }
56
- end
57
-
58
- let(:ops) do
59
- {
60
- "$set" => {
61
- "field" => "value",
62
- "child.children.1.children.3.field" => "value",
63
- }
64
- }
65
- end
66
-
67
- let(:expected) do
68
- {
69
- "$set" => {
70
- "field" => "value",
71
- "child.children.$.children.3.field" => "value",
72
- }
73
- }
74
- end
75
-
76
-
77
- let(:processed) do
78
- positionable.positionally(selector, ops)
79
- end
80
-
81
- it "does not do any replacement" do
82
- expect(processed).to eq(expected)
83
- end
84
- end
85
- end
86
-
87
- context "when the selector has only 1 pair" do
88
-
89
- let(:selector) do
90
- { "_id" => 1 }
91
- end
92
-
93
- let(:processed) do
94
- positionable.positionally(selector, updates)
95
- end
96
-
97
- it "does not do any replacement" do
98
- expect(processed).to eq(updates)
99
- end
100
- end
101
-
102
- context "when the selector has 2 pairs" do
103
-
104
- context "when the second pair has an id" do
105
-
106
- let(:selector) do
107
- { "_id" => 1, "children._id" => 2 }
108
- end
109
-
110
- let(:expected) do
111
- {
112
- "$set" => {
113
- "field" => "value",
114
- "children.$.field" => "value",
115
- "children.$.children.1.children.3.field" => "value"
116
- },
117
- "$pushAll" => {
118
- "children.$.children.1.children.3.fields" => [ "value", "value" ]
119
- }
120
- }
121
- end
122
-
123
- let(:processed) do
124
- positionable.positionally(selector, updates)
125
- end
126
-
127
- it "replaces the first index with the positional operator" do
128
- expect(processed).to eq(expected)
129
- end
130
- end
131
-
132
- context "when the second pair has no id" do
133
-
134
- let(:selector) do
135
- { "_id" => 1, "children._id" => nil }
136
- end
137
-
138
- let(:expected) do
139
- {
140
- "$set" => {
141
- "field" => "value",
142
- "children.0.field" => "value",
143
- "children.0.children.1.children.3.field" => "value"
144
- },
145
- "$pushAll" => {
146
- "children.0.children.1.children.3.fields" => [ "value", "value" ]
147
- }
148
- }
149
- end
150
-
151
- let(:processed) do
152
- positionable.positionally(selector, updates)
153
- end
154
-
155
- it "replaces the first index with the positional operator" do
156
- expect(processed).to eq(expected)
157
- end
158
- end
159
- end
160
-
161
- context "when the selector has 3 pairs" do
162
-
163
- let(:selector) do
164
- { "_id" => 1, "children._id" => 2, "children.0.children._id" => 3 }
165
- end
166
-
167
- let(:expected) do
168
- {
169
- "$set" => {
170
- "field" => "value",
171
- "children.$.field" => "value",
172
- "children.0.children.$.children.3.field" => "value"
173
- },
174
- "$pushAll" => {
175
- "children.0.children.$.children.3.fields" => [ "value", "value" ]
176
- }
177
- }
178
- end
179
-
180
- let(:processed) do
181
- positionable.positionally(selector, updates)
182
- end
183
-
184
- it "replaces the first index with the positional operator" do
185
- expect(processed).to eq(expected)
186
- end
187
- end
188
-
189
- context "when the selector has 4 pairs" do
190
-
191
- let(:selector) do
192
- {
193
- "_id" => 1,
194
- "children._id" => 2,
195
- "children.0.children._id" => 3,
196
- "children.0.children.1.children._id" => 4
197
- }
198
- end
199
-
200
- let(:expected) do
201
- {
202
- "$set" => {
203
- "field" => "value",
204
- "children.$.field" => "value",
205
- "children.0.children.1.children.$.field" => "value"
206
- },
207
- "$pushAll" => {
208
- "children.0.children.1.children.$.fields" => [ "value", "value" ]
209
- }
210
- }
211
- end
212
-
213
- let(:processed) do
214
- positionable.positionally(selector, updates)
215
- end
216
-
217
- it "replaces the first index with the positional operator" do
218
- expect(processed).to eq(expected)
219
- end
220
- end
221
- end
222
- end