Skip to content

Commit 051e623

Browse files
dccoteclaude
andcommitted
Skip database tests gracefully in CI environment
- Add isCI() helper in env.py, returns True when CI env var is set - canAccessLabdata() now returns False in CI to avoid SSH timeouts - Prerequisites test classes skip instead of fail when servers unavailable - All local MySQL/PostgreSQL test classes skip in CI Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 4d2e2b9 commit 051e623

File tree

2 files changed

+26
-38
lines changed

2 files changed

+26
-38
lines changed

dcclab/tests/env.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@
99
os.environ.setdefault('PYTHON_KEYRING_BACKEND', 'keyring.backends.macOS.Keyring')
1010

1111

12+
def isCI():
13+
return os.environ.get('CI', '').lower() in ('true', '1')
14+
15+
1216
def canAccessLabdata(host="cafeine2.crulrg.ulaval.ca", port=22, timeout=3):
17+
if isCI():
18+
return False
1319
try:
1420
s = socket.create_connection((host, port), timeout=timeout)
1521
s.close()

dcclab/tests/testDatabase.py

Lines changed: 20 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -296,42 +296,28 @@ def canAccessLocalMySQL():
296296
return False
297297

298298

299+
@unittest.skipIf(env.isCI(), "Local database not available in CI")
299300
class TestLocalMySQLPrerequisites(env.DCCLabTestCase):
300301
def testLocalMySQLIsRunning(self):
301302
if not isLocalMySQLRunning():
302-
self.fail(
303-
"MySQL is not running on 127.0.0.1:3306.\n"
304-
"Start it with one of:\n\n"
305-
" brew services start mysql # macOS with Homebrew\n"
306-
" sudo systemctl start mysql # Linux with systemd\n"
307-
" mysql.server start # macOS alternate\n"
303+
self.skipTest(
304+
"MySQL is not running on 127.0.0.1:3306. "
305+
"Start with: brew services start mysql"
308306
)
309307

310308
def testLocalMySQLTestUserIsAvailable(self):
311309
if not isLocalMySQLRunning():
312310
self.skipTest("MySQL is not running")
313311
if not canAccessLocalMySQL():
314-
self.fail(
315-
"Cannot connect to local MySQL as user 'test'.\n"
316-
"An administrator must run the following commands to set up the test environment:\n\n"
317-
" mysql -u root -p -e \"\n"
318-
" CREATE DATABASE IF NOT EXISTS test;\n"
319-
" CREATE USER IF NOT EXISTS 'test'@'127.0.0.1' IDENTIFIED BY 'test';\n"
320-
" CREATE USER IF NOT EXISTS 'test'@'localhost' IDENTIFIED BY 'test';\n"
321-
" GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, REFERENCES,\n"
322-
" CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW,\n"
323-
" CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER\n"
324-
" ON test.* TO 'test'@'127.0.0.1';\n"
325-
" GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, REFERENCES,\n"
326-
" CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW,\n"
327-
" CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER\n"
328-
" ON test.* TO 'test'@'localhost';\n"
329-
" FLUSH PRIVILEGES;\n"
330-
" \"\n"
312+
self.skipTest(
313+
"Cannot connect to local MySQL as user 'test'. "
314+
"Create with: mysql -u root -p -e \"CREATE DATABASE IF NOT EXISTS test; "
315+
"CREATE USER IF NOT EXISTS 'test'@'127.0.0.1' IDENTIFIED BY 'test'; "
316+
"GRANT ALL ON test.* TO 'test'@'127.0.0.1'; FLUSH PRIVILEGES;\""
331317
)
332318

333319

334-
@unittest.skipUnless(canAccessLocalMySQL(), "Requires local MySQL at 127.0.0.1")
320+
@unittest.skipIf(env.isCI() or not canAccessLocalMySQL(), "Requires local MySQL at 127.0.0.1")
335321
class TestLocalMySQLWithDatabase(env.DCCLabTestCase):
336322
localURL = "mysql://test:test@127.0.0.1/test"
337323
tableName = "test_local_db"
@@ -436,7 +422,7 @@ def testDisableForeignKeys(self):
436422
self.assertEqual(list(row.values())[0], 0)
437423

438424

439-
@unittest.skipUnless(canAccessLocalMySQL(), "Requires local MySQL at 127.0.0.1")
425+
@unittest.skipIf(env.isCI() or not canAccessLocalMySQL(), "Requires local MySQL at 127.0.0.1")
440426
class TestLocalMySQLWithMySQLDatabase(env.DCCLabTestCase):
441427
localURL = "mysql://test:test@127.0.0.1/test"
442428
tableName = "test_local_mysqldb"
@@ -560,31 +546,27 @@ def canAccessLocalPostgres():
560546
return False
561547

562548

549+
@unittest.skipIf(env.isCI(), "Local database not available in CI")
563550
class TestLocalPostgresPrerequisites(env.DCCLabTestCase):
564551
def testLocalPostgresIsRunning(self):
565552
if not isLocalPostgresRunning():
566-
self.fail(
567-
"PostgreSQL is not running on 127.0.0.1:5432.\n"
568-
"Start it with one of:\n\n"
569-
" brew services start postgresql # macOS with Homebrew\n"
570-
" sudo systemctl start postgresql # Linux with systemd\n"
553+
self.skipTest(
554+
"PostgreSQL is not running on 127.0.0.1:5432. "
555+
"Start with: brew services start postgresql"
571556
)
572557

573558
def testLocalPostgresTestUserIsAvailable(self):
574559
if not isLocalPostgresRunning():
575560
self.skipTest("PostgreSQL is not running")
576561
if not canAccessLocalPostgres():
577-
self.fail(
578-
"Cannot connect to local PostgreSQL as user 'test'.\n"
579-
"An administrator must run the following commands to set up the test environment:\n\n"
580-
" sudo -u postgres psql -c \"\n"
581-
" CREATE USER test WITH PASSWORD 'test';\n"
582-
" CREATE DATABASE test OWNER test;\n"
583-
" \"\n"
562+
self.skipTest(
563+
"Cannot connect to local PostgreSQL as user 'test'. "
564+
"Create with: psql -d postgres -c \"CREATE USER test WITH PASSWORD 'test'; "
565+
"CREATE DATABASE test OWNER test;\""
584566
)
585567

586568

587-
@unittest.skipUnless(canAccessLocalPostgres(), "Requires local PostgreSQL at 127.0.0.1")
569+
@unittest.skipIf(env.isCI() or not canAccessLocalPostgres(), "Requires local PostgreSQL at 127.0.0.1")
588570
class TestLocalPostgresWithPostgresqlDatabase(env.DCCLabTestCase):
589571
localURL = "postgresql://test:test@127.0.0.1/test"
590572
tableName = "test_local_pgdb"

0 commit comments

Comments
 (0)