save_queue 0.3.0 → 0.4.0
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.
- data/.travis.yml +3 -2
- data/HISTORY.md +13 -6
- data/README.md +184 -126
- data/lib/save_queue/exceptions.rb +2 -1
- data/lib/save_queue/object/queue_class_management.rb +21 -0
- data/lib/save_queue/object.rb +35 -47
- data/lib/save_queue/object_queue.rb +14 -26
- data/lib/save_queue/plugins/dirty/object.rb +31 -0
- data/lib/save_queue/plugins/dirty.rb +11 -0
- data/lib/save_queue/plugins/notification/object.rb +6 -24
- data/lib/save_queue/plugins/notification/queue.rb +2 -3
- data/lib/save_queue/plugins/notification.rb +2 -2
- data/lib/save_queue/plugins/validation/exceptions.rb +10 -2
- data/lib/save_queue/plugins/validation/queue.rb +1 -1
- data/lib/save_queue/plugins/validation.rb +1 -1
- data/lib/save_queue/uniq_queue.rb +10 -2
- data/lib/save_queue/version.rb +1 -1
- data/spec/dirty/dirty_spec.rb +74 -0
- data/spec/dirty/object_spec.rb +200 -0
- data/spec/notification/notification_spec.rb +3 -4
- data/spec/notification/object_spec.rb +0 -17
- data/spec/notification/queue_spec.rb +4 -4
- data/spec/object/queue_class_management_spec.rb +53 -0
- data/spec/object_queue_spec.rb +58 -68
- data/spec/object_spec.rb +124 -163
- data/spec/save_queue_spec.rb +0 -62
- data/spec/support/object_helpers.rb +31 -0
- data/spec/support/queue_helpers.rb +3 -1
- data/spec/uniq_queue_spec.rb +51 -21
- data/spec/validation/queue_spec.rb +83 -32
- metadata +14 -8
@@ -14,21 +14,22 @@ module SaveQueue
|
|
14
14
|
define_hook :before_add
|
15
15
|
define_hook :after_add
|
16
16
|
|
17
|
+
before_add :check_requirements
|
18
|
+
|
17
19
|
# @return [Hash] save
|
18
|
-
# @option save [Array<Object>] :processed
|
19
20
|
# @option save [Array<Object>] :saved
|
20
21
|
# @option save [Object] :failed
|
21
22
|
# @option save [Array<Object>] :pending
|
22
23
|
attr_reader :errors
|
24
|
+
|
23
25
|
def initialize(*args)
|
24
26
|
super
|
25
27
|
@errors = {}
|
26
28
|
end
|
27
29
|
|
28
30
|
def add object
|
29
|
-
run_hook :before_add
|
31
|
+
run_hook :before_add, object
|
30
32
|
|
31
|
-
check_requirements_for object
|
32
33
|
result = super object
|
33
34
|
|
34
35
|
run_hook :after_add, result, object
|
@@ -36,13 +37,6 @@ module SaveQueue
|
|
36
37
|
result
|
37
38
|
end
|
38
39
|
|
39
|
-
def << object
|
40
|
-
add object
|
41
|
-
self
|
42
|
-
end
|
43
|
-
|
44
|
-
alias_method :push, :add
|
45
|
-
|
46
40
|
def save
|
47
41
|
save!
|
48
42
|
true
|
@@ -52,34 +46,28 @@ module SaveQueue
|
|
52
46
|
|
53
47
|
def save!
|
54
48
|
run_hook :before_save
|
49
|
+
|
55
50
|
@errors = {}
|
56
51
|
saved = []
|
57
|
-
processed = []
|
58
52
|
|
59
53
|
@queue.each do |object|
|
60
|
-
if object.
|
61
|
-
|
62
|
-
|
63
|
-
if false == result
|
64
|
-
@errors[:save] = {:processed => processed, :saved => saved, :failed => object, :pending => @queue - (saved + [object])}
|
65
|
-
raise FailedSaveError, errors[:save]
|
66
|
-
end
|
67
|
-
|
68
|
-
saved << object
|
54
|
+
if false == object.save
|
55
|
+
@errors[:save] = {:saved => saved, :failed => object, :pending => @queue - (saved + [object])}
|
56
|
+
raise FailedSaveError, errors[:save]
|
69
57
|
end
|
70
|
-
processed << object
|
71
|
-
end
|
72
58
|
|
73
|
-
|
59
|
+
saved << object
|
60
|
+
end
|
61
|
+
clear
|
74
62
|
|
75
63
|
run_hook :after_save
|
64
|
+
|
76
65
|
true
|
77
66
|
end
|
78
67
|
|
79
|
-
|
80
68
|
private
|
81
|
-
def
|
82
|
-
[:save
|
69
|
+
def check_requirements(object)
|
70
|
+
[:save].each do |method|
|
83
71
|
raise ArgumentError, "#{object.inspect} does not respond to ##{method}" unless object.respond_to? method
|
84
72
|
end
|
85
73
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module SaveQueue
|
2
|
+
module Plugins
|
3
|
+
module Dirty
|
4
|
+
module Object
|
5
|
+
def mark_as_changed
|
6
|
+
@_changed_mark = true
|
7
|
+
end
|
8
|
+
|
9
|
+
def mark_as_saved
|
10
|
+
@_changed_mark = false
|
11
|
+
end
|
12
|
+
|
13
|
+
# @returns [Boolean] true if object has been modified
|
14
|
+
def has_unsaved_changes?
|
15
|
+
@_changed_mark ||= false
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def _sq_around_original_save
|
20
|
+
result = nil
|
21
|
+
if has_unsaved_changes?
|
22
|
+
result = yield
|
23
|
+
mark_as_saved
|
24
|
+
end
|
25
|
+
|
26
|
+
result
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -2,32 +2,14 @@ module SaveQueue
|
|
2
2
|
module Plugins
|
3
3
|
module Notification
|
4
4
|
module Object
|
5
|
-
|
6
|
-
def create_queue
|
7
|
-
super
|
8
|
-
queue = instance_variable_get("@_save_queue")
|
9
|
-
raise "save queue should respond to add_observer in order to work correctly" unless queue.respond_to? :add_observer
|
10
|
-
queue.add_observer(self, :queue_changed_event)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.included base
|
15
|
-
|
16
|
-
#queue_creator = Module.new do
|
17
|
-
# def create_queue
|
18
|
-
# super
|
19
|
-
# queue = instance_variable_get("@_save_queue")
|
20
|
-
# raise "save queue should respond to add_observer in order to work correctly" unless queue.respond_to? :add_observer
|
21
|
-
# queue.add_observer(self, :queue_changed_event)
|
22
|
-
# end
|
23
|
-
#end
|
5
|
+
def queue_changed_event(result, object, *args); end
|
24
6
|
|
25
|
-
|
26
|
-
|
27
|
-
end
|
7
|
+
def create_queue
|
8
|
+
super
|
28
9
|
|
29
|
-
|
30
|
-
|
10
|
+
queue = instance_variable_get("@_save_queue")
|
11
|
+
raise "save queue should respond to add_observer in order to work correctly" unless queue.respond_to? :add_observer
|
12
|
+
queue.add_observer(self, :queue_changed_event)
|
31
13
|
end
|
32
14
|
end
|
33
15
|
end
|
@@ -9,8 +9,8 @@ module SaveQueue
|
|
9
9
|
module Notification
|
10
10
|
module Queue
|
11
11
|
def self.included base
|
12
|
-
base.send :include, Observable
|
13
|
-
base.after_add :change_and_notify
|
12
|
+
base.send :include, Observable
|
13
|
+
base.after_add :change_and_notify
|
14
14
|
end
|
15
15
|
|
16
16
|
private
|
@@ -18,7 +18,6 @@ module SaveQueue
|
|
18
18
|
changed
|
19
19
|
notify_observers(*args)
|
20
20
|
end
|
21
|
-
|
22
21
|
end
|
23
22
|
end
|
24
23
|
end
|
@@ -6,8 +6,8 @@ module SaveQueue
|
|
6
6
|
module Notification
|
7
7
|
def self.included base
|
8
8
|
klass = Class.new(base.queue_class)
|
9
|
-
klass.send :include, Notification::Queue
|
10
|
-
base.send
|
9
|
+
klass.send :include, Notification::Queue unless klass.include? Notification::Queue
|
10
|
+
base.send :include, Notification::Object unless base.include? Notification::Object
|
11
11
|
base.queue_class = klass
|
12
12
|
end
|
13
13
|
end
|
@@ -1,12 +1,20 @@
|
|
1
1
|
module SaveQueue
|
2
2
|
class FailedValidationError < Error
|
3
3
|
attr_reader :failed_objects
|
4
|
+
|
4
5
|
def initialize(failed_objects)
|
5
6
|
@failed_objects = Array(failed_objects)
|
6
7
|
end
|
7
8
|
|
8
|
-
|
9
|
-
|
9
|
+
|
10
|
+
# Overwrite to your needs
|
11
|
+
def to_s
|
12
|
+
"#{super}: " + @failed_objects.join("\n")
|
10
13
|
end
|
14
|
+
|
15
|
+
# danger if object not respond to errors or full_messages
|
16
|
+
#def to_s
|
17
|
+
# "#{super}: " + @failed_objects.map{|object| "\"#{object.to_s}\": " + object.errors.full_messages.join(', ')}.join("\n")
|
18
|
+
#end
|
11
19
|
end
|
12
20
|
end
|
@@ -7,7 +7,7 @@ module SaveQueue
|
|
7
7
|
module Validation
|
8
8
|
def self.included base
|
9
9
|
klass = Class.new(base.queue_class)
|
10
|
-
klass.send :include, Validation::Queue
|
10
|
+
klass.send :include, Validation::Queue unless klass.include? Validation::Queue
|
11
11
|
base.queue_class = klass
|
12
12
|
end
|
13
13
|
end
|
@@ -32,7 +32,15 @@ module SaveQueue
|
|
32
32
|
|
33
33
|
true
|
34
34
|
end
|
35
|
-
|
36
|
-
alias_method
|
35
|
+
|
36
|
+
#alias_method :push, :add # Not working as expected: does not save inheritance
|
37
|
+
def push(*args)
|
38
|
+
add *args
|
39
|
+
end
|
40
|
+
|
41
|
+
def << *args
|
42
|
+
add *args
|
43
|
+
self
|
44
|
+
end
|
37
45
|
end
|
38
46
|
end
|
data/lib/save_queue/version.rb
CHANGED
@@ -0,0 +1,74 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "save_queue/plugins/dirty"
|
3
|
+
|
4
|
+
describe SaveQueue::Plugins::Dirty do
|
5
|
+
describe "#integration" do
|
6
|
+
it "should mix Object to object class" do
|
7
|
+
klass = new_class
|
8
|
+
klass.send :include, SaveQueue::Plugins::Dirty
|
9
|
+
|
10
|
+
klass.should include SaveQueue::Plugins::Dirty::Object
|
11
|
+
end
|
12
|
+
describe "functional" do
|
13
|
+
it "README example should work" do
|
14
|
+
article = Article.new
|
15
|
+
|
16
|
+
tag_objects = []
|
17
|
+
3.times do
|
18
|
+
tag = Tag.new
|
19
|
+
tag.change_attribute :title, "new tag"
|
20
|
+
tag.should_receive(:save).once
|
21
|
+
tag_objects << tag
|
22
|
+
end
|
23
|
+
article.tags = tag_objects
|
24
|
+
|
25
|
+
tag = Tag.new
|
26
|
+
tag.change_attribute :title, "single tag"
|
27
|
+
tag.should_receive(:save).once
|
28
|
+
article.add_tag tag
|
29
|
+
|
30
|
+
# that will save article and all tags in this article if article
|
31
|
+
# and tags are valid, and if article.save and all tag.save returns true
|
32
|
+
# You may also use #save! method, that will trigger save_queue.save! and
|
33
|
+
# raise SaveQueue::FailedSaveError on fail
|
34
|
+
article.save.should be_true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
require 'save_queue'
|
41
|
+
class Article
|
42
|
+
include SaveQueue
|
43
|
+
include SaveQueue::Plugins::Dirty
|
44
|
+
|
45
|
+
def change_attribute attr, value
|
46
|
+
@attributes ||= {}
|
47
|
+
@attributes[attr] = value
|
48
|
+
mark_as_changed # call this and object will be marked for save
|
49
|
+
end
|
50
|
+
|
51
|
+
def tags= tag_objects
|
52
|
+
@tags = tag_objects
|
53
|
+
mark_as_changed
|
54
|
+
save_queue.add_all tag_objects
|
55
|
+
end
|
56
|
+
|
57
|
+
def add_tag tag
|
58
|
+
@tags ||= []
|
59
|
+
@tags << tag
|
60
|
+
save_queue.add tag # or use <<, push methods
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
class Tag
|
66
|
+
include SaveQueue
|
67
|
+
include SaveQueue::Plugins::Dirty
|
68
|
+
|
69
|
+
def change_attribute attr, value
|
70
|
+
@attributes ||= {}
|
71
|
+
@attributes[attr] = value
|
72
|
+
mark_as_changed # call this and object will be marked for save
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,200 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "save_queue/plugins/dirty/object"
|
3
|
+
|
4
|
+
class DirtyObject
|
5
|
+
include SaveQueue
|
6
|
+
include SaveQueue::Plugins::Dirty::Object
|
7
|
+
end
|
8
|
+
|
9
|
+
describe SaveQueue::Plugins::Dirty::Object do
|
10
|
+
let(:object) { DirtyObject.new }
|
11
|
+
|
12
|
+
describe "#has_unsaved_changes?" do
|
13
|
+
it "should return true for changed object" do
|
14
|
+
object.mark_as_changed
|
15
|
+
object.has_unsaved_changes?.should eq true
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should return false for unchanged object" do
|
19
|
+
object.mark_as_saved
|
20
|
+
object.has_unsaved_changes?.should eq false
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should return false for new object" do
|
24
|
+
object.has_unsaved_changes?.should eq false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "marks" do
|
29
|
+
it "should change state of an object" do
|
30
|
+
object.mark_as_saved
|
31
|
+
object.should_not have_unsaved_changes
|
32
|
+
object.mark_as_changed
|
33
|
+
object.should have_unsaved_changes
|
34
|
+
object.mark_as_saved
|
35
|
+
object.should_not have_unsaved_changes
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#save!" do
|
40
|
+
context "changed object" do
|
41
|
+
let(:changed_object) {object.mark_as_changed; object}
|
42
|
+
|
43
|
+
it "should call #save! on queue" do
|
44
|
+
changed_object.save_queue.should_receive(:save!).once
|
45
|
+
changed_object.save!
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should mark object as saved" do
|
49
|
+
changed_object.should_receive(:mark_as_saved).once
|
50
|
+
changed_object.save!
|
51
|
+
end
|
52
|
+
|
53
|
+
context "original class has #save! method defined" do
|
54
|
+
it "should call that method" do
|
55
|
+
changed_object =
|
56
|
+
Class.new(DirtyObject) do
|
57
|
+
attr_reader :save_called
|
58
|
+
def save!
|
59
|
+
@save_called = true
|
60
|
+
end
|
61
|
+
end.new
|
62
|
+
|
63
|
+
changed_object.mark_as_changed
|
64
|
+
expect{ changed_object.save! }.to change { changed_object.save_called }.from(nil).to(true)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context "not changed object" do
|
70
|
+
let(:not_changed_object) {object.mark_as_saved; object}
|
71
|
+
|
72
|
+
it "should not mark object as saved" do
|
73
|
+
not_changed_object.should_not_receive(:mark_as_saved)
|
74
|
+
not_changed_object.save!
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should call #save! on queue" do
|
78
|
+
not_changed_object.save_queue.should_receive(:save!).once
|
79
|
+
not_changed_object.save!
|
80
|
+
end
|
81
|
+
|
82
|
+
context "original class has #save! method defined" do
|
83
|
+
it "should not call that method" do
|
84
|
+
not_changed_object =
|
85
|
+
Class.new(DirtyObject) do
|
86
|
+
attr_reader :save_called
|
87
|
+
def save!
|
88
|
+
@save_called = true
|
89
|
+
end
|
90
|
+
end.new
|
91
|
+
|
92
|
+
not_changed_object.mark_as_saved
|
93
|
+
expect{ not_changed_object.save! }.to_not change { not_changed_object.save_called }
|
94
|
+
end
|
95
|
+
|
96
|
+
context "multiple save with changing state" do
|
97
|
+
it "should call that method if state was changed after 1st save" do
|
98
|
+
not_changed_object =
|
99
|
+
Class.new(DirtyObject) do
|
100
|
+
attr_reader :save_called
|
101
|
+
def save!
|
102
|
+
@save_called = true
|
103
|
+
end
|
104
|
+
end.new
|
105
|
+
not_changed_object.save!
|
106
|
+
not_changed_object.mark_as_changed
|
107
|
+
changed_object = not_changed_object
|
108
|
+
|
109
|
+
expect{ changed_object.save! }.to change { changed_object.save_called }.from(nil).to(true)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "#save" do
|
117
|
+
context "changed object" do
|
118
|
+
let(:changed_object) {object.mark_as_changed; object}
|
119
|
+
|
120
|
+
it "should save queue" do
|
121
|
+
changed_object.save_queue.should_receive(:save).once
|
122
|
+
changed_object.save
|
123
|
+
end
|
124
|
+
|
125
|
+
context "original class has #save method defined" do
|
126
|
+
it "should call that method (save object)" do
|
127
|
+
changed_object =
|
128
|
+
Class.new(DirtyObject) do
|
129
|
+
attr_reader :save_called
|
130
|
+
def save
|
131
|
+
@save_called = true
|
132
|
+
end
|
133
|
+
end.new
|
134
|
+
|
135
|
+
changed_object.mark_as_changed
|
136
|
+
expect{ changed_object.save }.to change { changed_object.save_called }.from(nil).to(true)
|
137
|
+
end
|
138
|
+
|
139
|
+
#it "should save object only once in multiple queues" do
|
140
|
+
# other_object = new_object
|
141
|
+
# target = new_count_object
|
142
|
+
#
|
143
|
+
# object .save_queue.add target
|
144
|
+
# other_object.save_queue.add target
|
145
|
+
#
|
146
|
+
# other_object.save.should be_true
|
147
|
+
# object.save.should be_true
|
148
|
+
#
|
149
|
+
# target.save_call_count.should == 1
|
150
|
+
#end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
context "not changed object" do
|
155
|
+
let(:not_changed_object) {object.mark_as_saved; object}
|
156
|
+
|
157
|
+
it "should not mark object as saved" do
|
158
|
+
not_changed_object.should_not_receive(:mark_as_saved)
|
159
|
+
not_changed_object.save
|
160
|
+
end
|
161
|
+
|
162
|
+
it "should save queue" do
|
163
|
+
not_changed_object.save_queue.should_receive(:save).once
|
164
|
+
not_changed_object.save
|
165
|
+
end
|
166
|
+
|
167
|
+
context "original class has #save method defined" do
|
168
|
+
it "should not call that method (dont save an object)" do
|
169
|
+
not_changed_object =
|
170
|
+
Class.new(DirtyObject) do
|
171
|
+
attr_reader :save_called
|
172
|
+
def save
|
173
|
+
@save_called = true
|
174
|
+
end
|
175
|
+
end.new
|
176
|
+
|
177
|
+
not_changed_object.mark_as_saved
|
178
|
+
expect{ not_changed_object.save }.to_not change { not_changed_object.save_called }
|
179
|
+
end
|
180
|
+
|
181
|
+
context "multiple save with changing state" do
|
182
|
+
it "should call that method if state was changed after 1st save" do
|
183
|
+
not_changed_object =
|
184
|
+
Class.new(DirtyObject) do
|
185
|
+
attr_reader :save_called
|
186
|
+
def save
|
187
|
+
@save_called = true
|
188
|
+
end
|
189
|
+
end.new
|
190
|
+
not_changed_object.save
|
191
|
+
not_changed_object.mark_as_changed
|
192
|
+
changed_object = not_changed_object
|
193
|
+
|
194
|
+
expect{ changed_object.save }.to change { changed_object.save_called }.from(nil).to(true)
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
@@ -34,11 +34,10 @@ describe SaveQueue::Plugins::Notification do
|
|
34
34
|
klass.new
|
35
35
|
end
|
36
36
|
|
37
|
-
|
38
|
-
it "should
|
39
|
-
object.
|
37
|
+
ADD_METHODS.each do |method|
|
38
|
+
it "should call queue_changed_event if save_queue was changed by ##{method} method" do
|
39
|
+
object.should_receive(:queue_changed_event)
|
40
40
|
object.save_queue.send method, new_object
|
41
|
-
object.should have_unsaved_changes
|
42
41
|
end
|
43
42
|
end
|
44
43
|
end
|
@@ -34,21 +34,4 @@ describe SaveQueue::Plugins::Notification::Object do
|
|
34
34
|
NotifyObject.queue_class = queue
|
35
35
|
expect { NotifyObject.new }.to_not raise_error
|
36
36
|
end
|
37
|
-
|
38
|
-
describe "#queue_changed_event" do
|
39
|
-
let(:object) do
|
40
|
-
NotifyObject.any_instance.stub(:create_queue)
|
41
|
-
NotifyObject.new
|
42
|
-
end
|
43
|
-
|
44
|
-
it "should mark self as changed" do
|
45
|
-
object.should_receive(:mark_as_changed)
|
46
|
-
object.send :queue_changed_event, true, stub(:some_object)
|
47
|
-
end
|
48
|
-
|
49
|
-
it "should not mark self as changed if result of adding element to a queue was false" do
|
50
|
-
object.should_not_receive(:mark_as_changed)
|
51
|
-
object.send :queue_changed_event, false, stub(:some_object)
|
52
|
-
end
|
53
|
-
end
|
54
37
|
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
require "save_queue/plugins/notification/queue"
|
3
3
|
|
4
|
-
class
|
4
|
+
class QueueWithNotification < SaveQueue::ObjectQueue
|
5
5
|
include SaveQueue::Plugins::Notification::Queue
|
6
6
|
end
|
7
7
|
|
8
8
|
describe SaveQueue::Plugins::Notification::Queue do
|
9
|
-
let(:queue) {
|
9
|
+
let(:queue) { QueueWithNotification.new }
|
10
10
|
|
11
|
-
|
11
|
+
ADD_METHODS.each do |method|
|
12
12
|
describe "##{method}" do
|
13
13
|
let(:element) { new_element }
|
14
14
|
|
@@ -18,7 +18,7 @@ describe SaveQueue::Plugins::Notification::Queue do
|
|
18
18
|
queue.send method, element
|
19
19
|
end
|
20
20
|
|
21
|
-
it "should
|
21
|
+
it "should provide input params and result of ##{method} method call to observers" do
|
22
22
|
queue.should_receive(:changed)
|
23
23
|
queue.should_receive(:notify_observers).with(true, element)
|
24
24
|
queue.send method, element
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'save_queue/object/queue_class_management'
|
2
|
+
|
3
|
+
describe SaveQueue::Object::QueueClassManagement do
|
4
|
+
let(:klass) do
|
5
|
+
Class.new do
|
6
|
+
extend SaveQueue::Object::QueueClassManagement
|
7
|
+
end
|
8
|
+
end
|
9
|
+
let(:default_queue_class) { SaveQueue::ObjectQueue }
|
10
|
+
let(:first_queue_class) { Class.new(default_queue_class) }
|
11
|
+
let(:second_queue_class) { Class.new(default_queue_class) }
|
12
|
+
|
13
|
+
it "should map to SaveQueue::ObjectQueue by default" do
|
14
|
+
klass.queue_class.should == default_queue_class
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "changing" do
|
18
|
+
it "should be possible" do
|
19
|
+
klass.queue_class = second_queue_class
|
20
|
+
klass.queue_class.should eq second_queue_class
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should check inclusion of Hooks module" do
|
24
|
+
expect{ klass.queue_class = Class.new }.to raise_error(RuntimeError, /Hooks/)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it "inclusion of SaveQueue::Object should not override settings" do
|
29
|
+
klass.queue_class = second_queue_class
|
30
|
+
expect { klass.send :include, SaveQueue::Object }.to_not change { klass.queue_class }
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "inheritance" do
|
34
|
+
let(:parent) { klass }
|
35
|
+
let(:child) { Class.new(parent) }
|
36
|
+
before(:each) do
|
37
|
+
parent.queue_class = first_queue_class
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should inherit settings of parent class" do
|
41
|
+
child.queue_class.should == first_queue_class
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should not override settings of parent class" do
|
45
|
+
expect { child.queue_class = second_queue_class }.to_not change { parent.queue_class }
|
46
|
+
end
|
47
|
+
|
48
|
+
it "inclusion of SaveQueue::Object should not override settings of child class" do
|
49
|
+
child.queue_class = second_queue_class
|
50
|
+
expect { child.send :include, SaveQueue::Object }.to_not change { child.queue_class }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|