mongoid 4.0.2 → 5.0.0.beta
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +66 -1
- data/README.md +14 -13
- data/lib/config/locales/en.yml +28 -28
- data/lib/mongoid.rb +28 -21
- data/lib/mongoid/atomic.rb +2 -4
- data/lib/mongoid/attributes.rb +7 -7
- data/lib/mongoid/attributes/processing.rb +4 -1
- data/lib/mongoid/attributes/readonly.rb +2 -2
- data/lib/mongoid/changeable.rb +4 -6
- data/lib/mongoid/clients.rb +142 -0
- data/lib/mongoid/clients/factory.rb +78 -0
- data/lib/mongoid/{sessions → clients}/options.rb +30 -19
- data/lib/mongoid/{sessions → clients}/storage_options.rb +27 -13
- data/lib/mongoid/{sessions → clients}/thread_options.rb +6 -3
- data/lib/mongoid/clients/validators.rb +2 -0
- data/lib/mongoid/{sessions → clients}/validators/storage.rb +5 -2
- data/lib/mongoid/composable.rb +3 -3
- data/lib/mongoid/config.rb +39 -41
- data/lib/mongoid/config/environment.rb +1 -1
- data/lib/mongoid/config/validators.rb +1 -1
- data/lib/mongoid/config/validators/{session.rb → client.rb} +31 -28
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +11 -11
- data/lib/mongoid/contextual/command.rb +9 -6
- data/lib/mongoid/contextual/geo_near.rb +17 -1
- data/lib/mongoid/contextual/map_reduce.rb +12 -11
- data/lib/mongoid/contextual/memory.rb +2 -5
- data/lib/mongoid/contextual/mongo.rb +92 -82
- data/lib/mongoid/contextual/none.rb +13 -0
- data/lib/mongoid/copyable.rb +6 -1
- data/lib/mongoid/criteria.rb +36 -3
- data/lib/mongoid/document.rb +3 -4
- data/lib/mongoid/errors.rb +6 -6
- data/lib/mongoid/errors/{mixed_session_configuration.rb → mixed_client_configuration.rb} +5 -5
- data/lib/mongoid/errors/no_client_config.rb +22 -0
- data/lib/mongoid/errors/{no_session_database.rb → no_client_database.rb} +4 -4
- data/lib/mongoid/errors/{no_session_hosts.rb → no_client_hosts.rb} +4 -4
- data/lib/mongoid/errors/{no_sessions_config.rb → no_clients_config.rb} +4 -4
- data/lib/mongoid/errors/no_default_client.rb +23 -0
- data/lib/mongoid/extensions/hash.rb +5 -1
- data/lib/mongoid/extensions/object.rb +3 -2
- data/lib/mongoid/extensions/set.rb +5 -5
- data/lib/mongoid/factory.rb +4 -2
- data/lib/mongoid/fields.rb +7 -2
- data/lib/mongoid/findable.rb +4 -1
- data/lib/mongoid/indexable.rb +15 -9
- data/lib/mongoid/persistable.rb +1 -2
- data/lib/mongoid/persistable/creatable.rb +2 -2
- data/lib/mongoid/persistable/deletable.rb +3 -3
- data/lib/mongoid/persistable/incrementable.rb +1 -1
- data/lib/mongoid/persistable/logical.rb +1 -1
- data/lib/mongoid/persistable/poppable.rb +1 -1
- data/lib/mongoid/persistable/pullable.rb +2 -2
- data/lib/mongoid/persistable/pushable.rb +2 -2
- data/lib/mongoid/persistable/renamable.rb +1 -1
- data/lib/mongoid/persistable/settable.rb +1 -1
- data/lib/mongoid/persistable/unsettable.rb +1 -1
- data/lib/mongoid/persistable/updatable.rb +2 -2
- data/lib/mongoid/persistable/upsertable.rb +1 -1
- data/lib/mongoid/query_cache.rb +98 -104
- data/lib/mongoid/railtie.rb +1 -21
- data/lib/mongoid/railties/database.rake +1 -1
- data/lib/mongoid/relations/builders.rb +3 -1
- data/lib/mongoid/relations/counter_cache.rb +1 -1
- data/lib/mongoid/relations/embedded/batchable.rb +3 -10
- data/lib/mongoid/relations/embedded/many.rb +4 -2
- data/lib/mongoid/relations/many.rb +1 -0
- data/lib/mongoid/relations/proxy.rb +6 -6
- data/lib/mongoid/relations/referenced/many.rb +2 -1
- data/lib/mongoid/relations/targets/enumerable.rb +11 -11
- data/lib/mongoid/relations/touchable.rb +1 -1
- data/lib/mongoid/reloadable.rb +2 -2
- data/lib/mongoid/scopable.rb +6 -17
- data/lib/mongoid/selectable.rb +1 -36
- data/lib/mongoid/serializable.rb +2 -2
- data/lib/mongoid/stateful.rb +0 -1
- data/lib/mongoid/tasks/database.rake +2 -2
- data/lib/mongoid/tasks/database.rb +23 -16
- data/lib/mongoid/threaded.rb +54 -33
- data/lib/mongoid/threaded/lifecycle.rb +21 -16
- data/lib/mongoid/traversable.rb +16 -1
- data/lib/mongoid/validatable.rb +1 -1
- data/lib/mongoid/validatable/queryable.rb +1 -1
- data/lib/mongoid/validatable/uniqueness.rb +3 -20
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +91 -57
- data/lib/rails/mongoid.rb +2 -2
- data/spec/app/models/audio.rb +1 -1
- data/spec/app/models/band.rb +1 -0
- data/spec/app/models/company.rb +5 -0
- data/spec/app/models/label.rb +7 -0
- data/spec/app/models/pub.rb +6 -0
- data/spec/app/models/staff.rb +7 -0
- data/spec/app/models/store_as_dup_test1.rb +5 -0
- data/spec/app/models/store_as_dup_test2.rb +5 -0
- data/spec/config/mongoid.yml +7 -25
- data/spec/mongoid/atomic/paths_spec.rb +3 -11
- data/spec/mongoid/attributes/nested_spec.rb +16 -16
- data/spec/mongoid/attributes/readonly_spec.rb +80 -18
- data/spec/mongoid/attributes_spec.rb +3 -3
- data/spec/mongoid/changeable_spec.rb +70 -0
- data/spec/mongoid/clients/factory_spec.rb +284 -0
- data/spec/mongoid/{sessions → clients}/options_spec.rb +4 -6
- data/spec/mongoid/clients_spec.rb +739 -0
- data/spec/mongoid/config/environment_spec.rb +14 -11
- data/spec/mongoid/config_spec.rb +33 -48
- data/spec/mongoid/contextual/atomic_spec.rb +1 -17
- data/spec/mongoid/contextual/geo_near_spec.rb +35 -0
- data/spec/mongoid/contextual/mongo_spec.rb +26 -83
- data/spec/mongoid/contextual/none_spec.rb +15 -0
- data/spec/mongoid/copyable_spec.rb +35 -1
- data/spec/mongoid/criteria/findable_spec.rb +197 -0
- data/spec/mongoid/criteria/modifiable_spec.rb +7 -29
- data/spec/mongoid/criteria_spec.rb +74 -91
- data/spec/mongoid/document_spec.rb +1 -1
- data/spec/mongoid/errors/{mixed_session_configuration_spec.rb → mixed_client_configuration_spec.rb} +1 -1
- data/spec/mongoid/errors/{no_session_config_spec.rb → no_client_config_spec.rb} +4 -4
- data/spec/mongoid/errors/{no_session_database_spec.rb → no_client_database_spec.rb} +4 -4
- data/spec/mongoid/errors/{no_session_hosts_spec.rb → no_client_hosts_spec.rb} +3 -3
- data/spec/mongoid/errors/{no_sessions_config_spec.rb → no_clients_config_spec.rb} +2 -2
- data/spec/mongoid/fields/localized_spec.rb +1 -0
- data/spec/mongoid/fields_spec.rb +1 -0
- data/spec/mongoid/findable_spec.rb +2 -23
- data/spec/mongoid/indexable_spec.rb +12 -8
- data/spec/mongoid/interceptable_spec.rb +15 -0
- data/spec/mongoid/persistable/settable_spec.rb +16 -0
- data/spec/mongoid/persistable/updatable_spec.rb +3 -2
- data/spec/mongoid/persistable_spec.rb +4 -4
- data/spec/mongoid/query_cache_spec.rb +13 -8
- data/spec/mongoid/relations/auto_save_spec.rb +1 -1
- data/spec/mongoid/relations/counter_cache_spec.rb +34 -0
- data/spec/mongoid/relations/eager/belongs_to_spec.rb +9 -0
- data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +3 -3
- data/spec/mongoid/relations/embedded/many_spec.rb +123 -1
- data/spec/mongoid/relations/embedded/one_spec.rb +3 -3
- data/spec/mongoid/relations/proxy_spec.rb +28 -0
- data/spec/mongoid/relations/referenced/in_spec.rb +1 -1
- data/spec/mongoid/relations/referenced/many_spec.rb +47 -23
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +1 -1
- data/spec/mongoid/relations/referenced/one_spec.rb +1 -1
- data/spec/mongoid/relations/targets/enumerable_spec.rb +9 -2
- data/spec/mongoid/reloadable_spec.rb +6 -6
- data/spec/mongoid/scopable_spec.rb +41 -28
- data/spec/mongoid/selectable_spec.rb +6 -16
- data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
- data/spec/mongoid/tasks/database_spec.rb +2 -2
- data/spec/mongoid/threaded_spec.rb +0 -7
- data/spec/mongoid/traversable_spec.rb +2 -2
- data/spec/mongoid/validatable/uniqueness_spec.rb +30 -1
- data/spec/mongoid_spec.rb +13 -15
- data/spec/rails/mongoid_spec.rb +13 -4
- data/spec/spec_helper.rb +44 -27
- data/spec/support/authorization.rb +12 -0
- data/spec/support/expectations.rb +14 -0
- metadata +52 -59
- data/lib/mongoid/contextual/find_and_modify.rb +0 -69
- data/lib/mongoid/contextual/text_search.rb +0 -178
- data/lib/mongoid/criteria/#findable.rb# +0 -141
- data/lib/mongoid/errors/no_default_session.rb +0 -23
- data/lib/mongoid/errors/no_session_config.rb +0 -22
- data/lib/mongoid/log_subscriber.rb +0 -55
- data/lib/mongoid/positional.rb +0 -71
- data/lib/mongoid/sessions.rb +0 -125
- data/lib/mongoid/sessions/factory.rb +0 -131
- data/lib/mongoid/sessions/mongo_uri.rb +0 -93
- data/lib/mongoid/sessions/validators.rb +0 -2
- data/lib/mongoid/support/query_counter.rb +0 -23
- data/spec/helpers.rb +0 -18
- data/spec/mongoid/#atomic_spec.rb# +0 -365
- data/spec/mongoid/contextual/find_and_modify_spec.rb +0 -220
- data/spec/mongoid/contextual/text_search_spec.rb +0 -209
- data/spec/mongoid/log_subscriber_spec.rb +0 -75
- data/spec/mongoid/positional_spec.rb +0 -222
- data/spec/mongoid/sessions/factory_spec.rb +0 -333
- data/spec/mongoid/sessions/mongo_uri_spec.rb +0 -103
- data/spec/mongoid/sessions_spec.rb +0 -1252
@@ -1,333 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Mongoid::Sessions::Factory do
|
4
|
-
|
5
|
-
describe ".create" do
|
6
|
-
|
7
|
-
context "when provided a name" do
|
8
|
-
|
9
|
-
context "when the configuration exists" do
|
10
|
-
|
11
|
-
context "when the configuration is standard" do
|
12
|
-
|
13
|
-
let(:config) do
|
14
|
-
{
|
15
|
-
default: { hosts: [ "localhost:27017" ], database: database_id },
|
16
|
-
secondary: { hosts: [ "localhost:27017" ], database: database_id }
|
17
|
-
}
|
18
|
-
end
|
19
|
-
|
20
|
-
before do
|
21
|
-
Mongoid::Config.sessions = config
|
22
|
-
end
|
23
|
-
|
24
|
-
let(:session) do
|
25
|
-
described_class.create(:secondary)
|
26
|
-
end
|
27
|
-
|
28
|
-
let(:cluster) do
|
29
|
-
session.cluster
|
30
|
-
end
|
31
|
-
|
32
|
-
it "returns a session" do
|
33
|
-
expect(session).to be_a(Moped::Session)
|
34
|
-
end
|
35
|
-
|
36
|
-
it "sets the cluster's seeds" do
|
37
|
-
expect(cluster.seeds.first.address.resolved).to eq("127.0.0.1:27017")
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
context "when the configuration has no ports" do
|
42
|
-
|
43
|
-
let(:config) do
|
44
|
-
{
|
45
|
-
default: { hosts: [ "127.0.0.1" ], database: database_id },
|
46
|
-
secondary: { hosts: [ "localhost" ], database: database_id }
|
47
|
-
}
|
48
|
-
end
|
49
|
-
|
50
|
-
before do
|
51
|
-
Mongoid::Config.sessions = config
|
52
|
-
end
|
53
|
-
|
54
|
-
let(:session) do
|
55
|
-
described_class.create(:secondary)
|
56
|
-
end
|
57
|
-
|
58
|
-
let(:default) do
|
59
|
-
described_class.create(:default)
|
60
|
-
end
|
61
|
-
|
62
|
-
let(:cluster) do
|
63
|
-
session.cluster
|
64
|
-
end
|
65
|
-
|
66
|
-
it "returns a session" do
|
67
|
-
expect(session).to be_a(Moped::Session)
|
68
|
-
end
|
69
|
-
|
70
|
-
it "sets the cluster's seed ports to 27017" do
|
71
|
-
expect(cluster.seeds.first.address.original).to eq("localhost:27017")
|
72
|
-
end
|
73
|
-
|
74
|
-
it "sets ips with no ports to 27017" do
|
75
|
-
expect(default.cluster.seeds.first.address.original).to eq("127.0.0.1:27017")
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
context "when configured via a uri" do
|
80
|
-
|
81
|
-
context "when the uri has a single host:port" do
|
82
|
-
|
83
|
-
let(:config) do
|
84
|
-
{
|
85
|
-
default: { hosts: [ "localhost:27017" ], database: database_id },
|
86
|
-
secondary: { uri: "mongodb://localhost:27017/mongoid_test" }
|
87
|
-
}
|
88
|
-
end
|
89
|
-
|
90
|
-
before do
|
91
|
-
Mongoid::Config.sessions = config
|
92
|
-
end
|
93
|
-
|
94
|
-
let(:session) do
|
95
|
-
described_class.create(:secondary)
|
96
|
-
end
|
97
|
-
|
98
|
-
let(:cluster) do
|
99
|
-
session.cluster
|
100
|
-
end
|
101
|
-
|
102
|
-
it "returns a session" do
|
103
|
-
expect(session).to be_a(Moped::Session)
|
104
|
-
end
|
105
|
-
|
106
|
-
it "sets the cluster's seeds" do
|
107
|
-
expect(cluster.seeds.first.address.original).to eq("localhost:27017")
|
108
|
-
end
|
109
|
-
|
110
|
-
it "sets the database" do
|
111
|
-
expect(session.options[:database]).to eq("mongoid_test")
|
112
|
-
end
|
113
|
-
|
114
|
-
it "sets the database in the configuration" do
|
115
|
-
session
|
116
|
-
expect(Mongoid.sessions[:secondary]).to include(:database)
|
117
|
-
end
|
118
|
-
|
119
|
-
it "sets the hosts in the configuration" do
|
120
|
-
session
|
121
|
-
expect(Mongoid.sessions[:secondary]).to include(:hosts)
|
122
|
-
end
|
123
|
-
|
124
|
-
it "removes the uri from the configuration" do
|
125
|
-
session
|
126
|
-
expect(Mongoid.sessions[:secondary]).to_not include(:uri)
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
context "when the uri has multiple host:port pairs" do
|
131
|
-
|
132
|
-
let(:config) do
|
133
|
-
{
|
134
|
-
default: { hosts: [ "localhost:27017" ], database: database_id },
|
135
|
-
secondary: { uri: "mongodb://localhost:27017,localhost:27017/mongoid_test" }
|
136
|
-
}
|
137
|
-
end
|
138
|
-
|
139
|
-
before do
|
140
|
-
Mongoid::Config.sessions = config
|
141
|
-
end
|
142
|
-
|
143
|
-
let(:session) do
|
144
|
-
described_class.create(:secondary)
|
145
|
-
end
|
146
|
-
|
147
|
-
let(:cluster) do
|
148
|
-
session.cluster
|
149
|
-
end
|
150
|
-
|
151
|
-
let(:seeds) do
|
152
|
-
cluster.seeds.map{ |node| node.address.original }
|
153
|
-
end
|
154
|
-
|
155
|
-
it "returns a session" do
|
156
|
-
expect(session).to be_a(Moped::Session)
|
157
|
-
end
|
158
|
-
|
159
|
-
it "sets the cluster's seeds" do
|
160
|
-
expect(seeds).to eq([ "localhost:27017", "localhost:27017" ])
|
161
|
-
end
|
162
|
-
|
163
|
-
it "sets the database" do
|
164
|
-
expect(session.options[:database]).to eq("mongoid_test")
|
165
|
-
end
|
166
|
-
|
167
|
-
it "sets the database in the configuration" do
|
168
|
-
session
|
169
|
-
expect(Mongoid.sessions[:secondary]).to include(:database)
|
170
|
-
end
|
171
|
-
|
172
|
-
it "sets the hosts in the configuration" do
|
173
|
-
session
|
174
|
-
expect(Mongoid.sessions[:secondary]).to include(:hosts)
|
175
|
-
end
|
176
|
-
|
177
|
-
it "removes the uri from the configuration" do
|
178
|
-
session
|
179
|
-
expect(Mongoid.sessions[:secondary]).to_not include(:uri)
|
180
|
-
end
|
181
|
-
end
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
context "when the configuration does not exist" do
|
186
|
-
|
187
|
-
it "raises an error" do
|
188
|
-
expect {
|
189
|
-
described_class.create(:unknown)
|
190
|
-
}.to raise_error(Mongoid::Errors::NoSessionConfig)
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
context "when no name is provided" do
|
196
|
-
|
197
|
-
let(:config) do
|
198
|
-
{ default: { hosts: ["localhost:27017"], database: database_id }}
|
199
|
-
end
|
200
|
-
|
201
|
-
before do
|
202
|
-
Mongoid::Config.sessions = config
|
203
|
-
end
|
204
|
-
|
205
|
-
let(:session) do
|
206
|
-
described_class.create
|
207
|
-
end
|
208
|
-
|
209
|
-
let(:cluster) do
|
210
|
-
session.cluster
|
211
|
-
end
|
212
|
-
|
213
|
-
let(:seeds) do
|
214
|
-
cluster.seeds.map{ |node| node.address.original }
|
215
|
-
end
|
216
|
-
|
217
|
-
it "returns the default session" do
|
218
|
-
expect(session).to be_a(Moped::Session)
|
219
|
-
end
|
220
|
-
|
221
|
-
it "sets the cluster's seeds" do
|
222
|
-
expect(seeds).to eq([ "localhost:27017" ])
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
|
-
context "when nil is provided and no default config" do
|
227
|
-
|
228
|
-
let(:config) { nil }
|
229
|
-
|
230
|
-
before do
|
231
|
-
Mongoid.sessions[:default] = nil
|
232
|
-
end
|
233
|
-
|
234
|
-
it "raises NoSessionsConfig error" do
|
235
|
-
expect{ Mongoid::Sessions::Factory.create(config) }.to raise_error(Mongoid::Errors::NoSessionsConfig)
|
236
|
-
end
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
describe ".default" do
|
241
|
-
|
242
|
-
let(:config) do
|
243
|
-
{ default: { hosts: ["localhost:27017"], database: database_id }}
|
244
|
-
end
|
245
|
-
|
246
|
-
before do
|
247
|
-
Mongoid::Config.sessions = config
|
248
|
-
end
|
249
|
-
|
250
|
-
let(:session) do
|
251
|
-
described_class.default
|
252
|
-
end
|
253
|
-
|
254
|
-
let(:cluster) do
|
255
|
-
session.cluster
|
256
|
-
end
|
257
|
-
|
258
|
-
let(:seeds) do
|
259
|
-
cluster.seeds.map{ |node| node.address.original }
|
260
|
-
end
|
261
|
-
|
262
|
-
it "returns the default session" do
|
263
|
-
expect(session).to be_a(Moped::Session)
|
264
|
-
end
|
265
|
-
|
266
|
-
it "sets the cluster's seeds" do
|
267
|
-
expect(seeds).to eq([ "localhost:27017" ])
|
268
|
-
end
|
269
|
-
end
|
270
|
-
|
271
|
-
context "when options are provided with string keys" do
|
272
|
-
|
273
|
-
let(:config) do
|
274
|
-
{
|
275
|
-
default: {
|
276
|
-
hosts: [ "localhost:27017" ],
|
277
|
-
database: database_id,
|
278
|
-
options: {
|
279
|
-
"down_interval" => 10,
|
280
|
-
"max_retries" => 5,
|
281
|
-
"refresh_interval" => 30,
|
282
|
-
"retry_interval" => 0.1,
|
283
|
-
"write" => { "w" => 1 }
|
284
|
-
}
|
285
|
-
}
|
286
|
-
}
|
287
|
-
end
|
288
|
-
|
289
|
-
before do
|
290
|
-
Mongoid::Config.sessions = config
|
291
|
-
end
|
292
|
-
|
293
|
-
let(:session) do
|
294
|
-
described_class.default
|
295
|
-
end
|
296
|
-
|
297
|
-
let(:cluster) do
|
298
|
-
session.cluster
|
299
|
-
end
|
300
|
-
|
301
|
-
let(:seeds) do
|
302
|
-
cluster.seeds.map{ |node| node.address.original }
|
303
|
-
end
|
304
|
-
|
305
|
-
it "returns the default session" do
|
306
|
-
expect(session).to be_a(Moped::Session)
|
307
|
-
end
|
308
|
-
|
309
|
-
it "sets the cluster's seeds" do
|
310
|
-
expect(seeds).to eq([ "localhost:27017" ])
|
311
|
-
end
|
312
|
-
|
313
|
-
it "sets the cluster down interval" do
|
314
|
-
expect(cluster.down_interval).to eq(10)
|
315
|
-
end
|
316
|
-
|
317
|
-
it "sets the cluster max retries" do
|
318
|
-
expect(cluster.max_retries).to eq(5)
|
319
|
-
end
|
320
|
-
|
321
|
-
it "sets the cluster refresh interval" do
|
322
|
-
expect(cluster.refresh_interval).to eq(30)
|
323
|
-
end
|
324
|
-
|
325
|
-
it "sets the cluster retry interval" do
|
326
|
-
expect(cluster.retry_interval).to eq(0.1)
|
327
|
-
end
|
328
|
-
|
329
|
-
it "sets the write concern" do
|
330
|
-
expect(session.write_concern).to be_a(Moped::WriteConcern::Propagate)
|
331
|
-
end
|
332
|
-
end
|
333
|
-
end
|
@@ -1,103 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Mongoid::Sessions::MongoUri do
|
4
|
-
|
5
|
-
let(:single) do
|
6
|
-
"mongodb://user:pass@localhost:27017/mongoid_test"
|
7
|
-
end
|
8
|
-
|
9
|
-
let(:multiple) do
|
10
|
-
"mongodb://localhost:27017,localhost:27017/mongoid_test"
|
11
|
-
end
|
12
|
-
|
13
|
-
describe "#database" do
|
14
|
-
|
15
|
-
let(:uri) do
|
16
|
-
described_class.new(single)
|
17
|
-
end
|
18
|
-
|
19
|
-
it "returns the database name" do
|
20
|
-
expect(uri.database).to eq("mongoid_test")
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
describe "#hosts" do
|
25
|
-
|
26
|
-
context "when a single node is provided" do
|
27
|
-
|
28
|
-
let(:uri) do
|
29
|
-
described_class.new(single)
|
30
|
-
end
|
31
|
-
|
32
|
-
it "returns an array with 1 node" do
|
33
|
-
expect(uri.hosts).to eq([ "localhost:27017" ])
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
context "when multiple nodes are provided" do
|
38
|
-
|
39
|
-
let(:uri) do
|
40
|
-
described_class.new(multiple)
|
41
|
-
end
|
42
|
-
|
43
|
-
it "returns an array with 2 nodes" do
|
44
|
-
expect(uri.hosts).to eq([ "localhost:27017", "localhost:27017" ])
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
describe "#password" do
|
50
|
-
|
51
|
-
let(:uri) do
|
52
|
-
described_class.new(single)
|
53
|
-
end
|
54
|
-
|
55
|
-
it "returns the password" do
|
56
|
-
expect(uri.password).to eq("pass")
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
describe "#to_hash" do
|
61
|
-
|
62
|
-
context "when a user and password are not provided" do
|
63
|
-
|
64
|
-
let(:uri) do
|
65
|
-
described_class.new(multiple)
|
66
|
-
end
|
67
|
-
|
68
|
-
it "does not include the username and password" do
|
69
|
-
expect(uri.to_hash).to eq({
|
70
|
-
hosts: [ "localhost:27017", "localhost:27017" ],
|
71
|
-
database: "mongoid_test"
|
72
|
-
})
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
context "when a user and password are provided" do
|
77
|
-
|
78
|
-
let(:uri) do
|
79
|
-
described_class.new(single)
|
80
|
-
end
|
81
|
-
|
82
|
-
it "includes the username and password" do
|
83
|
-
expect(uri.to_hash).to eq({
|
84
|
-
hosts: [ "localhost:27017" ],
|
85
|
-
database: "mongoid_test",
|
86
|
-
username: "user",
|
87
|
-
password: "pass"
|
88
|
-
})
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
describe "#username" do
|
94
|
-
|
95
|
-
let(:uri) do
|
96
|
-
described_class.new(single)
|
97
|
-
end
|
98
|
-
|
99
|
-
it "returns the userame" do
|
100
|
-
expect(uri.username).to eq("user")
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
@@ -1,1252 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Mongoid::Sessions do
|
4
|
-
|
5
|
-
describe "#collection" do
|
6
|
-
|
7
|
-
shared_examples_for "an overridden collection at the class level" do
|
8
|
-
|
9
|
-
let(:band) do
|
10
|
-
klass.new
|
11
|
-
end
|
12
|
-
|
13
|
-
it "returns the collection for the model" do
|
14
|
-
expect(band.collection).to be_a(Moped::Collection)
|
15
|
-
end
|
16
|
-
|
17
|
-
it "sets the correct collection name" do
|
18
|
-
expect(band.collection.name).to eq("artists")
|
19
|
-
end
|
20
|
-
|
21
|
-
context "when accessing from the class level" do
|
22
|
-
|
23
|
-
it "returns the collection for the model" do
|
24
|
-
expect(klass.collection).to be_a(Moped::Collection)
|
25
|
-
end
|
26
|
-
|
27
|
-
it "sets the correct collection name" do
|
28
|
-
expect(klass.collection.name).to eq("artists")
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
context "when overriding the persistence options" do
|
34
|
-
|
35
|
-
let(:klass) do
|
36
|
-
Band.with(collection: "artists")
|
37
|
-
end
|
38
|
-
|
39
|
-
it_behaves_like "an overridden collection at the class level"
|
40
|
-
end
|
41
|
-
|
42
|
-
context "when overriding store_in and persistence options" do
|
43
|
-
|
44
|
-
let(:klass) do
|
45
|
-
Band.with(collection: "artists")
|
46
|
-
end
|
47
|
-
|
48
|
-
before do
|
49
|
-
Band.store_in collection: "foo"
|
50
|
-
end
|
51
|
-
|
52
|
-
after do
|
53
|
-
Band.reset_storage_options!
|
54
|
-
end
|
55
|
-
|
56
|
-
it_behaves_like "an overridden collection at the class level"
|
57
|
-
end
|
58
|
-
|
59
|
-
context "when overriding the default with store_in" do
|
60
|
-
|
61
|
-
after do
|
62
|
-
Band.reset_storage_options!
|
63
|
-
end
|
64
|
-
|
65
|
-
context "when called multiple times with different options" do
|
66
|
-
|
67
|
-
before do
|
68
|
-
Band.store_in collection: "artists"
|
69
|
-
Band.store_in session: "another"
|
70
|
-
end
|
71
|
-
|
72
|
-
it "should merge the options together" do
|
73
|
-
expect(Band.storage_options[:collection]).to eq("artists")
|
74
|
-
expect(Band.storage_options[:session]).to eq("another")
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
context "when overriding with a proc" do
|
79
|
-
|
80
|
-
let(:klass) { Band }
|
81
|
-
|
82
|
-
before do
|
83
|
-
Band.store_in(collection: ->{ "artists" })
|
84
|
-
end
|
85
|
-
|
86
|
-
it_behaves_like "an overridden collection at the class level"
|
87
|
-
end
|
88
|
-
|
89
|
-
context "when overriding with a string" do
|
90
|
-
|
91
|
-
let(:klass) { Band }
|
92
|
-
|
93
|
-
before do
|
94
|
-
Band.store_in(collection: "artists")
|
95
|
-
end
|
96
|
-
|
97
|
-
after do
|
98
|
-
Band.reset_storage_options!
|
99
|
-
end
|
100
|
-
|
101
|
-
it_behaves_like "an overridden collection at the class level"
|
102
|
-
end
|
103
|
-
|
104
|
-
context "when overriding with a symbol" do
|
105
|
-
|
106
|
-
let(:klass) { Band }
|
107
|
-
|
108
|
-
before do
|
109
|
-
klass.store_in(collection: :artists)
|
110
|
-
end
|
111
|
-
|
112
|
-
after do
|
113
|
-
klass.reset_storage_options!
|
114
|
-
end
|
115
|
-
|
116
|
-
it_behaves_like "an overridden collection at the class level"
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
context "when not overriding the default" do
|
121
|
-
|
122
|
-
let(:band) do
|
123
|
-
Band.new
|
124
|
-
end
|
125
|
-
|
126
|
-
it "returns the collection for the model" do
|
127
|
-
expect(band.collection).to be_a(Moped::Collection)
|
128
|
-
end
|
129
|
-
|
130
|
-
it "sets the correct collection name" do
|
131
|
-
expect(band.collection.name.to_s).to eq("bands")
|
132
|
-
end
|
133
|
-
|
134
|
-
context "when accessing from the class level" do
|
135
|
-
|
136
|
-
it "returns the collection for the model" do
|
137
|
-
expect(Band.collection).to be_a(Moped::Collection)
|
138
|
-
end
|
139
|
-
|
140
|
-
it "sets the correct collection name" do
|
141
|
-
expect(Band.collection.name.to_s).to eq("bands")
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
describe "#collection_name" do
|
148
|
-
|
149
|
-
shared_examples_for "an overridden collection name at the class level" do
|
150
|
-
|
151
|
-
let(:band) do
|
152
|
-
klass.new
|
153
|
-
end
|
154
|
-
|
155
|
-
context "when accessing from the instance" do
|
156
|
-
|
157
|
-
it "returns the overridden value" do
|
158
|
-
expect(band.collection_name).to eq(:artists)
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
context "when accessing from the class level" do
|
163
|
-
|
164
|
-
it "returns the overridden value" do
|
165
|
-
expect(klass.collection_name).to eq(:artists)
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
context "when overriding the persistence options" do
|
171
|
-
|
172
|
-
let(:klass) do
|
173
|
-
Band.with(collection: "artists")
|
174
|
-
end
|
175
|
-
|
176
|
-
it_behaves_like "an overridden collection name at the class level"
|
177
|
-
end
|
178
|
-
|
179
|
-
context "when overriding store_in and persistence options" do
|
180
|
-
|
181
|
-
let(:klass) do
|
182
|
-
Band.with(collection: "artists")
|
183
|
-
end
|
184
|
-
|
185
|
-
before do
|
186
|
-
Band.store_in collection: "foo"
|
187
|
-
end
|
188
|
-
|
189
|
-
after do
|
190
|
-
Band.reset_storage_options!
|
191
|
-
end
|
192
|
-
|
193
|
-
it_behaves_like "an overridden collection name at the class level"
|
194
|
-
end
|
195
|
-
|
196
|
-
context "when overriding the default with store_in" do
|
197
|
-
|
198
|
-
let(:klass) { Band }
|
199
|
-
|
200
|
-
after do
|
201
|
-
Band.reset_storage_options!
|
202
|
-
end
|
203
|
-
|
204
|
-
context "when overriding with a proc" do
|
205
|
-
|
206
|
-
before do
|
207
|
-
Band.store_in(collection: ->{ "artists" })
|
208
|
-
end
|
209
|
-
|
210
|
-
it_behaves_like "an overridden collection name at the class level"
|
211
|
-
end
|
212
|
-
|
213
|
-
context "when overriding with a string" do
|
214
|
-
|
215
|
-
before do
|
216
|
-
Band.store_in(collection: "artists")
|
217
|
-
end
|
218
|
-
|
219
|
-
it_behaves_like "an overridden collection name at the class level"
|
220
|
-
end
|
221
|
-
|
222
|
-
context "when overriding with a symbol" do
|
223
|
-
|
224
|
-
before do
|
225
|
-
Band.store_in(collection: :artists)
|
226
|
-
end
|
227
|
-
|
228
|
-
it_behaves_like "an overridden collection name at the class level"
|
229
|
-
end
|
230
|
-
end
|
231
|
-
|
232
|
-
context "when not overriding the default" do
|
233
|
-
|
234
|
-
let(:band) do
|
235
|
-
Band.new
|
236
|
-
end
|
237
|
-
|
238
|
-
it "returns the pluralized model name" do
|
239
|
-
expect(band.collection_name).to eq(:bands)
|
240
|
-
end
|
241
|
-
|
242
|
-
context "when accessing from the class level" do
|
243
|
-
|
244
|
-
it "returns the pluralized model name" do
|
245
|
-
expect(Band.collection_name).to eq(:bands)
|
246
|
-
end
|
247
|
-
end
|
248
|
-
end
|
249
|
-
|
250
|
-
context "when the model is a subclass" do
|
251
|
-
|
252
|
-
let(:firefox) do
|
253
|
-
Firefox.new
|
254
|
-
end
|
255
|
-
|
256
|
-
it "returns the root class pluralized model name" do
|
257
|
-
expect(firefox.collection_name).to eq(:canvases)
|
258
|
-
end
|
259
|
-
|
260
|
-
context "when accessing from the class level" do
|
261
|
-
|
262
|
-
it "returns the root class pluralized model name" do
|
263
|
-
expect(Firefox.collection_name).to eq(:canvases)
|
264
|
-
end
|
265
|
-
end
|
266
|
-
end
|
267
|
-
end
|
268
|
-
|
269
|
-
describe "#database_name" do
|
270
|
-
|
271
|
-
shared_examples_for "an overridden database name" do
|
272
|
-
|
273
|
-
let(:band) do
|
274
|
-
klass.new
|
275
|
-
end
|
276
|
-
|
277
|
-
context "when accessing from the instance" do
|
278
|
-
|
279
|
-
it "returns the overridden value" do
|
280
|
-
expect(band.mongo_session.options[:database].to_s).to eq(database_id_alt)
|
281
|
-
end
|
282
|
-
end
|
283
|
-
|
284
|
-
context "when accessing from the class level" do
|
285
|
-
|
286
|
-
it "returns the overridden value" do
|
287
|
-
expect(klass.database_name.to_s).to eq(database_id_alt)
|
288
|
-
end
|
289
|
-
|
290
|
-
it "session returns the overridden value" do
|
291
|
-
expect(klass.mongo_session.options[:database].to_s).to eq(database_id_alt)
|
292
|
-
end
|
293
|
-
end
|
294
|
-
end
|
295
|
-
|
296
|
-
context "when overriding the persistence options" do
|
297
|
-
|
298
|
-
let(:klass) do
|
299
|
-
Band.with(database: database_id_alt)
|
300
|
-
end
|
301
|
-
|
302
|
-
it_behaves_like "an overridden database name"
|
303
|
-
end
|
304
|
-
|
305
|
-
context "when overriding with store_in" do
|
306
|
-
|
307
|
-
let(:klass) { Band }
|
308
|
-
|
309
|
-
before do
|
310
|
-
Band.store_in database: database_id_alt
|
311
|
-
end
|
312
|
-
|
313
|
-
after do
|
314
|
-
Band.reset_storage_options!
|
315
|
-
end
|
316
|
-
|
317
|
-
it_behaves_like "an overridden database name"
|
318
|
-
end
|
319
|
-
|
320
|
-
context "when overriding store_in and persistence options" do
|
321
|
-
|
322
|
-
let(:klass) do
|
323
|
-
Band.with(database: database_id_alt)
|
324
|
-
end
|
325
|
-
|
326
|
-
before do
|
327
|
-
Band.store_in database: "foo"
|
328
|
-
end
|
329
|
-
|
330
|
-
after do
|
331
|
-
Band.reset_storage_options!
|
332
|
-
end
|
333
|
-
|
334
|
-
it_behaves_like "an overridden database name"
|
335
|
-
end
|
336
|
-
|
337
|
-
context "when overriding using the session" do
|
338
|
-
|
339
|
-
let(:session_name) { :alternative }
|
340
|
-
|
341
|
-
before do
|
342
|
-
Mongoid.sessions[session_name] = { database: database_id_alt, hosts: [ "#{HOST}:#{PORT}" ] }
|
343
|
-
end
|
344
|
-
|
345
|
-
after do
|
346
|
-
Mongoid.sessions.delete(session_name)
|
347
|
-
end
|
348
|
-
|
349
|
-
context "when overriding the persistence options" do
|
350
|
-
|
351
|
-
let(:klass) do
|
352
|
-
Band.with(session: session_name)
|
353
|
-
end
|
354
|
-
|
355
|
-
it_behaves_like "an overridden database name"
|
356
|
-
end
|
357
|
-
|
358
|
-
context "when overriding with store_in" do
|
359
|
-
|
360
|
-
let(:klass) { Band }
|
361
|
-
|
362
|
-
before do
|
363
|
-
Band.store_in(session: session_name)
|
364
|
-
end
|
365
|
-
|
366
|
-
after do
|
367
|
-
Band.reset_storage_options!
|
368
|
-
end
|
369
|
-
|
370
|
-
it_behaves_like "an overridden database name"
|
371
|
-
end
|
372
|
-
end
|
373
|
-
end
|
374
|
-
|
375
|
-
describe "#mongo_session" do
|
376
|
-
|
377
|
-
let(:file) do
|
378
|
-
File.join(File.dirname(__FILE__), "..", "config", "mongoid.yml")
|
379
|
-
end
|
380
|
-
|
381
|
-
before do
|
382
|
-
described_class.clear
|
383
|
-
Mongoid.load!(file, :test)
|
384
|
-
Mongoid.sessions[:default][:database] = database_id
|
385
|
-
end
|
386
|
-
|
387
|
-
context "when getting the default" do
|
388
|
-
|
389
|
-
let(:file) do
|
390
|
-
File.join(File.dirname(__FILE__), "..", "config", "mongoid.yml")
|
391
|
-
end
|
392
|
-
|
393
|
-
before do
|
394
|
-
described_class.clear
|
395
|
-
Mongoid.load!(file, :test)
|
396
|
-
Mongoid.sessions[:default][:database] = database_id
|
397
|
-
end
|
398
|
-
|
399
|
-
let!(:band) do
|
400
|
-
Band.new
|
401
|
-
end
|
402
|
-
|
403
|
-
let!(:mongo_session) do
|
404
|
-
band.mongo_session
|
405
|
-
end
|
406
|
-
|
407
|
-
it "returns the default session" do
|
408
|
-
expect(mongo_session.options[:database].to_s).to eq(database_id)
|
409
|
-
end
|
410
|
-
end
|
411
|
-
|
412
|
-
context "when overridden the database with store_in" do
|
413
|
-
|
414
|
-
before do
|
415
|
-
Band.store_in(database: database_id_alt)
|
416
|
-
end
|
417
|
-
|
418
|
-
context "on instance level" do
|
419
|
-
|
420
|
-
let(:band) do
|
421
|
-
Band.new.with({:read=>:primary})
|
422
|
-
end
|
423
|
-
|
424
|
-
it "uses the new database" do
|
425
|
-
expect(band.mongo_session.send(:current_database).name).to eq database_id_alt
|
426
|
-
end
|
427
|
-
|
428
|
-
context "when using another database before" do
|
429
|
-
|
430
|
-
before do
|
431
|
-
band
|
432
|
-
User.create!
|
433
|
-
end
|
434
|
-
|
435
|
-
it "uses the new database" do
|
436
|
-
expect(band.mongo_session.send(:current_database).name).to eq database_id_alt
|
437
|
-
end
|
438
|
-
end
|
439
|
-
end
|
440
|
-
end
|
441
|
-
|
442
|
-
context "when overriding to a monghq single server", config: :mongohq do
|
443
|
-
|
444
|
-
shared_examples_for "an overridden session to a mongohq single server" do
|
445
|
-
|
446
|
-
let(:band) do
|
447
|
-
Band.new
|
448
|
-
end
|
449
|
-
|
450
|
-
let(:single_session) do
|
451
|
-
band.mongo_session
|
452
|
-
end
|
453
|
-
|
454
|
-
it "returns the default session" do
|
455
|
-
expect(single_session.options[:database].to_s).to eq(ENV["MONGOHQ_SINGLE_NAME"])
|
456
|
-
end
|
457
|
-
end
|
458
|
-
|
459
|
-
context "when overriding with a proc" do
|
460
|
-
|
461
|
-
before do
|
462
|
-
Band.store_in(session: ->{ :mongohq_single })
|
463
|
-
end
|
464
|
-
|
465
|
-
it_behaves_like "an overridden session to a mongohq single server"
|
466
|
-
end
|
467
|
-
|
468
|
-
context "when overriding with a string" do
|
469
|
-
|
470
|
-
before do
|
471
|
-
Band.store_in(session: "mongohq_single")
|
472
|
-
end
|
473
|
-
|
474
|
-
it_behaves_like "an overridden session to a mongohq single server"
|
475
|
-
end
|
476
|
-
|
477
|
-
context "when overriding with a symbol" do
|
478
|
-
|
479
|
-
before do
|
480
|
-
Band.store_in(session: :mongohq_single)
|
481
|
-
end
|
482
|
-
|
483
|
-
it_behaves_like "an overridden session to a mongohq single server"
|
484
|
-
end
|
485
|
-
end
|
486
|
-
|
487
|
-
context "when overriding to a mongohq replica set", config: :mongohq do
|
488
|
-
|
489
|
-
let(:band) do
|
490
|
-
Band.new
|
491
|
-
end
|
492
|
-
|
493
|
-
let(:replica_session) do
|
494
|
-
band.mongo_session
|
495
|
-
end
|
496
|
-
|
497
|
-
shared_examples_for "an overridden session to a mongohq replica set" do
|
498
|
-
|
499
|
-
let(:seeds) do
|
500
|
-
replica_session.cluster.seeds.map{ |node| node.address.original }
|
501
|
-
end
|
502
|
-
|
503
|
-
it "returns the overridden session" do
|
504
|
-
expect(seeds).to eq([ ENV["MONGOHQ_REPL_1_URL"], ENV["MONGOHQ_REPL_2_URL"] ])
|
505
|
-
end
|
506
|
-
end
|
507
|
-
|
508
|
-
context "when overriding with a proc" do
|
509
|
-
|
510
|
-
before do
|
511
|
-
Band.store_in(session: ->{ :mongohq_repl })
|
512
|
-
end
|
513
|
-
|
514
|
-
it_behaves_like "an overridden session to a mongohq replica set"
|
515
|
-
end
|
516
|
-
|
517
|
-
context "when overriding with a string" do
|
518
|
-
|
519
|
-
before do
|
520
|
-
Band.store_in(session: "mongohq_repl")
|
521
|
-
end
|
522
|
-
|
523
|
-
it_behaves_like "an overridden session to a mongohq replica set"
|
524
|
-
end
|
525
|
-
|
526
|
-
context "when overriding with a symbol" do
|
527
|
-
|
528
|
-
before do
|
529
|
-
Band.store_in(session: :mongohq_repl)
|
530
|
-
end
|
531
|
-
|
532
|
-
it_behaves_like "an overridden session to a mongohq replica set"
|
533
|
-
end
|
534
|
-
end
|
535
|
-
|
536
|
-
context "when overriding to a mongohq replica set with uri config", config: :mongohq do
|
537
|
-
|
538
|
-
before(:all) do
|
539
|
-
Band.store_in(session: :mongohq_repl_uri)
|
540
|
-
end
|
541
|
-
|
542
|
-
let(:band) do
|
543
|
-
Band.new
|
544
|
-
end
|
545
|
-
|
546
|
-
let(:repl_session) do
|
547
|
-
band.mongo_session
|
548
|
-
end
|
549
|
-
|
550
|
-
let(:seeds) do
|
551
|
-
repl_session.cluster.seeds.map{ |node| node.address.original }
|
552
|
-
end
|
553
|
-
|
554
|
-
it "returns the overridden session" do
|
555
|
-
expect(seeds).to eq([ ENV["MONGOHQ_REPL_1_URL"], ENV["MONGOHQ_REPL_2_URL"] ])
|
556
|
-
end
|
557
|
-
end
|
558
|
-
|
559
|
-
context "when no session exists with the key" do
|
560
|
-
|
561
|
-
before(:all) do
|
562
|
-
Band.store_in(session: :nonexistant)
|
563
|
-
end
|
564
|
-
|
565
|
-
let(:band) do
|
566
|
-
Band.new
|
567
|
-
end
|
568
|
-
|
569
|
-
it "raises an error" do
|
570
|
-
expect {
|
571
|
-
band.mongo_session
|
572
|
-
}.to raise_error(Mongoid::Errors::NoSessionConfig)
|
573
|
-
end
|
574
|
-
end
|
575
|
-
end
|
576
|
-
|
577
|
-
describe ".mongo_session" do
|
578
|
-
|
579
|
-
let(:file) do
|
580
|
-
File.join(File.dirname(__FILE__), "..", "config", "mongoid.yml")
|
581
|
-
end
|
582
|
-
|
583
|
-
before do
|
584
|
-
described_class.clear
|
585
|
-
Mongoid.load!(file, :test)
|
586
|
-
Mongoid.sessions[:default][:database] = database_id
|
587
|
-
end
|
588
|
-
|
589
|
-
after do
|
590
|
-
Band.reset_storage_options!
|
591
|
-
end
|
592
|
-
|
593
|
-
context "when getting the default" do
|
594
|
-
|
595
|
-
let(:file) do
|
596
|
-
File.join(File.dirname(__FILE__), "..", "config", "mongoid.yml")
|
597
|
-
end
|
598
|
-
|
599
|
-
before do
|
600
|
-
Band.reset_storage_options!
|
601
|
-
described_class.clear
|
602
|
-
Mongoid.load!(file, :test)
|
603
|
-
Mongoid.sessions[:default][:database] = database_id
|
604
|
-
end
|
605
|
-
|
606
|
-
let!(:mongo_session) do
|
607
|
-
Band.mongo_session
|
608
|
-
end
|
609
|
-
|
610
|
-
it "returns the default session" do
|
611
|
-
expect(mongo_session.options[:database].to_s).to eq(database_id)
|
612
|
-
end
|
613
|
-
end
|
614
|
-
|
615
|
-
context "when overriding to a monghq single server", config: :mongohq do
|
616
|
-
|
617
|
-
before(:all) do
|
618
|
-
Band.store_in(session: :mongohq_single)
|
619
|
-
end
|
620
|
-
|
621
|
-
let(:session) do
|
622
|
-
Band.mongo_session
|
623
|
-
end
|
624
|
-
|
625
|
-
it "returns the default session" do
|
626
|
-
expect(session.options[:database].to_s).to eq(ENV["MONGOHQ_SINGLE_NAME"])
|
627
|
-
end
|
628
|
-
end
|
629
|
-
|
630
|
-
context "when overriding to a mongohq replica set", config: :mongohq do
|
631
|
-
|
632
|
-
before(:all) do
|
633
|
-
Band.store_in(session: :mongohq_repl)
|
634
|
-
end
|
635
|
-
|
636
|
-
let(:repl_session) do
|
637
|
-
Band.mongo_session
|
638
|
-
end
|
639
|
-
|
640
|
-
let(:seeds) do
|
641
|
-
repl_session.cluster.seeds.map{ |node| node.address.original }
|
642
|
-
end
|
643
|
-
|
644
|
-
it "returns the overridden session" do
|
645
|
-
expect(seeds).to eq([ ENV["MONGOHQ_REPL_1_URL"], ENV["MONGOHQ_REPL_2_URL"] ])
|
646
|
-
end
|
647
|
-
end
|
648
|
-
|
649
|
-
context "when no session exists with the key" do
|
650
|
-
|
651
|
-
before(:all) do
|
652
|
-
Band.store_in(session: :nonexistant)
|
653
|
-
end
|
654
|
-
|
655
|
-
it "raises an error" do
|
656
|
-
expect {
|
657
|
-
Band.mongo_session
|
658
|
-
}.to raise_error(Mongoid::Errors::NoSessionConfig)
|
659
|
-
end
|
660
|
-
end
|
661
|
-
end
|
662
|
-
|
663
|
-
describe ".store_in" do
|
664
|
-
|
665
|
-
context "when provided a non hash" do
|
666
|
-
|
667
|
-
it "raises an error" do
|
668
|
-
expect {
|
669
|
-
Band.store_in :artists
|
670
|
-
}.to raise_error(Mongoid::Errors::InvalidStorageOptions)
|
671
|
-
end
|
672
|
-
end
|
673
|
-
|
674
|
-
context "when provided a class that extend another document" do
|
675
|
-
|
676
|
-
let(:klass) do
|
677
|
-
Class.new(Band)
|
678
|
-
end
|
679
|
-
|
680
|
-
it "raises an error" do
|
681
|
-
expect {
|
682
|
-
klass.store_in(database: :artists)
|
683
|
-
}.to raise_error(Mongoid::Errors::InvalidStorageParent)
|
684
|
-
end
|
685
|
-
end
|
686
|
-
|
687
|
-
context "when provided a hash" do
|
688
|
-
|
689
|
-
context "when the hash is not valid" do
|
690
|
-
|
691
|
-
it "raises an error" do
|
692
|
-
expect {
|
693
|
-
Band.store_in coll: "artists"
|
694
|
-
}.to raise_error(Mongoid::Errors::InvalidStorageOptions)
|
695
|
-
end
|
696
|
-
end
|
697
|
-
end
|
698
|
-
end
|
699
|
-
|
700
|
-
describe ".with" do
|
701
|
-
|
702
|
-
context "when sending operations to a different database" do
|
703
|
-
|
704
|
-
after do
|
705
|
-
Band.with(database: database_id_alt).delete_all
|
706
|
-
end
|
707
|
-
|
708
|
-
describe ".create" do
|
709
|
-
|
710
|
-
let!(:band) do
|
711
|
-
Band.with(database: database_id_alt).create
|
712
|
-
end
|
713
|
-
|
714
|
-
it "does not persist to the default database" do
|
715
|
-
expect {
|
716
|
-
Band.find(band.id)
|
717
|
-
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
718
|
-
end
|
719
|
-
|
720
|
-
let(:from_db) do
|
721
|
-
Band.with(database: database_id_alt).find(band.id)
|
722
|
-
end
|
723
|
-
|
724
|
-
it "persists to the specified database" do
|
725
|
-
expect(from_db).to eq(band)
|
726
|
-
end
|
727
|
-
|
728
|
-
it "persists the correct number of documents" do
|
729
|
-
expect(Band.with(database: database_id_alt).count).to eq(1)
|
730
|
-
end
|
731
|
-
end
|
732
|
-
|
733
|
-
describe ".map_reduce", config: :mongohq do
|
734
|
-
|
735
|
-
let(:map) do
|
736
|
-
%Q{
|
737
|
-
function() {
|
738
|
-
emit(this.name, { likes: this.likes });
|
739
|
-
}}
|
740
|
-
end
|
741
|
-
|
742
|
-
let(:reduce) do
|
743
|
-
%Q{
|
744
|
-
function(key, values) {
|
745
|
-
var result = { likes: 0 };
|
746
|
-
values.forEach(function(value) {
|
747
|
-
result.likes += value.likes;
|
748
|
-
});
|
749
|
-
return result;
|
750
|
-
}}
|
751
|
-
end
|
752
|
-
|
753
|
-
before do
|
754
|
-
Band.with(database: database_id_alt).delete_all
|
755
|
-
end
|
756
|
-
|
757
|
-
let!(:depeche_mode) do
|
758
|
-
Band.with(database: database_id_alt).
|
759
|
-
create(name: "Depeche Mode", likes: 200)
|
760
|
-
end
|
761
|
-
|
762
|
-
let!(:tool) do
|
763
|
-
Band.with(database: database_id_alt).
|
764
|
-
create(name: "Tool", likes: 100)
|
765
|
-
end
|
766
|
-
|
767
|
-
context "when outputting in memory" do
|
768
|
-
|
769
|
-
let(:results) do
|
770
|
-
Band.with(database: database_id_alt).
|
771
|
-
map_reduce(map, reduce).out(inline: 1)
|
772
|
-
end
|
773
|
-
|
774
|
-
it "executes the map/reduce on the correct database" do
|
775
|
-
expect(results.first["value"]).to eq({ "likes" => 200 })
|
776
|
-
end
|
777
|
-
end
|
778
|
-
|
779
|
-
context "when outputting to a collection" do
|
780
|
-
|
781
|
-
let(:results) do
|
782
|
-
Band.with(database: database_id_alt).
|
783
|
-
map_reduce(map, reduce).out(replace: "bands_output")
|
784
|
-
end
|
785
|
-
|
786
|
-
it "executes the map/reduce on the correct database" do
|
787
|
-
expect(results.first["value"]).to eq({ "likes" => 200 })
|
788
|
-
end
|
789
|
-
end
|
790
|
-
end
|
791
|
-
end
|
792
|
-
|
793
|
-
context "when sending operations to a different collection" do
|
794
|
-
|
795
|
-
describe ".create" do
|
796
|
-
|
797
|
-
let!(:band) do
|
798
|
-
Band.with(collection: "artists").create
|
799
|
-
end
|
800
|
-
|
801
|
-
it "does not persist to the default database" do
|
802
|
-
expect {
|
803
|
-
Band.find(band.id)
|
804
|
-
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
805
|
-
end
|
806
|
-
|
807
|
-
let(:from_db) do
|
808
|
-
Band.with(collection: "artists").find(band.id)
|
809
|
-
end
|
810
|
-
|
811
|
-
it "persists to the specified database" do
|
812
|
-
expect(from_db).to eq(band)
|
813
|
-
end
|
814
|
-
|
815
|
-
it "persists the correct number of documents" do
|
816
|
-
expect(Band.with(collection: "artists").count).to eq(1)
|
817
|
-
end
|
818
|
-
end
|
819
|
-
|
820
|
-
describe ".map_reduce", config: :mongohq do
|
821
|
-
|
822
|
-
let(:map) do
|
823
|
-
%Q{
|
824
|
-
function() {
|
825
|
-
emit(this.name, { likes: this.likes });
|
826
|
-
}}
|
827
|
-
end
|
828
|
-
|
829
|
-
let(:reduce) do
|
830
|
-
%Q{
|
831
|
-
function(key, values) {
|
832
|
-
var result = { likes: 0 };
|
833
|
-
values.forEach(function(value) {
|
834
|
-
result.likes += value.likes;
|
835
|
-
});
|
836
|
-
return result;
|
837
|
-
}}
|
838
|
-
end
|
839
|
-
|
840
|
-
before do
|
841
|
-
Band.with(collection: "artists").delete_all
|
842
|
-
end
|
843
|
-
|
844
|
-
let!(:depeche_mode) do
|
845
|
-
Band.with(collection: "artists").
|
846
|
-
create(name: "Depeche Mode", likes: 200)
|
847
|
-
end
|
848
|
-
|
849
|
-
let!(:tool) do
|
850
|
-
Band.with(collection: "artists").
|
851
|
-
create(name: "Tool", likes: 100)
|
852
|
-
end
|
853
|
-
|
854
|
-
let(:results) do
|
855
|
-
Band.with(collection: "artists").
|
856
|
-
map_reduce(map, reduce).out(inline: 1)
|
857
|
-
end
|
858
|
-
|
859
|
-
it "executes the map/reduce on the correct collection" do
|
860
|
-
expect(results.first["value"]).to eq({ "likes" => 200 })
|
861
|
-
end
|
862
|
-
end
|
863
|
-
end
|
864
|
-
|
865
|
-
context "when sending operations to a different session" do
|
866
|
-
|
867
|
-
describe ".create" do
|
868
|
-
|
869
|
-
let(:file) do
|
870
|
-
File.join(File.dirname(__FILE__), "..", "config", "mongoid.yml")
|
871
|
-
end
|
872
|
-
|
873
|
-
before do
|
874
|
-
described_class.clear
|
875
|
-
Mongoid.load!(file, :test)
|
876
|
-
end
|
877
|
-
|
878
|
-
context "when sending to a mongohq single server", config: :mongohq do
|
879
|
-
|
880
|
-
let!(:band) do
|
881
|
-
Band.with(
|
882
|
-
session: "mongohq_single",
|
883
|
-
database: database_id
|
884
|
-
).create
|
885
|
-
end
|
886
|
-
|
887
|
-
let(:from_db) do
|
888
|
-
Band.with(
|
889
|
-
session: "mongohq_single",
|
890
|
-
database: database_id
|
891
|
-
).find(band.id)
|
892
|
-
end
|
893
|
-
|
894
|
-
it "persists to the specified database" do
|
895
|
-
expect(from_db).to eq(band)
|
896
|
-
end
|
897
|
-
end
|
898
|
-
|
899
|
-
context "when sending to a mongohq replica set", config: :mongohq do
|
900
|
-
|
901
|
-
let!(:band) do
|
902
|
-
Band.with(
|
903
|
-
session: "mongohq_repl",
|
904
|
-
database: "mongoid_replica"
|
905
|
-
).create
|
906
|
-
end
|
907
|
-
|
908
|
-
let(:from_db) do
|
909
|
-
Band.with(
|
910
|
-
session: "mongohq_repl",
|
911
|
-
database: "mongoid_replica"
|
912
|
-
).find(band.id)
|
913
|
-
end
|
914
|
-
|
915
|
-
it "persists to the specified database" do
|
916
|
-
expect(from_db).to eq(band)
|
917
|
-
end
|
918
|
-
end
|
919
|
-
|
920
|
-
context "when sending to a mongohq replica set with uri config", config: :mongohq do
|
921
|
-
|
922
|
-
let!(:band) do
|
923
|
-
Band.with(
|
924
|
-
session: "mongohq_repl_uri",
|
925
|
-
database: "mongoid_replica"
|
926
|
-
).create
|
927
|
-
end
|
928
|
-
|
929
|
-
let(:from_db) do
|
930
|
-
Band.with(
|
931
|
-
session: "mongohq_repl_uri",
|
932
|
-
database: "mongoid_replica"
|
933
|
-
).find(band.id)
|
934
|
-
end
|
935
|
-
|
936
|
-
it "persists to the specified database" do
|
937
|
-
expect(from_db).to eq(band)
|
938
|
-
end
|
939
|
-
end
|
940
|
-
end
|
941
|
-
|
942
|
-
describe ".map_reduce", config: :mongohq do
|
943
|
-
|
944
|
-
let(:file) do
|
945
|
-
File.join(File.dirname(__FILE__), "..", "config", "mongoid.yml")
|
946
|
-
end
|
947
|
-
|
948
|
-
before do
|
949
|
-
described_class.clear
|
950
|
-
Mongoid.load!(file, :test)
|
951
|
-
end
|
952
|
-
|
953
|
-
let(:map) do
|
954
|
-
%Q{
|
955
|
-
function() {
|
956
|
-
emit(this.name, { likes: this.likes });
|
957
|
-
}}
|
958
|
-
end
|
959
|
-
|
960
|
-
let(:reduce) do
|
961
|
-
%Q{
|
962
|
-
function(key, values) {
|
963
|
-
var result = { likes: 0 };
|
964
|
-
values.forEach(function(value) {
|
965
|
-
result.likes += value.likes;
|
966
|
-
});
|
967
|
-
return result;
|
968
|
-
}}
|
969
|
-
end
|
970
|
-
|
971
|
-
before do
|
972
|
-
Band.with(
|
973
|
-
session: "mongohq_repl",
|
974
|
-
database: "mongoid_replica"
|
975
|
-
).delete_all
|
976
|
-
end
|
977
|
-
|
978
|
-
let!(:depeche_mode) do
|
979
|
-
Band.with(
|
980
|
-
session: "mongohq_repl",
|
981
|
-
database: "mongoid_replica"
|
982
|
-
).create(name: "Depeche Mode", likes: 200)
|
983
|
-
end
|
984
|
-
|
985
|
-
let!(:tool) do
|
986
|
-
Band.with(
|
987
|
-
session: "mongohq_repl",
|
988
|
-
database: "mongoid_replica"
|
989
|
-
).create(name: "Tool", likes: 100)
|
990
|
-
end
|
991
|
-
|
992
|
-
let(:results) do
|
993
|
-
Band.with(
|
994
|
-
session: "mongohq_repl",
|
995
|
-
database: "mongoid_replica"
|
996
|
-
).map_reduce(map, reduce).out(inline: 1)
|
997
|
-
end
|
998
|
-
|
999
|
-
it "executes the map/reduce on the correct session" do
|
1000
|
-
expect(results.first["value"]).to eq({ "likes" => 200 })
|
1001
|
-
end
|
1002
|
-
end
|
1003
|
-
end
|
1004
|
-
|
1005
|
-
context "when sending operations with safe mode" do
|
1006
|
-
|
1007
|
-
describe ".create" do
|
1008
|
-
|
1009
|
-
before do
|
1010
|
-
Person.create_indexes
|
1011
|
-
Person.create(ssn: "432-97-1111")
|
1012
|
-
end
|
1013
|
-
|
1014
|
-
context "when no error occurs" do
|
1015
|
-
|
1016
|
-
it "inserts the document" do
|
1017
|
-
expect(Person.count).to eq(1)
|
1018
|
-
end
|
1019
|
-
end
|
1020
|
-
|
1021
|
-
context "when a mongodb error occurs" do
|
1022
|
-
|
1023
|
-
it "bubbles up to the caller" do
|
1024
|
-
expect {
|
1025
|
-
Person.create(ssn: "432-97-1111")
|
1026
|
-
}.to raise_error(Moped::Errors::OperationFailure)
|
1027
|
-
end
|
1028
|
-
end
|
1029
|
-
|
1030
|
-
context "when using write -1" do
|
1031
|
-
|
1032
|
-
let(:new_person) do
|
1033
|
-
Person.with(write: {w: -1}).create(ssn: "432-97-1111")
|
1034
|
-
end
|
1035
|
-
|
1036
|
-
it "ignores mongodb error" do
|
1037
|
-
expect(new_person).to_not be nil
|
1038
|
-
end
|
1039
|
-
end
|
1040
|
-
end
|
1041
|
-
|
1042
|
-
describe ".create!" do
|
1043
|
-
|
1044
|
-
before do
|
1045
|
-
Person.create!(ssn: "432-97-1112")
|
1046
|
-
end
|
1047
|
-
|
1048
|
-
context "when no error occurs" do
|
1049
|
-
|
1050
|
-
it "inserts the document" do
|
1051
|
-
expect(Person.count).to eq(1)
|
1052
|
-
end
|
1053
|
-
end
|
1054
|
-
|
1055
|
-
context "when a mongodb error occurs" do
|
1056
|
-
|
1057
|
-
before do
|
1058
|
-
Person.create_indexes
|
1059
|
-
end
|
1060
|
-
|
1061
|
-
it "bubbles up to the caller" do
|
1062
|
-
expect {
|
1063
|
-
Person.create!(ssn: "432-97-1112")
|
1064
|
-
}.to raise_error(Moped::Errors::OperationFailure)
|
1065
|
-
end
|
1066
|
-
end
|
1067
|
-
|
1068
|
-
context "when a validation error occurs" do
|
1069
|
-
|
1070
|
-
it "raises the validation error" do
|
1071
|
-
expect {
|
1072
|
-
Account.create!(name: "this name is way too long")
|
1073
|
-
}.to raise_error(Mongoid::Errors::Validations)
|
1074
|
-
end
|
1075
|
-
end
|
1076
|
-
end
|
1077
|
-
|
1078
|
-
describe ".save" do
|
1079
|
-
|
1080
|
-
before do
|
1081
|
-
Person.create(ssn: "432-97-1113")
|
1082
|
-
end
|
1083
|
-
|
1084
|
-
context "when a mongodb error occurs" do
|
1085
|
-
|
1086
|
-
let(:person) do
|
1087
|
-
Person.new(ssn: "432-97-1113")
|
1088
|
-
end
|
1089
|
-
|
1090
|
-
before do
|
1091
|
-
Person.create_indexes
|
1092
|
-
end
|
1093
|
-
|
1094
|
-
it "bubbles up to the caller" do
|
1095
|
-
expect {
|
1096
|
-
person.save
|
1097
|
-
}.to raise_error(Moped::Errors::OperationFailure)
|
1098
|
-
end
|
1099
|
-
end
|
1100
|
-
end
|
1101
|
-
|
1102
|
-
describe ".save!" do
|
1103
|
-
|
1104
|
-
before do
|
1105
|
-
Person.create!(ssn: "432-97-1114")
|
1106
|
-
end
|
1107
|
-
|
1108
|
-
context "when a mongodb error occurs" do
|
1109
|
-
|
1110
|
-
let(:person) do
|
1111
|
-
Person.new(ssn: "432-97-1114")
|
1112
|
-
end
|
1113
|
-
|
1114
|
-
before do
|
1115
|
-
Person.create_indexes
|
1116
|
-
end
|
1117
|
-
|
1118
|
-
it "bubbles up to the caller" do
|
1119
|
-
expect {
|
1120
|
-
person.save!
|
1121
|
-
}.to raise_error(Moped::Errors::OperationFailure)
|
1122
|
-
end
|
1123
|
-
end
|
1124
|
-
|
1125
|
-
context "when a validation error occurs" do
|
1126
|
-
|
1127
|
-
let(:account) do
|
1128
|
-
Account.new(name: "this name is way too long")
|
1129
|
-
end
|
1130
|
-
|
1131
|
-
it "raises the validation error" do
|
1132
|
-
expect {
|
1133
|
-
account.save!
|
1134
|
-
}.to raise_error(Mongoid::Errors::Validations)
|
1135
|
-
end
|
1136
|
-
end
|
1137
|
-
end
|
1138
|
-
end
|
1139
|
-
end
|
1140
|
-
|
1141
|
-
context "when the default database uses a uri" do
|
1142
|
-
|
1143
|
-
let(:file) do
|
1144
|
-
File.join(File.dirname(__FILE__), "..", "config", "mongoid.yml")
|
1145
|
-
end
|
1146
|
-
|
1147
|
-
let(:config) do
|
1148
|
-
{ default: { uri: "mongodb://localhost:#{PORT}/#{database_id}" }}
|
1149
|
-
end
|
1150
|
-
|
1151
|
-
before do
|
1152
|
-
Mongoid::Threaded.sessions.clear
|
1153
|
-
Mongoid.sessions = config
|
1154
|
-
end
|
1155
|
-
|
1156
|
-
context "when creating a document" do
|
1157
|
-
|
1158
|
-
let!(:band) do
|
1159
|
-
Band.create(name: "Placebo")
|
1160
|
-
end
|
1161
|
-
|
1162
|
-
it "persists the document to the correct database" do
|
1163
|
-
expect(Band.find(band.id)).to eq(band)
|
1164
|
-
end
|
1165
|
-
end
|
1166
|
-
end
|
1167
|
-
|
1168
|
-
context "when overriding the default database "do
|
1169
|
-
|
1170
|
-
let(:file) do
|
1171
|
-
File.join(File.dirname(__FILE__), "..", "config", "mongoid.yml")
|
1172
|
-
end
|
1173
|
-
|
1174
|
-
before do
|
1175
|
-
Mongoid::Config.load!(file, :test)
|
1176
|
-
end
|
1177
|
-
|
1178
|
-
context "when the override is global" do
|
1179
|
-
|
1180
|
-
before do
|
1181
|
-
Mongoid.override_database(:mongoid_optional)
|
1182
|
-
end
|
1183
|
-
|
1184
|
-
after do
|
1185
|
-
Band.delete_all
|
1186
|
-
Mongoid.override_database(nil)
|
1187
|
-
end
|
1188
|
-
|
1189
|
-
let!(:band) do
|
1190
|
-
Band.create(name: "Tool")
|
1191
|
-
end
|
1192
|
-
|
1193
|
-
it "persists to the overridden database" do
|
1194
|
-
Band.mongo_session.with(database: :mongoid_optional) do |sess|
|
1195
|
-
expect(sess[:bands].find(name: "Tool")).to_not be_nil
|
1196
|
-
end
|
1197
|
-
end
|
1198
|
-
end
|
1199
|
-
end
|
1200
|
-
|
1201
|
-
context "when overriding the default session", config: :mongohq do
|
1202
|
-
|
1203
|
-
context "when the override is configured with a uri" do
|
1204
|
-
|
1205
|
-
let(:file) do
|
1206
|
-
File.join(File.dirname(__FILE__), "..", "config", "mongoid.yml")
|
1207
|
-
end
|
1208
|
-
|
1209
|
-
before do
|
1210
|
-
Mongoid::Config.load!(file, :test)
|
1211
|
-
Mongoid.override_session(:mongohq_repl_uri)
|
1212
|
-
end
|
1213
|
-
|
1214
|
-
after do
|
1215
|
-
Mongoid.override_session(nil)
|
1216
|
-
end
|
1217
|
-
|
1218
|
-
it "has some database name on session" do
|
1219
|
-
expect(Band.mongo_session.options[:database]).to eq(:mongoid_replica)
|
1220
|
-
end
|
1221
|
-
end
|
1222
|
-
|
1223
|
-
context "when the override is global" do
|
1224
|
-
|
1225
|
-
let(:file) do
|
1226
|
-
File.join(File.dirname(__FILE__), "..", "config", "mongoid.yml")
|
1227
|
-
end
|
1228
|
-
|
1229
|
-
before do
|
1230
|
-
Mongoid::Config.load!(file, :test)
|
1231
|
-
Mongoid.override_session(:mongohq_single)
|
1232
|
-
end
|
1233
|
-
|
1234
|
-
after do
|
1235
|
-
Band.with(database: database_id).delete_all
|
1236
|
-
Mongoid.override_session(nil)
|
1237
|
-
end
|
1238
|
-
|
1239
|
-
let!(:band) do
|
1240
|
-
Band.with(database: database_id).create(name: "Tool")
|
1241
|
-
end
|
1242
|
-
|
1243
|
-
let(:persisted) do
|
1244
|
-
Band.with(session: :mongohq_single, database: database_id).where(name: "Tool").first
|
1245
|
-
end
|
1246
|
-
|
1247
|
-
it "persists to the overridden session" do
|
1248
|
-
expect(persisted).to eq(band)
|
1249
|
-
end
|
1250
|
-
end
|
1251
|
-
end
|
1252
|
-
end
|