Skip to content
This repository was archived by the owner on Mar 24, 2025. It is now read-only.

Commit 4bd298c

Browse files
Fix SQLAlchemy tests
1 parent 00c5f8a commit 4bd298c

File tree

4 files changed

+36
-17
lines changed

4 files changed

+36
-17
lines changed

baseplate/clients/sqlalchemy.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from sqlalchemy import create_engine, event
1111
from sqlalchemy.engine import Connection, Engine, ExceptionContext
1212
from sqlalchemy.engine.interfaces import ExecutionContext
13-
from sqlalchemy.engine.url import make_url
13+
from sqlalchemy.engine.url import URL, make_url
1414
from sqlalchemy.orm import Session
1515
from sqlalchemy.pool import QueuePool
1616

@@ -87,13 +87,16 @@ def engine_from_config(
8787
raise TypeError("'secrets' is required if 'credentials_secret' is set")
8888
credentials = secrets.get_credentials(options.credentials_secret)
8989

90-
# support sqlalchemy 1.4+ where URL is immutable
91-
# https://docs.sqlalchemy.org/en/14/changelog/migration_14.html#the-url-object-is-now-immutable
92-
if hasattr(url, "set"):
93-
url = url.set(username=credentials.username, password=credentials.password)
94-
else:
95-
url.username = credentials.username
96-
url.password = credentials.password
90+
# Create new URL with SQLAlchemy 2.0 compatible parameters
91+
url = URL.create(
92+
drivername=url.drivername,
93+
username=credentials.username,
94+
password=credentials.password,
95+
host=url.host,
96+
port=url.port,
97+
database=url.database,
98+
query=url.query or {},
99+
)
97100

98101
return create_engine(url, **kwargs)
99102

tests/integration/message_queue_tests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def test_get_timeout(self):
4242
with self.assertRaises(TimedOutError):
4343
mq.get(timeout=0.1)
4444
elapsed = time.time() - start
45-
self.assertAlmostEqual(elapsed, 0.1, places=2)
45+
self.assertAlmostEqual(elapsed, 0.1, places=1)
4646

4747
def test_put_timeout(self):
4848
message_queue = MessageQueue(self.qname, max_messages=1, max_message_size=1)

tests/integration/sqlalchemy_tests.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import unittest
22

33
try:
4-
from sqlalchemy import Column, Integer, String
4+
from sqlalchemy import Column, Integer, String, text
55
from sqlalchemy.dialects.sqlite import BOOLEAN
66
from sqlalchemy.exc import OperationalError, StatementError
77
from sqlalchemy.ext.declarative import declarative_base
@@ -46,7 +46,8 @@ def setUp(self):
4646

4747
def test_simple_query(self):
4848
with self.server_span:
49-
self.server_span.context.db.execute("SELECT * FROM test;")
49+
with self.server_span.context.db.connect() as conn:
50+
conn.execute(text("SELECT * FROM test;"))
5051

5152
server_span_observer = self.baseplate_observer.get_only_child()
5253
span_observer = server_span_observer.get_only_child()
@@ -57,7 +58,8 @@ def test_simple_query(self):
5758

5859
def test_very_long_query(self):
5960
with self.server_span:
60-
self.server_span.context.db.execute("SELECT *" + (" " * 1024) + "FROM test;")
61+
with self.server_span.context.db.connect() as conn:
62+
conn.execute(text("SELECT *" + (" " * 1024) + "FROM test;"))
6163

6264
server_span_observer = self.baseplate_observer.get_only_child()
6365
span_observer = server_span_observer.get_only_child()
@@ -72,7 +74,8 @@ def test_nested_local_span(self):
7274
with self.server_span.make_child(
7375
"local", local=True, component_name="example"
7476
) as local:
75-
local.context.db.execute("SELECT * FROM test;")
77+
with local.context.db.connect() as conn:
78+
conn.execute(text("SELECT * FROM test;"))
7679

7780
server_span_observer = self.baseplate_observer.get_only_child()
7881
local_span_observer = server_span_observer.get_only_child()
@@ -85,7 +88,8 @@ def test_nested_local_span(self):
8588
def test_error_in_query(self):
8689
with self.server_span:
8790
with self.assertRaises(OperationalError):
88-
self.context.db.execute("SELECT * FROM does_not_exist;")
91+
with self.context.db.connect() as conn:
92+
conn.execute(text("SELECT * FROM does_not_exist;"))
8993

9094
server_span_observer = self.baseplate_observer.get_only_child()
9195
span_observer = server_span_observer.get_only_child()
@@ -138,4 +142,4 @@ def test_simple_config(self):
138142

139143
context = baseplate.make_context_object()
140144
with baseplate.make_server_span(context, "test"):
141-
context.db.execute("SELECT 1;")
145+
context.db.execute(text("SELECT 1;"))

tests/unit/clients/sqlalchemy_tests.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,18 @@ def setUp(self):
3030

3131
def test_url(self):
3232
engine = engine_from_config({"database.url": "sqlite://"})
33-
self.assertEqual(engine.url, URL("sqlite"))
33+
self.assertEqual(
34+
engine.url,
35+
URL.create(
36+
"sqlite",
37+
username=None,
38+
password=None,
39+
host=None,
40+
port=None,
41+
database=None,
42+
query={},
43+
),
44+
)
3445

3546
@mock.patch("baseplate.clients.sqlalchemy.create_engine")
3647
def test_credentials(self, create_engine_mock):
@@ -45,13 +56,14 @@ def test_credentials(self, create_engine_mock):
4556
self.secrets,
4657
)
4758
create_engine_mock.assert_called_once_with(
48-
URL(
59+
URL.create(
4960
drivername="postgresql",
5061
username="reddit",
5162
password="password",
5263
host="localhost",
5364
port="9000",
5465
database="db",
66+
query={},
5567
),
5668
pool_recycle=60,
5769
pool_size=10,

0 commit comments

Comments
 (0)