test/transactions_test.rb in redis-2.2.2 vs test/transactions_test.rb in redis-3.0.0.rc1

- old
+ new

@@ -21,11 +21,65 @@ r.multi do |multi| multi.set "foo", "s1" end assert "s1" == r.get("foo") +end +test "MULTI/EXEC with a block doesn't return replies for MULTI and EXEC" do |r| + r1, r2, nothing_else = r.multi do |multi| + multi.set "foo", "s1" + multi.get "foo" + end + + assert_equal "OK", r1 + assert_equal "s1", r2 + assert_equal nil, nothing_else +end + +test "Assignment inside MULTI/EXEC block" do |r| + r.multi do |m| + @first = m.sadd("foo", 1) + @second = m.sadd("foo", 1) + end + + assert_equal true, @first.value + assert_equal false, @second.value +end + +# Although we could support accessing the values in these futures, +# it doesn't make a lot of sense. +test "Assignment inside MULTI/EXEC block with delayed command errors" do |r| + assert_raise do + r.multi do |m| + @first = m.set("foo", "s1") + @second = m.incr("foo") # not an integer + @third = m.lpush("foo", "value") # wrong kind of value + end + end + + assert_equal "OK", @first.value + assert_raise { @second.value } + assert_raise { @third.value } +end + +test "Assignment inside MULTI/EXEC block with immediate command errors" do |r| + assert_raise do + r.multi do |m| + m.doesnt_exist + @first = m.sadd("foo", 1) + m.doesnt_exist + @second = m.sadd("foo", 1) + m.doesnt_exist + end + end + + assert_raise(Redis::FutureNotReady) { @first.value } + assert_raise(Redis::FutureNotReady) { @second.value } +end + +test "Raise immediate errors in MULTI/EXEC" do |r| assert_raise(RuntimeError) do r.multi do |multi| multi.set "bar", "s2" raise "Some error" multi.set "baz", "s3" @@ -34,33 +88,53 @@ assert nil == r.get("bar") assert nil == r.get("baz") end -test "Don't raise (and ignore) immediate error in MULTI/EXEC" do |r| - result = r.multi do |m| - m.set("foo", "s1") - m.unknown_command +test "Transformed replies as return values for MULTI/EXEC block" do |r| + info, _ = r.multi do |m| + r.info end - assert 1 == result.size - assert "OK" == result.first - assert "s1" == r.get("foo") + assert info.kind_of?(Hash) end -test "Don't raise delayed error in MULTI/EXEC" do |r| - result = r.multi do |m| - m.set("foo", "s1") - m.incr("foo") # not an integer - m.lpush("foo", "value") # wrong kind of value +test "Transformed replies inside MULTI/EXEC block" do |r| + r.multi do |m| + @info = r.info end - assert result[1].message =~ /not an integer/i - assert result[2].message =~ /wrong kind of value/i + assert @info.value.kind_of?(Hash) +end + +test "Raise command errors in MULTI/EXEC" do |r| + assert_raise do + r.multi do |m| + m.set("foo", "s1") + m.incr("foo") # not an integer + m.lpush("foo", "value") # wrong kind of value + end + end + assert "s1" == r.get("foo") end +test "Raise command errors when accessing futures after MULTI/EXEC" do |r| + begin + r.multi do |m| + m.set("foo", "s1") + @counter = m.incr("foo") # not an integer + end + rescue Exception + # Not gonna deal with it + end + + # We should test for Redis::Error here, but hiredis doesn't yet do + # custom error classes. + assert_raise(RuntimeError) { @counter.value } +end + test "MULTI with a block yielding the client" do |r| r.multi do |multi| multi.set "foo", "s1" end @@ -95,6 +169,5 @@ multi.set "foo", "s2" end assert "s2" == r.get("foo") end -