acts_as_saveable 0.10.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.
@@ -0,0 +1,131 @@
1
+ module ActsAsSaveable
2
+ module Saver
3
+
4
+ def self.included(base)
5
+
6
+ # allow user to define these
7
+ aliases = {
8
+ :save_up_for => [:likes, :upsaves, :up_saves],
9
+ :save_down_for => [:dislikes, :downsaves, :down_saves],
10
+ :saved_on? => [:saved_for?],
11
+ :saved_up_on? => [:saved_up_for?],
12
+ :saved_down_on? => [:saved_down_for?],
13
+ :saved_as_when_saving_on => [:saved_as_when_saved_on, :saved_as_when_saving_for, :saved_as_when_saved_for],
14
+ }
15
+
16
+ base.class_eval do
17
+
18
+ has_many :saves, :class_name => 'ActsAsSaveable::Save', :as => :saver, :dependent => :destroy do
19
+ def saveables
20
+ includes(:saveable).map(&:saveable)
21
+ end
22
+ end
23
+
24
+ aliases.each do |method, links|
25
+ links.each do |new_method|
26
+ alias_method(new_method, method)
27
+ end
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+
34
+ # saving
35
+ def saved args
36
+ args[:saveable].save_by args.merge({:saver => self})
37
+ end
38
+
39
+ def save_up_for model=nil, args={}
40
+ saved :saveable => model, :save_scope => args[:save_scope], :saved => true
41
+ end
42
+
43
+ def save_down_for model=nil, args={}
44
+ saved :saveable => model, :save_scope => args[:save_scope], :saved => false
45
+ end
46
+
47
+ def unsave_for model, args={}
48
+ model.unsaved :saver => self, :save_scope => args[:save_scope]
49
+ end
50
+
51
+ # results
52
+ def saved_on? saveable, args={}
53
+ saves = find_saves(:saveable_id => saveable.id, :saveable_type => saveable.class.base_class.name,
54
+ :save_scope => args[:save_scope])
55
+ saves.size > 0
56
+ end
57
+
58
+ def saved_up_on? saveable, args={}
59
+ saves = find_saves(:saveable_id => saveable.id, :saveable_type => saveable.class.base_class.name,
60
+ :save_scope => args[:save_scope], :save_flag => true)
61
+ saves.size > 0
62
+ end
63
+
64
+ def saved_down_on? saveable, args={}
65
+ saves = find_saves(:saveable_id => saveable.id, :saveable_type => saveable.class.base_class.name,
66
+ :save_scope => args[:save_scope], :save_flag => false)
67
+ saves.size > 0
68
+ end
69
+
70
+ def saved_as_when_saving_on saveable, args={}
71
+ saved = find_saves(:saveable_id => saveable.id, :saveable_type => saveable.class.base_class.name,
72
+ :save_scope => args[:save_scope]).select(:save_flag).last
73
+ return nil unless saved
74
+ return saved.save_flag
75
+ end
76
+
77
+ def find_saves extra_conditions = {}
78
+ saves.where(extra_conditions)
79
+ end
80
+
81
+ def find_up_saves args={}
82
+ find_saves :save_flag => true, :save_scope => args[:save_scope]
83
+ end
84
+
85
+ def find_down_saves args={}
86
+ find_saves :save_flag => false, :save_scope => args[:save_scope]
87
+ end
88
+
89
+ def find_saves_for_class klass, extra_conditions = {}
90
+ find_saves extra_conditions.merge({:saveable_type => klass.name})
91
+ end
92
+
93
+ def find_up_saves_for_class klass, args={}
94
+ find_saves_for_class klass, :save_flag => true, :save_scope => args[:save_scope]
95
+ end
96
+
97
+ def find_down_saves_for_class klass, args={}
98
+ find_saves_for_class klass, :save_flag => false, :save_scope => args[:save_scope]
99
+ end
100
+
101
+ # Including polymporphic relations for eager loading
102
+ def include_objects
103
+ ActsAsSaveable::Save.includes(:saveable)
104
+ end
105
+
106
+ def find_saved_items extra_conditions = {}
107
+ options = extra_conditions.merge :saver_id => id, :saver_type => self.class.base_class.name
108
+ include_objects.where(options).collect(&:saveable)
109
+ end
110
+
111
+ def find_up_saved_items extra_conditions = {}
112
+ find_saved_items extra_conditions.merge(:save_flag => true)
113
+ end
114
+
115
+ def find_down_saved_items extra_conditions = {}
116
+ find_saved_items extra_conditions.merge(:save_flag => false)
117
+ end
118
+
119
+ def get_saved klass, extra_conditions = {}
120
+ klass.joins(:saves_for).merge find_saves(extra_conditions)
121
+ end
122
+
123
+ def get_up_saved klass
124
+ klass.joins(:saves_for).merge find_up_saves
125
+ end
126
+
127
+ def get_down_saved klass
128
+ klass.joins(:saves_for).merge find_down_saves
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,3 @@
1
+ module ActsAsSaveable
2
+ VERSION = "0.10.1"
3
+ end
@@ -0,0 +1,31 @@
1
+ require 'rails/generators/migration'
2
+
3
+ module ActsAsSaveable
4
+ class MigrationGenerator < Rails::Generators::Base
5
+ include Rails::Generators::Migration
6
+
7
+ desc "Generates migration for saveable (saves table)"
8
+
9
+ def self.orm
10
+ Rails::Generators.options[:rails][:orm]
11
+ end
12
+
13
+ def self.source_root
14
+ File.join(File.dirname(__FILE__), 'templates', (orm.to_s unless orm.class.eql?(String)) )
15
+ end
16
+
17
+ def self.orm_has_migration?
18
+ [:active_record].include? orm
19
+ end
20
+
21
+ def self.next_migration_number(path)
22
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
23
+ end
24
+
25
+ def create_migration_file
26
+ if self.class.orm_has_migration?
27
+ migration_template 'migration.rb', 'db/migrate/acts_as_saveable_migration.rb'
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,27 @@
1
+ class ActsAsSaveableMigration < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :saves do |t|
4
+
5
+ t.references :saveable, :polymorphic => true
6
+ t.references :saver, :polymorphic => true
7
+
8
+ t.boolean :save_flag
9
+ t.string :save_scope
10
+ t.integer :save_weight
11
+
12
+ t.timestamps
13
+ end
14
+
15
+ if ActiveRecord::VERSION::MAJOR < 4
16
+ add_index :saves, [:saveable_id, :saveable_type]
17
+ add_index :saves, [:saver_id, :saver_type]
18
+ end
19
+
20
+ add_index :saves, [:saver_id, :saver_type, :save_scope]
21
+ add_index :saves, [:saveable_id, :saveable_type, :save_scope]
22
+ end
23
+
24
+ def self.down
25
+ drop_table :saves
26
+ end
27
+ end
@@ -0,0 +1,21 @@
1
+ require 'acts_as_saveable'
2
+ require 'spec_helper'
3
+
4
+ describe SaveableSaver do
5
+ it_behaves_like "a saveable_model" do
6
+ # TODO Replace with factories
7
+ let (:saver) { SaveableSaver.create(:name => 'i can saved!') }
8
+ let (:saver2) { SaveableSaver.create(:name => 'a new person') }
9
+ let (:saver3) { Saver.create(:name => 'another person') }
10
+ let (:saveable) { SaveableSaver.create(:name => 'a saving model') }
11
+ let (:saveable_cache) { SaveableCache.create(:name => 'saving model with cache') }
12
+ end
13
+
14
+ it_behaves_like "a saver_model" do
15
+ # TODO Replace with factories
16
+ let (:saver) { SaveableSaver.create(:name => 'i can saved!') }
17
+ let (:saver2) { SaveableSaver.create(:name => 'a new person') }
18
+ let (:saveable) { SaveableSaver.create(:name => 'a saving model') }
19
+ let (:saveable2) { SaveableSaver.create(:name => 'a 2nd saving model') }
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ require 'acts_as_saveable'
2
+ require 'spec_helper'
3
+
4
+ describe ActsAsSaveable::Saveable do
5
+ it "should not be saveable" do
6
+ expect(NotSaveable).not_to be_saveable
7
+ end
8
+
9
+ it "should be saveable" do
10
+ expect(Saveable).to be_saveable
11
+ end
12
+
13
+ it_behaves_like "a saveable_model" do
14
+ # TODO Replace with factories
15
+ let (:saver) { Saver.create(:name =>'i can saved!') }
16
+ let (:saver2) { Saver.create(:name => 'a new person') }
17
+ let (:saver3) { Saver.create(:name => 'another person') }
18
+ let (:saveable) { Saveable.create(:name =>'a saving model') }
19
+ let (:saveable_cache) { SaveableCache.create(:name => 'saving model with cache') }
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ require 'acts_as_saveable'
2
+ require 'spec_helper'
3
+
4
+ describe ActsAsSaveable::Saver do
5
+
6
+ it "should not be a saver" do
7
+ expect(NotSaveable).not_to be_saveable
8
+ end
9
+
10
+ it "should be a saver" do
11
+ expect(Saveable).to be_saveable
12
+ end
13
+
14
+ it_behaves_like "a saver_model" do
15
+ # TODO Replace with factories
16
+ let (:saver) { Saver.create(:name => 'i can saved!') }
17
+ let (:saver2) { Saver.create(:name => 'a new person') }
18
+ let (:saveable) { Saveable.create(:name => 'a saving model') }
19
+ let (:saveable2) { Saveable.create(:name => 'a 2nd saving model') }
20
+ end
21
+ end
@@ -0,0 +1,484 @@
1
+ shared_examples "a saveable_model" do
2
+ it "should return false when a saved with no saver is saved" do
3
+ expect(saveable.save_by).to be false
4
+ end
5
+
6
+ it "should have one saved when saved" do
7
+ saveable.save_by :saver => saver, :saved => 'yes'
8
+ expect(saveable.saves_for.size).to eq(1)
9
+ end
10
+
11
+ it "should have one saved when saved on twice by the same person" do
12
+ saveable.save_by :saver => saver, :saved => 'yes'
13
+ saveable.save_by :saver => saver, :saved => 'no'
14
+ expect(saveable.saves_for.size).to eq(1)
15
+ end
16
+
17
+ it "should have two saves_for when saved on twice by the same person with duplicate paramenter" do
18
+ saveable.save_by :saver => saver, :saved => 'yes'
19
+ saveable.save_by :saver => saver, :saved => 'no', :duplicate => true
20
+ expect(saveable.saves_for.size).to eq(2)
21
+ end
22
+
23
+ it "should have one scoped saved when saving under an scope" do
24
+ saveable.save_by :saver => saver, :saved => 'yes', :save_scope => 'rank'
25
+ expect(saveable.find_saves_for(:save_scope => 'rank').size).to eq(1)
26
+ end
27
+
28
+ it "should have one saved when saved on twice using scope by the same person" do
29
+ saveable.save_by :saver => saver, :saved => 'yes', :save_scope => 'rank'
30
+ saveable.save_by :saver => saver, :saved => 'no', :save_scope => 'rank'
31
+ expect(saveable.find_saves_for(:save_scope => 'rank').size).to eq(1)
32
+ end
33
+
34
+ it "should have two saves_for when saving on two different scopes by the same person" do
35
+ saveable.save_by :saver => saver, :saved => 'yes', :save_scope => 'weekly_rank'
36
+ saveable.save_by :saver => saver, :saved => 'no', :save_scope => 'monthly_rank'
37
+ expect(saveable.saves_for.size).to eq(2)
38
+ end
39
+
40
+ it "should be callable with save_up" do
41
+ saveable.save_up saver
42
+ expect(saveable.get_up_saves.first.saver).to eq(saver)
43
+ end
44
+
45
+ it "should be callable with save_down" do
46
+ saveable.save_down saver
47
+ expect(saveable.get_down_saves.first.saver).to eq(saver)
48
+ end
49
+
50
+ it "should have 2 saves_for when saved on once by two different people" do
51
+ saveable.save_by :saver => saver
52
+ saveable.save_by :saver => saver2
53
+ expect(saveable.saves_for.size).to eq(2)
54
+ end
55
+
56
+ it "should have one true saved" do
57
+ saveable.save_by :saver => saver
58
+ saveable.save_by :saver => saver2, :saved => 'dislike'
59
+ expect(saveable.get_up_saves.size).to eq(1)
60
+ end
61
+
62
+ it "should have 2 false saves_for" do
63
+ saveable.save_by :saver => saver, :saved => 'no'
64
+ saveable.save_by :saver => saver2, :saved => 'dislike'
65
+ expect(saveable.get_down_saves.size).to eq(2)
66
+ end
67
+
68
+ it "should have been saved on by saver2" do
69
+ saveable.save_by :saver => saver2, :saved => true
70
+ expect(saveable.find_saves_for.first.saver.id).to be saver2.id
71
+ end
72
+
73
+ it "should count the saved as registered if this is the savers first saved" do
74
+ saveable.save_by :saver => saver
75
+ expect(saveable.save_registered?).to be true
76
+ end
77
+
78
+ it "should not count the saved as being registered if that saver has already saved and the saved has not changed" do
79
+ saveable.save_by :saver => saver, :saved => true
80
+ saveable.save_by :saver => saver, :saved => 'yes'
81
+ expect(saveable.save_registered?).to be false
82
+ end
83
+
84
+ it "should count the saved as registered if the saver has saved and the saved flag has changed" do
85
+ saveable.save_by :saver => saver, :saved => true
86
+ saveable.save_by :saver => saver, :saved => 'dislike'
87
+ expect(saveable.save_registered?).to be true
88
+ end
89
+
90
+ it "should count the saved as registered if the saver has saved and the saved weight has changed" do
91
+ saveable.save_by :saver => saver, :saved => true, :save_weight => 1
92
+ saveable.save_by :saver => saver, :saved => true, :save_weight => 2
93
+ expect(saveable.save_registered?).to be true
94
+ end
95
+
96
+ it "should be saved on by saver" do
97
+ saveable.save_by :saver => saver
98
+ expect(saveable.saved_on_by?(saver)).to be true
99
+ end
100
+
101
+ it "should be able to unsaved a saver" do
102
+ saveable.upsaved_by(saver)
103
+ saveable.unsave_by(saver)
104
+ expect(saveable.saved_on_by?(saver)).to be false
105
+ end
106
+
107
+ it "should unsaved a positive saved" do
108
+ saveable.save_by :saver => saver
109
+ saveable.unsaved :saver => saver
110
+ expect(saveable.find_saves_for.count).to eq(0)
111
+ end
112
+
113
+ it "should set the saveable to unregistered after unsaving" do
114
+ saveable.save_by :saver => saver
115
+ saveable.unsaved :saver => saver
116
+ expect(saveable.save_registered?).to be false
117
+ end
118
+
119
+ it "should unsaved a negative saved" do
120
+ saveable.save_by :saver => saver, :saved => 'no'
121
+ saveable.unsaved :saver => saver
122
+ expect(saveable.find_saves_for.count).to eq(0)
123
+ end
124
+
125
+ it "should unsaved only the from a single saver" do
126
+ saveable.save_by :saver => saver
127
+ saveable.save_by :saver => saver2
128
+ saveable.unsaved :saver => saver
129
+ expect(saveable.find_saves_for.count).to eq(1)
130
+ end
131
+
132
+ it "should be contained to instances" do
133
+ saveable2 = Saveable.new(:name => '2nd saveable')
134
+ saveable2.save
135
+
136
+ saveable.save_by :saver => saver, :saved => false
137
+ saveable2.save_by :saver => saver, :saved => true
138
+ saveable2.save_by :saver => saver, :saved => true
139
+
140
+ expect(saveable.save_registered?).to be true
141
+ expect(saveable2.save_registered?).to be false
142
+ end
143
+
144
+ it "should set default saved weight to 1 if not specified" do
145
+ saveable.upsave_by saver
146
+ expect(saveable.find_saves_for.first.save_weight).to eq(1)
147
+ end
148
+
149
+ describe "with cached saves_for" do
150
+
151
+ before(:each) do
152
+ clean_database
153
+ saver = Saver.new(:name => 'i can saved!')
154
+ saver.save
155
+
156
+ saveable = Saveable.new(:name => 'a saving model without a cache')
157
+ saveable.save
158
+
159
+ saveable_cache = SaveableCache.new(:name => 'saving model with cache')
160
+ saveable_cache.save
161
+ end
162
+
163
+ it "should not update cached saves_for if there are no columns" do
164
+ saveable.save_by :saver => saver
165
+ end
166
+
167
+ it "should update cached total saves_for if there is a total column" do
168
+ saveable_cache.cached_saves_total = 50
169
+ saveable_cache.save_by :saver => saver
170
+ expect(saveable_cache.cached_saves_total).to eq(1)
171
+ end
172
+
173
+ it "should update cached total saves_for when a saved up is removed" do
174
+ saveable_cache.save_by :saver => saver, :saved => 'true'
175
+ saveable_cache.unsaved :saver => saver
176
+ expect(saveable_cache.cached_saves_total).to eq(0)
177
+ end
178
+
179
+ it "should update cached total saves_for when a saved down is removed" do
180
+ saveable_cache.save_by :saver => saver, :saved => 'false'
181
+ saveable_cache.unsaved :saver => saver
182
+ expect(saveable_cache.cached_saves_total).to eq(0)
183
+ end
184
+
185
+ it "should update cached score saves_for if there is a score column" do
186
+ saveable_cache.cached_saves_score = 50
187
+ saveable_cache.save_by :saver => saver
188
+ expect(saveable_cache.cached_saves_score).to eq(1)
189
+ saveable_cache.save_by :saver => saver2, :saved => 'false'
190
+ expect(saveable_cache.cached_saves_score).to eq(0)
191
+ saveable_cache.save_by :saver => saver, :saved => 'false'
192
+ expect(saveable_cache.cached_saves_score).to eq(-2)
193
+ end
194
+
195
+ it "should update cached score saves_for when a saved up is removed" do
196
+ saveable_cache.save_by :saver => saver, :saved => 'true'
197
+ expect(saveable_cache.cached_saves_score).to eq(1)
198
+ saveable_cache.unsaved :saver => saver
199
+ expect(saveable_cache.cached_saves_score).to eq(0)
200
+ end
201
+
202
+ it "should update cached score saves_for when a saved down is removed" do
203
+ saveable_cache.save_by :saver => saver, :saved => 'false'
204
+ expect(saveable_cache.cached_saves_score).to eq(-1)
205
+ saveable_cache.unsaved :saver => saver
206
+ expect(saveable_cache.cached_saves_score).to eq(0)
207
+ end
208
+
209
+ it "should update cached weighted total if there is a weighted total column" do
210
+ saveable_cache.cached_weighted_total = 50
211
+ saveable_cache.save_by :saver => saver
212
+ expect(saveable_cache.cached_weighted_total).to eq(1)
213
+ saveable_cache.save_by :saver => saver2, :saved => 'false'
214
+ expect(saveable_cache.cached_weighted_total).to eq(2)
215
+ end
216
+
217
+ it "should update cached weighted total saves_for when a saved up is removed" do
218
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_weight => 3
219
+ expect(saveable_cache.cached_weighted_total).to eq(3)
220
+ saveable_cache.unsaved :saver => saver
221
+ expect(saveable_cache.cached_weighted_total).to eq(0)
222
+ end
223
+
224
+ it "should update cached weighted total saves_for when a saved down is removed" do
225
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_weight => 4
226
+ expect(saveable_cache.cached_weighted_total).to eq(4)
227
+ saveable_cache.unsaved :saver => saver
228
+ expect(saveable_cache.cached_weighted_total).to eq(0)
229
+ end
230
+
231
+ it "should update cached weighted score if there is a weighted score column" do
232
+ saveable_cache.cached_weighted_score = 50
233
+ saveable_cache.save_by :saver => saver, :save_weight => 3
234
+ expect(saveable_cache.cached_weighted_score).to eq(3)
235
+ saveable_cache.save_by :saver => saver2, :saved => 'false', :save_weight => 5
236
+ expect(saveable_cache.cached_weighted_score).to eq(-2)
237
+ # saver changes her saved from 3 to 5
238
+ saveable_cache.save_by :saver => saver, :save_weight => 5
239
+ expect(saveable_cache.cached_weighted_score).to eq(0)
240
+ saveable_cache.save_by :saver => saver3, :save_weight => 4
241
+ expect(saveable_cache.cached_weighted_score).to eq(4)
242
+ end
243
+
244
+ it "should update cached weighted score saves_for when a saved up is removed" do
245
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_weight => 3
246
+ expect(saveable_cache.cached_weighted_score).to eq(3)
247
+ saveable_cache.unsaved :saver => saver
248
+ expect(saveable_cache.cached_weighted_score).to eq(0)
249
+ end
250
+
251
+ it "should update cached weighted score saves_for when a saved down is removed" do
252
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_weight => 4
253
+ expect(saveable_cache.cached_weighted_score).to eq(-4)
254
+ saveable_cache.unsaved :saver => saver
255
+ expect(saveable_cache.cached_weighted_score).to eq(0)
256
+ end
257
+
258
+ it "should update cached weighted average if there is a weighted average column" do
259
+ saveable_cache.cached_weighted_average = 50.0
260
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_weight => 5
261
+ expect(saveable_cache.cached_weighted_average).to eq(5.0)
262
+ saveable_cache.save_by :saver => saver2, :saved => 'true', :save_weight => 3
263
+ expect(saveable_cache.cached_weighted_average).to eq(4.0)
264
+ # saver changes her saved from 5 to 4
265
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_weight => 4
266
+ expect(saveable_cache.cached_weighted_average).to eq(3.5)
267
+ saveable_cache.save_by :saver => saver3, :saved => 'true', :save_weight => 5
268
+ expect(saveable_cache.cached_weighted_average).to eq(4.0)
269
+ end
270
+
271
+ it "should update cached weighted average saves_for when a saved up is removed" do
272
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_weight => 5
273
+ saveable_cache.save_by :saver => saver2, :saved => 'true', :save_weight => 3
274
+ expect(saveable_cache.cached_weighted_average).to eq(4)
275
+ saveable_cache.unsaved :saver => saver
276
+ expect(saveable_cache.cached_weighted_average).to eq(3)
277
+ end
278
+
279
+ it "should update cached up saves_for if there is an up saved column" do
280
+ saveable_cache.cached_saves_up = 50
281
+ saveable_cache.save_by :saver => saver
282
+ saveable_cache.save_by :saver => saver
283
+ expect(saveable_cache.cached_saves_up).to eq(1)
284
+ end
285
+
286
+ it "should update cached down saves_for if there is a down saved column" do
287
+ saveable_cache.cached_saves_down = 50
288
+ saveable_cache.save_by :saver => saver, :saved => 'false'
289
+ expect(saveable_cache.cached_saves_down).to eq(1)
290
+ end
291
+
292
+ it "should update cached up saves_for when a saved up is removed" do
293
+ saveable_cache.save_by :saver => saver, :saved => 'true'
294
+ saveable_cache.unsaved :saver => saver
295
+ expect(saveable_cache.cached_saves_up).to eq(0)
296
+ end
297
+
298
+ it "should update cached down saves_for when a saved down is removed" do
299
+ saveable_cache.save_by :saver => saver, :saved => 'false'
300
+ saveable_cache.unsaved :saver => saver
301
+ expect(saveable_cache.cached_saves_down).to eq(0)
302
+ end
303
+
304
+ it "should select from cached total saves_for if there a total column" do
305
+ saveable_cache.save_by :saver => saver
306
+ saveable_cache.cached_saves_total = 50
307
+ expect(saveable_cache.count_saves_total).to eq(50)
308
+ end
309
+
310
+ it "should select from cached up saves_for if there is an up saved column" do
311
+ saveable_cache.save_by :saver => saver
312
+ saveable_cache.cached_saves_up = 50
313
+ expect(saveable_cache.count_saves_up).to eq(50)
314
+ end
315
+
316
+ it "should select from cached down saves_for if there is a down saved column" do
317
+ saveable_cache.save_by :saver => saver, :saved => 'false'
318
+ saveable_cache.cached_saves_down = 50
319
+ expect(saveable_cache.count_saves_down).to eq(50)
320
+ end
321
+
322
+ it "should select from cached weighted total if there is a weighted total column" do
323
+ saveable_cache.save_by :saver => saver, :saved => 'false'
324
+ saveable_cache.cached_weighted_total = 50
325
+ expect(saveable_cache.weighted_total).to eq(50)
326
+ end
327
+
328
+ it "should select from cached weighted score if there is a weighted score column" do
329
+ saveable_cache.save_by :saver => saver, :saved => 'false'
330
+ saveable_cache.cached_weighted_score = 50
331
+ expect(saveable_cache.weighted_score).to eq(50)
332
+ end
333
+
334
+ it "should select from cached weighted average if there is a weighted average column" do
335
+ saveable_cache.save_by :saver => saver, :saved => 'false'
336
+ saveable_cache.cached_weighted_average = 50
337
+ expect(saveable_cache.weighted_average).to eq(50)
338
+ end
339
+
340
+ it "should update cached total saves_for when saving under an scope" do
341
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => 'rank'
342
+ expect(saveable_cache.cached_saves_total).to eq(1)
343
+ end
344
+
345
+ it "should update cached up saves_for when saving under an scope" do
346
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => 'rank'
347
+ expect(saveable_cache.cached_saves_up).to eq(1)
348
+ end
349
+
350
+ it "should update cached total saves_for when a scoped saved down is removed" do
351
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => 'rank'
352
+ saveable_cache.unsaved :saver => saver, :save_scope => 'rank'
353
+ expect(saveable_cache.cached_saves_total).to eq(0)
354
+ end
355
+
356
+ it "should update cached up saves_for when a scoped saved down is removed" do
357
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => 'rank'
358
+ saveable_cache.unsaved :saver => saver, :save_scope => 'rank'
359
+ expect(saveable_cache.cached_saves_up).to eq(0)
360
+ end
361
+
362
+ it "should update cached down saves_for when downsaving under a scope" do
363
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => 'rank'
364
+ expect(saveable_cache.cached_saves_down).to eq(1)
365
+ end
366
+
367
+ it "should update cached down saves_for when a scoped saved down is removed" do
368
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => 'rank'
369
+ saveable_cache.unsaved :saver => saver, :save_scope => 'rank'
370
+ expect(saveable_cache.cached_saves_down).to eq(0)
371
+ end
372
+
373
+ end
374
+
375
+ describe "with scoped cached saves_for" do
376
+
377
+ it "should update cached total saves_for if there is a total column" do
378
+ saveable_cache.cached_scoped_test_saves_total = 50
379
+ saveable_cache.save_by :saver => saver, :save_scope => "test"
380
+ expect(saveable_cache.cached_scoped_test_saves_total).to eq(1)
381
+ end
382
+
383
+ it "should update cached total saves_for when a saved up is removed" do
384
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => "test"
385
+ saveable_cache.unsaved :saver => saver, :save_scope => "test"
386
+ expect(saveable_cache.cached_scoped_test_saves_total).to eq(0)
387
+ end
388
+
389
+ it "should update cached total saves_for when a saved down is removed" do
390
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => "test"
391
+ saveable_cache.unsaved :saver => saver, :save_scope => "test"
392
+ expect(saveable_cache.cached_scoped_test_saves_total).to eq(0)
393
+ end
394
+
395
+ it "should update cached score saves_for if there is a score column" do
396
+ saveable_cache.cached_scoped_test_saves_score = 50
397
+ saveable_cache.save_by :saver => saver, :save_scope => "test"
398
+ expect(saveable_cache.cached_scoped_test_saves_score).to eq(1)
399
+ saveable_cache.save_by :saver => saver2, :saved => 'false', :save_scope => "test"
400
+ expect(saveable_cache.cached_scoped_test_saves_score).to eq(0)
401
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => "test"
402
+ expect(saveable_cache.cached_scoped_test_saves_score).to eq(-2)
403
+ end
404
+
405
+ it "should update cached score saves_for when a saved up is removed" do
406
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => "test"
407
+ expect(saveable_cache.cached_scoped_test_saves_score).to eq(1)
408
+ saveable_cache.unsaved :saver => saver, :save_scope => "test"
409
+ expect(saveable_cache.cached_scoped_test_saves_score).to eq(0)
410
+ end
411
+
412
+ it "should update cached score saves_for when a saved down is removed" do
413
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => "test"
414
+ expect(saveable_cache.cached_scoped_test_saves_score).to eq(-1)
415
+ saveable_cache.unsaved :saver => saver, :save_scope => "test"
416
+ expect(saveable_cache.cached_scoped_test_saves_score).to eq(0)
417
+ end
418
+
419
+ it "should update cached up saves_for if there is an up saved column" do
420
+ saveable_cache.cached_scoped_test_saves_up = 50
421
+ saveable_cache.save_by :saver => saver, :save_scope => "test"
422
+ saveable_cache.save_by :saver => saver, :save_scope => "test"
423
+ expect(saveable_cache.cached_scoped_test_saves_up).to eq(1)
424
+ end
425
+
426
+ it "should update cached down saves_for if there is a down saved column" do
427
+ saveable_cache.cached_scoped_test_saves_down = 50
428
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => "test"
429
+ expect(saveable_cache.cached_scoped_test_saves_down).to eq(1)
430
+ end
431
+
432
+ it "should update cached up saves_for when a saved up is removed" do
433
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => "test"
434
+ saveable_cache.unsaved :saver => saver, :save_scope => "test"
435
+ expect(saveable_cache.cached_scoped_test_saves_up).to eq(0)
436
+ end
437
+
438
+ it "should update cached down saves_for when a saved down is removed" do
439
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => "test"
440
+ saveable_cache.unsaved :saver => saver, :save_scope => "test"
441
+ expect(saveable_cache.cached_scoped_test_saves_down).to eq(0)
442
+ end
443
+
444
+ it "should select from cached total saves_for if there a total column" do
445
+ saveable_cache.save_by :saver => saver, :save_scope => "test"
446
+ saveable_cache.cached_scoped_test_saves_total = 50
447
+ expect(saveable_cache.count_saves_total(false, "test")).to eq(50)
448
+ end
449
+
450
+ it "should select from cached up saves_for if there is an up saved column" do
451
+ saveable_cache.save_by :saver => saver, :save_scope => "test"
452
+ saveable_cache.cached_scoped_test_saves_up = 50
453
+ expect(saveable_cache.count_saves_up(false, "test")).to eq(50)
454
+ end
455
+
456
+ it "should select from cached down saves_for if there is a down saved column" do
457
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => "test"
458
+ saveable_cache.cached_scoped_test_saves_down = 50
459
+ expect(saveable_cache.count_saves_down(false, "test")).to eq(50)
460
+ end
461
+
462
+ end
463
+
464
+ describe "sti models" do
465
+
466
+ it "should be able to saved on a saveable child of a non saveable sti model" do
467
+ saveable = SaveableChildOfStiNotSaveable.create(:name => 'sti child')
468
+
469
+ saveable.save_by :saver => saver, :saved => 'yes'
470
+ expect(saveable.saves_for.size).to eq(1)
471
+ end
472
+
473
+ it "should not be able to saved on a parent non saveable" do
474
+ expect(StiNotSaveable).not_to be_saveable
475
+ end
476
+
477
+ it "should be able to saved on a child when its parent is saveable" do
478
+ saveable = ChildOfStiSaveable.create(:name => 'sti child')
479
+
480
+ saveable.save_by :saver => saver, :saved => 'yes'
481
+ expect(saveable.saves_for.size).to eq(1)
482
+ end
483
+ end
484
+ end