1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
require_relative "spec_helper"
describe "run_transaction_hooks extension" do
before do
@db = Sequel.mock.extension(:run_transaction_hooks)
end
it "should support #run_after_{commit,rollback} hooks to run the hooks early" do
@db.transaction do
@db.sqls.must_equal ["BEGIN"]
@db.run_after_commit_hooks
@db.run_after_rollback_hooks
@db.after_commit{@db.run "C"}
@db.after_commit{@db.run "C2"}
@db.after_rollback{@db.run "R"}
@db.after_rollback{@db.run "R2"}
@db.sqls.must_equal []
@db.run_after_commit_hooks
@db.sqls.must_equal ["C", "C2"]
@db.run_after_rollback_hooks
@db.sqls.must_equal ["R", "R2"]
end
@db.sqls.must_equal ["COMMIT"]
@db.transaction(:rollback=>:always) do
@db.after_commit{@db.run "C"}
@db.after_commit{@db.run "C2"}
@db.after_rollback{@db.run "R"}
@db.after_rollback{@db.run "R2"}
@db.sqls.must_equal ["BEGIN"]
@db.run_after_commit_hooks
@db.sqls.must_equal ["C", "C2"]
@db.run_after_rollback_hooks
@db.sqls.must_equal ["R", "R2"]
end
@db.sqls.must_equal ["ROLLBACK"]
end
it "should support #run_after_{commit,rollback} hooks to run the hooks early when savepoints are not supported" do
def @db.supports_savepoints?; false end
@db.transaction do
@db.sqls.must_equal ["BEGIN"]
@db.run_after_commit_hooks
@db.run_after_rollback_hooks
@db.after_commit{@db.run "C"}
@db.after_commit{@db.run "C2"}
@db.after_rollback{@db.run "R"}
@db.after_rollback{@db.run "R2"}
@db.sqls.must_equal []
@db.run_after_commit_hooks
@db.sqls.must_equal ["C", "C2"]
@db.run_after_rollback_hooks
@db.sqls.must_equal ["R", "R2"]
end
@db.sqls.must_equal ["COMMIT"]
@db.transaction(:rollback=>:always) do
@db.after_commit{@db.run "C"}
@db.after_commit{@db.run "C2"}
@db.after_rollback{@db.run "R"}
@db.after_rollback{@db.run "R2"}
@db.sqls.must_equal ["BEGIN"]
@db.run_after_commit_hooks
@db.sqls.must_equal ["C", "C2"]
@db.run_after_rollback_hooks
@db.sqls.must_equal ["R", "R2"]
end
@db.sqls.must_equal ["ROLLBACK"]
end
it "should not same hook on transaction completion when using #run_after_{commit,rollback} hooks" do
@db.transaction do
@db.after_commit{@db.run "C"}
@db.after_commit{@db.run "C2"}
@db.after_rollback{@db.run "R"}
@db.after_rollback{@db.run "R2"}
@db.sqls.must_equal ["BEGIN"]
@db.run_after_commit_hooks
@db.run_after_rollback_hooks
@db.sqls
end
@db.sqls.must_equal ["COMMIT"]
@db.transaction(:rollback=>:always) do
@db.after_commit{@db.run "C"}
@db.after_commit{@db.run "C2"}
@db.after_rollback{@db.run "R"}
@db.after_rollback{@db.run "R2"}
@db.sqls.must_equal ["BEGIN"]
@db.run_after_commit_hooks
@db.run_after_rollback_hooks
@db.sqls
end
@db.sqls.must_equal ["ROLLBACK"]
end
it "should handle savepoint hooks in #run_after_{commit,rollback} hooks" do
@db.transaction do
@db.after_commit{@db.run "C"}
@db.after_rollback{@db.run "R"}
@db.transaction(:savepoint=>:true) do
@db.after_commit(:savepoint=>true){@db.run "SC"}
@db.after_rollback(:savepoint=>true){@db.run "SR"}
@db.sqls.must_equal ["BEGIN", "SAVEPOINT autopoint_1"]
@db.run_after_commit_hooks
@db.sqls.must_equal ["C", "SC"]
@db.run_after_rollback_hooks
@db.sqls.must_equal ["R", "SR"]
end
end
@db.sqls.must_equal ["RELEASE SAVEPOINT autopoint_1", "COMMIT"]
@db.transaction(:rollback=>:always) do
@db.after_commit{@db.run "C"}
@db.after_rollback{@db.run "R"}
@db.transaction(:savepoint=>:true) do
@db.after_commit(:savepoint=>true){@db.run "SC"}
@db.after_rollback(:savepoint=>true){@db.run "SR"}
end
@db.sqls.must_equal ["BEGIN", "SAVEPOINT autopoint_1", "RELEASE SAVEPOINT autopoint_1"]
@db.run_after_commit_hooks
@db.sqls.must_equal ["C", "SC"]
@db.run_after_rollback_hooks
@db.sqls.must_equal ["R", "SR"]
end
@db.sqls.must_equal ["ROLLBACK"]
@db.transaction(:rollback=>:always) do
@db.after_commit{@db.run "C"}
@db.after_rollback{@db.run "R"}
@db.transaction(:savepoint=>:true, :rollback=>:always) do
@db.after_commit(:savepoint=>true){@db.run "SC"}
@db.after_rollback(:savepoint=>true){@db.run "SR"}
end
@db.sqls.must_equal ["BEGIN", "SAVEPOINT autopoint_1", "ROLLBACK TO SAVEPOINT autopoint_1", "SR"]
@db.run_after_commit_hooks
@db.sqls.must_equal ["C"]
@db.run_after_rollback_hooks
@db.sqls.must_equal ["R"]
end
@db.sqls.must_equal ["ROLLBACK"]
end
it "should raise Error if trying to run transaction hooks outside of a transaction" do
proc{@db.run_after_commit_hooks}.must_raise Sequel::Error
proc{@db.run_after_rollback_hooks}.must_raise Sequel::Error
end
end
|