Skip to content

Commit 64ffbc1

Browse files
add transaction tests
1 parent 0b08a04 commit 64ffbc1

File tree

1 file changed

+55
-2
lines changed

1 file changed

+55
-2
lines changed

test/query_test.exs

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1978,7 +1978,21 @@ defmodule QueryTest do
19781978
assert {:ok, _} = P.prepare(pid, "42", "SELECT 42")
19791979
end
19801980

1981-
test "disconnect_and_retry with transaction" do
1981+
test "disconnect_and_retry with prepare in transaction" do
1982+
# Start new connection so we can retry on disconnect
1983+
opts = [database: "postgrex_test", backoff_min: 1, backoff_max: 1]
1984+
{:ok, pid} = P.start_link(opts)
1985+
1986+
# Dropping socket in middle of transaction should return error
1987+
fun = fn conn ->
1988+
disconnect(conn)
1989+
P.prepare(conn, "42", "SELECT 42")
1990+
end
1991+
1992+
assert {:error, :rollback} = P.transaction(pid, fun)
1993+
end
1994+
1995+
test "disconnect_and_retry with begin transaction" do
19821996
# Start new connection so we can retry on disconnect
19831997
opts = [database: "postgrex_test", backoff_min: 1, backoff_max: 1]
19841998
{:ok, pid} = P.start_link(opts)
@@ -2005,7 +2019,24 @@ defmodule QueryTest do
20052019
assert :ok = P.close(pid, query)
20062020
end
20072021

2008-
test "disconnect_and_retry on attempting execution of prepared statement" do
2022+
test "disconnect_and_retry with closing prepared statement in transaction" do
2023+
# Start new connection so we can retry on disconnect
2024+
opts = [database: "postgrex_test", backoff_min: 1, backoff_max: 1]
2025+
{:ok, pid} = P.start_link(opts)
2026+
2027+
# Prepare query that we wil try to close after disconnecting
2028+
{:ok, query} = P.prepare(pid, "42", "SELECT 42")
2029+
2030+
# Dropping socket in middle of transaction should return error
2031+
fun = fn conn ->
2032+
disconnect(conn)
2033+
P.close(conn, query)
2034+
end
2035+
2036+
assert {:error, :rollback} = P.transaction(pid, fun)
2037+
end
2038+
2039+
test "disconnect_and_retry with binding prepared statement" do
20092040
# Start new connection so we can retry on disconnect
20102041
opts = [database: "postgrex_test", backoff_min: 1, backoff_max: 1]
20112042
{:ok, pid} = P.start_link(opts)
@@ -2020,6 +2051,28 @@ defmodule QueryTest do
20202051
assert {:ok, _, _} = P.execute(pid, query, [])
20212052
end
20222053

2054+
test "disconnect_and_retry with binding prepared statement in transaction" do
2055+
# Start new connection so we can retry on disconnect
2056+
opts = [database: "postgrex_test", backoff_min: 1, backoff_max: 1]
2057+
{:ok, pid} = P.start_link(opts)
2058+
2059+
# Prepare query that we wil try to execute after disconnecting
2060+
{:ok, query} = P.prepare(pid, "42", "SELECT 42")
2061+
2062+
# Dropping socket in middle of transaction should return error
2063+
fun = fn conn ->
2064+
disconnect(conn)
2065+
P.execute(conn, query, [])
2066+
end
2067+
2068+
assert {:error, :rollback} = P.transaction(pid, fun)
2069+
end
2070+
2071+
defp disconnect(%DBConnection{} = conn) do
2072+
sock = get_socket(conn)
2073+
:gen_tcp.shutdown(sock, :read_write)
2074+
end
2075+
20232076
defp disconnect(pid) do
20242077
sock = DBConnection.run(pid, &get_socket/1)
20252078
:gen_tcp.shutdown(sock, :read_write)

0 commit comments

Comments
 (0)