couchrest_model 2.1.0.rc1 → 2.2.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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.travis.yml +15 -4
  4. data/Gemfile.activesupport-4.x +4 -0
  5. data/Gemfile.activesupport-5.x +4 -0
  6. data/README.md +2 -0
  7. data/VERSION +1 -1
  8. data/couchrest_model.gemspec +3 -2
  9. data/history.md +14 -1
  10. data/lib/couchrest/model/associations.rb +3 -8
  11. data/lib/couchrest/model/base.rb +15 -7
  12. data/lib/couchrest/model/casted_array.rb +22 -34
  13. data/lib/couchrest/model/configuration.rb +2 -0
  14. data/lib/couchrest/model/design.rb +4 -3
  15. data/lib/couchrest/model/designs/view.rb +37 -32
  16. data/lib/couchrest/model/dirty.rb +93 -19
  17. data/lib/couchrest/model/embeddable.rb +2 -14
  18. data/lib/couchrest/model/extended_attachments.rb +2 -4
  19. data/lib/couchrest/model/persistence.rb +14 -17
  20. data/lib/couchrest/model/properties.rb +46 -54
  21. data/lib/couchrest/model/property.rb +0 -3
  22. data/lib/couchrest/model/proxyable.rb +20 -4
  23. data/lib/couchrest/model/validations/uniqueness.rb +4 -1
  24. data/lib/couchrest_model.rb +2 -2
  25. data/spec/fixtures/models/article.rb +1 -1
  26. data/spec/fixtures/models/card.rb +2 -1
  27. data/spec/fixtures/models/person.rb +1 -0
  28. data/spec/fixtures/models/project.rb +3 -0
  29. data/spec/unit/assocations_spec.rb +73 -73
  30. data/spec/unit/attachment_spec.rb +34 -34
  31. data/spec/unit/base_spec.rb +102 -102
  32. data/spec/unit/casted_array_spec.rb +7 -7
  33. data/spec/unit/casted_spec.rb +7 -7
  34. data/spec/unit/configuration_spec.rb +11 -11
  35. data/spec/unit/connection_spec.rb +30 -30
  36. data/spec/unit/core_extensions/{time_parsing.rb → time_parsing_spec.rb} +21 -21
  37. data/spec/unit/design_spec.rb +38 -38
  38. data/spec/unit/designs/design_mapper_spec.rb +26 -26
  39. data/spec/unit/designs/migrations_spec.rb +13 -13
  40. data/spec/unit/designs/view_spec.rb +319 -274
  41. data/spec/unit/designs_spec.rb +39 -39
  42. data/spec/unit/dirty_spec.rb +188 -103
  43. data/spec/unit/embeddable_spec.rb +119 -117
  44. data/spec/unit/inherited_spec.rb +4 -4
  45. data/spec/unit/persistence_spec.rb +122 -122
  46. data/spec/unit/properties_spec.rb +466 -16
  47. data/spec/unit/property_protection_spec.rb +32 -32
  48. data/spec/unit/property_spec.rb +45 -436
  49. data/spec/unit/proxyable_spec.rb +140 -82
  50. data/spec/unit/subclass_spec.rb +14 -14
  51. data/spec/unit/translations_spec.rb +5 -5
  52. data/spec/unit/typecast_spec.rb +131 -131
  53. data/spec/unit/utils/migrate_spec.rb +2 -2
  54. data/spec/unit/validations_spec.rb +31 -31
  55. metadata +27 -12
  56. data/lib/couchrest/model/casted_hash.rb +0 -84
@@ -4,7 +4,7 @@ require "spec_helper"
4
4
  describe CouchRest::Model::Designs do
5
5
 
6
6
  it "should accessable from model" do
7
- DesignModel.respond_to?(:design).should be_true
7
+ expect(DesignModel.respond_to?(:design)).to be_truthy
8
8
  end
9
9
 
10
10
  describe "class methods" do
@@ -18,35 +18,35 @@ describe CouchRest::Model::Designs do
18
18
  describe "without block" do
19
19
  it "should create design_doc and all methods" do
20
20
  @klass.design
21
- @klass.should respond_to(:design_doc)
22
- @klass.should respond_to(:all)
21
+ expect(@klass).to respond_to(:design_doc)
22
+ expect(@klass).to respond_to(:all)
23
23
  end
24
24
 
25
25
  it "should created named design_doc method and not all" do
26
26
  @klass.design :stats
27
- @klass.should respond_to(:stats_design_doc)
28
- @klass.should_not respond_to(:all)
27
+ expect(@klass).to respond_to(:stats_design_doc)
28
+ expect(@klass).not_to respond_to(:all)
29
29
  end
30
30
 
31
31
  it "should have added itself to a design_blocks array" do
32
32
  @klass.design
33
33
  blocks = @klass.instance_variable_get(:@_design_blocks)
34
- blocks.length.should eql(1)
35
- blocks.first.should eql({:args => [], :block => nil})
34
+ expect(blocks.length).to eql(1)
35
+ expect(blocks.first).to eql({:args => [], :block => nil})
36
36
  end
37
37
 
38
38
  it "should have added itself to a design_blocks array" do
39
39
  @klass.design
40
40
  blocks = @klass.instance_variable_get(:@_design_blocks)
41
- blocks.length.should eql(1)
42
- blocks.first.should eql({:args => [], :block => nil})
41
+ expect(blocks.length).to eql(1)
42
+ expect(blocks.first).to eql({:args => [], :block => nil})
43
43
  end
44
44
 
45
45
  it "should have added itself to a design_blocks array with prefix" do
46
46
  @klass.design :stats
47
47
  blocks = @klass.instance_variable_get(:@_design_blocks)
48
- blocks.length.should eql(1)
49
- blocks.first.should eql({:args => [:stats], :block => nil})
48
+ expect(blocks.length).to eql(1)
49
+ expect(blocks.first).to eql({:args => [:stats], :block => nil})
50
50
  end
51
51
  end
52
52
 
@@ -59,13 +59,13 @@ describe CouchRest::Model::Designs do
59
59
  end
60
60
 
61
61
  it "should pass calls to mapper" do
62
- @klass.design_doc.auto_update.should be_false
62
+ expect(@klass.design_doc.auto_update).to be_falsey
63
63
  end
64
64
 
65
65
  it "should have added itself to a design_blocks array" do
66
66
  blocks = @klass.instance_variable_get(:@_design_blocks)
67
- blocks.length.should eql(1)
68
- blocks.first.should eql({:args => [], :block => @block})
67
+ expect(blocks.length).to eql(1)
68
+ expect(blocks.first).to eql({:args => [], :block => @block})
69
69
  end
70
70
 
71
71
  it "should handle multiple designs" do
@@ -74,9 +74,9 @@ describe CouchRest::Model::Designs do
74
74
  end
75
75
  @klass.design :stats, &@block2
76
76
  blocks = @klass.instance_variable_get(:@_design_blocks)
77
- blocks.length.should eql(2)
78
- blocks.first.should eql({:args => [], :block => @block})
79
- blocks.last.should eql({:args => [:stats], :block => @block2})
77
+ expect(blocks.length).to eql(2)
78
+ expect(blocks.first).to eql({:args => [], :block => @block})
79
+ expect(blocks.last).to eql({:args => [:stats], :block => @block2})
80
80
  end
81
81
  end
82
82
 
@@ -92,21 +92,21 @@ describe CouchRest::Model::Designs do
92
92
  end
93
93
 
94
94
  it "should add designs to sub module" do
95
- @klass.should respond_to(:design_doc)
95
+ expect(@klass).to respond_to(:design_doc)
96
96
  end
97
97
 
98
98
  end
99
99
 
100
100
  describe "default_per_page" do
101
101
  it "should return 25 default" do
102
- DesignModel.default_per_page.should eql(25)
102
+ expect(DesignModel.default_per_page).to eql(25)
103
103
  end
104
104
  end
105
105
 
106
106
  describe ".paginates_per" do
107
107
  it "should set the default per page value" do
108
108
  DesignModel.paginates_per(21)
109
- DesignModel.default_per_page.should eql(21)
109
+ expect(DesignModel.default_per_page).to eql(21)
110
110
  end
111
111
  end
112
112
  end
@@ -136,12 +136,12 @@ describe CouchRest::Model::Designs do
136
136
 
137
137
  it "will fail if reduce is not specific in view" do
138
138
  @mod.create(:title => 'This is a test')
139
- lambda { @mod.by_title_fail.first }.should raise_error(CouchRest::NotFound)
139
+ expect { @mod.by_title_fail.first }.to raise_error(CouchRest::NotFound)
140
140
  end
141
141
 
142
142
  it "will perform view request" do
143
143
  @mod.create(:title => 'This is a test')
144
- @mod.by_title.first.title.should eql("This is a test")
144
+ expect(@mod.by_title.first.title).to eql("This is a test")
145
145
  end
146
146
 
147
147
  end
@@ -159,28 +159,28 @@ describe CouchRest::Model::Designs do
159
159
 
160
160
  it "should return single matched record with find helper" do
161
161
  course = Course.find_by_title('bbb')
162
- course.should_not be_nil
163
- course.title.should eql('bbb') # Ensure really is a Course!
162
+ expect(course).not_to be_nil
163
+ expect(course.title).to eql('bbb') # Ensure really is a Course!
164
164
  end
165
165
 
166
166
  it "should return nil if not found" do
167
167
  course = Course.find_by_title('fff')
168
- course.should be_nil
168
+ expect(course).to be_nil
169
169
  end
170
170
 
171
171
  it "should peform search on view with two properties" do
172
172
  course = Course.find_by_title_and_active(['bbb', true])
173
- course.should_not be_nil
174
- course.title.should eql('bbb') # Ensure really is a Course!
173
+ expect(course).not_to be_nil
174
+ expect(course.title).to eql('bbb') # Ensure really is a Course!
175
175
  end
176
176
 
177
177
  it "should return nil if not found" do
178
178
  course = Course.find_by_title_and_active(['bbb', false])
179
- course.should be_nil
179
+ expect(course).to be_nil
180
180
  end
181
181
 
182
182
  it "should raise exception if view not present" do
183
- lambda { Course.find_by_foobar('123') }.should raise_error(NoMethodError)
183
+ expect { Course.find_by_foobar('123') }.to raise_error(NoMethodError)
184
184
  end
185
185
 
186
186
  end
@@ -226,15 +226,15 @@ describe CouchRest::Model::Designs do
226
226
  it "should make the design doc upon first query" do
227
227
  Unattached.by_title.database(@db)
228
228
  doc = Unattached.design_doc
229
- doc['views']['all']['map'].should include('Unattached')
229
+ expect(doc['views']['all']['map']).to include('Unattached')
230
230
  end
231
231
  it "should merge query params" do
232
232
  rs = Unattached.by_title.database(@db).startkey("bbb").endkey("eee")
233
- rs.length.should == 3
233
+ expect(rs.length).to eq(3)
234
234
  end
235
235
  it "should get from specific database" do
236
236
  u = Unattached.get(@first_id, @db)
237
- u.title.should == "aaa"
237
+ expect(u.title).to eq("aaa")
238
238
  end
239
239
  it "should barf on first if no database given" do
240
240
  expect{ Unattached.first }.to raise_error(CouchRest::Model::DatabaseNotDefined)
@@ -246,7 +246,7 @@ describe CouchRest::Model::Designs do
246
246
  end
247
247
  it "should get last" do
248
248
  u = Unattached.all.database(@db).last
249
- u.title.should == "aaa"
249
+ expect(u.title).to eq("aaa")
250
250
  end
251
251
 
252
252
  end
@@ -268,18 +268,18 @@ describe CouchRest::Model::Designs do
268
268
  it "should create the design doc" do
269
269
  Article.by_user_id_and_date rescue nil
270
270
  doc = Article.design_doc
271
- doc['views']['by_date'].should_not be_nil
271
+ expect(doc['views']['by_date']).not_to be_nil
272
272
  end
273
273
  it "should sort correctly" do
274
274
  articles = Article.by_user_id_and_date.all
275
- articles.collect{|a|a['user_id']}.should == ['aaron', 'aaron', 'quentin',
276
- 'quentin']
277
- articles[1].title.should == 'not junk'
275
+ expect(articles.collect{|a|a['user_id']}).to eq(['aaron', 'aaron', 'quentin',
276
+ 'quentin'])
277
+ expect(articles[1].title).to eq('not junk')
278
278
  end
279
279
  it "should be queryable with couchrest options" do
280
280
  articles = Article.by_user_id_and_date(:limit => 1, :startkey => 'quentin').all
281
- articles.length.should == 1
282
- articles[0].title.should == "even more interesting"
281
+ expect(articles.length).to eq(1)
282
+ expect(articles[0].title).to eq("even more interesting")
283
283
  end
284
284
  end
285
285
 
@@ -37,12 +37,8 @@ describe "Dirty" do
37
37
  it "should return changes on an attribute" do
38
38
  @card = Card.new(:first_name => "matt")
39
39
  @card.first_name = "andrew"
40
- @card.first_name_changed?.should be_true
41
- if ActiveModel::VERSION::STRING > "3.2.0"
42
- @card.changes.should == { "first_name" => [nil, "andrew"] }
43
- else
44
- @card.changes.should == { "first_name" => ["matt", "andrew"] }
45
- end
40
+ expect(@card.first_name_changed?).to be_truthy
41
+ expect(@card.changes).to eq([ ["+", "first_name", "andrew"] ])
46
42
  end
47
43
  end
48
44
 
@@ -50,8 +46,8 @@ describe "Dirty" do
50
46
  it "should return changes on an attribute" do
51
47
  @card = Card.create!(:first_name => "matt")
52
48
  @card.first_name = "andrew"
53
- @card.first_name_changed?.should be_true
54
- @card.changes.should == { "first_name" => ["matt", "andrew"] }
49
+ expect(@card.first_name_changed?).to be_truthy
50
+ expect(@card.changes).to eq([["~", "first_name", "matt", "andrew"]])
55
51
  end
56
52
  end
57
53
 
@@ -62,7 +58,7 @@ describe "Dirty" do
62
58
  it "should not save unchanged records" do
63
59
  card_id = Card.create!(:first_name => "matt").id
64
60
  @card = Card.find(card_id)
65
- @card.database.should_not_receive(:save_doc)
61
+ expect(@card.database).not_to receive(:save_doc)
66
62
  @card.save
67
63
  end
68
64
 
@@ -70,7 +66,7 @@ describe "Dirty" do
70
66
  card_id = Card.create!(:first_name => "matt").id
71
67
  @card = Card.find(card_id)
72
68
  @card.first_name = "andrew"
73
- @card.database.should_receive(:save_doc).and_return({"ok" => true})
69
+ expect(@card.database).to receive(:save_doc).and_return({"ok" => true})
74
70
  @card.save
75
71
  end
76
72
 
@@ -81,77 +77,77 @@ describe "Dirty" do
81
77
  # match activerecord behaviour
82
78
  it "should report no changes on a new object with no attributes set" do
83
79
  @card = Card.new
84
- @card.changed?.should be_false
80
+ expect(@card.changed?).to be_falsey
85
81
  end
86
82
 
87
83
  it "should report no changes on a hash property with a default value" do
88
84
  @obj = DirtyModel.new
89
- @obj.details.changed?.should be_false
85
+ expect(@obj.details_changed?).to be_falsey
90
86
  end
91
87
 
92
88
  # match activerecord behaviour
93
89
  it "should report changes on a new object with attributes set" do
94
90
  @card = Card.new(:first_name => "matt")
95
- @card.changed?.should be_true
91
+ expect(@card.changed?).to be_truthy
96
92
  end
97
93
 
98
94
  it "should report no changes on new object with 'unique_id' set" do
99
95
  @obj = DirtyUniqueIdModel.new
100
- @obj.changed?.should be_false
101
- @obj.changes.should be_empty
96
+ expect(@obj.changed?).to be_falsey
97
+ expect(@obj.changes).to be_empty
102
98
  end
103
99
 
104
100
  it "should report no changes on objects fetched from the database" do
105
101
  card_id = Card.create!(:first_name => "matt").id
106
102
  @card = Card.find(card_id)
107
- @card.changed?.should be_false
103
+ expect(@card.changed?).to be_falsey
108
104
  end
109
105
 
110
106
  it "should report changes if the record is modified" do
111
107
  @card = Card.new
112
108
  @card.first_name = "andrew"
113
- @card.changed?.should be_true
114
- @card.first_name_changed?.should be_true
109
+ expect(@card.changed?).to be_truthy
110
+ expect(@card.first_name_changed?).to be_truthy
115
111
  end
116
112
 
117
113
  it 'should report changes if the record is modified by attributes' do
118
114
  @card = Card.new
119
115
  @card.attributes = {:first_name => 'danny'}
120
- @card.changed?.should be_true
121
- @card.first_name_changed?.should be_true
116
+ expect(@card.changed?).to be_truthy
117
+ expect(@card.first_name_changed?).to be_truthy
122
118
  end
123
119
 
124
120
  it 'should report no changes if the record is modified with an invalid property by attributes' do
125
121
  @card = Card.new
126
122
  @card.attributes = {:middle_name => 'danny'}
127
- @card.changed?.should be_false
128
- @card.first_name_changed?.should be_false
123
+ expect(@card.changed?).to be_falsey
124
+ expect(@card.first_name_changed?).to be_falsey
129
125
  end
130
126
 
131
127
  it "should report no changes if the record is modified with update_attributes" do
132
128
  @card = Card.new
133
129
  @card.update_attributes(:first_name => 'henry')
134
- @card.changed?.should be_false
130
+ expect(@card.changed?).to be_falsey
135
131
  end
136
132
 
137
133
  it "should report no changes if the record is modified with an invalid property by update_attributes" do
138
134
  @card = Card.new
139
135
  @card.update_attributes(:middle_name => 'peter')
140
- @card.changed?.should be_false
136
+ expect(@card.changed?).to be_falsey
141
137
  end
142
138
 
143
139
  it "should report no changes for unmodified records" do
144
140
  card_id = Card.create!(:first_name => "matt").id
145
141
  @card = Card.find(card_id)
146
142
  @card.first_name = "matt"
147
- @card.changed?.should be_false
148
- @card.first_name_changed?.should be_false
143
+ expect(@card.changed?).to be_falsey
144
+ expect(@card.first_name_changed?).to be_falsey
149
145
  end
150
146
 
151
147
  it "should report no changes after a new record has been saved" do
152
148
  @card = Card.new(:first_name => "matt")
153
149
  @card.save!
154
- @card.changed?.should be_false
150
+ expect(@card.changed?).to be_falsey
155
151
  end
156
152
 
157
153
  it "should report no changes after a record has been saved" do
@@ -159,7 +155,7 @@ describe "Dirty" do
159
155
  @card = Card.find(card_id)
160
156
  @card.first_name = "andrew"
161
157
  @card.save!
162
- @card.changed?.should be_false
158
+ expect(@card.changed?).to be_falsey
163
159
  end
164
160
 
165
161
  # test changing list properties
@@ -168,14 +164,14 @@ describe "Dirty" do
168
164
  cat_id = Cat.create!(:name => "Felix", :toys => [{:name => "Mouse"}]).id
169
165
  @cat = Cat.find(cat_id)
170
166
  @cat.toys = [{:name => "Feather"}]
171
- @cat.changed?.should be_true
167
+ expect(@cat.changed?).to be_truthy
172
168
  end
173
169
 
174
170
  it "should report no changes if a list property is unmodified" do
175
171
  cat_id = Cat.create!(:name => "Felix", :toys => [{:name => "Mouse"}]).id
176
172
  @cat = Cat.find(cat_id)
177
173
  @cat.toys = [{:name => "Mouse"}] # same as original list
178
- @cat.changed?.should be_false
174
+ expect(@cat.changed?).to be_falsey
179
175
  end
180
176
 
181
177
  # attachments
@@ -185,7 +181,7 @@ describe "Dirty" do
185
181
  @file = File.open(FIXTURE_PATH + '/attachments/test.html')
186
182
  @cat = Cat.find(cat_id)
187
183
  @cat.create_attachment(:file => @file, :name => "my_attachment")
188
- @cat.changed?.should be_true
184
+ expect(@cat.changed?).to be_truthy
189
185
  end
190
186
 
191
187
  it "should report changes if an attachment is deleted" do
@@ -196,7 +192,7 @@ describe "Dirty" do
196
192
  @cat.save
197
193
  @cat = Cat.find(@cat.id)
198
194
  @cat.delete_attachment(@attachment_name)
199
- @cat.changed?.should be_true
195
+ expect(@cat.changed?).to be_truthy
200
196
  end
201
197
 
202
198
  # casted models
@@ -205,29 +201,29 @@ describe "Dirty" do
205
201
  @cat = Cat.create!(:name => "Felix", :favorite_toy => { :name => "Mouse" })
206
202
  @cat = Cat.find(@cat.id)
207
203
  @cat.favorite_toy.name = 'Feather'
208
- @cat.changed?.should be_true
204
+ expect(@cat.changed?).to be_truthy
209
205
  end
210
206
 
211
207
  it "should report changes to casted model in array" do
212
208
  @obj = Cat.create!(:name => 'felix', :toys => [{:name => "Catnip"}])
213
209
  @obj = Cat.get(@obj.id)
214
- @obj.toys.first.name.should eql('Catnip')
215
- @obj.toys.first.changed?.should be_false
216
- @obj.changed?.should be_false
210
+ expect(@obj.toys.first.name).to eql('Catnip')
211
+ expect(@obj.toys.first.changed?).to be_falsey
212
+ expect(@obj.changed?).to be_falsey
217
213
  @obj.toys.first.name = "Super Catnip"
218
- @obj.toys.first.changed?.should be_true
219
- @obj.changed?.should be_true
214
+ expect(@obj.toys.first.changed?).to be_truthy
215
+ expect(@obj.changed?).to be_truthy
220
216
  end
221
217
 
222
218
  it "should report changes to anonymous casted models in array" do
223
219
  @obj = DirtyModel.create!(:sub_models => [{:title => "Sample"}])
224
220
  @obj = DirtyModel.get(@obj.id)
225
- @obj.sub_models.first.title.should eql("Sample")
226
- @obj.sub_models.first.changed?.should be_false
227
- @obj.changed?.should be_false
221
+ expect(@obj.sub_models.first.title).to eql("Sample")
222
+ expect(@obj.sub_models.first.changed?).to be_falsey
223
+ expect(@obj.changed?).to be_falsey
228
224
  @obj.sub_models.first.title = "Another Sample"
229
- @obj.sub_models.first.changed?.should be_true
230
- @obj.changed?.should be_true
225
+ expect(@obj.sub_models.first.changed?).to be_truthy
226
+ expect(@obj.changed?).to be_truthy
231
227
  end
232
228
 
233
229
  # casted arrays
@@ -235,63 +231,62 @@ describe "Dirty" do
235
231
  def test_casted_array(change_expected)
236
232
  obj = DirtyModel.create!
237
233
  obj = DirtyModel.get(obj.id)
238
- array = obj.keywords
239
- yield array, obj
234
+ yield obj
240
235
  if change_expected
241
- obj.changed?.should be_true
236
+ expect(obj.changed?).to be_truthy
242
237
  else
243
- obj.changed?.should be_false
238
+ expect(obj.changed?).to be_falsey
244
239
  end
245
240
  end
246
241
 
247
242
  def should_change_array
248
- test_casted_array(true) { |a,b| yield a,b }
243
+ test_casted_array(true) { |a| yield a }
249
244
  end
250
245
 
251
246
  def should_not_change_array
252
- test_casted_array(false) { |a,b| yield a,b }
247
+ test_casted_array(false) { |a| yield a }
253
248
  end
254
249
 
255
250
  it "should report changes if an array index is modified" do
256
- should_change_array do |array, obj|
257
- array[0] = "keyword"
251
+ should_change_array do |obj|
252
+ obj.keywords[0] = "keyword"
258
253
  end
259
254
  end
260
255
 
261
256
  it "should report no changes if an array index is unmodified" do
262
- should_not_change_array do |array, obj|
263
- array[0] = array[0]
257
+ should_not_change_array do |obj|
258
+ obj.keywords[0] = obj.keywords[0]
264
259
  end
265
260
  end
266
261
 
267
262
  it "should report changes if an array is appended with <<" do
268
- should_change_array do |array, obj|
269
- array << 'keyword'
263
+ should_change_array do |obj|
264
+ obj.keywords << 'keyword'
270
265
  end
271
266
  end
272
267
 
273
268
  it "should report changes if item is inserted into array" do
274
- should_change_array do |array, obj|
275
- array.insert(0, 'keyword')
276
- obj.keywords[0].should eql('keyword')
269
+ should_change_array do |obj|
270
+ obj.keywords.insert(0, 'keyword')
271
+ expect(obj.keywords[0]).to eql('keyword')
277
272
  end
278
273
  end
279
274
 
280
275
  it "should report changes if items are inserted into array" do
281
- should_change_array do |array, obj|
282
- array.insert(1, 'keyword', 'keyword2')
283
- obj.keywords[2].should eql('keyword2')
276
+ should_change_array do |obj|
277
+ obj.keywords.insert(1, 'keyword', 'keyword2')
278
+ expect(obj.keywords[2]).to eql('keyword2')
284
279
  end
285
280
  end
286
281
 
287
282
  it "should report changes if an array is popped" do
288
- should_change_array do |array, obj|
289
- array.pop
283
+ should_change_array do |obj|
284
+ obj.keywords.pop
290
285
  end
291
286
  end
292
287
 
293
288
  it "should report changes if an array is popped after reload" do
294
- should_change_array do |array, obj|
289
+ should_change_array do |obj|
295
290
  obj.reload
296
291
  obj.keywords.pop
297
292
  end
@@ -299,86 +294,86 @@ describe "Dirty" do
299
294
 
300
295
 
301
296
  it "should report no changes if an empty array is popped" do
302
- should_not_change_array do |array, obj|
303
- array.clear
297
+ should_not_change_array do |obj|
298
+ obj.keywords.clear
304
299
  obj.save! # clears changes
305
- array.pop
300
+ obj.keywords.pop
306
301
  end
307
302
  end
308
303
 
309
304
  it "should report changes on deletion from an array" do
310
- should_change_array do |array, obj|
311
- array << "keyword"
305
+ should_change_array do |obj|
306
+ obj.keywords << "keyword"
312
307
  obj.save!
313
- array.delete_at(0)
308
+ obj.keywords.delete_at(0)
314
309
  end
315
310
 
316
- should_change_array do |array, obj|
317
- array << "keyword"
311
+ should_change_array do |obj|
312
+ obj.keywords << "keyword"
318
313
  obj.save!
319
- array.delete("keyword")
314
+ obj.keywords.delete("keyword")
320
315
  end
321
316
  end
322
317
 
323
318
  it "should report changes on deletion from an array after reload" do
324
- should_change_array do |array, obj|
325
- array << "keyword"
319
+ should_change_array do |obj|
320
+ obj.keywords << "keyword"
326
321
  obj.save!
327
322
  obj.reload
328
- array.delete_at(0)
323
+ obj.keywords.delete_at(0)
329
324
  end
330
325
 
331
- should_change_array do |array, obj|
332
- array << "keyword"
326
+ should_change_array do |obj|
327
+ obj.keywords << "keyword"
333
328
  obj.save!
334
329
  obj.reload
335
- array.delete("keyword")
330
+ obj.keywords.delete("keyword")
336
331
  end
337
332
  end
338
333
 
339
334
  it "should report no changes on deletion from an empty array" do
340
- should_not_change_array do |array, obj|
341
- array.clear
335
+ should_not_change_array do |obj|
336
+ obj.keywords.clear
342
337
  obj.save!
343
- array.delete_at(0)
338
+ obj.keywords.delete_at(0)
344
339
  end
345
340
 
346
- should_not_change_array do |array, obj|
347
- array.clear
341
+ should_not_change_array do |obj|
342
+ obj.keywords.clear
348
343
  obj.save!
349
- array.delete("keyword")
344
+ obj.keywords.delete("keyword")
350
345
  end
351
346
  end
352
347
 
353
348
  it "should report changes if an array is pushed" do
354
- should_change_array do |array, obj|
355
- array.push("keyword")
349
+ should_change_array do |obj|
350
+ obj.keywords.push("keyword")
356
351
  end
357
352
  end
358
353
 
359
354
  it "should report changes if an array is shifted" do
360
- should_change_array do |array, obj|
361
- array.shift
355
+ should_change_array do |obj|
356
+ obj.keywords.shift
362
357
  end
363
358
  end
364
359
 
365
360
  it "should report no changes if an empty array is shifted" do
366
- should_not_change_array do |array, obj|
367
- array.clear
361
+ should_not_change_array do |obj|
362
+ obj.keywords.clear
368
363
  obj.save! # clears changes
369
- array.shift
364
+ obj.keywords.shift
370
365
  end
371
366
  end
372
367
 
373
368
  it "should report changes if an array is unshifted" do
374
- should_change_array do |array, obj|
375
- array.unshift("keyword")
369
+ should_change_array do |obj|
370
+ obj.keywords.unshift("keyword")
376
371
  end
377
372
  end
378
373
 
379
374
  it "should report changes if an array is cleared" do
380
- should_change_array do |array, obj|
381
- array.clear
375
+ should_change_array do |obj|
376
+ obj.keywords.clear
382
377
  end
383
378
  end
384
379
 
@@ -390,9 +385,9 @@ describe "Dirty" do
390
385
  hash = obj.details
391
386
  yield hash, obj
392
387
  if change_expected
393
- obj.changed?.should be_true
388
+ expect(obj.changed?).to be_truthy
394
389
  else
395
- obj.changed?.should be_false
390
+ expect(obj.changed?).to be_falsey
396
391
  end
397
392
  end
398
393
 
@@ -488,6 +483,63 @@ describe "Dirty" do
488
483
 
489
484
  end
490
485
 
486
+ describe "#clear_changes_information" do
487
+
488
+ let :obj do
489
+ Cat.new(:name => "Sam")
490
+ end
491
+
492
+ it "should reset any change information" do
493
+ obj.name = "Sambo"
494
+ obj.clear_changes_information
495
+ expect(obj.changed?).to be_falsey
496
+ expect(obj.name_changed?).to be_falsey
497
+ end
498
+
499
+ it "should reset nested changed information" do
500
+ obj.favorite_toy = { name: 'freddo' }
501
+ obj.save
502
+ obj.favorite_toy.name = 'froddo'
503
+ expect(obj.changed?).to be_truthy
504
+ obj.clear_changes_information
505
+ expect(obj.changed?).to be_falsey
506
+ expect(obj.favorite_toy.changed?).to be_falsey
507
+ expect(obj.favorite_toy.name_changed?).to be_falsey
508
+ end
509
+
510
+ end
511
+
512
+ describe "property methods" do
513
+
514
+ let :obj do
515
+ Card.create!(:first_name => "Sam")
516
+ end
517
+
518
+ describe "#property_changed?" do
519
+ it "should be true on change" do
520
+ expect(obj.first_name_changed?).to be_falsey
521
+ obj.first_name = "Sambo"
522
+ expect(obj.first_name_changed?).to be_truthy
523
+ end
524
+ end
525
+
526
+ describe "#property_was" do
527
+ it "should be true on change" do
528
+ expect(obj.first_name_was).to eql("Sam")
529
+ obj.first_name = "Sambo"
530
+ expect(obj.first_name_was).to eql("Sam")
531
+ end
532
+ end
533
+
534
+ describe "#property_change" do
535
+ it "should show change" do
536
+ expect(obj.first_name_change).to eql([])
537
+ obj.first_name = "Sambo"
538
+ expect(obj.first_name_change).to eql(['Sam', 'Sambo'])
539
+ end
540
+ end
541
+
542
+ end
491
543
 
492
544
  describe "when mass_assign_any_attribute true" do
493
545
  before(:each) do
@@ -501,32 +553,65 @@ describe "Dirty" do
501
553
 
502
554
  it "should report no changes if the record is modified with update_attributes" do
503
555
  @card.update_attributes(:other_name => 'henry')
504
- @card.changed?.should be_false
556
+ expect(@card.changed?).to be_falsey
505
557
  end
506
558
 
507
559
  it "should report not new if the record is modified with update_attributes" do
508
560
  @card.update_attributes(:other_name => 'henry')
509
- @card.new?.should be_false
561
+ expect(@card.new?).to be_falsey
510
562
  end
511
563
 
512
564
  it 'should report changes when updated with attributes' do
513
565
  @card.save
514
566
  @card.attributes = {:testing => 'fooobar'}
515
- @card.changed?.should be_true
567
+ expect(@card.changed?).to be_truthy
516
568
  end
517
569
 
518
570
  it 'should report changes when updated with a known property' do
519
571
  @card.save
520
572
  @card.first_name = 'Danny'
521
- @card.changed?.should be_true
573
+ expect(@card.changed?).to be_truthy
522
574
  end
523
575
 
524
576
  it "should not report changes if property is updated with same value" do
525
577
  @card.update_attributes :testing => 'fooobar'
526
578
  @card.attributes = {'testing' => 'fooobar'}
527
- @card.changed?.should be_false
579
+ expect(@card.changed?).to be_falsey
528
580
  end
529
581
 
530
582
  end
531
583
 
584
+ context "when dirty tracking is disabled" do
585
+
586
+ let :obj do
587
+ Project.new(:name => 'Test')
588
+ end
589
+
590
+ it "should be persisted correctly" do
591
+ obj.save!
592
+ expect(Project.get(obj.id)).to_not be_nil
593
+ end
594
+
595
+ it "should always assume the doc has changed" do
596
+ expect(obj.changed?).to be_truthy
597
+ obj.save!
598
+ expect(obj.changed?).to be_truthy
599
+ end
600
+
601
+ it "should provide a nil changes set" do
602
+ expect(obj.changes).to be_nil
603
+ end
604
+
605
+ it "should not store a changes cache" do
606
+ expect(obj.send(:original_change_data)).to be_nil
607
+ end
608
+
609
+ it "should asume all properties have changed" do
610
+ obj.save!
611
+ obj.name = "Fooo"
612
+ expect(obj.name_changed?).to be_truthy
613
+ expect(obj.name_change).to eql(nil)
614
+ end
615
+
616
+ end
532
617
  end