Skip to content

Commit 5b9e7d4

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

3 files changed

Lines changed: 124 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: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,66 @@ 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+
.returning(:favorite_numbers)
73+
74+
repo.db.transaction do |tx|
75+
repo.db = tx
76+
repo.query(query)
77+
ensure
78+
repo.db = db
79+
end
80+
81+
it "updates the user" do
82+
query = User.query
83+
.select(:favorite_numbers, :id)
84+
.where(id: user.id.not_nil!)
85+
86+
updated_user = repo.query(query).first
87+
updated_user.favorite_numbers.should eq([17])
88+
end
89+
90+
context "raising an error" do
91+
error_was_raised = false
92+
93+
query = User
94+
.update
95+
.set(favorite_numbers: [13])
96+
.where(id: user.id.not_nil!)
97+
.returning(:favorite_numbers)
98+
99+
begin
100+
repo.db.transaction do |tx|
101+
repo.db = tx
102+
repo.query(query)
103+
raise "error"
104+
ensure
105+
repo.db = db
106+
end
107+
rescue
108+
error_was_raised = true
109+
end
110+
111+
it "raises the error" do
112+
error_was_raised.should be_truthy
113+
end
114+
115+
it "rolls back the transaction" do
116+
query = User.query
117+
.select(:favorite_numbers, :id)
118+
.where(id: user.id.not_nil!)
119+
120+
updated_user = repo.query(query).first
121+
updated_user.favorite_numbers.should_not eq([13])
122+
end
123+
end
124+
end
65125
end
66126

67127
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)