rails-observers 0.1.2 → 0.1.4
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.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +29 -13
- data/lib/rails/observers/action_controller/caching.rb +1 -1
- data/lib/rails/observers/action_controller/caching/sweeper.rb +61 -0
- data/lib/rails/observers/action_controller/caching/sweeping.rb +3 -59
- data/lib/rails/observers/active_resource/observing.rb +41 -0
- data/lib/rails/observers/activerecord/observer.rb +4 -0
- data/lib/rails/observers/railtie.rb +23 -7
- data/lib/rails/observers/version.rb +1 -1
- metadata +39 -62
- data/.gitignore +0 -18
- data/.travis.yml +0 -12
- data/Gemfile +0 -8
- data/Rakefile +0 -34
- data/rails-observers.gemspec +0 -26
- data/rails-observers.gemspec.erb +0 -26
- data/test/configuration_test.rb +0 -37
- data/test/console_test.rb +0 -38
- data/test/fixtures/developers.yml +0 -4
- data/test/fixtures/minimalistics.yml +0 -2
- data/test/fixtures/topics.yml +0 -41
- data/test/generators/generators_test_helper.rb +0 -16
- data/test/generators/namespaced_generators_test.rb +0 -34
- data/test/generators/observer_generator_test.rb +0 -33
- data/test/helper.rb +0 -74
- data/test/isolation/abstract_unit.rb +0 -119
- data/test/lifecycle_test.rb +0 -249
- data/test/models/observers.rb +0 -27
- data/test/observer_array_test.rb +0 -222
- data/test/observing_test.rb +0 -183
- data/test/rake_test.rb +0 -40
- data/test/sweeper_test.rb +0 -83
- data/test/transaction_callbacks_test.rb +0 -246
data/test/observing_test.rb
DELETED
@@ -1,183 +0,0 @@
|
|
1
|
-
require 'minitest/autorun'
|
2
|
-
require 'active_model'
|
3
|
-
require 'rails/observers/active_model/active_model'
|
4
|
-
|
5
|
-
class ObservedModel
|
6
|
-
include ActiveModel::Observing
|
7
|
-
|
8
|
-
class Observer
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class FooObserver < ActiveModel::Observer
|
13
|
-
class << self
|
14
|
-
public :new
|
15
|
-
end
|
16
|
-
|
17
|
-
attr_accessor :stub
|
18
|
-
|
19
|
-
def on_spec(record, *args)
|
20
|
-
stub.event_with(record, *args) if stub
|
21
|
-
end
|
22
|
-
|
23
|
-
def around_save(record)
|
24
|
-
yield :in_around_save
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
class Foo
|
29
|
-
include ActiveModel::Observing
|
30
|
-
end
|
31
|
-
|
32
|
-
class ObservingTest < ActiveModel::TestCase
|
33
|
-
def setup
|
34
|
-
ObservedModel.observers.clear
|
35
|
-
end
|
36
|
-
|
37
|
-
test "initializes model with no cached observers" do
|
38
|
-
assert ObservedModel.observers.empty?, "Not empty: #{ObservedModel.observers.inspect}"
|
39
|
-
end
|
40
|
-
|
41
|
-
test "stores cached observers in an array" do
|
42
|
-
ObservedModel.observers << :foo
|
43
|
-
assert ObservedModel.observers.include?(:foo), ":foo not in #{ObservedModel.observers.inspect}"
|
44
|
-
end
|
45
|
-
|
46
|
-
test "flattens array of assigned cached observers" do
|
47
|
-
ObservedModel.observers = [[:foo], :bar]
|
48
|
-
assert ObservedModel.observers.include?(:foo), ":foo not in #{ObservedModel.observers.inspect}"
|
49
|
-
assert ObservedModel.observers.include?(:bar), ":bar not in #{ObservedModel.observers.inspect}"
|
50
|
-
end
|
51
|
-
|
52
|
-
test "uses an ObserverArray so observers can be disabled" do
|
53
|
-
ObservedModel.observers = [:foo, :bar]
|
54
|
-
assert ObservedModel.observers.is_a?(ActiveModel::ObserverArray)
|
55
|
-
end
|
56
|
-
|
57
|
-
test "instantiates observer names passed as strings" do
|
58
|
-
ObservedModel.observers << 'foo_observer'
|
59
|
-
FooObserver.expects(:instance)
|
60
|
-
ObservedModel.instantiate_observers
|
61
|
-
end
|
62
|
-
|
63
|
-
test "instantiates observer names passed as symbols" do
|
64
|
-
ObservedModel.observers << :foo_observer
|
65
|
-
FooObserver.expects(:instance)
|
66
|
-
ObservedModel.instantiate_observers
|
67
|
-
end
|
68
|
-
|
69
|
-
test "instantiates observer classes" do
|
70
|
-
ObservedModel.observers << ObservedModel::Observer
|
71
|
-
ObservedModel::Observer.expects(:instance)
|
72
|
-
ObservedModel.instantiate_observers
|
73
|
-
end
|
74
|
-
|
75
|
-
test "raises an appropriate error when a developer accidentally adds the wrong class (i.e. Widget instead of WidgetObserver)" do
|
76
|
-
assert_raise ArgumentError do
|
77
|
-
ObservedModel.observers = ['string']
|
78
|
-
ObservedModel.instantiate_observers
|
79
|
-
end
|
80
|
-
assert_raise ArgumentError do
|
81
|
-
ObservedModel.observers = [:string]
|
82
|
-
ObservedModel.instantiate_observers
|
83
|
-
end
|
84
|
-
assert_raise ArgumentError do
|
85
|
-
ObservedModel.observers = [String]
|
86
|
-
ObservedModel.instantiate_observers
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
test "passes observers to subclasses" do
|
91
|
-
FooObserver.instance
|
92
|
-
bar = Class.new(Foo)
|
93
|
-
assert_equal Foo.observers_count, bar.observers_count
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
class ObserverTest < ActiveModel::TestCase
|
98
|
-
def setup
|
99
|
-
ObservedModel.observers = :foo_observer
|
100
|
-
FooObserver.singleton_class.instance_eval do
|
101
|
-
alias_method :original_observed_classes, :observed_classes
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def teardown
|
106
|
-
FooObserver.singleton_class.instance_eval do
|
107
|
-
undef_method :observed_classes
|
108
|
-
alias_method :observed_classes, :original_observed_classes
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
test "guesses implicit observable model name" do
|
113
|
-
assert_equal Foo, FooObserver.observed_class
|
114
|
-
end
|
115
|
-
|
116
|
-
test "tracks implicit observable models" do
|
117
|
-
instance = FooObserver.new
|
118
|
-
assert_equal [Foo], instance.observed_classes
|
119
|
-
end
|
120
|
-
|
121
|
-
test "tracks explicit observed model class" do
|
122
|
-
FooObserver.observe ObservedModel
|
123
|
-
instance = FooObserver.new
|
124
|
-
assert_equal [ObservedModel], instance.observed_classes
|
125
|
-
end
|
126
|
-
|
127
|
-
test "tracks explicit observed model as string" do
|
128
|
-
FooObserver.observe 'observed_model'
|
129
|
-
instance = FooObserver.new
|
130
|
-
assert_equal [ObservedModel], instance.observed_classes
|
131
|
-
end
|
132
|
-
|
133
|
-
test "tracks explicit observed model as symbol" do
|
134
|
-
FooObserver.observe :observed_model
|
135
|
-
instance = FooObserver.new
|
136
|
-
assert_equal [ObservedModel], instance.observed_classes
|
137
|
-
end
|
138
|
-
|
139
|
-
test "calls existing observer event" do
|
140
|
-
foo = Foo.new
|
141
|
-
FooObserver.instance.stub = stub
|
142
|
-
FooObserver.instance.stub.expects(:event_with).with(foo)
|
143
|
-
Foo.notify_observers(:on_spec, foo)
|
144
|
-
end
|
145
|
-
|
146
|
-
test "calls existing observer event from the instance" do
|
147
|
-
foo = Foo.new
|
148
|
-
FooObserver.instance.stub = stub
|
149
|
-
FooObserver.instance.stub.expects(:event_with).with(foo)
|
150
|
-
foo.notify_observers(:on_spec)
|
151
|
-
end
|
152
|
-
|
153
|
-
test "passes extra arguments" do
|
154
|
-
foo = Foo.new
|
155
|
-
FooObserver.instance.stub = stub
|
156
|
-
FooObserver.instance.stub.expects(:event_with).with(foo, :bar)
|
157
|
-
Foo.send(:notify_observers, :on_spec, foo, :bar)
|
158
|
-
end
|
159
|
-
|
160
|
-
test "skips nonexistent observer event" do
|
161
|
-
foo = Foo.new
|
162
|
-
Foo.notify_observers(:whatever, foo)
|
163
|
-
end
|
164
|
-
|
165
|
-
test "update passes a block on to the observer" do
|
166
|
-
yielded_value = nil
|
167
|
-
FooObserver.instance.update(:around_save, Foo.new) do |val|
|
168
|
-
yielded_value = val
|
169
|
-
end
|
170
|
-
assert_equal :in_around_save, yielded_value
|
171
|
-
end
|
172
|
-
|
173
|
-
test "observe redefines observed_classes class method" do
|
174
|
-
class BarObserver < ActiveModel::Observer
|
175
|
-
observe :foo
|
176
|
-
end
|
177
|
-
|
178
|
-
assert_equal [Foo], BarObserver.observed_classes
|
179
|
-
|
180
|
-
BarObserver.observe(ObservedModel)
|
181
|
-
assert_equal [ObservedModel], BarObserver.observed_classes
|
182
|
-
end
|
183
|
-
end
|
data/test/rake_test.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'isolation/abstract_unit'
|
2
|
-
require 'rails-observers'
|
3
|
-
|
4
|
-
module ApplicationTests
|
5
|
-
class RakeTest < ActiveSupport::TestCase
|
6
|
-
include ActiveSupport::Testing::Isolation
|
7
|
-
|
8
|
-
def setup
|
9
|
-
build_app
|
10
|
-
boot_rails
|
11
|
-
FileUtils.rm_rf("#{app_path}/config/environments")
|
12
|
-
end
|
13
|
-
|
14
|
-
def teardown
|
15
|
-
teardown_app
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_load_activerecord_base_when_we_use_observers
|
19
|
-
Dir.chdir(app_path) do
|
20
|
-
`bundle exec rails g model user;
|
21
|
-
bundle exec rake db:migrate;
|
22
|
-
bundle exec rails g observer user;`
|
23
|
-
|
24
|
-
add_to_config "config.active_record.observers = :user_observer"
|
25
|
-
|
26
|
-
assert_equal "0", `bundle exec rails r "puts User.count"`.strip
|
27
|
-
|
28
|
-
app_file "lib/tasks/count_user.rake", <<-RUBY
|
29
|
-
namespace :user do
|
30
|
-
task :count => :environment do
|
31
|
-
puts User.count
|
32
|
-
end
|
33
|
-
end
|
34
|
-
RUBY
|
35
|
-
|
36
|
-
assert_equal "0", `bundle exec rake user:count`.strip
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
data/test/sweeper_test.rb
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
require 'minitest/autorun'
|
2
|
-
require 'action_controller'
|
3
|
-
require 'active_record'
|
4
|
-
require 'rails/observers/activerecord/active_record'
|
5
|
-
require 'rails/observers/action_controller/caching'
|
6
|
-
|
7
|
-
SharedTestRoutes = ActionDispatch::Routing::RouteSet.new
|
8
|
-
|
9
|
-
class AppSweeper < ActionController::Caching::Sweeper; end
|
10
|
-
|
11
|
-
class SweeperTestController < ActionController::Base
|
12
|
-
include SharedTestRoutes.url_helpers
|
13
|
-
|
14
|
-
cache_sweeper :app_sweeper
|
15
|
-
|
16
|
-
def show
|
17
|
-
render text: 'hello world'
|
18
|
-
end
|
19
|
-
|
20
|
-
def error
|
21
|
-
raise StandardError.new
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
class SweeperTest < ActionController::TestCase
|
26
|
-
def setup
|
27
|
-
@routes = SharedTestRoutes
|
28
|
-
|
29
|
-
@routes.draw do
|
30
|
-
get ':controller(/:action)'
|
31
|
-
end
|
32
|
-
|
33
|
-
super
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_sweeper_should_not_ignore_no_method_error
|
37
|
-
sweeper = ActionController::Caching::Sweeper.send(:new)
|
38
|
-
assert_raise NoMethodError do
|
39
|
-
sweeper.send_not_defined
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_sweeper_should_not_block_rendering
|
44
|
-
response = test_process(SweeperTestController)
|
45
|
-
assert_equal 'hello world', response.body
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_sweeper_should_clean_up_if_exception_is_raised
|
49
|
-
assert_raise StandardError do
|
50
|
-
test_process(SweeperTestController, 'error')
|
51
|
-
end
|
52
|
-
assert_nil AppSweeper.instance.controller
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_before_method_of_sweeper_should_always_return_true
|
56
|
-
sweeper = ActionController::Caching::Sweeper.send(:new)
|
57
|
-
assert sweeper.before(SweeperTestController.new)
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_after_method_of_sweeper_should_always_return_nil
|
61
|
-
sweeper = ActionController::Caching::Sweeper.send(:new)
|
62
|
-
assert_nil sweeper.after(SweeperTestController.new)
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_sweeper_should_not_ignore_unknown_method_calls
|
66
|
-
sweeper = ActionController::Caching::Sweeper.send(:new)
|
67
|
-
assert_raise NameError do
|
68
|
-
sweeper.instance_eval do
|
69
|
-
some_method_that_doesnt_exist
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
private
|
75
|
-
|
76
|
-
def test_process(controller, action = "show")
|
77
|
-
@controller = controller.is_a?(Class) ? controller.new : controller
|
78
|
-
@request = ActionController::TestRequest.new
|
79
|
-
@response = ActionController::TestResponse.new
|
80
|
-
|
81
|
-
process(action)
|
82
|
-
end
|
83
|
-
end
|
@@ -1,246 +0,0 @@
|
|
1
|
-
require "helper"
|
2
|
-
|
3
|
-
class TransactionCallbacksTest < ActiveRecord::TestCase
|
4
|
-
self.use_transactional_fixtures = false
|
5
|
-
fixtures :topics
|
6
|
-
|
7
|
-
class TopicWithCallbacks < ActiveRecord::Base
|
8
|
-
self.table_name = :topics
|
9
|
-
|
10
|
-
after_commit{|record| record.send(:do_after_commit, nil)}
|
11
|
-
after_commit(:on => :create){|record| record.send(:do_after_commit, :create)}
|
12
|
-
after_commit(:on => :update){|record| record.send(:do_after_commit, :update)}
|
13
|
-
after_commit(:on => :destroy){|record| record.send(:do_after_commit, :destroy)}
|
14
|
-
after_rollback{|record| record.send(:do_after_rollback, nil)}
|
15
|
-
after_rollback(:on => :create){|record| record.send(:do_after_rollback, :create)}
|
16
|
-
after_rollback(:on => :update){|record| record.send(:do_after_rollback, :update)}
|
17
|
-
after_rollback(:on => :destroy){|record| record.send(:do_after_rollback, :destroy)}
|
18
|
-
|
19
|
-
def history
|
20
|
-
@history ||= []
|
21
|
-
end
|
22
|
-
|
23
|
-
def after_commit_block(on = nil, &block)
|
24
|
-
@after_commit ||= {}
|
25
|
-
@after_commit[on] ||= []
|
26
|
-
@after_commit[on] << block
|
27
|
-
end
|
28
|
-
|
29
|
-
def after_rollback_block(on = nil, &block)
|
30
|
-
@after_rollback ||= {}
|
31
|
-
@after_rollback[on] ||= []
|
32
|
-
@after_rollback[on] << block
|
33
|
-
end
|
34
|
-
|
35
|
-
def do_after_commit(on)
|
36
|
-
blocks = @after_commit[on] if defined?(@after_commit)
|
37
|
-
blocks.each{|b| b.call(self)} if blocks
|
38
|
-
end
|
39
|
-
|
40
|
-
def do_after_rollback(on)
|
41
|
-
blocks = @after_rollback[on] if defined?(@after_rollback)
|
42
|
-
blocks.each{|b| b.call(self)} if blocks
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def setup
|
47
|
-
@first, @second = TopicWithCallbacks.find(1, 3).sort_by { |t| t.id }
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_call_after_commit_after_transaction_commits
|
51
|
-
@first.after_commit_block{|r| r.history << :after_commit}
|
52
|
-
@first.after_rollback_block{|r| r.history << :after_rollback}
|
53
|
-
|
54
|
-
@first.save!
|
55
|
-
assert_equal [:after_commit], @first.history
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_only_call_after_commit_on_update_after_transaction_commits_for_existing_record
|
59
|
-
@first.after_commit_block(:create){|r| r.history << :commit_on_create}
|
60
|
-
@first.after_commit_block(:update){|r| r.history << :commit_on_update}
|
61
|
-
@first.after_commit_block(:destroy){|r| r.history << :commit_on_destroy}
|
62
|
-
@first.after_rollback_block(:create){|r| r.history << :rollback_on_create}
|
63
|
-
@first.after_rollback_block(:update){|r| r.history << :rollback_on_update}
|
64
|
-
@first.after_rollback_block(:destroy){|r| r.history << :rollback_on_destroy}
|
65
|
-
|
66
|
-
@first.save!
|
67
|
-
assert_equal [:commit_on_update], @first.history
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_only_call_after_commit_on_destroy_after_transaction_commits_for_destroyed_record
|
71
|
-
@first.after_commit_block(:create){|r| r.history << :commit_on_create}
|
72
|
-
@first.after_commit_block(:update){|r| r.history << :commit_on_update}
|
73
|
-
@first.after_commit_block(:destroy){|r| r.history << :commit_on_destroy}
|
74
|
-
@first.after_rollback_block(:create){|r| r.history << :rollback_on_create}
|
75
|
-
@first.after_rollback_block(:update){|r| r.history << :rollback_on_update}
|
76
|
-
@first.after_rollback_block(:destroy){|r| r.history << :rollback_on_destroy}
|
77
|
-
|
78
|
-
@first.destroy
|
79
|
-
assert_equal [:commit_on_destroy], @first.history
|
80
|
-
end
|
81
|
-
|
82
|
-
def test_only_call_after_commit_on_create_after_transaction_commits_for_new_record
|
83
|
-
@new_record = TopicWithCallbacks.new(:title => "New topic", :written_on => Date.today)
|
84
|
-
@new_record.after_commit_block(:create){|r| r.history << :commit_on_create}
|
85
|
-
@new_record.after_commit_block(:update){|r| r.history << :commit_on_update}
|
86
|
-
@new_record.after_commit_block(:destroy){|r| r.history << :commit_on_destroy}
|
87
|
-
@new_record.after_rollback_block(:create){|r| r.history << :rollback_on_create}
|
88
|
-
@new_record.after_rollback_block(:update){|r| r.history << :rollback_on_update}
|
89
|
-
@new_record.after_rollback_block(:destroy){|r| r.history << :rollback_on_destroy}
|
90
|
-
|
91
|
-
@new_record.save!
|
92
|
-
assert_equal [:commit_on_create], @new_record.history
|
93
|
-
end
|
94
|
-
|
95
|
-
def test_call_after_rollback_after_transaction_rollsback
|
96
|
-
@first.after_commit_block{|r| r.history << :after_commit}
|
97
|
-
@first.after_rollback_block{|r| r.history << :after_rollback}
|
98
|
-
|
99
|
-
Topic.transaction do
|
100
|
-
@first.save!
|
101
|
-
raise ActiveRecord::Rollback
|
102
|
-
end
|
103
|
-
|
104
|
-
assert_equal [:after_rollback], @first.history
|
105
|
-
end
|
106
|
-
|
107
|
-
def test_only_call_after_rollback_on_update_after_transaction_rollsback_for_existing_record
|
108
|
-
@first.after_commit_block(:create){|r| r.history << :commit_on_create}
|
109
|
-
@first.after_commit_block(:update){|r| r.history << :commit_on_update}
|
110
|
-
@first.after_commit_block(:destroy){|r| r.history << :commit_on_destroy}
|
111
|
-
@first.after_rollback_block(:create){|r| r.history << :rollback_on_create}
|
112
|
-
@first.after_rollback_block(:update){|r| r.history << :rollback_on_update}
|
113
|
-
@first.after_rollback_block(:destroy){|r| r.history << :rollback_on_destroy}
|
114
|
-
|
115
|
-
Topic.transaction do
|
116
|
-
@first.save!
|
117
|
-
raise ActiveRecord::Rollback
|
118
|
-
end
|
119
|
-
|
120
|
-
assert_equal [:rollback_on_update], @first.history
|
121
|
-
end
|
122
|
-
|
123
|
-
def test_only_call_after_rollback_on_destroy_after_transaction_rollsback_for_destroyed_record
|
124
|
-
@first.after_commit_block(:create){|r| r.history << :commit_on_create}
|
125
|
-
@first.after_commit_block(:update){|r| r.history << :commit_on_update}
|
126
|
-
@first.after_commit_block(:destroy){|r| r.history << :commit_on_update}
|
127
|
-
@first.after_rollback_block(:create){|r| r.history << :rollback_on_create}
|
128
|
-
@first.after_rollback_block(:update){|r| r.history << :rollback_on_update}
|
129
|
-
@first.after_rollback_block(:destroy){|r| r.history << :rollback_on_destroy}
|
130
|
-
|
131
|
-
Topic.transaction do
|
132
|
-
@first.destroy
|
133
|
-
raise ActiveRecord::Rollback
|
134
|
-
end
|
135
|
-
|
136
|
-
assert_equal [:rollback_on_destroy], @first.history
|
137
|
-
end
|
138
|
-
|
139
|
-
def test_only_call_after_rollback_on_create_after_transaction_rollsback_for_new_record
|
140
|
-
@new_record = TopicWithCallbacks.new(:title => "New topic", :written_on => Date.today)
|
141
|
-
@new_record.after_commit_block(:create){|r| r.history << :commit_on_create}
|
142
|
-
@new_record.after_commit_block(:update){|r| r.history << :commit_on_update}
|
143
|
-
@new_record.after_commit_block(:destroy){|r| r.history << :commit_on_destroy}
|
144
|
-
@new_record.after_rollback_block(:create){|r| r.history << :rollback_on_create}
|
145
|
-
@new_record.after_rollback_block(:update){|r| r.history << :rollback_on_update}
|
146
|
-
@new_record.after_rollback_block(:destroy){|r| r.history << :rollback_on_destroy}
|
147
|
-
|
148
|
-
Topic.transaction do
|
149
|
-
@new_record.save!
|
150
|
-
raise ActiveRecord::Rollback
|
151
|
-
end
|
152
|
-
|
153
|
-
assert_equal [:rollback_on_create], @new_record.history
|
154
|
-
end
|
155
|
-
|
156
|
-
def test_call_after_rollback_when_commit_fails
|
157
|
-
TopicWithCallbacks.connection.class.send(:alias_method, :real_method_commit_db_transaction, :commit_db_transaction)
|
158
|
-
begin
|
159
|
-
TopicWithCallbacks.connection.class.class_eval do
|
160
|
-
def commit_db_transaction; raise "boom!"; end
|
161
|
-
end
|
162
|
-
|
163
|
-
@first.after_commit_block{|r| r.history << :after_commit}
|
164
|
-
@first.after_rollback_block{|r| r.history << :after_rollback}
|
165
|
-
|
166
|
-
assert !@first.save rescue nil
|
167
|
-
assert_equal [:after_rollback], @first.history
|
168
|
-
ensure
|
169
|
-
TopicWithCallbacks.connection.class.send(:remove_method, :commit_db_transaction)
|
170
|
-
TopicWithCallbacks.connection.class.send(:alias_method, :commit_db_transaction, :real_method_commit_db_transaction)
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
def test_only_call_after_rollback_on_records_rolled_back_to_a_savepoint
|
175
|
-
def @first.rollbacks(i=0); @rollbacks ||= 0; @rollbacks += i if i; end
|
176
|
-
def @first.commits(i=0); @commits ||= 0; @commits += i if i; end
|
177
|
-
@first.after_rollback_block{|r| r.rollbacks(1)}
|
178
|
-
@first.after_commit_block{|r| r.commits(1)}
|
179
|
-
|
180
|
-
def @second.rollbacks(i=0); @rollbacks ||= 0; @rollbacks += i if i; end
|
181
|
-
def @second.commits(i=0); @commits ||= 0; @commits += i if i; end
|
182
|
-
@second.after_rollback_block{|r| r.rollbacks(1)}
|
183
|
-
@second.after_commit_block{|r| r.commits(1)}
|
184
|
-
|
185
|
-
Topic.transaction do
|
186
|
-
@first.save!
|
187
|
-
Topic.transaction(:requires_new => true) do
|
188
|
-
@second.save!
|
189
|
-
raise ActiveRecord::Rollback
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
assert_equal 1, @first.commits
|
194
|
-
assert_equal 0, @first.rollbacks
|
195
|
-
assert_equal 0, @second.commits
|
196
|
-
assert_equal 1, @second.rollbacks
|
197
|
-
end
|
198
|
-
|
199
|
-
def test_only_call_after_rollback_on_records_rolled_back_to_a_savepoint_when_release_savepoint_fails
|
200
|
-
def @first.rollbacks(i=0); @rollbacks ||= 0; @rollbacks += i if i; end
|
201
|
-
def @first.commits(i=0); @commits ||= 0; @commits += i if i; end
|
202
|
-
|
203
|
-
@first.after_rollback_block{|r| r.rollbacks(1)}
|
204
|
-
@first.after_commit_block{|r| r.commits(1)}
|
205
|
-
|
206
|
-
Topic.transaction do
|
207
|
-
@first.save
|
208
|
-
Topic.transaction(:requires_new => true) do
|
209
|
-
@first.save!
|
210
|
-
raise ActiveRecord::Rollback
|
211
|
-
end
|
212
|
-
Topic.transaction(:requires_new => true) do
|
213
|
-
@first.save!
|
214
|
-
raise ActiveRecord::Rollback
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
|
-
assert_equal 1, @first.commits
|
219
|
-
assert_equal 2, @first.rollbacks
|
220
|
-
end
|
221
|
-
|
222
|
-
def test_after_transaction_callbacks_should_prevent_callbacks_from_being_called
|
223
|
-
def @first.last_after_transaction_error=(e); @last_transaction_error = e; end
|
224
|
-
def @first.last_after_transaction_error; @last_transaction_error; end
|
225
|
-
@first.after_commit_block{|r| r.last_after_transaction_error = :commit; raise "fail!";}
|
226
|
-
@first.after_rollback_block{|r| r.last_after_transaction_error = :rollback; raise "fail!";}
|
227
|
-
@second.after_commit_block{|r| r.history << :after_commit}
|
228
|
-
@second.after_rollback_block{|r| r.history << :after_rollback}
|
229
|
-
|
230
|
-
Topic.transaction do
|
231
|
-
@first.save!
|
232
|
-
@second.save!
|
233
|
-
end
|
234
|
-
assert_equal :commit, @first.last_after_transaction_error
|
235
|
-
assert_equal [:after_commit], @second.history
|
236
|
-
|
237
|
-
@second.history.clear
|
238
|
-
Topic.transaction do
|
239
|
-
@first.save!
|
240
|
-
@second.save!
|
241
|
-
raise ActiveRecord::Rollback
|
242
|
-
end
|
243
|
-
assert_equal :rollback, @first.last_after_transaction_error
|
244
|
-
assert_equal [:after_rollback], @second.history
|
245
|
-
end
|
246
|
-
end
|