require 'test/unit' begin require 'transaction/simple' rescue LoadError require "#{File.dirname(__FILE__)}/simple" end unless Module.respond_to?(:alias_method_chain) class Module def alias_method_chain(target, feature) alias_method "#{target}_without_#{feature}", target alias_method target, "#{target}_with_#{feature}" end end end unless Symbol.respond_to?(:to_proc) class Symbol def to_proc Proc.new { |*args| args.shift.__send__(self, *args) } end end end $LOAD_PATH << "#{File.dirname(__FILE__)}/../lib" require 'active_record/object_transactions' class Transactor class << self attr_accessor :method_calls def transaction self.method_calls += 1 yield end end self.method_calls = 0 def transaction(&block) self.class.transaction(&block) end end class DeprecatedContainer < Transactor def object_transactions_deprecation_warning 'test' end include ActiveRecord::ObjectTransactions end class Container < Transactor include ActiveRecord::ObjectTransactions end class ObjectTransactionsTest < Test::Unit::TestCase def setup Container.method_calls = 0 end def test_object_transactions assert_transaction_count 0 Container.transaction { } assert_transaction_count 1 begin foo = 'foo' foo_self = class << foo; self end assert !foo_self.include?(Transaction::Simple) Container.transaction(foo) do assert_transaction_count 2 assert foo_self.include?(Transaction::Simple) assert foo.transaction_open? foo << 'bar' raise 'rollback' end flunk rescue assert_transaction_count 2 assert foo_self.include?(Transaction::Simple) assert !foo.transaction_open? assert_equal 'foo', foo end end def test_instance_method foo = 'foo' Container.new.transaction(foo) do assert_transaction_count 1 foo << 'bar' raise 'rollback' end flunk rescue assert_equal 'foo', foo end def test_deprecated_object_transactions assert_nil DeprecatedContainer.new.object_transactions_deprecation_warning end protected def assert_transaction_count(expected) assert_equal expected, Container.method_calls, "Expected #{expected} transactions but there were #{Container.method_calls}" end end