mongo_mapper 0.12.0 → 0.13.0.beta1

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 (154) hide show
  1. checksums.yaml +7 -0
  2. data/README.rdoc +35 -13
  3. data/bin/mmconsole +1 -1
  4. data/lib/mongo_mapper.rb +4 -0
  5. data/lib/mongo_mapper/connection.rb +17 -6
  6. data/lib/mongo_mapper/document.rb +1 -0
  7. data/lib/mongo_mapper/exceptions.rb +4 -1
  8. data/lib/mongo_mapper/extensions/binary.rb +1 -1
  9. data/lib/mongo_mapper/extensions/boolean.rb +20 -23
  10. data/lib/mongo_mapper/extensions/date.rb +3 -3
  11. data/lib/mongo_mapper/extensions/integer.rb +5 -1
  12. data/lib/mongo_mapper/extensions/kernel.rb +2 -0
  13. data/lib/mongo_mapper/extensions/ordered_hash.rb +23 -0
  14. data/lib/mongo_mapper/extensions/string.rb +2 -2
  15. data/lib/mongo_mapper/extensions/time.rb +7 -5
  16. data/lib/mongo_mapper/middleware/identity_map.rb +3 -4
  17. data/lib/mongo_mapper/plugins.rb +1 -1
  18. data/lib/mongo_mapper/plugins/associations.rb +11 -5
  19. data/lib/mongo_mapper/plugins/associations/base.rb +5 -3
  20. data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +0 -0
  21. data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +8 -8
  22. data/lib/mongo_mapper/plugins/associations/collection.rb +2 -0
  23. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +32 -7
  24. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +2 -2
  25. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +12 -12
  26. data/lib/mongo_mapper/plugins/associations/proxy.rb +5 -1
  27. data/lib/mongo_mapper/plugins/associations/single_association.rb +6 -6
  28. data/lib/mongo_mapper/plugins/clone.rb +4 -2
  29. data/lib/mongo_mapper/plugins/dirty.rb +22 -21
  30. data/lib/mongo_mapper/plugins/document.rb +4 -4
  31. data/lib/mongo_mapper/plugins/dumpable.rb +22 -0
  32. data/lib/mongo_mapper/plugins/embedded_callbacks.rb +58 -9
  33. data/lib/mongo_mapper/plugins/identity_map.rb +42 -32
  34. data/lib/mongo_mapper/plugins/keys.rb +133 -54
  35. data/lib/mongo_mapper/plugins/keys/key.rb +68 -22
  36. data/lib/mongo_mapper/plugins/modifiers.rb +26 -19
  37. data/lib/mongo_mapper/plugins/persistence.rb +15 -5
  38. data/lib/mongo_mapper/plugins/querying.rb +15 -40
  39. data/lib/mongo_mapper/plugins/querying/{decorator.rb → decorated_plucky_query.rb} +24 -4
  40. data/lib/mongo_mapper/plugins/rails.rb +22 -2
  41. data/lib/mongo_mapper/plugins/safe.rb +8 -5
  42. data/lib/mongo_mapper/plugins/sci.rb +26 -4
  43. data/lib/mongo_mapper/plugins/scopes.rb +5 -4
  44. data/lib/mongo_mapper/plugins/timestamps.rb +11 -4
  45. data/lib/mongo_mapper/plugins/validations.rb +1 -1
  46. data/lib/mongo_mapper/utils.rb +12 -0
  47. data/lib/mongo_mapper/version.rb +1 -1
  48. data/lib/rails/generators/mongo_mapper/config/config_generator.rb +20 -7
  49. data/lib/rails/generators/mongo_mapper/config/templates/mongo.yml +6 -0
  50. data/lib/rails/generators/mongo_mapper/model/model_generator.rb +18 -1
  51. data/lib/rails/generators/mongo_mapper/model/templates/model.rb +9 -5
  52. data/{test/functional/test_accessible.rb → spec/functional/accessible_spec.rb} +29 -29
  53. data/{test/functional/associations/test_belongs_to_polymorphic_proxy.rb → spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb} +10 -10
  54. data/{test/functional/associations/test_belongs_to_proxy.rb → spec/functional/associations/belongs_to_proxy_spec.rb} +82 -64
  55. data/{test/functional/associations/test_in_array_proxy.rb → spec/functional/associations/in_array_proxy_spec.rb} +68 -68
  56. data/{test/functional/associations/test_many_documents_as_proxy.rb → spec/functional/associations/many_documents_as_proxy_spec.rb} +37 -38
  57. data/{test/functional/associations/test_many_documents_proxy.rb → spec/functional/associations/many_documents_proxy_spec.rb} +233 -146
  58. data/{test/functional/associations/test_many_embedded_polymorphic_proxy.rb → spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb} +19 -20
  59. data/{test/functional/associations/test_many_embedded_proxy.rb → spec/functional/associations/many_embedded_proxy_spec.rb} +23 -24
  60. data/{test/functional/associations/test_many_polymorphic_proxy.rb → spec/functional/associations/many_polymorphic_proxy_spec.rb} +45 -46
  61. data/{test/functional/associations/test_one_as_proxy.rb → spec/functional/associations/one_as_proxy_spec.rb} +75 -77
  62. data/{test/functional/associations/test_one_embedded_polymorphic_proxy.rb → spec/functional/associations/one_embedded_polymorphic_proxy_spec.rb} +31 -32
  63. data/{test/functional/associations/test_one_embedded_proxy.rb → spec/functional/associations/one_embedded_proxy_spec.rb} +10 -10
  64. data/{test/functional/associations/test_one_proxy.rb → spec/functional/associations/one_proxy_spec.rb} +125 -102
  65. data/spec/functional/associations_spec.rb +48 -0
  66. data/{test/functional/test_binary.rb → spec/functional/binary_spec.rb} +6 -6
  67. data/spec/functional/caching_spec.rb +75 -0
  68. data/{test/functional/test_callbacks.rb → spec/functional/callbacks_spec.rb} +84 -26
  69. data/{test/functional/test_dirty.rb → spec/functional/dirty_spec.rb} +57 -42
  70. data/{test/functional/test_document.rb → spec/functional/document_spec.rb} +52 -52
  71. data/spec/functional/dumpable_spec.rb +24 -0
  72. data/{test/functional/test_dynamic_querying.rb → spec/functional/dynamic_querying_spec.rb} +14 -14
  73. data/{test/functional/test_embedded_document.rb → spec/functional/embedded_document_spec.rb} +51 -42
  74. data/{test/functional/test_equality.rb → spec/functional/equality_spec.rb} +4 -4
  75. data/spec/functional/extensions_spec.rb +16 -0
  76. data/{test/functional/test_identity_map.rb → spec/functional/identity_map_spec.rb} +73 -61
  77. data/spec/functional/indexes_spec.rb +48 -0
  78. data/spec/functional/keys_spec.rb +224 -0
  79. data/{test/functional/test_logger.rb → spec/functional/logger_spec.rb} +6 -6
  80. data/spec/functional/modifiers_spec.rb +550 -0
  81. data/spec/functional/pagination_spec.rb +89 -0
  82. data/spec/functional/protected_spec.rb +199 -0
  83. data/spec/functional/querying_spec.rb +1003 -0
  84. data/spec/functional/rails_spec.rb +55 -0
  85. data/spec/functional/safe_spec.rb +163 -0
  86. data/{test/functional/test_sci.rb → spec/functional/sci_spec.rb} +123 -34
  87. data/{test/functional/test_scopes.rb → spec/functional/scopes_spec.rb} +59 -26
  88. data/spec/functional/timestamps_spec.rb +97 -0
  89. data/{test/functional/test_touch.rb → spec/functional/touch_spec.rb} +13 -13
  90. data/spec/functional/userstamps_spec.rb +46 -0
  91. data/{test/functional/test_validations.rb → spec/functional/validations_spec.rb} +64 -64
  92. data/spec/spec_helper.rb +81 -0
  93. data/spec/support/matchers.rb +24 -0
  94. data/{test → spec/support}/models.rb +1 -6
  95. data/spec/unit/associations/base_spec.rb +146 -0
  96. data/spec/unit/associations/belongs_to_association_spec.rb +30 -0
  97. data/spec/unit/associations/many_association_spec.rb +64 -0
  98. data/spec/unit/associations/one_association_spec.rb +48 -0
  99. data/{test/unit/associations/test_proxy.rb → spec/unit/associations/proxy_spec.rb} +21 -21
  100. data/{test/unit/test_clone.rb → spec/unit/clone_spec.rb} +21 -11
  101. data/spec/unit/config_generator_spec.rb +24 -0
  102. data/{test/unit/test_document.rb → spec/unit/document_spec.rb} +42 -42
  103. data/{test/unit/test_dynamic_finder.rb → spec/unit/dynamic_finder_spec.rb} +28 -28
  104. data/{test/unit/test_embedded_document.rb → spec/unit/embedded_document_spec.rb} +102 -108
  105. data/{test/unit/test_equality.rb → spec/unit/equality_spec.rb} +7 -7
  106. data/{test/unit/test_exceptions.rb → spec/unit/exceptions_spec.rb} +3 -3
  107. data/{test/unit/test_extensions.rb → spec/unit/extensions_spec.rb} +85 -71
  108. data/spec/unit/identity_map_middleware_spec.rb +134 -0
  109. data/{test/unit/test_inspect.rb → spec/unit/inspect_spec.rb} +8 -8
  110. data/{test/unit/test_key.rb → spec/unit/key_spec.rb} +82 -52
  111. data/spec/unit/keys_spec.rb +155 -0
  112. data/spec/unit/model_generator_spec.rb +47 -0
  113. data/spec/unit/mongo_mapper_spec.rb +184 -0
  114. data/spec/unit/pagination_spec.rb +11 -0
  115. data/{test/unit/test_plugins.rb → spec/unit/plugins_spec.rb} +14 -14
  116. data/spec/unit/rails_compatibility_spec.rb +40 -0
  117. data/{test/unit/test_rails_reflect_on_association.rb → spec/unit/rails_reflect_on_association_spec.rb} +9 -9
  118. data/{test/unit/test_rails.rb → spec/unit/rails_spec.rb} +31 -31
  119. data/spec/unit/serialization_spec.rb +169 -0
  120. data/spec/unit/serializers/json_serializer_spec.rb +218 -0
  121. data/spec/unit/serializers/xml_serializer_spec.rb +198 -0
  122. data/{test/unit/test_time_zones.rb → spec/unit/time_zones_spec.rb} +8 -8
  123. data/{test/unit/test_translation.rb → spec/unit/translation_spec.rb} +6 -6
  124. data/{test/unit/test_validations.rb → spec/unit/validations_spec.rb} +72 -59
  125. metadata +199 -179
  126. data/test/_NOTE_ON_TESTING +0 -1
  127. data/test/functional/test_associations.rb +0 -46
  128. data/test/functional/test_caching.rb +0 -77
  129. data/test/functional/test_indexes.rb +0 -50
  130. data/test/functional/test_modifiers.rb +0 -537
  131. data/test/functional/test_pagination.rb +0 -91
  132. data/test/functional/test_protected.rb +0 -201
  133. data/test/functional/test_querying.rb +0 -935
  134. data/test/functional/test_safe.rb +0 -76
  135. data/test/functional/test_timestamps.rb +0 -62
  136. data/test/functional/test_userstamps.rb +0 -44
  137. data/test/support/railtie.rb +0 -4
  138. data/test/support/railtie/autoloaded.rb +0 -2
  139. data/test/support/railtie/not_autoloaded.rb +0 -3
  140. data/test/support/railtie/parent.rb +0 -3
  141. data/test/test_active_model_lint.rb +0 -18
  142. data/test/test_helper.rb +0 -93
  143. data/test/unit/associations/test_base.rb +0 -146
  144. data/test/unit/associations/test_belongs_to_association.rb +0 -29
  145. data/test/unit/associations/test_many_association.rb +0 -63
  146. data/test/unit/associations/test_one_association.rb +0 -47
  147. data/test/unit/serializers/test_json_serializer.rb +0 -216
  148. data/test/unit/serializers/test_xml_serializer.rb +0 -196
  149. data/test/unit/test_identity_map_middleware.rb +0 -132
  150. data/test/unit/test_keys.rb +0 -65
  151. data/test/unit/test_mongo_mapper.rb +0 -157
  152. data/test/unit/test_pagination.rb +0 -11
  153. data/test/unit/test_rails_compatibility.rb +0 -38
  154. data/test/unit/test_serialization.rb +0 -166
@@ -1,91 +0,0 @@
1
- require 'test_helper'
2
-
3
- class PaginationTest < Test::Unit::TestCase
4
- context "Paginating" do
5
- setup do
6
- @document = Doc do
7
- key :first_name, String
8
- key :last_name, String
9
- key :age, Integer
10
-
11
- def self.per_page; 1 end
12
- end
13
-
14
- @doc1 = @document.create(:first_name => 'John', :last_name => 'Nunemaker', :age => '27')
15
- @doc2 = @document.create(:first_name => 'Steve', :last_name => 'Smith', :age => '28')
16
- @doc3 = @document.create(:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26')
17
- end
18
-
19
- should "return the total pages" do
20
- result = @document.paginate(:per_page => 2, :page => 1)
21
- result.total_pages.should == 2
22
- end
23
-
24
- should "return the total pages when defaulting to the document class per_page" do
25
- result = @document.paginate(:page => 1)
26
- result.total_pages.should == 3
27
- end
28
-
29
- should "return the total of records" do
30
- result = @document.paginate(:per_page => 2, :page => 1)
31
- result.total_entries.should == 3
32
- end
33
-
34
- should "return the items" do
35
- result = @document.paginate(:per_page => 2, :page => 1, :order => 'first_name')
36
- result.size.should == 2
37
- result.should == [@doc1, @doc3]
38
- end
39
-
40
- should "accept conditions" do
41
- result = @document.paginate({
42
- :last_name => 'Nunemaker',
43
- :order => "age DESC",
44
- :per_page => 2,
45
- :page => 1,
46
- })
47
- result.should == [@doc1, @doc3]
48
- result.first.age.should == 27
49
-
50
- result = @document.paginate({
51
- :conditions => {:last_name => 'Nunemaker'},
52
- :order => "age DESC",
53
- :per_page => 2,
54
- :page => 1} )
55
- result.should == [@doc1, @doc3]
56
- result.first.age.should == 27
57
- end
58
-
59
- should "withstand rigor" do
60
- result = @document.paginate({
61
- :per_page => 1,
62
- :page => 1,
63
- :order => 'age desc',
64
- :last_name => 'Nunemaker'
65
- })
66
- result.should == [@doc1]
67
- result.total_entries.should == 2
68
- result.total_pages.should == 2
69
-
70
- result = @document.paginate({
71
- :per_page => 1,
72
- :page => 2,
73
- :order => 'age desc',
74
- :last_name => 'Nunemaker'
75
- })
76
- result.should == [@doc3]
77
- result.total_entries.should == 2
78
- result.total_pages.should == 2
79
-
80
- result = @document.paginate({
81
- :per_page => 2,
82
- :page => 1,
83
- :order => 'age desc',
84
- :last_name => 'Nunemaker'
85
- })
86
- result.should == [@doc1, @doc3]
87
- result.total_entries.should == 2
88
- result.total_pages.should == 1
89
- end
90
- end
91
- end
@@ -1,201 +0,0 @@
1
- require 'test_helper'
2
-
3
- class ProtectedTest < Test::Unit::TestCase
4
- context 'A document with protected attributes' do
5
- setup do
6
- @doc_class = Doc do
7
- key :name, String
8
- key :admin, Boolean, :default => false
9
-
10
- attr_protected :admin
11
- end
12
-
13
- @doc = @doc_class.create(:name => 'Steve Sloan')
14
- end
15
-
16
- should "have protected attributes class method" do
17
- @doc_class.protected_attributes.should == [:admin].to_set
18
- end
19
-
20
- should "default protected attributes to nil" do
21
- Doc().protected_attributes.should be_nil
22
- end
23
-
24
- should "have protected attributes instance method" do
25
- @doc.protected_attributes.should equal(@doc_class.protected_attributes)
26
- end
27
-
28
- should "raise error if there are accessible attributes" do
29
- doc = Doc('Post')
30
- doc.attr_accessible :name
31
- lambda { doc.attr_protected :admin }.
32
- should raise_error(/Declare either attr_protected or attr_accessible for Post/)
33
- end
34
-
35
- should "know if using protected attributes" do
36
- @doc_class.protected_attributes?.should be(true)
37
- Doc().protected_attributes?.should be(false)
38
- end
39
-
40
- should "work with :protected shortcut when defining key" do
41
- Doc() do
42
- key :user_id, ObjectId, :protected => true
43
- end.protected_attributes.should == [:user_id].to_set
44
- end
45
-
46
- should "assign protected attribute through accessor" do
47
- @doc.admin = true
48
- @doc.admin.should be_true
49
- end
50
-
51
- should "ignore protected attribute on #initialize" do
52
- doc = @doc_class.new(:name => 'John', :admin => true)
53
- doc.admin.should be_false
54
- doc.name.should == 'John'
55
- end
56
-
57
- should "not ignore protected attributes on #initialize from the database" do
58
- doc = @doc_class.new(:name => 'John')
59
- doc.admin = true
60
- doc.save!
61
-
62
- doc = @doc_class.first(:name => 'John')
63
- doc.admin.should be_true
64
- doc.name.should == 'John'
65
- end
66
-
67
- should "not ignore protected attributes on #reload" do
68
- doc = @doc_class.new(:name => 'John')
69
- doc.admin = true
70
- doc.save!
71
-
72
- doc.reload
73
- doc.admin.should be_true
74
- doc.name.should == 'John'
75
- end
76
-
77
- should "ignore protected attribute on #update_attribute" do
78
- @doc.update_attribute('admin', true)
79
- @doc.admin.should be_true
80
- end
81
-
82
- should "ignore protected attribute on #update_attributes" do
83
- @doc.update_attributes(:name => 'Ren Hoek', :admin => true)
84
- @doc.name.should == 'Ren Hoek'
85
- @doc.admin.should be_false
86
- end
87
-
88
- should "ignore protected attribute on #update_attributes!" do
89
- @doc.update_attributes!(:name => 'Stimpson J. Cat', :admin => true)
90
- @doc.name.should == 'Stimpson J. Cat'
91
- @doc.admin.should be_false
92
- end
93
-
94
- should "ignore protecteds attribute on #attributes=" do
95
- @doc.attributes = {:name => 'Stimpson J. Cat', :admin => true}
96
- @doc.name.should == 'Stimpson J. Cat'
97
- @doc.admin.should be_false
98
- end
99
-
100
- should "be indifferent to whether the protected keys are strings or symbols" do
101
- @doc.update_attributes!("name" => 'Stimpson J. Cat', "admin" => true)
102
- @doc.name.should == 'Stimpson J. Cat'
103
- @doc.admin.should be_false
104
- end
105
-
106
- should "accept nil as constructor's argument without raising exception" do
107
- lambda { @doc_class.new(nil) }.should_not raise_error
108
- end
109
- end
110
-
111
- context "Single collection inherited protected attributes" do
112
- setup do
113
- class ::GrandParent
114
- include MongoMapper::Document
115
-
116
- key :site_id, ObjectId
117
- attr_protected :site_id
118
- end
119
- GrandParent.collection.remove
120
-
121
- class ::Child < ::GrandParent
122
- key :position, Integer
123
-
124
- attr_protected :position
125
- end
126
-
127
- class ::GrandChild < ::Child; end
128
-
129
- class ::OtherChild < ::GrandParent
130
- key :blog_id, ObjectId
131
-
132
- attr_protected :blog_id
133
- end
134
- end
135
-
136
- teardown do
137
- Object.send :remove_const, 'GrandParent' if defined?(::GrandParent)
138
- Object.send :remove_const, 'Child' if defined?(::Child)
139
- Object.send :remove_const, 'GrandChild' if defined?(::GrandChild)
140
- Object.send :remove_const, 'OtherChild' if defined?(::OtherChild)
141
- end
142
-
143
- should "share keys down the inheritance trail" do
144
- GrandParent.protected_attributes.should == [:site_id].to_set
145
- Child.protected_attributes.should == [:site_id, :position].to_set
146
- GrandChild.protected_attributes.should == [:site_id, :position].to_set
147
- OtherChild.protected_attributes.should == [:site_id, :blog_id].to_set
148
- end
149
- end
150
-
151
- context 'An embedded document with protected attributes' do
152
- setup do
153
- @doc_class = Doc('Project')
154
- @edoc_class = EDoc('Person') do
155
- key :name, String
156
- key :admin, Boolean, :default => false
157
-
158
- attr_protected :admin
159
- end
160
- @doc_class.many :people, :class => @edoc_class
161
-
162
- @doc = @doc_class.create(:title => 'MongoMapper')
163
- @edoc = @edoc_class.new(:name => 'Steve Sloan')
164
- @doc.people << @edoc
165
- end
166
-
167
- should "have protected attributes class method" do
168
- @edoc_class.protected_attributes.should == [:admin].to_set
169
- end
170
-
171
- should "default protected attributes to nil" do
172
- EDoc().protected_attributes.should be_nil
173
- end
174
-
175
- should "have protected attributes instance method" do
176
- @edoc.protected_attributes.should equal(@edoc_class.protected_attributes)
177
- end
178
-
179
- should "assign protected attribute through accessor" do
180
- @edoc.admin = true
181
- @edoc.admin.should be_true
182
- end
183
-
184
- should "not ignore protected attribute on #update_attribute" do
185
- @edoc.update_attribute('admin', true)
186
- @edoc.admin.should be_true
187
- end
188
-
189
- should "ignore protected attribute on #update_attributes" do
190
- @edoc.update_attributes(:name => 'Ren Hoek', :admin => true)
191
- @edoc.name.should == 'Ren Hoek'
192
- @edoc.admin.should be_false
193
- end
194
-
195
- should "ignore protected attribute on #update_attributes!" do
196
- @edoc.update_attributes!(:name => 'Stimpson J. Cat', :admin => true)
197
- @edoc.name.should == 'Stimpson J. Cat'
198
- @edoc.admin.should be_false
199
- end
200
- end
201
- end
@@ -1,935 +0,0 @@
1
- require 'test_helper'
2
-
3
- class QueryingTesting < Test::Unit::TestCase
4
- def setup
5
- @document = Doc do
6
- key :first_name, String
7
- key :last_name, String
8
- key :age, Integer
9
- key :date, Date
10
- end
11
- end
12
-
13
- context ".query" do
14
- setup do
15
- @query = @document.query
16
- end
17
-
18
- should "set model to self" do
19
- @query.model.should == @document
20
- end
21
-
22
- should "always return new instance" do
23
- @document.query.should_not equal(@query)
24
- end
25
-
26
- should "apply options" do
27
- @document.query(:foo => 'bar')[:foo].should == 'bar'
28
- end
29
- end
30
-
31
- context ".criteria_hash" do
32
- setup do
33
- @hash = @document.criteria_hash
34
- end
35
-
36
- should "set object id keys on hash" do
37
- @hash.object_ids.should == [:_id]
38
- end
39
-
40
- should "always return new instance" do
41
- @document.criteria_hash.should_not equal(@hash)
42
- end
43
-
44
- should "apply provided criteria" do
45
- @document.criteria_hash(:foo => 'bar')[:foo].should == 'bar'
46
- end
47
- end
48
-
49
- context ".create (single document)" do
50
- setup do
51
- @doc = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
52
- end
53
-
54
- should "create a document in correct collection" do
55
- @document.count.should == 1
56
- end
57
-
58
- should "automatically set id" do
59
- @doc.id.should be_instance_of(BSON::ObjectId)
60
- @doc._id.should be_instance_of(BSON::ObjectId)
61
- end
62
-
63
- should "no longer be new?" do
64
- @doc.new?.should be_false
65
- end
66
-
67
- should "return instance of document" do
68
- @doc.should be_instance_of(@document)
69
- @doc.first_name.should == 'John'
70
- @doc.last_name.should == 'Nunemaker'
71
- @doc.age.should == 27
72
- end
73
-
74
- should "not fail if no attributes provided" do
75
- document = Doc()
76
- lambda { document.create }.should change { document.count }.by(1)
77
- end
78
- end
79
-
80
- context ".create (multiple documents)" do
81
- setup do
82
- @docs = @document.create([
83
- {:first_name => 'John', :last_name => 'Nunemaker', :age => '27'},
84
- {:first_name => 'Steve', :last_name => 'Smith', :age => '28'},
85
- ])
86
- end
87
-
88
- should "create multiple documents" do
89
- @document.count.should == 2
90
- end
91
-
92
- should "return an array of doc instances" do
93
- @docs.map do |doc|
94
- doc.should be_instance_of(@document)
95
- end
96
- end
97
- end
98
-
99
- context ".update (single document)" do
100
- setup do
101
- doc = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
102
- @doc = @document.update(doc._id, {:age => 40})
103
- end
104
-
105
- should "update attributes provided" do
106
- @doc.age.should == 40
107
- end
108
-
109
- should "not update existing attributes that were not set to update" do
110
- @doc.first_name.should == 'John'
111
- @doc.last_name.should == 'Nunemaker'
112
- end
113
-
114
- should "not create new document" do
115
- @document.count.should == 1
116
- end
117
-
118
- should "raise error if not provided id" do
119
- doc = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
120
- lambda { @document.update }.should raise_error(ArgumentError)
121
- end
122
-
123
- should "raise error if not provided attributes" do
124
- doc = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
125
- lambda { @document.update(doc._id) }.should raise_error(ArgumentError)
126
- lambda { @document.update(doc._id, [1]) }.should raise_error(ArgumentError)
127
- end
128
- end
129
-
130
- context ".update (multiple documents)" do
131
- setup do
132
- @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
133
- @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
134
-
135
- @docs = @document.update({
136
- @doc1._id => {:age => 30},
137
- @doc2._id => {:age => 30},
138
- })
139
- end
140
-
141
- should "not create any new documents" do
142
- @document.count.should == 2
143
- end
144
-
145
- should "should return an array of doc instances" do
146
- @docs.map do |doc|
147
- doc.should be_instance_of(@document)
148
- end
149
- end
150
-
151
- should "update the documents" do
152
- @document.find(@doc1._id).age.should == 30
153
- @document.find(@doc2._id).age.should == 30
154
- end
155
-
156
- should "raise error if not a hash" do
157
- lambda { @document.update([1, 2]) }.should raise_error(ArgumentError)
158
- end
159
- end
160
-
161
- context ".find" do
162
- setup do
163
- @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
164
- @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
165
- @doc3 = @document.create({:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26'})
166
- end
167
-
168
- should "return nil if nothing provided for find" do
169
- @document.find.should be_nil
170
- end
171
-
172
- should "raise document not found if nothing provided for find!" do
173
- assert_raises(MongoMapper::DocumentNotFound) do
174
- @document.find!
175
- end
176
- end
177
-
178
- context "(with a single id)" do
179
- should "work" do
180
- @document.find(@doc1._id).should == @doc1
181
- end
182
-
183
- should "return nil if document not found with find" do
184
- @document.find(123).should be_nil
185
- end
186
-
187
- should "raise error if document not found with find!" do
188
- assert_raises(MongoMapper::DocumentNotFound) { @document.find!(123) }
189
- end
190
- end
191
-
192
- context "(with multiple id's)" do
193
- should "work as arguments" do
194
- @document.find(@doc1._id, @doc2._id).should == [@doc1, @doc2]
195
- end
196
-
197
- should "work as arguments with string ids" do
198
- @document.find(@doc1._id.to_s, @doc2._id.to_s).should == [@doc1, @doc2]
199
- end
200
-
201
- should "work as array" do
202
- @document.find([@doc1._id, @doc2._id]).should == [@doc1, @doc2]
203
- end
204
-
205
- should "work as array with string ids" do
206
- @document.find([@doc1._id.to_s, @doc2._id.to_s]).should == [@doc1, @doc2]
207
- end
208
-
209
- should "compact not found when using find" do
210
- @document.find(@doc1._id, BSON::ObjectId.new.to_s).should == [@doc1]
211
- end
212
-
213
- should "raise error if not all found when using find!" do
214
- assert_raises(MongoMapper::DocumentNotFound) do
215
- @document.find!(@doc1._id, BSON::ObjectId.new.to_s)
216
- end
217
- end
218
-
219
- should "return array if array with one element" do
220
- @document.find([@doc1._id]).should == [@doc1]
221
- end
222
- end
223
-
224
- should "be able to find using condition auto-detection" do
225
- @document.first(:first_name => 'John').should == @doc1
226
- @document.all(:last_name => 'Nunemaker', :order => 'age desc').should == [@doc1, @doc3]
227
- end
228
-
229
- context "#all" do
230
- should "find all documents with options" do
231
- @document.all(:order => 'first_name').should == [@doc1, @doc3, @doc2]
232
- @document.all(:last_name => 'Nunemaker', :order => 'age desc').should == [@doc1, @doc3]
233
- end
234
- end
235
-
236
- context "#first" do
237
- should "find first document with options" do
238
- @document.first(:order => 'first_name').should == @doc1
239
- @document.first(:age => 28).should == @doc2
240
- end
241
- end
242
-
243
- context "#last" do
244
- should "find last document with options" do
245
- @document.last(:order => 'age').should == @doc2
246
- @document.last(:order => 'age', :age => 28).should == @doc2
247
- end
248
- end
249
-
250
- context "#find_each" do
251
- should "yield all documents found based on options" do
252
- yield_documents = []
253
- @document.find_each(:order => "first_name") {|doc| yield_documents << doc }
254
- yield_documents.should == [@doc1, @doc3, @doc2]
255
-
256
- yield_documents = []
257
- @document.find_each(:last_name => 'Nunemaker', :order => 'age desc') {|doc| yield_documents << doc }
258
- yield_documents.should == [@doc1, @doc3]
259
- end
260
- end
261
- end # finding documents
262
-
263
- context ".find_by_id" do
264
- setup do
265
- @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
266
- @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
267
- end
268
-
269
- should "be able to find by id" do
270
- @document.find_by_id(@doc1._id).should == @doc1
271
- @document.find_by_id(@doc2._id).should == @doc2
272
- end
273
-
274
- should "return nil if document not found" do
275
- @document.find_by_id(1234).should be_nil
276
- end
277
- end
278
-
279
- context ".first_or_create" do
280
- should "find if exists" do
281
- created = @document.create(:first_name => 'John', :last_name => 'Nunemaker')
282
- lambda {
283
- found = @document.first_or_create(:first_name => 'John', :last_name => 'Nunemaker')
284
- found.should == created
285
- }.should_not change { @document.count }
286
- end
287
-
288
- should "create if not found" do
289
- lambda {
290
- created = @document.first_or_create(:first_name => 'John', :last_name => 'Nunemaker')
291
- created.first_name.should == 'John'
292
- created.last_name.should == 'Nunemaker'
293
- }.should change { @document.count }.by(1)
294
- end
295
-
296
- should "disregard non-keys when creating, but use them in the query" do
297
- assert_nothing_raised do
298
- @document.create(:first_name => 'John', :age => 9)
299
- lambda {
300
- @document.first_or_create(:first_name => 'John', :age.gt => 10).first_name.should == 'John'
301
- }.should change { @document.count }.by(1)
302
- end
303
- end
304
- end
305
-
306
- context ".first_or_new" do
307
- should "find if exists" do
308
- created = @document.create(:first_name => 'John', :last_name => 'Nunemaker')
309
- lambda {
310
- found = @document.first_or_new(:first_name => 'John', :last_name => 'Nunemaker')
311
- found.should == created
312
- }.should_not change { @document.count }
313
- end
314
-
315
- should "initialize if not found" do
316
- lambda {
317
- created = @document.first_or_new(:first_name => 'John', :last_name => 'Nunemaker')
318
- created.first_name.should == 'John'
319
- created.last_name.should == 'Nunemaker'
320
- created.should be_new
321
- }.should_not change { @document.count }
322
- end
323
-
324
- should "disregard non-keys when initializing, but use them in the query" do
325
- assert_nothing_raised do
326
- @document.create(:first_name => 'John', :age => 9)
327
- @document.first_or_new(:first_name => 'John', :age.gt => 10).first_name.should == 'John'
328
- end
329
- end
330
- end
331
-
332
- context ".delete (single document)" do
333
- setup do
334
- @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
335
- @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
336
- @document.delete(@doc1._id)
337
- end
338
-
339
- should "remove document from collection" do
340
- @document.count.should == 1
341
- end
342
-
343
- should "not remove other documents" do
344
- @document.find(@doc2._id).should_not be(nil)
345
- end
346
- end
347
-
348
- context ".delete (multiple documents)" do
349
- should "work with multiple arguments" do
350
- @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
351
- @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
352
- @doc3 = @document.create({:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26'})
353
- @document.delete(@doc1._id, @doc2._id)
354
-
355
- @document.count.should == 1
356
- end
357
-
358
- should "work with array as argument" do
359
- @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
360
- @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
361
- @doc3 = @document.create({:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26'})
362
- @document.delete([@doc1._id, @doc2._id])
363
-
364
- @document.count.should == 1
365
- end
366
- end
367
-
368
- context ".delete_all" do
369
- setup do
370
- @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
371
- @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
372
- @doc3 = @document.create({:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26'})
373
- end
374
-
375
- should "remove all documents when given no conditions" do
376
- @document.delete_all
377
- @document.count.should == 0
378
- end
379
-
380
- should "only remove matching documents when given conditions" do
381
- @document.delete_all({:first_name => 'John'})
382
- @document.count.should == 2
383
- end
384
-
385
- should "convert the conditions to mongo criteria" do
386
- @document.delete_all(:age => [26, 27])
387
- @document.count.should == 1
388
- end
389
- end
390
-
391
- context ".destroy (single document)" do
392
- setup do
393
- @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
394
- @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
395
- @document.destroy(@doc1._id)
396
- end
397
-
398
- should "remove document from collection" do
399
- @document.count.should == 1
400
- end
401
-
402
- should "not remove other documents" do
403
- @document.find(@doc2._id).should_not be(nil)
404
- end
405
- end
406
-
407
- context ".destroy (multiple documents)" do
408
- should "work with multiple arguments" do
409
- @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
410
- @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
411
- @doc3 = @document.create({:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26'})
412
- @document.destroy(@doc1._id, @doc2._id)
413
-
414
- @document.count.should == 1
415
- end
416
-
417
- should "work with array as argument" do
418
- @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
419
- @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
420
- @doc3 = @document.create({:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26'})
421
- @document.destroy([@doc1._id, @doc2._id])
422
-
423
- @document.count.should == 1
424
- end
425
- end
426
-
427
- context ".destroy_all" do
428
- setup do
429
- @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
430
- @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
431
- @doc3 = @document.create({:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26'})
432
- end
433
-
434
- should "remove all documents when given no conditions" do
435
- @document.destroy_all
436
- @document.count.should == 0
437
- end
438
-
439
- should "only remove matching documents when given conditions" do
440
- @document.destroy_all(:first_name => 'John')
441
- @document.count.should == 2
442
- @document.destroy_all(:age => 26)
443
- @document.count.should == 1
444
- end
445
-
446
- should "convert the conditions to mongo criteria" do
447
- @document.destroy_all(:age => [26, 27])
448
- @document.count.should == 1
449
- end
450
- end
451
-
452
- context ".count" do
453
- setup do
454
- @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
455
- @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
456
- @doc3 = @document.create({:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26'})
457
- end
458
-
459
- should "count all with no arguments" do
460
- @document.count.should == 3
461
- end
462
-
463
- should "return 0 if there are no documents in the collection" do
464
- @document.delete_all
465
- @document.count.should == 0
466
- end
467
-
468
- should "return 0 if the collection does not exist" do
469
- klass = Doc do
470
- set_collection_name 'foobarbazwickdoesnotexist'
471
- end
472
-
473
- klass.count.should == 0
474
- end
475
-
476
- should "return count for matching documents if conditions provided" do
477
- @document.count(:age => 27).should == 1
478
- end
479
-
480
- should "convert the conditions to mongo criteria" do
481
- @document.count(:age => [26, 27]).should == 2
482
- end
483
- end
484
-
485
- context ".size" do
486
- should "return 0 if no documents" do
487
- @document.count.should == 0
488
- end
489
-
490
- should "return the number of documents" do
491
- @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
492
- @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
493
- @doc3 = @document.create({:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26'})
494
- @document.count.should == 3
495
- end
496
- end
497
-
498
- context ".empty?" do
499
- should "be true if no documents" do
500
- @document.empty?.should be_true
501
- end
502
-
503
- should "be false if documents present" do
504
- @doc = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
505
- @document.empty?.should be_false
506
- end
507
- end
508
-
509
- context ".exists?" do
510
- setup do
511
- @doc = @document.create(:first_name => "James", :age => 27)
512
- end
513
-
514
- should "be true when at least one document exists" do
515
- @document.exists?.should == true
516
- end
517
-
518
- should "be false when no documents exist" do
519
- @doc.destroy
520
- @document.exists?.should == false
521
- end
522
-
523
- should "be true when at least one document exists that matches the conditions" do
524
- @document.exists?(:first_name => "James").should == true
525
- end
526
-
527
- should "be false when no documents exist with the provided conditions" do
528
- @document.exists?(:first_name => "Jean").should == false
529
- end
530
- end
531
-
532
- context "to_a" do
533
- should "return an array" do
534
- @document.to_a.class.should == Array
535
- end
536
-
537
- should "return everything" do
538
- @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
539
- @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
540
- @doc3 = @document.create({:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26'})
541
- @document.to_a.size.should == 3
542
- end
543
- end
544
-
545
- context ".where" do
546
- setup do
547
- @doc1 = @document.create(:first_name => 'John', :last_name => 'Nunemaker', :age => '27')
548
- @doc2 = @document.create(:first_name => 'Steve', :last_name => 'Smith', :age => '28')
549
- @doc3 = @document.create(:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26')
550
- @query = @document.where(:last_name => 'Nunemaker')
551
- end
552
-
553
- should "fetch documents when kicker called" do
554
- docs = @query.all
555
- docs.should include(@doc1)
556
- docs.should include(@doc3)
557
- docs.should_not include(@doc2)
558
- end
559
-
560
- should "be chainable" do
561
- @query.sort(:age).first.should == @doc3
562
- end
563
- end
564
-
565
- context ".fields" do
566
- setup do
567
- @doc1 = @document.create(:first_name => 'John', :last_name => 'Nunemaker', :age => '27')
568
- @doc2 = @document.create(:first_name => 'Steve', :last_name => 'Smith', :age => '28')
569
- @doc3 = @document.create(:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26')
570
- @query = @document.fields(:age)
571
- end
572
-
573
- should "fetch documents when kicker called" do
574
- docs = @query.all
575
- docs.should include(@doc1)
576
- docs.should include(@doc3)
577
- docs.should include(@doc2)
578
- docs.each do |doc|
579
- doc.age.should_not be_nil
580
- doc.first_name.should be_nil # key was not loaded
581
- doc.last_name.should be_nil # key was not loaded
582
- end
583
- end
584
-
585
- should "be chainable" do
586
- @query.sort(:age).all.map(&:age).should == [26, 27, 28]
587
- end
588
- end
589
-
590
- context ".limit" do
591
- setup do
592
- @doc1 = @document.create(:first_name => 'John', :last_name => 'Nunemaker', :age => '27')
593
- @doc2 = @document.create(:first_name => 'Steve', :last_name => 'Smith', :age => '28')
594
- @doc3 = @document.create(:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26')
595
- @query = @document.limit(2)
596
- end
597
-
598
- should "fetch documents when kicker called" do
599
- docs = @query.all
600
- docs.size.should == 2
601
- end
602
-
603
- should "be chainable" do
604
- result = [26, 27]
605
- @query.sort(:age).all.map(&:age).should == result
606
- @query.count.should > result.size
607
- end
608
- end
609
-
610
- context ".skip" do
611
- setup do
612
- @doc1 = @document.create(:first_name => 'John', :last_name => 'Nunemaker', :age => '27')
613
- @doc2 = @document.create(:first_name => 'Steve', :last_name => 'Smith', :age => '28')
614
- @doc3 = @document.create(:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26')
615
- @query = @document.skip(1)
616
- end
617
-
618
- should "fetch documents when kicker called" do
619
- docs = @query.all
620
- docs.size.should == 2 # skipping 1 out of 3
621
- end
622
-
623
- should "be chainable" do
624
- result = [27, 28]
625
- @query.sort(:age).all.map(&:age).should == result
626
- @query.count.should > result.size
627
- end
628
- end
629
-
630
- context ".sort" do
631
- setup do
632
- @doc1 = @document.create(:first_name => 'John', :last_name => 'Nunemaker', :age => '27')
633
- @doc2 = @document.create(:first_name => 'Steve', :last_name => 'Smith', :age => '28')
634
- @doc3 = @document.create(:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26')
635
- @query = @document.sort(:age)
636
- end
637
-
638
- should "fetch documents when kicker called" do
639
- @query.all.should == [@doc3, @doc1, @doc2]
640
- end
641
-
642
- should "be chainable" do
643
- result = [28]
644
- @query.skip(2).all.map(&:age).should == result
645
- @query.count.should > result.size
646
- end
647
- end
648
-
649
- context "#update_attributes (new document)" do
650
- setup do
651
- @doc = @document.new(:first_name => 'John', :age => '27')
652
- @doc.update_attributes(:first_name => 'Johnny', :age => 30)
653
- end
654
-
655
- should "insert document into the collection" do
656
- @document.count.should == 1
657
- end
658
-
659
- should "assign an id for the document" do
660
- @doc.id.should be_instance_of(BSON::ObjectId)
661
- end
662
-
663
- should "save attributes" do
664
- @doc.first_name.should == 'Johnny'
665
- @doc.age.should == 30
666
- end
667
-
668
- should "update attributes in the database" do
669
- doc = @doc.reload
670
- doc.should == @doc
671
- doc.first_name.should == 'Johnny'
672
- doc.age.should == 30
673
- end
674
-
675
- should "allow updating custom attributes" do
676
- @doc.update_attributes(:gender => 'mALe')
677
- @doc.reload.gender.should == 'mALe'
678
- end
679
- end
680
-
681
- context "#update_attributes (existing document)" do
682
- setup do
683
- @doc = @document.create(:first_name => 'John', :age => '27')
684
- @doc.update_attributes(:first_name => 'Johnny', :age => 30)
685
- end
686
-
687
- should "not insert document into collection" do
688
- @document.count.should == 1
689
- end
690
-
691
- should "update attributes" do
692
- @doc.first_name.should == 'Johnny'
693
- @doc.age.should == 30
694
- end
695
-
696
- should "update attributes in the database" do
697
- doc = @doc.reload
698
- doc.first_name.should == 'Johnny'
699
- doc.age.should == 30
700
- end
701
- end
702
-
703
- context "#update_attributes (return value)" do
704
- setup do
705
- @document.key :foo, String, :required => true
706
- end
707
-
708
- should "be true if document valid" do
709
- @document.new.update_attributes(:foo => 'bar').should be_true
710
- end
711
-
712
- should "be false if document not valid" do
713
- @document.new.update_attributes({}).should be_false
714
- end
715
- end
716
-
717
- context "#update_attribute" do
718
- setup do
719
- @doc = @document.create(:first_name => 'John', :age => '27')
720
- end
721
-
722
- should "accept symbols as keys" do
723
- @doc.update_attribute(:first_name, 'Chris').should be_true
724
- @doc.reload.first_name.should == 'Chris'
725
- end
726
-
727
- should "update the attribute" do
728
- @doc.update_attribute('first_name', 'Chris').should be_true
729
- @doc.reload.first_name.should == 'Chris'
730
- end
731
-
732
- should "update the attribute without invoking validations" do
733
- @document.key :name, String, :required => true
734
-
735
- @doc.expects(:valid?).never
736
- @doc.update_attribute('name', '').should be_true
737
- @doc.reload.name.should == ''
738
- @document.count.should == 1
739
- end
740
- end
741
-
742
- context "#save (new document)" do
743
- setup do
744
- @doc = @document.new(:first_name => 'John', :age => '27')
745
- @doc.save
746
- end
747
-
748
- should "insert document into the collection" do
749
- @document.count.should == 1
750
- end
751
-
752
- should "assign an id for the document" do
753
- @doc.id.should be_instance_of(BSON::ObjectId)
754
- end
755
-
756
- should "save attributes" do
757
- @doc.first_name.should == 'John'
758
- @doc.age.should == 27
759
- end
760
-
761
- should "update attributes in the database" do
762
- doc = @doc.reload
763
- doc.should == @doc
764
- doc.first_name.should == 'John'
765
- doc.age.should == 27
766
- end
767
-
768
- should "allow to add custom attributes to the document" do
769
- @doc = @document.new(:first_name => 'David', :age => '26', :gender => 'male', :tags => [1, "2"])
770
- @doc.save
771
- doc = @doc.reload
772
- doc.gender.should == 'male'
773
- doc.tags.should == [1, "2"]
774
- end
775
-
776
- should "allow to use custom methods to assign properties" do
777
- klass = Doc do
778
- key :name, String
779
-
780
- def realname=(value)
781
- self.name = value
782
- end
783
- end
784
-
785
- person = klass.new(:realname => 'David')
786
- person.save
787
- person.reload.name.should == 'David'
788
- end
789
-
790
- context "with key of type date" do
791
- should "save the date value as a Time object" do
792
- doc = @document.new(:first_name => 'John', :age => '27', :date => "2009-12-01")
793
- doc.save
794
- doc.date.should == Date.new(2009, 12, 1)
795
- end
796
- end
797
- end
798
-
799
- context "#save (existing document)" do
800
- setup do
801
- @doc = @document.create(:first_name => 'John', :age => '27')
802
- @doc.first_name = 'Johnny'
803
- @doc.age = 30
804
- @doc.save
805
- end
806
-
807
- should "not insert document into collection" do
808
- @document.count.should == 1
809
- end
810
-
811
- should "update attributes" do
812
- @doc.first_name.should == 'Johnny'
813
- @doc.age.should == 30
814
- end
815
-
816
- should "update attributes in the database" do
817
- doc = @doc.reload
818
- doc.first_name.should == 'Johnny'
819
- doc.age.should == 30
820
- end
821
-
822
- should "allow updating custom attributes" do
823
- @doc = @document.new(:first_name => 'David', :age => '26', :gender => 'male')
824
- @doc.gender = 'Male'
825
- @doc.save
826
- @doc.reload.gender.should == 'Male'
827
- end
828
- end
829
-
830
- context "#save (with validations off)" do
831
- setup do
832
- @document = Doc do
833
- key :name, String, :required => true
834
- end
835
- end
836
-
837
- should "insert invalid document" do
838
- doc = @document.new
839
- doc.expects(:valid?).never
840
- doc.save(:validate => false)
841
- @document.count.should == 1
842
- end
843
- end
844
-
845
- context "#save (with options)" do
846
- setup do
847
- @document = Doc do
848
- key :name, String
849
- end
850
- @document.ensure_index :name, :unique => true
851
- end
852
- teardown { drop_indexes(@document) }
853
-
854
- should "allow passing safe" do
855
- @document.create(:name => 'John')
856
- assert_raises(Mongo::OperationFailure) do
857
- @document.new(:name => 'John').save(:safe => true)
858
- end
859
- end
860
-
861
- should "raise argument error if options has unsupported key" do
862
- assert_raises(ArgumentError) do
863
- @document.new.save(:foo => true)
864
- end
865
- end
866
- end
867
-
868
- context "#save! (with options)" do
869
- setup do
870
- @document = Doc { key :name, String }
871
- @document.ensure_index :name, :unique => true
872
- end
873
- teardown { drop_indexes(@document) }
874
-
875
- should "allow passing safe" do
876
- @document.create(:name => 'John')
877
- assert_raises(Mongo::OperationFailure) do
878
- @document.new(:name => 'John').save!(:safe => true)
879
- end
880
- end
881
-
882
- should "raise argument error if options has unsupported key" do
883
- assert_raises(ArgumentError) do
884
- @document.new.save!(:foo => true)
885
- end
886
- end
887
-
888
- should "raise argument error if using validate as that would be pointless with save!" do
889
- assert_raises(ArgumentError) do
890
- @document.new.save!(:validate => false)
891
- end
892
- end
893
- end
894
-
895
- context "#destroy" do
896
- setup do
897
- @doc = @document.create(:first_name => 'John', :age => '27')
898
- @doc.destroy
899
- end
900
-
901
- should "remove the document from the collection" do
902
- @document.count.should == 0
903
- end
904
- end
905
-
906
- context "#delete" do
907
- setup do
908
- @doc1 = @document.create(:first_name => 'John', :last_name => 'Nunemaker', :age => '27')
909
- @doc2 = @document.create(:first_name => 'Steve', :last_name => 'Smith', :age => '28')
910
-
911
- @document.class_eval do
912
- before_destroy :before_destroy_callback
913
- after_destroy :after_destroy_callback
914
-
915
- def history; @history ||= [] end
916
- def before_destroy_callback; history << :after_destroy end
917
- def after_destroy_callback; history << :after_destroy end
918
- end
919
-
920
- @doc1.delete
921
- end
922
-
923
- should "remove document from collection" do
924
- @document.count.should == 1
925
- end
926
-
927
- should "not remove other documents" do
928
- @document.find(@doc2.id).should_not be(nil)
929
- end
930
-
931
- should "not call before/after destroy callbacks" do
932
- @doc1.history.should == []
933
- end
934
- end
935
- end