mongo_mapper 0.7.0 → 0.7.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 (43) hide show
  1. data/README.rdoc +3 -1
  2. data/Rakefile +9 -12
  3. data/lib/mongo_mapper.rb +30 -10
  4. data/lib/mongo_mapper/document.rb +16 -74
  5. data/lib/mongo_mapper/embedded_document.rb +7 -1
  6. data/lib/mongo_mapper/plugins.rb +3 -0
  7. data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +1 -12
  8. data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +6 -1
  9. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +4 -1
  10. data/lib/mongo_mapper/plugins/callbacks.rb +183 -12
  11. data/lib/mongo_mapper/plugins/keys.rb +17 -5
  12. data/lib/mongo_mapper/plugins/modifiers.rb +87 -0
  13. data/lib/mongo_mapper/plugins/pagination/proxy.rb +7 -3
  14. data/lib/mongo_mapper/plugins/protected.rb +1 -1
  15. data/lib/mongo_mapper/plugins/rails.rb +16 -8
  16. data/lib/mongo_mapper/plugins/serialization.rb +51 -81
  17. data/lib/mongo_mapper/plugins/timestamps.rb +21 -0
  18. data/lib/mongo_mapper/plugins/userstamps.rb +14 -0
  19. data/lib/mongo_mapper/query.rb +1 -1
  20. data/lib/mongo_mapper/version.rb +3 -0
  21. data/mongo_mapper.gemspec +22 -11
  22. data/test/active_model_lint_test.rb +11 -0
  23. data/test/functional/associations/test_in_array_proxy.rb +16 -0
  24. data/test/functional/associations/test_many_documents_proxy.rb +22 -0
  25. data/test/functional/test_callbacks.rb +104 -34
  26. data/test/functional/test_document.rb +70 -149
  27. data/test/functional/test_embedded_document.rb +39 -34
  28. data/test/functional/test_indexing.rb +44 -0
  29. data/test/functional/test_modifiers.rb +297 -227
  30. data/test/functional/test_protected.rb +11 -5
  31. data/test/functional/test_timestamps.rb +64 -0
  32. data/test/functional/test_userstamps.rb +28 -0
  33. data/test/support/timing.rb +1 -1
  34. data/test/unit/serializers/test_json_serializer.rb +30 -17
  35. data/test/unit/test_embedded_document.rb +15 -15
  36. data/test/unit/test_keys.rb +15 -11
  37. data/test/unit/test_mongo_mapper.rb +31 -1
  38. data/test/unit/test_pagination.rb +33 -0
  39. data/test/unit/test_query.rb +6 -0
  40. data/test/unit/test_serialization.rb +3 -3
  41. data/test/unit/test_support.rb +9 -5
  42. metadata +17 -6
  43. data/VERSION +0 -1
@@ -3,51 +3,56 @@ require 'models'
3
3
 
4
4
  class EmbeddedDocumentTest < Test::Unit::TestCase
5
5
  def setup
6
- @klass = Doc do
7
- key :first_name, String
8
- key :last_name, String
6
+ @klass = Doc('Person') do
7
+ key :name, String
9
8
  end
10
-
11
- @pet_klass = EDoc do
9
+
10
+ @pet_klass = EDoc('Pet') do
12
11
  key :name, String
13
12
  end
14
-
13
+
15
14
  @klass.many :pets, :class => @pet_klass
16
-
17
- @address_class = EDoc do
15
+
16
+ @address_class = EDoc('Address') do
18
17
  key :city, String
19
18
  key :state, String
20
19
  end
21
20
  end
22
-
23
- context "Saving a document with an embedded document" do
21
+
22
+ context "Saving a document with a key that is an embedded document" do
24
23
  setup do
25
24
  @klass.key :foo, @address_class
26
-
27
- @address = @address_class.new(:city => 'South Bend', :state => 'IN')
28
- @doc = @klass.new(:foo => @address)
29
25
  end
30
-
26
+
31
27
  should "embed embedded document" do
32
- @doc.save
33
- @doc.foo.city.should == 'South Bend'
34
- @doc.foo.state.should == 'IN'
28
+ address = @address_class.new(:city => 'South Bend', :state => 'IN')
29
+ doc = @klass.create(:foo => address)
30
+ doc.foo.city.should == 'South Bend'
31
+ doc.foo.state.should == 'IN'
35
32
 
36
- doc = @doc.reload
33
+ doc = doc.reload
37
34
  doc.foo.city.should == 'South Bend'
38
35
  doc.foo.state.should == 'IN'
39
36
  end
37
+
38
+ should "assign _parent_document and _root_document" do
39
+ address = @address_class.new(:city => 'South Bend', :state => 'IN')
40
+ address._parent_document.should be_nil
41
+ doc = @klass.create(:foo => address)
42
+ address._parent_document.should be(doc)
43
+ address._root_document.should be(doc)
44
+ end
40
45
  end
41
-
46
+
42
47
  should "correctly instantiate single collection inherited embedded documents" do
43
48
  document = Doc('Foo') do
44
49
  key :message, Message
45
50
  end
46
-
51
+
47
52
  doc1 = document.create(:message => Enter.new)
48
53
  doc1.reload.message.class.should be(Enter)
49
54
  end
50
-
55
+
51
56
  context "new?" do
52
57
  setup do
53
58
  @klass.key :foo, @address_class
@@ -58,65 +63,65 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
58
63
  doc = @klass.new(:foo => address)
59
64
  address.new?.should == true
60
65
  end
61
-
66
+
62
67
  should "not be new after document is saved" do
63
68
  address = @address_class.new(:city => 'South Bend', :state => 'IN')
64
69
  doc = @klass.new(:foo => address)
65
70
  doc.save
66
71
  doc.foo.new?.should == false
67
72
  end
68
-
73
+
69
74
  should "not be new when document is read back" do
70
75
  address = @address_class.new(:city => 'South Bend', :state => 'IN')
71
76
  doc = @klass.new(:foo => address)
72
77
  doc.save
73
-
78
+
74
79
  doc = doc.reload
75
80
  doc.foo.new?.should == false
76
81
  end
77
82
  end
78
-
83
+
79
84
  should "be able to save" do
80
85
  person = @klass.create
81
-
86
+
82
87
  pet = @pet_klass.new(:name => 'sparky')
83
88
  person.pets << pet
84
89
  pet.should be_new
85
90
  pet.save
86
91
  pet.should_not be_new
87
-
92
+
88
93
  person.reload
89
94
  person.pets.first.should == pet
90
95
  end
91
-
96
+
92
97
  should "be able to dynamically add new keys and save" do
93
98
  person = @klass.create
94
-
99
+
95
100
  pet = @pet_klass.new(:name => 'sparky', :crazy_key => 'crazy')
96
101
  person.pets << pet
97
102
  pet.save
98
-
103
+
99
104
  person.reload
100
105
  person.pets.first.crazy_key.should == 'crazy'
101
106
  end
102
-
107
+
103
108
  should "be able to update_attributes" do
104
109
  pet = @pet_klass.new(:name => 'sparky')
105
110
  person = @klass.create(:pets => [pet])
106
111
  person.reload
107
112
  pet = person.pets.first
108
-
113
+
109
114
  pet.update_attributes(:name => 'koda').should be_true
110
115
  person.reload
111
116
  person.pets.first._id.should == pet._id
112
117
  person.pets.first.name.should == 'koda'
113
118
  end
114
-
119
+
115
120
  should "be able to update_attributes!" do
116
121
  person = @klass.create(:pets => [@pet_klass.new(:name => 'sparky')])
117
122
  person.reload
118
123
  pet = person.pets.first
119
-
124
+
120
125
  attributes = {:name => 'koda'}
121
126
  pet.expects(:attributes=).with(attributes)
122
127
  pet.expects(:save!)
@@ -0,0 +1,44 @@
1
+ require 'test_helper'
2
+
3
+ class IndexingTest < Test::Unit::TestCase
4
+ context "Indexing" do
5
+ setup do
6
+ @document = Doc do
7
+ set_collection_name 'users'
8
+
9
+ key :first_name, String
10
+ key :last_name, String
11
+ key :age, Integer
12
+ key :date, Date
13
+ end
14
+ drop_indexes(@document)
15
+ end
16
+
17
+ should "allow creating index for a key" do
18
+ @document.ensure_index :first_name
19
+ @document.should have_index('first_name_1')
20
+ end
21
+
22
+ should "allow creating unique index for a key" do
23
+ @document.ensure_index :first_name, :unique => true
24
+ @document.should have_index('first_name_1')
25
+ end
26
+
27
+ should "allow creating index on multiple keys" do
28
+ @document.ensure_index [[:first_name, 1], [:last_name, -1]]
29
+
30
+ # order is different for different versions of ruby so instead of
31
+ # just checking have_index('first_name_1_last_name_-1') I'm checking
32
+ # the values of the indexes to make sure the index creation was successful
33
+ @document.collection.index_information.detect do |index|
34
+ keys = index[1]
35
+ keys.include?(['first_name', 1]) && keys.include?(['last_name', -1])
36
+ end.should_not be_nil
37
+ end
38
+
39
+ should "work with :index shortcut when defining key" do
40
+ @document.key :father, String, :index => true
41
+ @document.should have_index('father_1')
42
+ end
43
+ end
44
+ end
@@ -10,243 +10,313 @@ class ModifierTest < Test::Unit::TestCase
10
10
  key :tags, Array
11
11
  end
12
12
  end
13
-
13
+
14
14
  def assert_page_counts(page, day_count, week_count, month_count)
15
15
  page.reload
16
16
  page.day_count.should == day_count
17
17
  page.week_count.should == week_count
18
18
  page.month_count.should == month_count
19
19
  end
20
-
21
- should "be able to increment with criteria and modifier hashes" do
22
- page = @page_class.create(:title => 'Home')
23
- page2 = @page_class.create(:title => 'Home')
24
-
25
- @page_class.increment({:title => 'Home'}, {
26
- :day_count => 1, :week_count => 2, :month_count => 3
27
- })
28
-
29
- assert_page_counts page, 1, 2, 3
30
- assert_page_counts page2, 1, 2, 3
31
- end
32
-
33
- should "be able to increment with ids and modifier hash" do
34
- page = @page_class.create(:title => 'Home')
35
- page2 = @page_class.create(:title => 'Home')
36
-
37
- @page_class.increment(page.id, page2.id, {
38
- :day_count => 1, :week_count => 2, :month_count => 3
39
- })
40
-
41
- assert_page_counts page, 1, 2, 3
42
- assert_page_counts page2, 1, 2, 3
43
- end
44
-
45
- should "be able to decrement with criteria and modifier hashes" do
46
- page = @page_class.create(:title => 'Home', :day_count => 1, :week_count => 2, :month_count => 3)
47
- page2 = @page_class.create(:title => 'Home', :day_count => 1, :week_count => 2, :month_count => 3)
48
-
49
- @page_class.decrement({:title => 'Home'}, {
50
- :day_count => 1, :week_count => 2, :month_count => 3
51
- })
52
-
53
- assert_page_counts page, 0, 0, 0
54
- assert_page_counts page2, 0, 0, 0
55
- end
56
-
57
- should "be able to decrement with ids and modifier hash" do
58
- page = @page_class.create(:title => 'Home', :day_count => 1, :week_count => 2, :month_count => 3)
59
- page2 = @page_class.create(:title => 'Home', :day_count => 1, :week_count => 2, :month_count => 3)
60
-
61
- @page_class.decrement(page.id, page2.id, {
62
- :day_count => 1, :week_count => 2, :month_count => 3
63
- })
64
-
65
- assert_page_counts page, 0, 0, 0
66
- assert_page_counts page2, 0, 0, 0
67
- end
68
-
69
- should "always decrement when decrement is called whether number is positive or negative" do
70
- page = @page_class.create(:title => 'Home', :day_count => 1, :week_count => 2, :month_count => 3)
71
- page2 = @page_class.create(:title => 'Home', :day_count => 1, :week_count => 2, :month_count => 3)
72
-
73
- @page_class.decrement(page.id, page2.id, {
74
- :day_count => -1, :week_count => 2, :month_count => -3
75
- })
76
-
77
- assert_page_counts page, 0, 0, 0
78
- assert_page_counts page2, 0, 0, 0
79
- end
80
-
81
- should "be able to set with criteria and modifier hashes" do
82
- page = @page_class.create(:title => 'Home')
83
- page2 = @page_class.create(:title => 'Home')
84
-
85
- @page_class.set({:title => 'Home'}, :title => 'Home Revised')
86
-
87
- page.reload
88
- page.title.should == 'Home Revised'
89
-
90
- page2.reload
91
- page2.title.should == 'Home Revised'
92
- end
93
-
94
- should "be able to set with ids and modifier hash" do
95
- page = @page_class.create(:title => 'Home')
96
- page2 = @page_class.create(:title => 'Home')
97
-
98
- @page_class.set(page.id, page2.id, :title => 'Home Revised')
99
-
100
- page.reload
101
- page.title.should == 'Home Revised'
102
-
103
- page2.reload
104
- page2.title.should == 'Home Revised'
105
- end
106
-
107
- should "be able to push with criteria and modifier hashes" do
108
- page = @page_class.create(:title => 'Home')
109
- page2 = @page_class.create(:title => 'Home')
110
-
111
- @page_class.push({:title => 'Home'}, :tags => 'foo')
112
-
113
- page.reload
114
- page.tags.should == %w(foo)
115
-
116
- page2.reload
117
- page.tags.should == %w(foo)
118
- end
119
-
120
- should "be able to push with ids and modifier hash" do
121
- page = @page_class.create(:title => 'Home')
122
- page2 = @page_class.create(:title => 'Home')
123
-
124
- @page_class.push(page.id, page2.id, :tags => 'foo')
125
-
126
- page.reload
127
- page.tags.should == %w(foo)
128
-
129
- page2.reload
130
- page.tags.should == %w(foo)
131
- end
132
20
 
133
- should "be able to push all with criteria and modifier hashes" do
134
- page = @page_class.create(:title => 'Home')
135
- page2 = @page_class.create(:title => 'Home')
136
- tags = %w(foo bar)
137
-
138
- @page_class.push_all({:title => 'Home'}, :tags => tags)
139
-
140
- page.reload
141
- page.tags.should == tags
142
-
143
- page2.reload
144
- page.tags.should == tags
145
- end
146
-
147
- should "be able to push all with ids and modifier hash" do
148
- page = @page_class.create(:title => 'Home')
149
- page2 = @page_class.create(:title => 'Home')
150
- tags = %w(foo bar)
151
-
152
- @page_class.push_all(page.id, page2.id, :tags => tags)
153
-
154
- page.reload
155
- page.tags.should == tags
156
-
157
- page2.reload
158
- page.tags.should == tags
159
- end
160
-
161
- should "be able to pull with criteria and modifier hashes" do
162
- page = @page_class.create(:title => 'Home', :tags => %w(foo bar))
163
- page2 = @page_class.create(:title => 'Home', :tags => %w(foo bar))
164
-
165
- @page_class.pull({:title => 'Home'}, :tags => 'foo')
166
-
167
- page.reload
168
- page.tags.should == %w(bar)
169
-
170
- page2.reload
171
- page.tags.should == %w(bar)
172
- end
173
-
174
- should "be able to pull with ids and modifier hash" do
175
- page = @page_class.create(:title => 'Home', :tags => %w(foo bar))
176
- page2 = @page_class.create(:title => 'Home', :tags => %w(foo bar))
177
-
178
- @page_class.pull(page.id, page2.id, :tags => 'foo')
179
-
180
- page.reload
181
- page.tags.should == %w(bar)
182
-
183
- page2.reload
184
- page.tags.should == %w(bar)
185
- end
21
+ context "using class methods" do
22
+ should "be able to increment with criteria and modifier hashes" do
23
+ page = @page_class.create(:title => 'Home')
24
+ page2 = @page_class.create(:title => 'Home')
186
25
 
187
- should "be able to pull all with criteria and modifier hashes" do
188
- page = @page_class.create(:title => 'Home', :tags => %w(foo bar baz))
189
- page2 = @page_class.create(:title => 'Home', :tags => %w(foo bar baz))
190
-
191
- @page_class.pull_all({:title => 'Home'}, :tags => %w(foo bar))
192
-
193
- page.reload
194
- page.tags.should == %w(baz)
195
-
196
- page2.reload
197
- page.tags.should == %w(baz)
198
- end
199
-
200
- should "be able to pull all with ids and modifier hash" do
201
- page = @page_class.create(:title => 'Home', :tags => %w(foo bar baz))
202
- page2 = @page_class.create(:title => 'Home', :tags => %w(foo bar baz))
203
-
204
- @page_class.pull_all(page.id, page2.id, :tags => %w(foo bar))
205
-
206
- page.reload
207
- page.tags.should == %w(baz)
208
-
209
- page2.reload
210
- page.tags.should == %w(baz)
211
- end
26
+ @page_class.increment({:title => 'Home'}, {
27
+ :day_count => 1, :week_count => 2, :month_count => 3
28
+ })
212
29
 
213
- should "be able to push uniq with criteria and modifier hash" do
214
- page = @page_class.create(:title => 'Home', :tags => 'foo')
215
- page2 = @page_class.create(:title => 'Home')
216
-
217
- @page_class.push_uniq({:title => 'Home'}, :tags => 'foo')
218
-
219
- page.reload
220
- page.tags.should == %w(foo)
221
-
222
- page2.reload
223
- page.tags.should == %w(foo)
224
- end
225
-
226
- should "be able to push uniq with ids and modifier hash" do
227
- page = @page_class.create(:title => 'Home', :tags => 'foo')
228
- page2 = @page_class.create(:title => 'Home')
229
-
230
- @page_class.push_uniq(page.id, page2.id, :tags => 'foo')
231
-
232
- page.reload
233
- page.tags.should == %w(foo)
234
-
235
- page2.reload
236
- page.tags.should == %w(foo)
237
- end
238
-
239
- should "be able to remove the last element the array" do
240
- page = @page_class.create(:title => 'Home', :tags => %w(foo bar))
241
- @page_class.pop(page.id, :tags => 1)
242
- page.reload
243
- page.tags.should == %w(foo)
30
+ assert_page_counts page, 1, 2, 3
31
+ assert_page_counts page2, 1, 2, 3
32
+ end
33
+
34
+ should "be able to increment with ids and modifier hash" do
35
+ page = @page_class.create(:title => 'Home')
36
+ page2 = @page_class.create(:title => 'Home')
37
+
38
+ @page_class.increment(page.id, page2.id, {
39
+ :day_count => 1, :week_count => 2, :month_count => 3
40
+ })
41
+
42
+ assert_page_counts page, 1, 2, 3
43
+ assert_page_counts page2, 1, 2, 3
44
+ end
45
+
46
+ should "be able to decrement with criteria and modifier hashes" do
47
+ page = @page_class.create(:title => 'Home', :day_count => 1, :week_count => 2, :month_count => 3)
48
+ page2 = @page_class.create(:title => 'Home', :day_count => 1, :week_count => 2, :month_count => 3)
49
+
50
+ @page_class.decrement({:title => 'Home'}, {
51
+ :day_count => 1, :week_count => 2, :month_count => 3
52
+ })
53
+
54
+ assert_page_counts page, 0, 0, 0
55
+ assert_page_counts page2, 0, 0, 0
56
+ end
57
+
58
+ should "be able to decrement with ids and modifier hash" do
59
+ page = @page_class.create(:title => 'Home', :day_count => 1, :week_count => 2, :month_count => 3)
60
+ page2 = @page_class.create(:title => 'Home', :day_count => 1, :week_count => 2, :month_count => 3)
61
+
62
+ @page_class.decrement(page.id, page2.id, {
63
+ :day_count => 1, :week_count => 2, :month_count => 3
64
+ })
65
+
66
+ assert_page_counts page, 0, 0, 0
67
+ assert_page_counts page2, 0, 0, 0
68
+ end
69
+
70
+ should "always decrement when decrement is called whether number is positive or negative" do
71
+ page = @page_class.create(:title => 'Home', :day_count => 1, :week_count => 2, :month_count => 3)
72
+ page2 = @page_class.create(:title => 'Home', :day_count => 1, :week_count => 2, :month_count => 3)
73
+
74
+ @page_class.decrement(page.id, page2.id, {
75
+ :day_count => -1, :week_count => 2, :month_count => -3
76
+ })
77
+
78
+ assert_page_counts page, 0, 0, 0
79
+ assert_page_counts page2, 0, 0, 0
80
+ end
81
+
82
+ should "be able to set with criteria and modifier hashes" do
83
+ page = @page_class.create(:title => 'Home')
84
+ page2 = @page_class.create(:title => 'Home')
85
+
86
+ @page_class.set({:title => 'Home'}, :title => 'Home Revised')
87
+
88
+ page.reload
89
+ page.title.should == 'Home Revised'
90
+
91
+ page2.reload
92
+ page2.title.should == 'Home Revised'
93
+ end
94
+
95
+ should "be able to set with ids and modifier hash" do
96
+ page = @page_class.create(:title => 'Home')
97
+ page2 = @page_class.create(:title => 'Home')
98
+
99
+ @page_class.set(page.id, page2.id, :title => 'Home Revised')
100
+
101
+ page.reload
102
+ page.title.should == 'Home Revised'
103
+
104
+ page2.reload
105
+ page2.title.should == 'Home Revised'
106
+ end
107
+
108
+ should "be able to push with criteria and modifier hashes" do
109
+ page = @page_class.create(:title => 'Home')
110
+ page2 = @page_class.create(:title => 'Home')
111
+
112
+ @page_class.push({:title => 'Home'}, :tags => 'foo')
113
+
114
+ page.reload
115
+ page.tags.should == %w(foo)
116
+
117
+ page2.reload
118
+ page.tags.should == %w(foo)
119
+ end
120
+
121
+ should "be able to push with ids and modifier hash" do
122
+ page = @page_class.create(:title => 'Home')
123
+ page2 = @page_class.create(:title => 'Home')
124
+
125
+ @page_class.push(page.id, page2.id, :tags => 'foo')
126
+
127
+ page.reload
128
+ page.tags.should == %w(foo)
129
+
130
+ page2.reload
131
+ page.tags.should == %w(foo)
132
+ end
133
+
134
+ should "be able to push all with criteria and modifier hashes" do
135
+ page = @page_class.create(:title => 'Home')
136
+ page2 = @page_class.create(:title => 'Home')
137
+ tags = %w(foo bar)
138
+
139
+ @page_class.push_all({:title => 'Home'}, :tags => tags)
140
+
141
+ page.reload
142
+ page.tags.should == tags
143
+
144
+ page2.reload
145
+ page.tags.should == tags
146
+ end
147
+
148
+ should "be able to push all with ids and modifier hash" do
149
+ page = @page_class.create(:title => 'Home')
150
+ page2 = @page_class.create(:title => 'Home')
151
+ tags = %w(foo bar)
152
+
153
+ @page_class.push_all(page.id, page2.id, :tags => tags)
154
+
155
+ page.reload
156
+ page.tags.should == tags
157
+
158
+ page2.reload
159
+ page.tags.should == tags
160
+ end
161
+
162
+ should "be able to pull with criteria and modifier hashes" do
163
+ page = @page_class.create(:title => 'Home', :tags => %w(foo bar))
164
+ page2 = @page_class.create(:title => 'Home', :tags => %w(foo bar))
165
+
166
+ @page_class.pull({:title => 'Home'}, :tags => 'foo')
167
+
168
+ page.reload
169
+ page.tags.should == %w(bar)
170
+
171
+ page2.reload
172
+ page.tags.should == %w(bar)
173
+ end
174
+
175
+ should "be able to pull with ids and modifier hash" do
176
+ page = @page_class.create(:title => 'Home', :tags => %w(foo bar))
177
+ page2 = @page_class.create(:title => 'Home', :tags => %w(foo bar))
178
+
179
+ @page_class.pull(page.id, page2.id, :tags => 'foo')
180
+
181
+ page.reload
182
+ page.tags.should == %w(bar)
183
+
184
+ page2.reload
185
+ page.tags.should == %w(bar)
186
+ end
187
+
188
+ should "be able to pull all with criteria and modifier hashes" do
189
+ page = @page_class.create(:title => 'Home', :tags => %w(foo bar baz))
190
+ page2 = @page_class.create(:title => 'Home', :tags => %w(foo bar baz))
191
+
192
+ @page_class.pull_all({:title => 'Home'}, :tags => %w(foo bar))
193
+
194
+ page.reload
195
+ page.tags.should == %w(baz)
196
+
197
+ page2.reload
198
+ page.tags.should == %w(baz)
199
+ end
200
+
201
+ should "be able to pull all with ids and modifier hash" do
202
+ page = @page_class.create(:title => 'Home', :tags => %w(foo bar baz))
203
+ page2 = @page_class.create(:title => 'Home', :tags => %w(foo bar baz))
204
+
205
+ @page_class.pull_all(page.id, page2.id, :tags => %w(foo bar))
206
+
207
+ page.reload
208
+ page.tags.should == %w(baz)
209
+
210
+ page2.reload
211
+ page.tags.should == %w(baz)
212
+ end
213
+
214
+ should "be able to push uniq with criteria and modifier hash" do
215
+ page = @page_class.create(:title => 'Home', :tags => 'foo')
216
+ page2 = @page_class.create(:title => 'Home')
217
+
218
+ @page_class.push_uniq({:title => 'Home'}, :tags => 'foo')
219
+
220
+ page.reload
221
+ page.tags.should == %w(foo)
222
+
223
+ page2.reload
224
+ page.tags.should == %w(foo)
225
+ end
226
+
227
+ should "be able to push uniq with ids and modifier hash" do
228
+ page = @page_class.create(:title => 'Home', :tags => 'foo')
229
+ page2 = @page_class.create(:title => 'Home')
230
+
231
+ @page_class.push_uniq(page.id, page2.id, :tags => 'foo')
232
+
233
+ page.reload
234
+ page.tags.should == %w(foo)
235
+
236
+ page2.reload
237
+ page.tags.should == %w(foo)
238
+ end
239
+
240
+ should "be able to remove the last element the array" do
241
+ page = @page_class.create(:title => 'Home', :tags => %w(foo bar))
242
+ @page_class.pop(page.id, :tags => 1)
243
+ page.reload
244
+ page.tags.should == %w(foo)
245
+ end
246
+
247
+ should "be able to remove the first element of the array" do
248
+ page = @page_class.create(:title => 'Home', :tags => %w(foo bar))
249
+ @page_class.pop(page.id, :tags => -1)
250
+ page.reload
251
+ page.tags.should == %w(bar)
252
+ end
244
253
  end
245
254
 
246
- should "be able to remove the first element of the array" do
247
- page = @page_class.create(:title => 'Home', :tags => %w(foo bar))
248
- @page_class.pop(page.id, :tags => -1)
249
- page.reload
250
- page.tags.should == %w(bar)
255
+ context "using instance methods" do
256
+ should "be able to increment with modifier hashes" do
257
+ page = @page_class.create
258
+
259
+ page.increment({:day_count => 1, :week_count => 2, :month_count => 3})
260
+
261
+ assert_page_counts page, 1, 2, 3
262
+ end
263
+
264
+ should "be able to decrement with modifier hashes" do
265
+ page = @page_class.create(:day_count => 1, :week_count => 2, :month_count => 3)
266
+
267
+ page.decrement({:day_count => 1, :week_count => 2, :month_count => 3})
268
+
269
+ assert_page_counts page, 0, 0, 0
270
+ end
271
+
272
+ should "always decrement when decrement is called whether number is positive or negative" do
273
+ page = @page_class.create(:day_count => 1, :week_count => 2, :month_count => 3)
274
+
275
+ page.decrement({:day_count => -1, :week_count => 2, :month_count => -3})
276
+
277
+ assert_page_counts page, 0, 0, 0
278
+ end
279
+
280
+ should "be able to set with modifier hashes" do
281
+ page = @page_class.create(:title => 'Home')
282
+
283
+ page.set(:title => 'Home Revised')
284
+
285
+ page.reload
286
+ page.title.should == 'Home Revised'
287
+ end
288
+
289
+ should "be able to push with modifier hashes" do
290
+ page = @page_class.create
291
+
292
+ page.push(:tags => 'foo')
293
+
294
+ page.reload
295
+ page.tags.should == %w(foo)
296
+ end
297
+
298
+ should "be able to pull with criteria and modifier hashes" do
299
+ page = @page_class.create(:tags => %w(foo bar))
300
+
301
+ page.pull(:tags => 'foo')
302
+
303
+ page.reload
304
+ page.tags.should == %w(bar)
305
+ end
306
+
307
+ should "be able to push uniq with criteria and modifier hash" do
308
+ page = @page_class.create(:tags => 'foo')
309
+ page2 = @page_class.create
310
+
311
+ page.push_uniq(:tags => 'foo')
312
+ page.push_uniq(:tags => 'foo')
313
+
314
+ page.reload
315
+ page.tags.should == %w(foo)
316
+
317
+ page2.reload
318
+ page.tags.should == %w(foo)
319
+ end
251
320
  end
321
+
252
322
  end