Skip to content

Commit 0a154fd

Browse files
committed
allow setting Onyx::SQL::Repository#db with DB::Transaction instances
1 parent ec866c9 commit 0a154fd

3 files changed

Lines changed: 122 additions & 0 deletions

File tree

db_spec/pg/repository/query_spec.cr

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,66 @@ describe "Repository(Postgres)#query" do
6666
user.referrer.not_nil!.uuid.should be_a(UUID)
6767
end
6868
end
69+
70+
context "in a transaction" do
71+
db = repo.db
72+
query = User
73+
.update
74+
.set(favorite_numbers: [17])
75+
.where(uuid: user.uuid.not_nil!)
76+
.returning(:favorite_numbers)
77+
78+
repo.db.transaction do |tx|
79+
repo.db = tx
80+
repo.query(query)
81+
ensure
82+
repo.db = db
83+
end
84+
85+
it "updates the user" do
86+
query = User.query
87+
.select(:favorite_numbers, :uuid)
88+
.where(uuid: user.uuid.not_nil!)
89+
90+
updated_user = repo.query(query).first
91+
updated_user.favorite_numbers.should eq([17])
92+
end
93+
94+
context "raising an error" do
95+
error_was_raised = false
96+
97+
query = User
98+
.update
99+
.set(favorite_numbers: [13])
100+
.where(uuid: user.uuid.not_nil!)
101+
.returning(:favorite_numbers)
102+
103+
begin
104+
repo.db.transaction do |tx|
105+
repo.db = tx
106+
repo.query(query)
107+
raise "error"
108+
ensure
109+
repo.db = db
110+
end
111+
rescue
112+
error_was_raised = true
113+
end
114+
115+
it "raises the error" do
116+
error_was_raised.should be_truthy
117+
end
118+
119+
it "rolls back the transaction" do
120+
query = User.query
121+
.select(:favorite_numbers, :uuid)
122+
.where(uuid: user.uuid.not_nil!)
123+
124+
updated_user = repo.query(query).first
125+
updated_user.favorite_numbers.should_not eq([13])
126+
end
127+
end
128+
end
69129
end
70130

71131
describe "where" do

db_spec/sqlite3/repository/query_spec.cr

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,64 @@ describe "Repository(Postgres)#query" do
6262
cursor.rows_affected.should eq 1
6363
end
6464
end
65+
66+
context "in a transaction" do
67+
db = repo.db
68+
query = User
69+
.update
70+
.set(favorite_numbers: [17])
71+
.where(id: user.id.not_nil!)
72+
73+
repo.db.transaction do |tx|
74+
repo.db = tx
75+
repo.query(query)
76+
ensure
77+
repo.db = db
78+
end
79+
80+
it "updates the user" do
81+
query = User.query
82+
.select(:favorite_numbers, :id)
83+
.where(id: user.id.not_nil!)
84+
85+
updated_user = repo.query(query).first
86+
updated_user.favorite_numbers.should eq([17])
87+
end
88+
89+
context "raising an error" do
90+
error_was_raised = false
91+
92+
query = User
93+
.update
94+
.set(favorite_numbers: [13])
95+
.where(id: user.id.not_nil!)
96+
97+
begin
98+
repo.db.transaction do |tx|
99+
repo.db = tx
100+
repo.query(query)
101+
raise "error"
102+
ensure
103+
repo.db = db
104+
end
105+
rescue
106+
error_was_raised = true
107+
end
108+
109+
it "raises the error" do
110+
error_was_raised.should be_truthy
111+
end
112+
113+
it "rolls back the transaction" do
114+
query = User.query
115+
.select(:favorite_numbers, :id)
116+
.where(id: user.id.not_nil!)
117+
118+
updated_user = repo.query(query).first
119+
updated_user.favorite_numbers.should_not eq([13])
120+
end
121+
end
122+
end
65123
end
66124

67125
describe "where" do

src/onyx-sql/repository.cr

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ module Onyx::SQL
3232
def initialize(@db : ::DB::Database | ::DB::Connection, @logger : Logger = Logger::Standard.new)
3333
end
3434

35+
def db=(transaction : ::DB::Transaction)
36+
self.db = transaction.connection
37+
end
38+
3539
protected def postgresql?
3640
{% if Object.all_subclasses.any? { |sc| sc.stringify == "PG::Driver" } %}
3741
return db.is_a?(PG::Driver)

0 commit comments

Comments
 (0)