record-cache 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +15 -0
  2. data/lib/record_cache.rb +2 -1
  3. data/lib/record_cache/base.rb +63 -22
  4. data/lib/record_cache/datastore/active_record.rb +5 -3
  5. data/lib/record_cache/datastore/active_record_30.rb +95 -38
  6. data/lib/record_cache/datastore/active_record_31.rb +157 -54
  7. data/lib/record_cache/datastore/active_record_32.rb +444 -0
  8. data/lib/record_cache/dispatcher.rb +47 -47
  9. data/lib/record_cache/multi_read.rb +14 -1
  10. data/lib/record_cache/query.rb +36 -25
  11. data/lib/record_cache/statistics.rb +5 -5
  12. data/lib/record_cache/strategy/base.rb +49 -19
  13. data/lib/record_cache/strategy/full_table_cache.rb +81 -0
  14. data/lib/record_cache/strategy/index_cache.rb +38 -36
  15. data/lib/record_cache/strategy/unique_index_cache.rb +130 -0
  16. data/lib/record_cache/strategy/util.rb +12 -12
  17. data/lib/record_cache/test/resettable_version_store.rb +2 -9
  18. data/lib/record_cache/version.rb +1 -1
  19. data/lib/record_cache/version_store.rb +23 -16
  20. data/spec/db/schema.rb +12 -0
  21. data/spec/db/seeds.rb +10 -0
  22. data/spec/lib/active_record/visitor_spec.rb +22 -0
  23. data/spec/lib/base_spec.rb +21 -0
  24. data/spec/lib/dispatcher_spec.rb +24 -46
  25. data/spec/lib/multi_read_spec.rb +6 -6
  26. data/spec/lib/query_spec.rb +43 -43
  27. data/spec/lib/statistics_spec.rb +28 -28
  28. data/spec/lib/strategy/base_spec.rb +98 -87
  29. data/spec/lib/strategy/full_table_cache_spec.rb +68 -0
  30. data/spec/lib/strategy/index_cache_spec.rb +112 -69
  31. data/spec/lib/strategy/query_cache_spec.rb +83 -0
  32. data/spec/lib/strategy/unique_index_on_id_cache_spec.rb +317 -0
  33. data/spec/lib/strategy/unique_index_on_string_cache_spec.rb +168 -0
  34. data/spec/lib/strategy/util_spec.rb +67 -49
  35. data/spec/lib/version_store_spec.rb +22 -41
  36. data/spec/models/address.rb +9 -0
  37. data/spec/models/apple.rb +1 -1
  38. data/spec/models/banana.rb +21 -2
  39. data/spec/models/language.rb +5 -0
  40. data/spec/models/person.rb +1 -1
  41. data/spec/models/store.rb +2 -1
  42. data/spec/spec_helper.rb +7 -4
  43. data/spec/support/after_commit.rb +2 -0
  44. data/spec/support/matchers/hit_cache_matcher.rb +10 -6
  45. data/spec/support/matchers/log.rb +45 -0
  46. data/spec/support/matchers/miss_cache_matcher.rb +10 -6
  47. data/spec/support/matchers/use_cache_matcher.rb +10 -6
  48. metadata +156 -161
  49. data/lib/record_cache/strategy/id_cache.rb +0 -93
  50. data/lib/record_cache/strategy/request_cache.rb +0 -49
  51. data/spec/lib/strategy/id_cache_spec.rb +0 -168
  52. data/spec/lib/strategy/request_cache_spec.rb +0 -85
@@ -1,61 +1,72 @@
1
- $KCODE = 'UTF8'
1
+ # encoding: utf-8
2
2
  require 'spec_helper'
3
3
 
4
4
  describe RecordCache::Strategy::Util do
5
5
 
6
6
  it "should serialize a record (currently Active Record only)" do
7
- subject.serialize(Banana.find(1)).should == {:a=>{"name"=>"Blue Banana 1", "id"=>1, "store_id"=>2, "person_id"=>4}, :c=>"Banana"}
7
+ expect(subject.serialize(Banana.find(1))).to eq({:a=>{"name"=>"Blue Banana 1", "id"=>1, "store_id"=>2, "person_id"=>4}, :c=>"Banana"})
8
8
  end
9
9
 
10
10
  it "should deserialize a record (currently Active Record only)" do
11
- subject.deserialize({:a=>{"name"=>"Blue Banana 1", "id"=>1, "store_id"=>2, "person_id"=>4}, :c=>"Banana"}).should == Banana.find(1)
11
+ expect(subject.deserialize({:a=>{"name"=>"Blue Banana 1", "id"=>1, "store_id"=>2, "person_id"=>4}, :c=>"Banana"})).to eq(Banana.find(1))
12
+ end
13
+
14
+ it "should call the after_finalize and after_find callbacks when deserializing a record" do
15
+ record = subject.deserialize({:a=>{"name"=>"Blue Banana 1", "id"=>1, "store_id"=>2, "person_id"=>4}, :c=>"Banana"})
16
+ expect(record.logs.sort).to eq(["after_find", "after_initialize"])
17
+ end
18
+
19
+ it "should not be a new record nor have changed attributes after deserializing a record" do
20
+ record = subject.deserialize({:a=>{"id"=>1}, :c=>"Banana"})
21
+ expect(record.new_record?).to be_falsey
22
+ expect(record.changed_attributes).to be_empty
12
23
  end
13
24
 
14
25
  context "filter" do
15
26
  it "should apply filter" do
16
27
  apples = Apple.where(:id => [1,2]).all
17
28
  subject.filter!(apples, :name => "Adams Apple 1")
18
- apples.should == [Apple.find_by_name("Adams Apple 1")]
29
+ expect(apples).to eq([Apple.find_by_name("Adams Apple 1")])
19
30
  end
20
-
31
+
21
32
  it "should return empty array when filter does not match any record" do
22
33
  apples = Apple.where(:id => [1,2]).all
23
34
  subject.filter!(apples, :name => "Adams Apple Pie")
24
- apples.should be_empty
35
+ expect(apples).to be_empty
25
36
  end
26
37
 
27
38
  it "should filter on text" do
28
39
  apples = Apple.where(:id => [1,2]).all
29
40
  subject.filter!(apples, :name => "Adams Apple 1")
30
- apples.should == [Apple.find_by_name("Adams Apple 1")]
41
+ expect(apples).to eq([Apple.find_by_name("Adams Apple 1")])
31
42
  end
32
43
 
33
44
  it "should filter on integers" do
34
45
  apples = Apple.where(:id => [1,2,8,9]).all
35
46
  subject.filter!(apples, :store_id => 2)
36
- apples.map(&:id).sort.should == [8,9]
47
+ expect(apples.map(&:id).sort).to eq([8,9])
37
48
  end
38
49
 
39
50
  it "should filter on dates" do
40
51
  people = Person.where(:id => [1,2,3]).all
41
52
  subject.filter!(people, :birthday => Date.civil(1953,11,11))
42
- people.size.should == 1
43
- people.first.name.should == "Blue"
53
+ expect(people.size).to eq(1)
54
+ expect(people.first.name).to eq("Blue")
44
55
  end
45
56
 
46
57
  it "should filter on floats" do
47
58
  people = Person.where(:id => [1,2,3]).all
48
59
  subject.filter!(people, :height => 1.75)
49
- people.size.should == 2
50
- people.map(&:name).sort.should == ["Blue", "Cris"]
60
+ expect(people.size).to eq(2)
61
+ expect(people.map(&:name).sort).to eq(["Blue", "Cris"])
51
62
  end
52
63
 
53
64
  it "should filter on arrays" do
54
65
  apples = Apple.where(:id => [1,2,8,9])
55
66
  subject.filter!(apples, :store_id => [2, 4])
56
- apples.map(&:id).sort.should == [8,9]
67
+ expect(apples.map(&:id).sort).to eq([8,9])
57
68
  end
58
-
69
+
59
70
  it "should filter on multiple fields" do
60
71
  # make sure two apples exist with the same name
61
72
  apple = Apple.find(8)
@@ -64,9 +75,16 @@ describe RecordCache::Strategy::Util do
64
75
 
65
76
  apples = Apple.where(:id => [1,2,3,8,9,10]).all
66
77
  subject.filter!(apples, :store_id => [2, 4], :name => apple.name)
67
- apples.size.should == 2
68
- apples.map(&:name).should == [apple.name, apple.name]
69
- apples.map(&:id).sort.should == [8,9]
78
+ expect(apples.size).to eq(2)
79
+ expect(apples.map(&:name)).to eq([apple.name, apple.name])
80
+ expect(apples.map(&:id).sort).to eq([8,9])
81
+ end
82
+
83
+ it "should filter with more than 2 and conditions" do
84
+ # this construction leads to a arel object with 3 Equality Nodes within a single And Node
85
+ apples = Apple.where(:store_id => [1,2]).where(:store_id => 1, :person_id => nil).all
86
+ expect(apples.size).to eq(2)
87
+ expect(apples.map(&:id).sort).to eq([1,2])
70
88
  end
71
89
 
72
90
  end
@@ -75,138 +93,138 @@ describe RecordCache::Strategy::Util do
75
93
  it "should accept a Symbol as a sort order" do
76
94
  people = Person.where(:id => [1,2,3]).all
77
95
  subject.sort!(people, :name)
78
- people.map(&:name).should == ["Adam", "Blue", "Cris"]
96
+ expect(people.map(&:name)).to eq(["Adam", "Blue", "Cris"])
79
97
  end
80
98
 
81
99
  it "should accept a single Array as a sort order" do
82
100
  people = Person.where(:id => [1,2,3]).all
83
101
  subject.sort!(people, [:name, false])
84
- people.map(&:name).should == ["Cris", "Blue", "Adam"]
102
+ expect(people.map(&:name)).to eq(["Cris", "Blue", "Adam"])
85
103
  end
86
104
 
87
105
  it "should accept multiple Symbols as a sort order" do
88
106
  people = Person.where(:id => [2,3,4,5]).all
89
107
  subject.sort!(people, :height, :id)
90
- people.map(&:height).should == [1.69, 1.75, 1.75, 1.91]
91
- people.map(&:id).should == [4, 2, 3, 5]
108
+ expect(people.map(&:height)).to eq([1.69, 1.75, 1.75, 1.91])
109
+ expect(people.map(&:id)).to eq([4, 2, 3, 5])
92
110
  end
93
111
 
94
112
  it "should accept a mix of Symbols and Arrays as a sort order" do
95
113
  people = Person.where(:id => [2,3,4,5]).all
96
114
  subject.sort!(people, [:height, false], :id)
97
- people.map(&:height).should == [1.91, 1.75, 1.75, 1.69]
98
- people.map(&:id).should == [5, 2, 3, 4]
115
+ expect(people.map(&:height)).to eq([1.91, 1.75, 1.75, 1.69])
116
+ expect(people.map(&:id)).to eq([5, 2, 3, 4])
99
117
  end
100
118
 
101
119
  it "should accept multiple Arrays as a sort order" do
102
120
  people = Person.where(:id => [2,3,4,5]).all
103
121
  subject.sort!(people, [:height, false], [:id, false])
104
- people.map(&:height).should == [1.91, 1.75, 1.75, 1.69]
105
- people.map(&:id).should == [5, 3, 2, 4]
122
+ expect(people.map(&:height)).to eq([1.91, 1.75, 1.75, 1.69])
123
+ expect(people.map(&:id)).to eq([5, 3, 2, 4])
106
124
  end
107
125
 
108
126
  it "should accept an Array with Arrays as a sort order (default used by record cache)" do
109
127
  people = Person.where(:id => [2,3,4,5]).all
110
128
  subject.sort!(people, [[:height, false], [:id, false]])
111
- people.map(&:height).should == [1.91, 1.75, 1.75, 1.69]
112
- people.map(&:id).should == [5, 3, 2, 4]
129
+ expect(people.map(&:height)).to eq([1.91, 1.75, 1.75, 1.69])
130
+ expect(people.map(&:id)).to eq([5, 3, 2, 4])
113
131
  end
114
132
 
115
133
  it "should order nil first for ASC" do
116
134
  apples = Apple.where(:store_id => 1).all
117
135
  subject.sort!(apples, [:person_id, true])
118
- apples.map(&:person_id).should == [nil, nil, 4, 4, 5]
136
+ expect(apples.map(&:person_id)).to eq([nil, nil, 4, 4, 5])
119
137
  end
120
138
 
121
139
  it "should order nil last for DESC" do
122
140
  apples = Apple.where(:store_id => 1).all
123
141
  subject.sort!(apples, [:person_id, false])
124
- apples.map(&:person_id).should == [5, 4, 4, nil, nil]
142
+ expect(apples.map(&:person_id)).to eq([5, 4, 4, nil, nil])
125
143
  end
126
144
 
127
145
  it "should order ascending on text" do
128
146
  people = Person.where(:id => [1,2,3,4]).all
129
147
  subject.sort!(people, [:name, true])
130
- people.map(&:name).should == ["Adam", "Blue", "Cris", "Fry"]
148
+ expect(people.map(&:name)).to eq(["Adam", "Blue", "Cris", "Fry"])
131
149
  end
132
150
 
133
151
  it "should order descending on text" do
134
152
  people = Person.where(:id => [1,2,3,4]).all
135
153
  subject.sort!(people, [:name, false])
136
- people.map(&:name).should == ["Fry", "Cris", "Blue", "Adam"]
154
+ expect(people.map(&:name)).to eq(["Fry", "Cris", "Blue", "Adam"])
137
155
  end
138
156
 
139
157
  it "should order ascending on integers" do
140
158
  people = Person.where(:id => [4,2,1,3]).all
141
159
  subject.sort!(people, [:id, true])
142
- people.map(&:id).should == [1,2,3,4]
160
+ expect(people.map(&:id)).to eq([1,2,3,4])
143
161
  end
144
162
 
145
163
  it "should order descending on integers" do
146
164
  people = Person.where(:id => [4,2,1,3]).all
147
165
  subject.sort!(people, [:id, false])
148
- people.map(&:id).should == [4,3,2,1]
166
+ expect(people.map(&:id)).to eq([4,3,2,1])
149
167
  end
150
168
 
151
169
  it "should order ascending on dates" do
152
170
  people = Person.where(:id => [1,2,3,4]).all
153
171
  subject.sort!(people, [:birthday, true])
154
- people.map(&:birthday).should == [Date.civil(1953,11,11), Date.civil(1975,03,20), Date.civil(1975,03,20), Date.civil(1985,01,20)]
172
+ expect(people.map(&:birthday)).to eq([Date.civil(1953,11,11), Date.civil(1975,03,20), Date.civil(1975,03,20), Date.civil(1985,01,20)])
155
173
  end
156
174
 
157
175
  it "should order descending on dates" do
158
176
  people = Person.where(:id => [1,2,3,4]).all
159
177
  subject.sort!(people, [:birthday, false])
160
- people.map(&:birthday).should == [Date.civil(1985,01,20), Date.civil(1975,03,20), Date.civil(1975,03,20), Date.civil(1953,11,11)]
178
+ expect(people.map(&:birthday)).to eq([Date.civil(1985,01,20), Date.civil(1975,03,20), Date.civil(1975,03,20), Date.civil(1953,11,11)])
161
179
  end
162
180
 
163
181
  it "should order ascending on float" do
164
182
  people = Person.where(:id => [1,2,3,4]).all
165
183
  subject.sort!(people, [:height, true])
166
- people.map(&:height).should == [1.69, 1.75, 1.75, 1.83]
184
+ expect(people.map(&:height)).to eq([1.69, 1.75, 1.75, 1.83])
167
185
  end
168
186
 
169
187
  it "should order descending on float" do
170
188
  people = Person.where(:id => [1,2,3,4]).all
171
189
  subject.sort!(people, [:height, false])
172
- people.map(&:height).should == [1.83, 1.75, 1.75, 1.69]
190
+ expect(people.map(&:height)).to eq([1.83, 1.75, 1.75, 1.69])
173
191
  end
174
192
 
175
193
  it "should order on multiple fields (ASC + ASC)" do
176
194
  people = Person.where(:id => [2,3,4,5]).all
177
195
  subject.sort!(people, [:height, true], [:id, true])
178
- people.map(&:height).should == [1.69, 1.75, 1.75, 1.91]
179
- people.map(&:id).should == [4, 2, 3, 5]
196
+ expect(people.map(&:height)).to eq([1.69, 1.75, 1.75, 1.91])
197
+ expect(people.map(&:id)).to eq([4, 2, 3, 5])
180
198
  end
181
199
 
182
200
  it "should order on multiple fields (ASC + DESC)" do
183
201
  people = Person.where(:id => [2,3,4,5]).all
184
202
  subject.sort!(people, [:height, true], [:id, false])
185
- people.map(&:height).should == [1.69, 1.75, 1.75, 1.91]
186
- people.map(&:id).should == [4, 3, 2, 5]
203
+ expect(people.map(&:height)).to eq([1.69, 1.75, 1.75, 1.91])
204
+ expect(people.map(&:id)).to eq([4, 3, 2, 5])
187
205
  end
188
206
 
189
207
  it "should order on multiple fields (DESC + ASC)" do
190
208
  people = Person.where(:id => [2,3,4,5]).all
191
209
  subject.sort!(people, [:height, false], [:id, true])
192
- people.map(&:height).should == [1.91, 1.75, 1.75, 1.69]
193
- people.map(&:id).should == [5, 2, 3, 4]
210
+ expect(people.map(&:height)).to eq([1.91, 1.75, 1.75, 1.69])
211
+ expect(people.map(&:id)).to eq([5, 2, 3, 4])
194
212
  end
195
213
 
196
214
  it "should order on multiple fields (DESC + DESC)" do
197
215
  people = Person.where(:id => [2,3,4,5]).all
198
216
  subject.sort!(people, [:height, false], [:id, false])
199
- people.map(&:height).should == [1.91, 1.75, 1.75, 1.69]
200
- people.map(&:id).should == [5, 3, 2, 4]
217
+ expect(people.map(&:height)).to eq([1.91, 1.75, 1.75, 1.69])
218
+ expect(people.map(&:id)).to eq([5, 3, 2, 4])
201
219
  end
202
-
220
+
203
221
  it "should use mysql style collation" do
204
222
  ids = []
205
223
  ids << Person.create!(:name => "ċedriĉ 3").id # latin other special
206
224
  ids << Person.create!(:name => "a cedric").id # first in ascending order
207
225
  ids << Person.create!(:name => "čedriĉ 4").id # latin another special
208
226
  ids << Person.create!(:name => "ćedriĉ Last").id # latin special lowercase
209
- ids << Person.create!(:name => "sedric 1").id # second to last latin in ascending order
227
+ ids << Person.create!(:name => "sedric 1").id # second to last latin in ascending order
210
228
  ids << Person.create!(:name => "Cedric 2").id # ascii uppercase
211
229
  ids << Person.create!(:name => "čedriĉ คฉ Almost last cedric").id # latin special, with non-latin
212
230
  ids << Person.create!(:name => "Sedric 2").id # last latin in ascending order
@@ -218,10 +236,10 @@ describe RecordCache::Strategy::Util do
218
236
  names_asc = ["1 cedric", "a cedric", "cedric 1", "Cedric 2", "ċedriĉ 3", "čedriĉ 4", "ćedriĉ Last", "čedriĉ คฉ Almost last cedric", "čedriĉ ꜩ Last", "sedric 1", "Sedric 2", "คฉ Really last"]
219
237
  people = Person.where(:id => ids).all
220
238
  subject.sort!(people, [:name, true])
221
- people.map(&:name).should == names_asc
239
+ expect(people.map(&:name)).to eq(names_asc)
222
240
 
223
241
  subject.sort!(people, [:name, false])
224
- people.map(&:name).should == names_asc.reverse
242
+ expect(people.map(&:name)).to eq(names_asc.reverse)
225
243
  end
226
244
  end
227
245
 
@@ -9,95 +9,76 @@ describe RecordCache::VersionStore do
9
9
  end
10
10
 
11
11
  it "should only accept ActiveSupport cache stores" do
12
- lambda { RecordCache::VersionStore.new(Object.new) }.should raise_error("Must be an ActiveSupport::Cache::Store")
12
+ expect{ RecordCache::VersionStore.new(Object.new) }.to raise_error("Store Object must respond to write")
13
13
  end
14
14
 
15
15
  context "current" do
16
16
  it "should retrieve the current version" do
17
- @version_store.current("key1").should == 1000
17
+ expect(@version_store.current("key1")).to eq(1000)
18
18
  end
19
19
 
20
20
  it "should retrieve nil for unknown keys" do
21
- @version_store.current("unknown_key").should == nil
21
+ expect(@version_store.current("unknown_key")).to be_nil
22
22
  end
23
23
  end
24
24
 
25
25
  context "current_multi" do
26
26
  it "should retrieve all versions" do
27
- @version_store.current_multi({:id1 => "key1", :id2 => "key2"}).should == {:id1 => 1000, :id2 => 2000}
27
+ expect(@version_store.current_multi({:id1 => "key1", :id2 => "key2"})).to eq({:id1 => 1000, :id2 => 2000})
28
28
  end
29
29
 
30
30
  it "should return nil for unknown keys" do
31
- @version_store.current_multi({:id1 => "key1", :key3 => "unknown_key"}).should == {:id1 => 1000, :key3 => nil}
31
+ expect(@version_store.current_multi({:id1 => "key1", :key3 => "unknown_key"})).to eq({:id1 => 1000, :key3 => nil})
32
32
  end
33
33
 
34
34
  it "should use read_multi on the underlying store" do
35
- mock(@version_store.store).read_multi(/key[12]/, /key[12]/) { {"key1" => 5, "key2" => 6} }
36
- @version_store.current_multi({:id1 => "key1", :id2 => "key2"}).should == {:id1 => 5, :id2 => 6}
35
+ allow(@version_store.store).to receive(:read_multi).with(/key[12]/, /key[12]/) { {"key1" => 5, "key2" => 6} }
36
+ expect(@version_store.current_multi({:id1 => "key1", :id2 => "key2"})).to eq({:id1 => 5, :id2 => 6})
37
37
  end
38
38
  end
39
39
 
40
40
  context "renew" do
41
41
  it "should renew the version" do
42
- @version_store.current("key1").should == 1000
42
+ expect(@version_store.current("key1")).to eq(1000)
43
43
  @version_store.renew("key1")
44
- @version_store.current("key1").should_not == 1000
44
+ expect(@version_store.current("key1")).to_not eq(1000)
45
45
  end
46
46
 
47
47
  it "should renew the version for unknown keys" do
48
- @version_store.current("unknown_key").should == nil
48
+ expect(@version_store.current("unknown_key")).to be_nil
49
49
  @version_store.renew("unknown_key")
50
- @version_store.current("unknown_key").should_not == nil
50
+ expect(@version_store.current("unknown_key")).to_not be_nil
51
51
  end
52
52
 
53
53
  it "should write to the debug log" do
54
- mock(RecordCache::Base.logger).debug?{ true }
55
- mock(RecordCache::Base.logger).debug(/Version Store: renew key1: nil => \d+/)
56
- @version_store.renew("key1")
57
- stub(RecordCache::Base.logger).debug?{ false } # to prevent the ResettableVersionStore from logging in +after(:each)+
54
+ expect{ @version_store.renew("key1") }.to log(:debug, /Version Store: renew key1: nil => \d+/)
58
55
  end
59
56
  end
60
57
 
58
+ # deprecated
61
59
  context "increment" do
62
- it "should increment the version" do
63
- @version_store.current("key1").should == 1000
64
- @version_store.increment("key1")
65
- @version_store.current("key1").should == 1001
66
- end
67
-
68
- it "should renew the version on increment for unknown keys" do
69
- # do not use unknown_key as the version store retains the value after this spec
70
- @version_store.current("unknown_key").should == nil
71
- @version_store.renew("unknown_key")
72
- @version_store.current("unknown_key").should_not == nil
73
- end
74
60
 
75
61
  it "should write to the debug log" do
76
- mock(RecordCache::Base.logger).debug?{ true }
77
- mock(RecordCache::Base.logger).debug("Version Store: incremented key1: 1000 => 1001")
78
- @version_store.increment("key1")
79
- stub(RecordCache::Base.logger).debug?{ false } # to prevent the ResettableVersionStore from logging in +after(:each)+
62
+ expect{ @version_store.increment("key1") }.to log(:debug, /increment is deprecated, use renew instead/)
80
63
  end
64
+
81
65
  end
82
66
 
83
67
  context "delete" do
84
68
  it "should delete the version" do
85
- @version_store.current("key1").should == 1000
86
- @version_store.delete("key1").should == true
87
- @version_store.current("key1").should == nil
69
+ expect(@version_store.current("key1")).to eq(1000)
70
+ expect(@version_store.delete("key1")).to be_truthy
71
+ expect(@version_store.current("key1")).to be_nil
88
72
  end
89
73
 
90
74
  it "should not raise an error when deleting the version for unknown keys" do
91
- @version_store.current("unknown_key").should == nil
92
- @version_store.delete("unknown_key").should == false
93
- @version_store.current("unknown_key").should == nil
75
+ expect(@version_store.current("unknown_key")).to be_nil
76
+ expect(@version_store.delete("unknown_key")).to be_falsey
77
+ expect(@version_store.current("unknown_key")).to be_nil
94
78
  end
95
79
 
96
80
  it "should write to the debug log" do
97
- mock(RecordCache::Base.logger).debug?{ true }
98
- mock(RecordCache::Base.logger).debug("Version Store: deleted key1")
99
- @version_store.delete("key1")
100
- stub(RecordCache::Base.logger).debug?{ false } # to prevent the ResettableVersionStore from logging in +after(:each)+
81
+ expect{ @version_store.delete("key1") }.to log(:debug, %(Version Store: deleted key1))
101
82
  end
102
83
  end
103
84
 
@@ -0,0 +1,9 @@
1
+ class Address < ActiveRecord::Base
2
+
3
+ cache_records :store => :shared, :key => "add", :index => [:store_id]
4
+
5
+ serialize :location, Hash
6
+
7
+ belongs_to :store
8
+
9
+ end
@@ -1,6 +1,6 @@
1
1
  class Apple < ActiveRecord::Base
2
2
 
3
- cache_records :store => :shared, :key => "apl", :index => [:store_id, :person_id]
3
+ cache_records :store => :shared, :key => "apl", :index => [:store_id, :person_id], :ttl => 300
4
4
 
5
5
  belongs_to :store
6
6
  belongs_to :person
@@ -1,8 +1,27 @@
1
1
  class Banana < ActiveRecord::Base
2
-
2
+
3
3
  cache_records :store => :local, :index => [:person_id]
4
4
 
5
5
  belongs_to :store
6
6
  belongs_to :person
7
-
7
+
8
+ after_initialize :do_after_initialize
9
+ after_find :do_after_find
10
+
11
+ def logs
12
+ @logs ||= []
13
+ end
14
+
15
+ private
16
+
17
+ def do_after_initialize
18
+ self.logs << "after_initialize"
19
+ true
20
+ end
21
+
22
+ def do_after_find
23
+ self.logs << "after_find"
24
+ true
25
+ end
26
+
8
27
  end