Skip to content

Commit 2a0f6d1

Browse files
authored
Fix some Database bugs and add more db test cases (#122)
1 parent ec325b5 commit 2a0f6d1

File tree

2 files changed

+152
-21
lines changed

2 files changed

+152
-21
lines changed

test/test_db_sqlite.py

Lines changed: 147 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
import datetime
12
import logging
23

34
import pytest
4-
from sqlalchemy import func, select
5+
from sqlalchemy import update
6+
from sqlalchemy.engine import Engine
7+
from sqlalchemy.orm.session import Session
58

69
from wadas._version import __dbversion__
710
from wadas.domain.database import DataBase, SQLiteDataBase
@@ -63,28 +66,141 @@ def test_unsupported_database(init):
6366
DataBase.initialize("DUMMY-DB-TYPE", "NOT-USED-HOST", None, "", "")
6467

6568

69+
def test_db_not_enabled(init):
70+
assert DataBase.initialize(DataBase.DBTypes.SQLITE, ":memory:", None, "", "", False) is True
71+
assert DataBase.wadas_db.enabled is False
72+
73+
74+
def test_db_enabled(init):
75+
assert DataBase.initialize(DataBase.DBTypes.SQLITE, ":memory:", None, "", "") is True
76+
assert DataBase.wadas_db.enabled is True
77+
78+
79+
def test_default_db_version(init):
80+
assert DataBase.initialize(DataBase.DBTypes.SQLITE, ":memory:", None, "", "") is True
81+
assert DataBase.wadas_db.version == __dbversion__
82+
83+
84+
def test_set_db_version(init):
85+
assert (
86+
DataBase.initialize(DataBase.DBTypes.SQLITE, ":memory:", None, "", "", version="X.Y.Z")
87+
is True
88+
)
89+
assert DataBase.wadas_db.version == "X.Y.Z"
90+
91+
6692
def test_no_engine_and_no_database(init):
6793
with pytest.raises(RuntimeError, match="The database and db engine have not been initialized."):
68-
SQLiteDataBase.get_engine()
94+
DataBase.get_engine()
95+
96+
97+
def test_get_engine(init):
98+
assert DataBase.wadas_db_engine is None
99+
assert DataBase.initialize(DataBase.DBTypes.SQLITE, ":memory:", None, "", "", False) is True
100+
assert DataBase.wadas_db is not None
101+
assert DataBase.get_engine() is DataBase.wadas_db_engine
102+
assert DataBase.wadas_db_engine is not None
103+
assert isinstance(DataBase.wadas_db_engine, Engine) is True
69104

70105

71106
def test_no_database(init):
72-
assert SQLiteDataBase.get_instance() is None
107+
assert DataBase.get_instance() is None
108+
109+
110+
def test_get_instance(init):
111+
assert DataBase.wadas_db is None
112+
assert DataBase.initialize(DataBase.DBTypes.SQLITE, ":memory:", None, "", "") is True
113+
assert DataBase.get_instance() is DataBase.wadas_db
114+
assert DataBase.wadas_db is not None
115+
116+
117+
def test_get_disabled_db(init):
118+
assert DataBase.wadas_db is None
119+
assert DataBase.get_enabled_db() is None
120+
assert DataBase.initialize(DataBase.DBTypes.SQLITE, ":memory:", None, "", "", False) is True
121+
assert DataBase.wadas_db is not None
122+
assert DataBase.get_enabled_db() is None
123+
assert DataBase.wadas_db is not None
124+
125+
126+
def test_get_enabled_db(init):
127+
assert DataBase.wadas_db is None
128+
assert DataBase.get_enabled_db() is None
129+
assert DataBase.initialize(DataBase.DBTypes.SQLITE, ":memory:", None, "", "") is True
130+
assert DataBase.wadas_db is not None
131+
assert DataBase.get_enabled_db() is DataBase.wadas_db
73132

74133

75-
def test_failing_on_destroy_instance(init):
134+
def test_destroy_instance(init):
76135
DataBase.wadas_db_engine = True
77-
SQLiteDataBase.destroy_instance()
136+
DataBase.destroy_instance()
78137
assert DataBase.wadas_db_engine is None
79138

80139

140+
def test_no_session_without_engine(init):
141+
assert DataBase.create_session() is None
142+
143+
144+
def test_create_session(init):
145+
assert DataBase.initialize(DataBase.DBTypes.SQLITE, ":memory:", None, "", "") is True
146+
session = DataBase.create_session()
147+
assert isinstance(session, Session) is True
148+
149+
150+
def test_no_db_uuid_without_session(init):
151+
assert DataBase.get_db_uuid() is None
152+
153+
154+
def test_no_db_uuid_without_populated_db(db):
155+
db, session = db
156+
assert db.get_db_uuid() is None
157+
158+
159+
def test_get_db_uuid(db):
160+
db, session = db
161+
db.populate_db("FAKE_UUID")
162+
assert db.get_db_uuid() == "FAKE_UUID"
163+
164+
165+
def test_no_db_version_without_session(init):
166+
assert DataBase.get_db_version() is None
167+
168+
169+
def test_no_db_version_without_populated_db(db):
170+
db, session = db
171+
assert db.get_db_version() is None
172+
173+
174+
def test_get_db_version(db):
175+
db, session = db
176+
db.populate_db("FAKE_UUID")
177+
assert db.get_db_version() == __dbversion__
178+
179+
180+
def test_bad_statement_on_run_query(db):
181+
db, session = db
182+
db.populate_db("FAKE_UUID")
183+
assert DataBase.run_query(None) is False
184+
185+
186+
def test_run_query(db):
187+
db, session = db
188+
db.populate_db("FAKE_UUID")
189+
stmt = update(DBMetadata).values(project_uuid="NEW_FAKE_UUID")
190+
assert DataBase.run_query(stmt) is True
191+
assert db.get_db_uuid() == "NEW_FAKE_UUID"
192+
193+
81194
def test_connection_string(db):
82195
db, session = db
83196
assert db is not None
84197
assert DataBase.wadas_db_engine is not None
85198
assert db.get_connection_string() == "sqlite:///:memory:"
86199

87200

201+
# Specific SQLite tests start here.
202+
203+
88204
def test_database_not_initialized(init):
89205
assert SQLiteDataBase("NOT-USED-HOST").create_database() is False
90206

@@ -106,16 +222,29 @@ def test_serialize(init):
106222

107223
def test_empty_database(db):
108224
db, session = db
109-
assert session.execute(select(func.count()).select_from(ActuationEvent)).scalar() == 0
110-
assert session.execute(select(func.count()).select_from(Actuator)).scalar() == 0
111-
assert session.execute(select(func.count()).select_from(Camera)).scalar() == 0
112-
assert session.execute(select(func.count()).select_from(ClassifiedAnimals)).scalar() == 0
113-
assert session.execute(select(func.count()).select_from(DBMetadata)).scalar() == 0
114-
assert session.execute(select(func.count()).select_from(DetectionEvent)).scalar() == 0
115-
assert session.execute(select(func.count()).select_from(FeederActuator)).scalar() == 0
116-
assert session.execute(select(func.count()).select_from(FTPCamera)).scalar() == 0
117-
assert session.execute(select(func.count()).select_from(RoadSignActuator)).scalar() == 0
118-
assert session.execute(select(func.count()).select_from(USBCamera)).scalar() == 0
119-
assert (
120-
session.execute(select(func.count()).select_from(camera_actuator_association)).scalar() == 0
121-
)
225+
assert session.query(ActuationEvent).count() == 0
226+
assert session.query(Actuator).count() == 0
227+
assert session.query(Camera).count() == 0
228+
assert session.query(ClassifiedAnimals).count() == 0
229+
assert session.query(DBMetadata).count() == 0
230+
assert session.query(DetectionEvent).count() == 0
231+
assert session.query(FeederActuator).count() == 0
232+
assert session.query(FTPCamera).count() == 0
233+
assert session.query(RoadSignActuator).count() == 0
234+
assert session.query(USBCamera).count() == 0
235+
assert session.query(camera_actuator_association).count() == 0
236+
237+
238+
def test_create_metadata(db):
239+
db, session = db
240+
db.populate_db("FAKE_UUID")
241+
rows = session.query(DBMetadata).all()
242+
assert len(rows) == 1
243+
row = rows[0]
244+
assert row.db_id == 1
245+
assert row.version == __dbversion__
246+
time_delta = datetime.datetime.now() - row.applied_at
247+
assert time_delta.days == 0
248+
assert time_delta.seconds == 0
249+
assert row.description == "WADAS database"
250+
assert row.project_uuid == "FAKE_UUID"

wadas/domain/database.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ def initialize(
149149
return False
150150

151151
DataBase.wadas_db = cls._create_instance(
152-
db_type, host, port, username, database_name, enabled=True, version=__dbversion__
152+
db_type, host, port, username, database_name, enabled=enabled, version=version
153153
)
154154
if not DataBase.wadas_db:
155155
return False
@@ -249,14 +249,15 @@ def get_db_version(cls):
249249

250250
@classmethod
251251
def run_query(cls, stmt):
252-
"""Generic method to run a query starting forma statement as input and handling
252+
"""Generic method to run a query starting from a statement as input and handling
253253
exceptions (if any)."""
254254

255-
logger.debug("Running query: %s", str(stmt))
255+
logger.debug("Running query: %s", stmt)
256256
if session := cls.create_session():
257257
try:
258258
session.execute(stmt)
259259
session.commit()
260+
return True
260261
except SQLAlchemyError:
261262
# Rollback the transaction in case of an error
262263
session.rollback()
@@ -271,6 +272,7 @@ def run_query(cls, stmt):
271272
)
272273
else:
273274
logger.error("DB session not initialized.")
275+
return False
274276

275277
@classmethod
276278
def insert_into_db(cls, domain_object):

0 commit comments

Comments
 (0)