diff --git a/lib/mock_redis/future.rb b/lib/mock_redis/future.rb index 29c35dae..e2ee8ba3 100644 --- a/lib/mock_redis/future.rb +++ b/lib/mock_redis/future.rb @@ -17,7 +17,7 @@ def value def store_result(result) @result_set = true - @result = result + @result = @block ? @block.call(result) : result end end end diff --git a/lib/mock_redis/transaction_wrapper.rb b/lib/mock_redis/transaction_wrapper.rb index 228ae034..3cbfbc82 100644 --- a/lib/mock_redis/transaction_wrapper.rb +++ b/lib/mock_redis/transaction_wrapper.rb @@ -17,7 +17,7 @@ def initialize(db) def method_missing(method, *args, &block) if in_multi? - future = MockRedis::Future.new([method, *args]) + future = MockRedis::Future.new([method, *args], block) @transaction_futures << future if @multi_block_given @@ -60,7 +60,7 @@ def exec begin result = send(*future.command) future.store_result(result) - result + future.value rescue StandardError => e e end diff --git a/spec/commands/future_spec.rb b/spec/commands/future_spec.rb index e89c50f0..3669b058 100644 --- a/spec/commands/future_spec.rb +++ b/spec/commands/future_spec.rb @@ -3,7 +3,12 @@ describe MockRedis::Future do let(:command) { [:get, 'foo'] } let(:result) { 'bar' } - before { @future = MockRedis::Future.new(command) } + let(:block) { ->(value) { value.upcase } } + + before do + @future = MockRedis::Future.new(command) + @future2 = MockRedis::Future.new(command, block) + end it 'remembers the command' do @future.command.should eq(command) @@ -17,4 +22,9 @@ @future.store_result(result) @future.value.should eq(result) end + + it 'executes the block on the value if block is passed in' do + @future2.store_result(result) + @future2.value.should eq('BAR') + end end diff --git a/spec/transactions_spec.rb b/spec/transactions_spec.rb index 4ce70a5c..b4a2ea3b 100644 --- a/spec/transactions_spec.rb +++ b/spec/transactions_spec.rb @@ -67,6 +67,22 @@ @redises.get('counter').should eq '6' @redises.get('test').should eq '1' end + + it 'allows blocks within multi blocks' do + @redises.set('foo', 'bar') + @redises.set('fuu', 'baz') + + result = nil + + @redises.multi do |r| + result = r.mget('foo', 'fuu') { |reply| reply.map(&:upcase) } + r.del('foo', 'fuu') + end + + result.value.should eq %w[BAR BAZ] + @redises.get('foo').should eq nil + @redises.get('fuu').should eq nil + end end context '#discard' do