Packages
ecto
1.0.0
3.14.1
3.14.0
3.13.6
3.13.5
3.13.4
3.13.3
3.13.2
3.13.1
3.13.0
3.12.6
3.12.5
3.12.4
3.12.3
3.12.2
3.12.1
3.12.0
3.11.2
3.11.1
3.11.0
3.10.3
3.10.2
3.10.1
3.10.0
3.9.6
3.9.5
3.9.4
3.9.3
3.9.2
3.9.1
3.9.0
3.8.4
3.8.3
3.8.2
3.8.1
3.8.0
3.7.2
3.7.1
3.7.0
3.6.2
3.6.1
3.6.0
3.5.8
3.5.7
3.5.6
3.5.5
3.5.4
3.5.3
3.5.2
3.5.1
3.5.0
3.5.0-rc.1
3.5.0-rc.0
3.4.6
3.4.5
3.4.4
3.4.3
3.4.2
3.4.1
3.4.0
3.3.4
3.3.3
3.3.2
3.3.1
3.3.0
3.2.5
3.2.4
3.2.3
3.2.2
3.2.1
3.2.0
3.1.7
3.1.6
3.1.5
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.9
3.0.8
3.0.7
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
3.0.0-rc.1
3.0.0-rc.0
2.2.12
2.2.11
2.2.10
2.2.9
2.2.8
2.2.7
2.2.6
2.2.5
2.2.4
2.2.3
2.2.2
2.2.1
2.2.0
2.2.0-rc.1
2.2.0-rc.0
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.1.0-rc.5
2.1.0-rc.4
2.1.0-rc.3
2.1.0-rc.2
2.1.0-rc.1
2.1.0-rc.0
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
2.0.0-rc.6
2.0.0-rc.5
2.0.0-rc.4
2.0.0-rc.3
2.0.0-rc.2
2.0.0-rc.1
2.0.0-rc.0
2.0.0-beta.2
2.0.0-beta.1
2.0.0-beta.0
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.16.0
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.1
0.13.0
0.12.1
0.12.0
0.12.0-rc
0.11.3
0.11.2
0.11.1
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.0
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.0
0.5.1
0.5.0
0.4.0
0.3.0
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.0
A toolkit for data mapping and language integrated query for Elixir
Current section
Files
Jump to
Current section
Files
integration_test/sql/test_transaction.exs
defmodule Ecto.Integration.TestTransactionTest do
use ExUnit.Case
alias Ecto.Integration.TestRepo
alias Ecto.Pool
@ref {Ecto.Pool, Ecto.Adapters.SQL.Sandbox, elem(TestRepo.__pool__, 1)}
@timeout :infinity
test "sandbox pool is lazy" do
assert {:ok, _} = Ecto.Adapters.SQL.Sandbox.start_link(UnknownModuleBecauseLazy, [])
end
test "begin, restart and rollback" do
assert_transaction(:raw)
assert :ok = Ecto.Adapters.SQL.begin_test_transaction(TestRepo)
assert_transaction(:sandbox)
assert :ok = Ecto.Adapters.SQL.restart_test_transaction(TestRepo)
assert_transaction(:sandbox)
assert :ok = Ecto.Adapters.SQL.rollback_test_transaction(TestRepo)
assert_transaction(:raw)
after
Ecto.Adapters.SQL.rollback_test_transaction(TestRepo)
end
test "restart_test_transaction begins a transaction if one is not running" do
assert_transaction(:raw)
assert :ok = Ecto.Adapters.SQL.restart_test_transaction(TestRepo)
assert_transaction(:sandbox)
assert :ok = Ecto.Adapters.SQL.rollback_test_transaction(TestRepo)
assert_transaction(:raw)
after
Ecto.Adapters.SQL.rollback_test_transaction(TestRepo)
end
test "begin_test_transaction inside another transaction should timeout" do
TestRepo.transaction(fn ->
assert {:timeout, _} =
catch_exit(Ecto.Adapters.SQL.restart_test_transaction(TestRepo,
[timeout: 200]))
end)
after
Ecto.Adapters.SQL.rollback_test_transaction(TestRepo)
end
test "restart_test_transaction inside another transaction should timeout" do
TestRepo.transaction(fn ->
assert {:timeout, _} =
catch_exit(Ecto.Adapters.SQL.restart_test_transaction(TestRepo,
[timeout: 200]))
end)
after
Ecto.Adapters.SQL.rollback_test_transaction(TestRepo)
end
test "begin_test_transaction should fail when it has already began" do
Ecto.Adapters.SQL.begin_test_transaction(TestRepo)
assert_raise RuntimeError, ~r"cannot begin test transaction", fn ->
Ecto.Adapters.SQL.begin_test_transaction(TestRepo)
end
after
Ecto.Adapters.SQL.rollback_test_transaction(TestRepo)
end
test "sandbox mode does not disconnect on transaction break" do
Ecto.Adapters.SQL.begin_test_transaction(TestRepo)
{:ok, conn} = TestRepo.transaction(fn() ->
assert %{conn: conn} = Process.get(@ref)
Pool.break(@ref, @timeout)
conn
end)
TestRepo.transaction(fn() ->
assert %{conn: ^conn} = Process.get(@ref)
{_, pid} = conn
assert Process.alive?(pid)
end)
after
Ecto.Adapters.SQL.rollback_test_transaction(TestRepo)
end
test "sandbox mode does not disconnect on run break" do
Ecto.Adapters.SQL.begin_test_transaction(TestRepo)
{_, pool_mod, pool} = @ref
try do
Pool.run(pool_mod, pool, @timeout, fn(conn, _) ->
throw(conn)
end)
catch
:throw, conn ->
TestRepo.transaction(fn() ->
assert %{conn: ^conn} = Process.get(@ref)
end)
end
after
Ecto.Adapters.SQL.rollback_test_transaction(TestRepo)
end
test "sandbox mode does not disconnect if transaction caller dies" do
Ecto.Adapters.SQL.begin_test_transaction(TestRepo)
_ = Process.flag(:trap_exit, true)
parent = self()
{:ok, task} = Task.start_link(fn ->
TestRepo.transaction(fn() ->
assert %{conn: conn} = Process.get(@ref)
send(parent, {:go, self(), conn})
:timer.sleep(@timeout)
end)
end)
assert_receive {:go, ^task, conn}, @timeout
Process.exit(task, :shutdown)
assert_receive {:EXIT, ^task, :shutdown}, @timeout
TestRepo.transaction(fn() ->
%{conn: ^conn} = Process.get(@ref)
{_, pid} = conn
assert Process.alive?(pid)
end)
after
Ecto.Adapters.SQL.rollback_test_transaction(TestRepo)
end
test "sandbox mode does not disconnect if run caller dies" do
Ecto.Adapters.SQL.begin_test_transaction(TestRepo)
_ = Process.flag(:trap_exit, true)
parent = self()
{:ok, task} = Task.start_link(fn ->
{_, pool_mod, pool} = @ref
Pool.run(pool_mod, pool, @timeout, fn(conn, _) ->
send(parent, {:go, self(), conn})
:timer.sleep(@timeout)
end)
end)
assert_receive {:go, ^task, conn}, @timeout
Process.exit(task, :shutdown)
assert_receive {:EXIT, ^task, :shutdown}, @timeout
TestRepo.transaction(fn() ->
assert %{conn: ^conn} = Process.get(@ref)
{_, pid} = conn
assert Process.alive?(pid)
end)
after
Ecto.Adapters.SQL.rollback_test_transaction(TestRepo)
end
test "raw mode disconnects on transaction break" do
conn = TestRepo.transaction(fn() ->
assert %{conn: conn} = Process.get(@ref)
Pool.break(@ref, @timeout)
conn
end)
TestRepo.transaction(fn() ->
%{conn: other} = Process.get(@ref)
assert conn != other
end)
end
test "raw mode disconnects if transaction caller dies" do
_ = Process.flag(:trap_exit, true)
parent = self()
{:ok, task} = Task.start_link(fn ->
TestRepo.transaction(fn() ->
assert %{conn: conn1} = Process.get(@ref)
send(parent, {:go, self(), conn1})
:timer.sleep(@timeout)
end)
end)
assert_receive {:go, ^task, conn1}, @timeout
Process.exit(task, :shutdown)
assert_receive {:EXIT, ^task, :shutdown}, @timeout
TestRepo.transaction(fn() ->
%{conn: conn2} = Process.get(@ref)
assert conn1 !== conn2
{_, pid1} = conn1
refute Process.alive?(pid1)
{_, pid2} = conn2
assert Process.alive?(pid2)
end)
end
test "raw mode does not disconnects if run caller dies" do
_ = Process.flag(:trap_exit, true)
parent = self()
{:ok, task} = Task.start_link(fn ->
{_, pool_mod, pool} = @ref
Pool.run(pool_mod, pool, @timeout, fn(conn, _) ->
send(parent, {:go, self(), conn})
:timer.sleep(@timeout)
end)
end)
assert_receive {:go, ^task, conn}, @timeout
Process.exit(task, :shutdown)
assert_receive {:EXIT, ^task, :shutdown}, @timeout
TestRepo.transaction(fn() ->
assert %{conn: ^conn} = Process.get(@ref)
{_, pid} = conn
assert Process.alive?(pid)
end)
end
defp assert_transaction(mode) do
TestRepo.transaction(fn ->
{_, pool, _} = TestRepo.__pool__
assert Ecto.Adapters.SQL.Sandbox.mode(pool) === mode
end)
end
end