mongo_mapper 0.13.0 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE +1 -1
  3. data/README.md +61 -0
  4. data/examples/keys.rb +1 -1
  5. data/examples/modifiers/set.rb +1 -1
  6. data/examples/querying.rb +1 -1
  7. data/examples/safe.rb +2 -2
  8. data/examples/scopes.rb +1 -1
  9. data/lib/mongo_mapper.rb +7 -0
  10. data/lib/mongo_mapper/connection.rb +16 -37
  11. data/lib/mongo_mapper/document.rb +4 -0
  12. data/lib/mongo_mapper/extensions/array.rb +14 -6
  13. data/lib/mongo_mapper/extensions/hash.rb +15 -3
  14. data/lib/mongo_mapper/extensions/object.rb +4 -0
  15. data/lib/mongo_mapper/extensions/object_id.rb +5 -1
  16. data/lib/mongo_mapper/extensions/string.rb +13 -5
  17. data/lib/mongo_mapper/extensions/symbol.rb +18 -0
  18. data/lib/mongo_mapper/plugins/accessible.rb +15 -5
  19. data/lib/mongo_mapper/plugins/associations.rb +7 -6
  20. data/lib/mongo_mapper/plugins/associations/base.rb +27 -14
  21. data/lib/mongo_mapper/plugins/associations/belongs_to_association.rb +10 -1
  22. data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +9 -8
  23. data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +12 -11
  24. data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +4 -4
  25. data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +60 -29
  26. data/lib/mongo_mapper/plugins/associations/in_foreign_array_proxy.rb +136 -0
  27. data/lib/mongo_mapper/plugins/associations/many_association.rb +4 -2
  28. data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +18 -16
  29. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +55 -48
  30. data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +14 -13
  31. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +7 -6
  32. data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +7 -5
  33. data/lib/mongo_mapper/plugins/associations/one_as_proxy.rb +14 -11
  34. data/lib/mongo_mapper/plugins/associations/one_embedded_polymorphic_proxy.rb +14 -13
  35. data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +9 -9
  36. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +27 -26
  37. data/lib/mongo_mapper/plugins/associations/proxy.rb +36 -29
  38. data/lib/mongo_mapper/plugins/associations/single_association.rb +5 -4
  39. data/lib/mongo_mapper/plugins/callbacks.rb +13 -0
  40. data/lib/mongo_mapper/plugins/counter_cache.rb +97 -0
  41. data/lib/mongo_mapper/plugins/dirty.rb +29 -37
  42. data/lib/mongo_mapper/plugins/document.rb +1 -1
  43. data/lib/mongo_mapper/plugins/dynamic_querying.rb +10 -9
  44. data/lib/mongo_mapper/plugins/dynamic_querying/dynamic_finder.rb +18 -17
  45. data/lib/mongo_mapper/plugins/embedded_callbacks.rb +2 -1
  46. data/lib/mongo_mapper/plugins/embedded_document.rb +1 -1
  47. data/lib/mongo_mapper/plugins/identity_map.rb +4 -2
  48. data/lib/mongo_mapper/plugins/indexes.rb +14 -7
  49. data/lib/mongo_mapper/plugins/keys.rb +170 -151
  50. data/lib/mongo_mapper/plugins/keys/key.rb +27 -16
  51. data/lib/mongo_mapper/plugins/keys/static.rb +45 -0
  52. data/lib/mongo_mapper/plugins/modifiers.rb +64 -38
  53. data/lib/mongo_mapper/plugins/partial_updates.rb +86 -0
  54. data/lib/mongo_mapper/plugins/persistence.rb +13 -8
  55. data/lib/mongo_mapper/plugins/protected.rb +6 -5
  56. data/lib/mongo_mapper/plugins/querying.rb +85 -42
  57. data/lib/mongo_mapper/plugins/querying/decorated_plucky_query.rb +20 -15
  58. data/lib/mongo_mapper/plugins/rails.rb +1 -0
  59. data/lib/mongo_mapper/plugins/safe.rb +10 -4
  60. data/lib/mongo_mapper/plugins/sci.rb +0 -0
  61. data/lib/mongo_mapper/plugins/scopes.rb +78 -7
  62. data/lib/mongo_mapper/plugins/stats.rb +17 -0
  63. data/lib/mongo_mapper/plugins/strong_parameters.rb +26 -0
  64. data/lib/mongo_mapper/plugins/timestamps.rb +1 -0
  65. data/lib/mongo_mapper/plugins/validations.rb +1 -1
  66. data/lib/mongo_mapper/railtie.rb +4 -3
  67. data/lib/mongo_mapper/utils.rb +2 -2
  68. data/lib/mongo_mapper/version.rb +1 -1
  69. data/lib/rails/generators/mongo_mapper/config/config_generator.rb +12 -13
  70. data/lib/rails/generators/mongo_mapper/model/model_generator.rb +9 -9
  71. data/spec/examples.txt +1717 -0
  72. data/spec/functional/accessible_spec.rb +19 -13
  73. data/spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb +13 -13
  74. data/spec/functional/associations/belongs_to_proxy_spec.rb +36 -20
  75. data/spec/functional/associations/in_array_proxy_spec.rb +145 -10
  76. data/spec/functional/associations/in_foreign_array_proxy_spec.rb +321 -0
  77. data/spec/functional/associations/many_documents_as_proxy_spec.rb +6 -6
  78. data/spec/functional/associations/many_documents_proxy_spec.rb +85 -14
  79. data/spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb +13 -13
  80. data/spec/functional/associations/many_embedded_proxy_spec.rb +1 -1
  81. data/spec/functional/associations/many_polymorphic_proxy_spec.rb +4 -4
  82. data/spec/functional/associations/one_as_proxy_spec.rb +10 -10
  83. data/spec/functional/associations/one_embedded_polymorphic_proxy_spec.rb +9 -9
  84. data/spec/functional/associations/one_embedded_proxy_spec.rb +3 -3
  85. data/spec/functional/associations/one_proxy_spec.rb +10 -10
  86. data/spec/functional/associations_spec.rb +3 -3
  87. data/spec/functional/binary_spec.rb +2 -2
  88. data/spec/functional/caching_spec.rb +8 -15
  89. data/spec/functional/callbacks_spec.rb +89 -2
  90. data/spec/functional/counter_cache_spec.rb +235 -0
  91. data/spec/functional/dirty_spec.rb +63 -46
  92. data/spec/functional/document_spec.rb +30 -5
  93. data/spec/functional/dumpable_spec.rb +1 -1
  94. data/spec/functional/embedded_document_spec.rb +17 -17
  95. data/spec/functional/identity_map_spec.rb +29 -16
  96. data/spec/functional/indexes_spec.rb +19 -18
  97. data/spec/functional/keys_spec.rb +86 -28
  98. data/spec/functional/logger_spec.rb +3 -3
  99. data/spec/functional/modifiers_spec.rb +81 -19
  100. data/spec/functional/partial_updates_spec.rb +577 -0
  101. data/spec/functional/protected_spec.rb +14 -14
  102. data/spec/functional/querying_spec.rb +77 -28
  103. data/spec/functional/safe_spec.rb +23 -27
  104. data/spec/functional/sci_spec.rb +9 -9
  105. data/spec/functional/scopes_spec.rb +235 -2
  106. data/spec/functional/static_keys_spec.rb +153 -0
  107. data/spec/functional/stats_spec.rb +86 -0
  108. data/spec/functional/strong_parameters_spec.rb +49 -0
  109. data/spec/functional/touch_spec.rb +1 -1
  110. data/spec/functional/validations_spec.rb +51 -57
  111. data/spec/quality_spec.rb +51 -0
  112. data/spec/spec_helper.rb +37 -9
  113. data/spec/support/matchers.rb +5 -14
  114. data/spec/unit/associations/base_spec.rb +12 -12
  115. data/spec/unit/associations/belongs_to_association_spec.rb +2 -2
  116. data/spec/unit/associations/many_association_spec.rb +2 -2
  117. data/spec/unit/associations/one_association_spec.rb +2 -2
  118. data/spec/unit/associations/proxy_spec.rb +19 -20
  119. data/spec/unit/clone_spec.rb +1 -1
  120. data/spec/unit/document_spec.rb +8 -8
  121. data/spec/unit/dynamic_finder_spec.rb +8 -8
  122. data/spec/unit/embedded_document_spec.rb +18 -19
  123. data/spec/unit/extensions_spec.rb +41 -17
  124. data/spec/unit/identity_map_middleware_spec.rb +65 -96
  125. data/spec/unit/key_spec.rb +28 -26
  126. data/spec/unit/keys_spec.rb +20 -11
  127. data/spec/unit/model_generator_spec.rb +0 -0
  128. data/spec/unit/mongo_mapper_spec.rb +38 -85
  129. data/spec/unit/rails_spec.rb +5 -0
  130. data/spec/unit/serialization_spec.rb +1 -1
  131. data/spec/unit/time_zones_spec.rb +2 -2
  132. data/spec/unit/validations_spec.rb +46 -33
  133. metadata +66 -37
  134. data/README.rdoc +0 -59
  135. data/lib/mongo_mapper/connections/10gen.rb +0 -0
  136. data/lib/mongo_mapper/connections/moped.rb +0 -0
  137. data/lib/mongo_mapper/extensions/ordered_hash.rb +0 -23
@@ -3,12 +3,12 @@ require 'spec_helper'
3
3
  describe "Single collection inheritance (document)" do
4
4
  context "without a connection", :without_connection => true do
5
5
  it "should attempt to create a connection during inheritance" do
6
- Mongo::MongoClient.should_not_receive(:new)
6
+ Mongo::Client.should_not_receive(:new)
7
7
  doc = Class.new
8
8
  doc.send(:include, MongoMapper::Document)
9
- expect {
9
+ lambda {
10
10
  Class.new(doc)
11
- }.to_not raise_error
11
+ }.should_not raise_error
12
12
  end
13
13
 
14
14
  it "should pick up a connection if one wasn't set" do
@@ -17,7 +17,7 @@ describe "Single collection inheritance (document)" do
17
17
  klass = Class.new(doc)
18
18
  klass.connection.should be_nil
19
19
  MongoMapper.connection
20
- klass.connection.should be_a Mongo::MongoClient
20
+ klass.connection.should be_a Mongo::Client
21
21
  end
22
22
  end
23
23
 
@@ -27,7 +27,7 @@ describe "Single collection inheritance (document)" do
27
27
  include MongoMapper::Document
28
28
  key :name, String
29
29
  end
30
- DocParent.collection.remove
30
+ DocParent.collection.drop
31
31
 
32
32
  class ::DocDaughter < ::DocParent; end
33
33
  class ::DocSon < ::DocParent; end
@@ -49,7 +49,7 @@ describe "Single collection inheritance (document)" do
49
49
  end
50
50
 
51
51
  it "should automatically add _type key to store class" do
52
- DocParent.key?(:_type).should be_true
52
+ DocParent.key?(:_type).should be_truthy
53
53
  end
54
54
 
55
55
  it "should use modifiers properly" do
@@ -61,7 +61,7 @@ describe "Single collection inheritance (document)" do
61
61
  it "should use the same connection in the subclass" do
62
62
  parent_class = Class.new do
63
63
  include MongoMapper::Document
64
- connection Mongo::MongoClient.new
64
+ connection Mongo::Client.new(['127.0.0.1:27017'])
65
65
  end
66
66
 
67
67
  child_class = Class.new(parent_class) do
@@ -323,7 +323,7 @@ describe "Single collection inheritance (document)" do
323
323
  end
324
324
 
325
325
  it "should automatically add _type key" do
326
- Grandparent.key?(:_type).should be_true
326
+ Grandparent.key?(:_type).should be_truthy
327
327
  end
328
328
 
329
329
  context ".single_collection_inherited?" do
@@ -377,4 +377,4 @@ describe "Single collection inheritance (document)" do
377
377
  p.reload.article_parent.sci_polymorphic_posts.all.should include(p)
378
378
  end
379
379
  end
380
- end
380
+ end
@@ -66,7 +66,7 @@ describe "Scopes" do
66
66
  @document.class_eval do
67
67
  scope :age, lambda { |age| {:age => age} }
68
68
  scope :ages, lambda { |low, high| {:age.gte => low, :age.lte => high} }
69
- scope :ordered, lambda { |sort| sort(sort) }
69
+ scope :ordered, lambda { |s| sort(s) }
70
70
  end
71
71
  end
72
72
 
@@ -170,7 +170,7 @@ describe "Scopes" do
170
170
  key :title, String
171
171
  key :published_at, Time
172
172
  end
173
- Item.collection.remove
173
+ Item.collection.drop
174
174
 
175
175
  class ::Page < ::Item; end
176
176
  class ::Blog < ::Item
@@ -201,4 +201,237 @@ describe "Scopes" do
201
201
  end
202
202
  end
203
203
  end
204
+
205
+ describe "with_scope" do
206
+ describe "with a base query" do
207
+ before do
208
+ @klass = Doc do
209
+ end
210
+ end
211
+
212
+ it "should scope" do
213
+ u1 = @klass.create!(:first_name => "Scott")
214
+ u2 = @klass.create!(:first_name => "Andrew")
215
+
216
+ run = false
217
+
218
+ @klass.with_scope(:first_name => "Scott") do
219
+ run = true
220
+ @klass.all.should == [u1]
221
+ end
222
+
223
+ run.should == true
224
+ end
225
+
226
+ it "should return the scope at the end of the block" do
227
+ u1 = @klass.create!(:first_name => "Scott")
228
+ u2 = @klass.create!(:first_name => "Andrew")
229
+
230
+ run = false
231
+
232
+ @klass.with_scope(:first_name => "Scott") do
233
+ run = true
234
+ @klass.all.should == [u1]
235
+ end
236
+
237
+ run.should == true
238
+
239
+ @klass.all.should include(u1)
240
+ @klass.all.should include(u2)
241
+ end
242
+
243
+ it "should be able to use an unscoped query" do
244
+ u1 = @klass.create!(:first_name => "Scott")
245
+ u2 = @klass.create!(:first_name => "Andrew")
246
+
247
+ run = false
248
+
249
+ @klass.with_scope(:first_name => "Scott") do
250
+ @klass.unscoped do
251
+ run = true
252
+ @klass.all.should include(u1)
253
+ @klass.all.should include(u2)
254
+ end
255
+
256
+ @klass.all.should == [u1]
257
+ end
258
+
259
+ run.should == true
260
+
261
+ @klass.all.should include(u1)
262
+ @klass.all.should include(u2)
263
+ end
264
+
265
+ it "should return the value of the block" do
266
+ u1 = @klass.create!(:first_name => "Scott")
267
+ u2 = @klass.create!(:first_name => "Andrew")
268
+
269
+ result = @klass.with_scope(:first_name => "Scott") do
270
+ @klass.all
271
+ end
272
+
273
+ result.should == [u1]
274
+ end
275
+
276
+ it "should have an empty list of default scope" do
277
+ @klass.default_scopes.should == []
278
+ end
279
+
280
+ it "should apply the default scope to all queries" do
281
+ @klass.key :active, Boolean, :default => true
282
+
283
+ normal = @klass.create!
284
+ inactive = @klass.create!(:active => false)
285
+
286
+ @klass.default_scope do
287
+ {
288
+ :active => true
289
+ }
290
+ end
291
+
292
+ @klass.all.should == [normal]
293
+ end
294
+
295
+ it "should allow multiple default scopes" do
296
+ @klass.key :active, Boolean, :default => true
297
+ @klass.key :soft_deleted, Boolean, :default => false
298
+
299
+ normal = @klass.create!
300
+ inactive = @klass.create!(:active => false)
301
+ deleted = @klass.create!(:soft_deleted => true)
302
+
303
+ @klass.default_scope do
304
+ {
305
+ :active => true,
306
+ }
307
+ end
308
+
309
+ @klass.default_scope do
310
+ {
311
+ :soft_deleted => false
312
+ }
313
+ end
314
+
315
+ @klass.all.should == [normal]
316
+ end
317
+
318
+ it "should allow a where inside a default_scope" do
319
+ @klass.key :active, Boolean, :default => true
320
+
321
+ normal = @klass.create!
322
+ inactive = @klass.create!(:active => false)
323
+
324
+ @klass.default_scope do
325
+ where(:active => true)
326
+ end
327
+
328
+ @klass.all.should == [normal]
329
+ end
330
+
331
+ it "should allow a hash directly" do
332
+ @klass.key :active, Boolean, :default => true
333
+
334
+ normal = @klass.create!
335
+ inactive = @klass.create!(:active => false)
336
+
337
+ @klass.default_scope :active => true
338
+
339
+ @klass.all.should == [normal]
340
+ end
341
+
342
+ it "should inherit default scopes, but only downwards" do
343
+ @klass.default_scope do
344
+ where(:active => true)
345
+ end
346
+ @subclass = Class.new(@klass)
347
+ @subclass.default_scopes.length.should == 1
348
+
349
+ @subclass.default_scope do
350
+ {
351
+ :foo => :bar
352
+ }
353
+ end
354
+
355
+ @subclass.default_scopes.length.should == 2
356
+ @klass.default_scopes.length.should == 1
357
+ end
358
+ end
359
+ end
360
+
361
+ describe "regression - multiple named scopes" do
362
+ it "should merge the hashes from multiple scopes" do
363
+ klass = Doc do
364
+ key :a, Boolean
365
+ key :b, Boolean
366
+ key :c, Boolean
367
+
368
+ scope :one, where(:a => true, :b => true)
369
+ scope :two, where(:c => true)
370
+ end
371
+
372
+ obj = klass.create!(:a => false, :b => true, :c => true)
373
+ klass.one.two.all.should == []
374
+
375
+ obj2 = klass.create(:a => true, :b => true, :c => true)
376
+ klass.one.two.all.should == [obj2]
377
+ end
378
+ end
379
+
380
+ describe "regression - with multiple scopes that set a key to nil" do
381
+ it "should still have the query as nil" do
382
+ klass = Doc do
383
+ key :a, Boolean
384
+
385
+ scope :one, lambda {
386
+ {
387
+ :a => nil
388
+ }
389
+ }
390
+ scope :two, lambda {
391
+ {
392
+ :a => nil
393
+ }
394
+ }
395
+ end
396
+
397
+ obj = klass.create!(:a => nil)
398
+ klass.one.two.all.should == [obj]
399
+ end
400
+ end
401
+
402
+ describe "regression - multiple scopes leading to empty query (array bug?)" do
403
+ before do
404
+ @klass = Doc do
405
+ key :send_at, Time
406
+
407
+ scope :unsent, lambda {
408
+ now = Time.now
409
+
410
+ {
411
+ send_at: {
412
+ '$lte' => now,
413
+ '$gte' => now - 30.days,
414
+ },
415
+ sent_at: nil,
416
+ }
417
+ }
418
+
419
+ scope :sorted, lambda {
420
+ sort(send_at: 1)
421
+ }
422
+ end
423
+ end
424
+
425
+ it "should filter properly by dates" do
426
+ old_obj = @klass.create(send_at: 3.months.ago)
427
+ one_day_ago = @klass.create(send_at: 1.day.ago)
428
+ two_days_ago = @klass.create(send_at: 2.days.ago)
429
+
430
+ all_unsorted = @klass.unsent.all
431
+
432
+ all_unsorted.should include(one_day_ago)
433
+ all_unsorted.should include(two_days_ago)
434
+ @klass.unsent.sorted.all.should == [two_days_ago, one_day_ago]
435
+ end
436
+ end
204
437
  end
@@ -0,0 +1,153 @@
1
+ require 'spec_helper'
2
+
3
+ describe MongoMapper::Plugins::Keys::Static do
4
+ before do
5
+ @klass = Class.new do
6
+ include MongoMapper::Document
7
+ end
8
+ end
9
+
10
+ it "is off by default" do
11
+ @klass.static_keys.should == false
12
+ end
13
+
14
+ it "can be turned on" do
15
+ @klass.static_keys = true
16
+ @klass.static_keys.should == true
17
+ end
18
+
19
+ describe "a class with static keys" do
20
+ before do
21
+ @klass = Class.new do
22
+ include MongoMapper::Document
23
+
24
+ self.static_keys = true
25
+
26
+ attr_accessor :an_accessor
27
+
28
+ key "valid_key", String
29
+ end
30
+
31
+ @obj = @klass.new
32
+ end
33
+
34
+ it "should be able to assign to a valid key" do
35
+ @obj.valid_key = "foo"
36
+ @obj.valid_key.should == "foo"
37
+ end
38
+
39
+ it "should raise a MissingKeyError if trying to assign to a field that does not exist" do
40
+ lambda {
41
+ @obj['foo'] = "foo"
42
+ }.should raise_error(MongoMapper::Plugins::Keys::Static::MissingKeyError)
43
+ end
44
+
45
+ it "should raise a MissingKeyError if trying to read from a field that does not exist" do
46
+ lambda {
47
+ @obj['foo']
48
+ }.should raise_error(MongoMapper::Plugins::Keys::Static::MissingKeyError)
49
+ end
50
+
51
+ it "should raise a MissingKeyError if trying to set attributes= to a field that does not exist" do
52
+ lambda {
53
+ @obj.attributes = {:foo => "foo"}
54
+ }.should raise_error(MongoMapper::Plugins::Keys::Static::MissingKeyError)
55
+ end
56
+
57
+ it "should be able to call a method" do
58
+ @obj.an_accessor = :bar
59
+ @obj.an_accessor.should == :bar
60
+ end
61
+
62
+ it "should raise a NoMethodError if trying to call the non-existant key method" do
63
+ lambda {
64
+ @obj.foo
65
+ }.should raise_error(NoMethodError)
66
+ end
67
+
68
+ it "should raise for read_key" do
69
+ lambda {
70
+ @obj.read_key('foo')
71
+ }.should raise_error(MongoMapper::Plugins::Keys::Static::MissingKeyError)
72
+ end
73
+
74
+ it "should raise for attribute" do
75
+ lambda {
76
+ @obj.attribute('foo')
77
+ }.should raise_error(MongoMapper::Plugins::Keys::Static::MissingKeyError)
78
+ end
79
+
80
+ it "should not raise if trying to assign to a field that exists (but with a symbol instead of a string)" do
81
+ lambda {
82
+ @obj.write_key(:valid_key, "foo")
83
+ }.should_not raise_error
84
+
85
+ @obj.valid_key.should == "foo"
86
+ end
87
+
88
+ it "should not raise a MissingKeyError if trying to read from a field that exists (but with a symbol instead of a string)" do
89
+ lambda {
90
+ @obj[:valid_key]
91
+ }.should_not raise_error
92
+ end
93
+
94
+ it "should not blow up when loading if there is a key defined in the db that has not been defined (but it should not load it)" do
95
+ @klass.collection.insert_one({ :foo => "bar", :valid_key => "something" })
96
+ @obj = @klass.first
97
+ @obj.valid_key.should == "something"
98
+
99
+ lambda {
100
+ @obj.foo
101
+ }.should raise_error(NoMethodError)
102
+ end
103
+ end
104
+
105
+ describe "a class without static keys" do
106
+ before do
107
+ @klass = Class.new do
108
+ include MongoMapper::Document
109
+ key :valid_key, String
110
+ end
111
+
112
+ @obj = @klass.new
113
+ end
114
+
115
+ it "should be able to assign to a valid key" do
116
+ @obj.valid_key = "foo"
117
+ @obj.valid_key.should == "foo"
118
+ end
119
+
120
+ it "should be able to read and assign a dynamic key" do
121
+ @obj['foo'].should be_nil
122
+ @obj['foo'] = "bar"
123
+ @obj['foo'].should == "bar"
124
+ end
125
+ end
126
+
127
+ describe "with mixed static + non static models" do
128
+ before do
129
+ @static_model = Class.new do
130
+ include MongoMapper::Document
131
+ self.static_keys = true
132
+ end
133
+
134
+ @non_static_model = Class.new do
135
+ include MongoMapper::Document
136
+ self.static_keys = false
137
+ end
138
+
139
+ @static_key_object = @static_model.new
140
+ @non_static_key_object = @non_static_model.new
141
+ end
142
+
143
+ it "should allow non-static key assignment to one, only static assignment to the other" do
144
+ @non_static_key_object['foo'] = 'bar'
145
+ @non_static_key_object.foo.should == 'bar'
146
+ @non_static_key_object['foo'].should == 'bar'
147
+
148
+ lambda {
149
+ @static_key_object['foo'] = 'bar'
150
+ }.should raise_error(MongoMapper::Plugins::Keys::Static::MissingKeyError)
151
+ end
152
+ end
153
+ end