Skip to content

Commit

Permalink
Supporting transactions through context middleware now
Browse files Browse the repository at this point in the history
  • Loading branch information
gus committed May 18, 2010
1 parent c6fa3f8 commit db2e16c
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 16 deletions.
1 change: 1 addition & 0 deletions lib/riot/active_record.rb
@@ -1,3 +1,4 @@
require 'riot/rails'
require 'riot/active_record/assertion_macros'
require 'riot/active_record/context_middleware'
require 'riot/active_record/transactional_middleware'
21 changes: 21 additions & 0 deletions lib/riot/active_record/transactional_middleware.rb
@@ -0,0 +1,21 @@
module RiotRails
class TransactionalMiddleware < Riot::ContextMiddleware
register

def handle?(context)
context.option(:transactional) == true
end

def call(context)
context.class.class_eval do
alias_method :transactionless_local_run, :local_run
def local_run(*args)
::ActiveRecord::Base.transaction do
transactionless_local_run(*args)
raise ::ActiveRecord::Rollback
end
end
end
end
end
end # RiotRails
37 changes: 21 additions & 16 deletions test/transactional_middleware_test.rb
@@ -1,21 +1,26 @@
require 'teststrap'

context "Transactional middleware" do
setup { Riot::Context.new("Room") { set :transactional, true } }
# hookup { topic.transaction { |&block| raise Exception, "Hello" } }
hookup do
ActiveRecord::Base.instance_eval do
# Hijacking transaction and just letting stuff fall through
def transaction(&block) yield; end
end
end

asserts("context execution is wrapped in a transaction to be rolled back")

# asserts(:transactional?)
#
# asserts("calling local run") do
# topic.local_run(Riot::SilentReporter.new, Riot::Situation.new)
# end.raises(Exception, "Hello")
#
# context "with a child context" do
# setup do
# topic.context("call me a submarine") {}
# end
# asserts(:transactional?)
# end
context "when :transactional is not set" do
setup { Riot::Context.new("Room") {} }

asserts("executing context does not raise errors") do
topic.local_run(Riot::SilentReporter.new, Riot::Situation.new)
end
end # when :transactional is not set

context "when :transactional is set to true" do
setup { Riot::Context.new("Room") { set(:transactional, true) } }

asserts("executing context") do
topic.local_run(Riot::SilentReporter.new, Riot::Situation.new)
end.raises(ActiveRecord::Rollback)
end # when :transactional is set to true
end # Transactional middleware

0 comments on commit db2e16c

Please sign in to comment.