2022-05-26 17:17:03 -04:00
|
|
|
# Copyright 2022 (c) Anna Schumaker
|
|
|
|
"""Test our custom db Connection object."""
|
|
|
|
import pathlib
|
|
|
|
import emmental.db
|
|
|
|
import tests.util
|
2022-05-26 17:18:21 -04:00
|
|
|
import unittest.mock
|
2022-05-26 17:17:03 -04:00
|
|
|
|
|
|
|
|
|
|
|
class TestConnection(tests.util.TestCase):
|
|
|
|
"""Test case for our database connection manager."""
|
|
|
|
|
|
|
|
def test_paths(self):
|
|
|
|
"""Check that path constants are pointing to the right places."""
|
2023-10-18 11:50:29 -04:00
|
|
|
dir = pathlib.Path(emmental.db.__file__).parent
|
|
|
|
self.assertEqual(emmental.db.SQL_V1_SCRIPT, dir / "emmental.sql")
|
|
|
|
self.assertEqual(emmental.db.SQL_V2_SCRIPT, dir / "upgrade-v2.sql")
|
2024-02-19 21:44:13 -05:00
|
|
|
self.assertEqual(emmental.db.SQL_V3_SCRIPT, dir / "upgrade-v3.sql")
|
2022-05-26 17:17:03 -04:00
|
|
|
|
|
|
|
def test_connection(self):
|
|
|
|
"""Check that the connection manager is initialized properly."""
|
|
|
|
self.assertIsInstance(self.sql, emmental.db.connection.Connection)
|
|
|
|
|
|
|
|
def test_version(self):
|
|
|
|
"""Test checking the database schema version."""
|
|
|
|
cur = self.sql("PRAGMA user_version")
|
2024-02-19 21:44:13 -05:00
|
|
|
self.assertEqual(cur.fetchone()["user_version"], 3)
|
2022-05-26 17:18:21 -04:00
|
|
|
|
2023-05-04 10:44:48 -04:00
|
|
|
def test_version_too_new(self):
|
|
|
|
"""Test failing when the database version is too new."""
|
|
|
|
self.sql._Connection__check_version()
|
|
|
|
|
2024-02-19 21:44:13 -05:00
|
|
|
self.sql("PRAGMA user_version = 4")
|
2023-05-04 10:44:48 -04:00
|
|
|
with self.assertRaises(Exception) as e:
|
|
|
|
self.sql._Connection__check_version()
|
2024-02-19 21:44:13 -05:00
|
|
|
self.assertEqual(str(e.exception), "Unsupported data version: 4")
|
2023-05-04 10:44:48 -04:00
|
|
|
|
2023-02-25 20:32:10 -05:00
|
|
|
def test_close(self):
|
|
|
|
"""Check closing the connection."""
|
|
|
|
self.sql.settings.queue.running = True
|
2022-08-10 11:19:29 -04:00
|
|
|
for tbl in self.sql.playlist_tables():
|
|
|
|
tbl.queue.running = True
|
2023-02-25 20:32:10 -05:00
|
|
|
|
|
|
|
self.sql.close()
|
|
|
|
self.assertFalse(self.sql.connected)
|
|
|
|
self.assertFalse(self.sql.settings.queue.running)
|
2022-08-10 11:19:29 -04:00
|
|
|
for tbl in self.sql.playlist_tables():
|
|
|
|
self.assertFalse(tbl.queue.running)
|
2023-02-25 20:32:10 -05:00
|
|
|
|
|
|
|
self.sql.close()
|
|
|
|
|
2022-05-26 17:18:21 -04:00
|
|
|
def test_tables(self):
|
|
|
|
"""Check that the connection has pointers to our tables."""
|
|
|
|
self.assertIsInstance(self.sql.settings, emmental.db.settings.Table)
|
2022-08-10 11:19:29 -04:00
|
|
|
self.assertIsInstance(self.sql.playlists, emmental.db.playlists.Table)
|
2022-08-22 15:51:18 -04:00
|
|
|
self.assertIsInstance(self.sql.artists, emmental.db.artists.Table)
|
2022-08-23 11:12:39 -04:00
|
|
|
self.assertIsInstance(self.sql.albums, emmental.db.albums.Table)
|
2022-08-26 13:23:37 -04:00
|
|
|
self.assertIsInstance(self.sql.media, emmental.db.media.Table)
|
2022-08-30 14:43:46 -04:00
|
|
|
self.assertIsInstance(self.sql.genres, emmental.db.genres.Table)
|
2022-08-31 11:23:47 -04:00
|
|
|
self.assertIsInstance(self.sql.decades, emmental.db.decades.Table)
|
2022-08-31 15:14:47 -04:00
|
|
|
self.assertIsInstance(self.sql.years, emmental.db.years.Table)
|
2022-09-06 14:13:51 -04:00
|
|
|
self.assertIsInstance(self.sql.libraries, emmental.db.libraries.Table)
|
2022-09-23 09:16:54 -04:00
|
|
|
self.assertIsInstance(self.sql.tracks, emmental.db.tracks.Table)
|
2022-08-23 11:12:39 -04:00
|
|
|
|
|
|
|
self.assertEqual(self.sql.albums.queue, self.sql.artists.queue)
|
2022-08-26 13:23:37 -04:00
|
|
|
self.assertEqual(self.sql.media.queue, self.sql.artists.queue)
|
2022-08-31 15:14:47 -04:00
|
|
|
self.assertEqual(self.sql.years.queue, self.sql.decades.queue)
|
2022-08-10 11:19:29 -04:00
|
|
|
|
|
|
|
self.assertListEqual([tbl for tbl in self.sql.playlist_tables()],
|
2022-08-23 11:12:39 -04:00
|
|
|
[self.sql.playlists, self.sql.artists,
|
2022-08-30 14:43:46 -04:00
|
|
|
self.sql.albums, self.sql.media,
|
2022-08-31 15:14:47 -04:00
|
|
|
self.sql.genres, self.sql.decades,
|
2022-09-06 14:13:51 -04:00
|
|
|
self.sql.years, self.sql.libraries])
|
2022-05-26 17:18:21 -04:00
|
|
|
|
|
|
|
def test_load(self):
|
|
|
|
"""Check that calling load() loads the tables."""
|
2024-03-13 11:20:15 -04:00
|
|
|
plist_tables = list(self.sql.playlist_tables())
|
|
|
|
all_tables = [self.sql.settings] + plist_tables + [self.sql.tracks]
|
2022-09-23 09:16:54 -04:00
|
|
|
|
2022-05-26 17:18:21 -04:00
|
|
|
table_loaded = unittest.mock.Mock()
|
|
|
|
self.sql.connect("table-loaded", table_loaded)
|
|
|
|
|
2024-03-13 11:20:15 -04:00
|
|
|
self.assertFalse(self.sql.loaded)
|
|
|
|
notify_loaded = unittest.mock.Mock()
|
|
|
|
self.sql.connect("notify::loaded", notify_loaded)
|
|
|
|
|
2022-05-26 17:18:21 -04:00
|
|
|
self.sql.load()
|
|
|
|
self.assertTrue(self.sql.settings.loaded)
|
2024-03-13 11:20:15 -04:00
|
|
|
notify_loaded.assert_not_called()
|
|
|
|
|
|
|
|
for tbl in all_tables[1:]:
|
2022-08-10 11:19:29 -04:00
|
|
|
self.assertFalse(tbl.loaded)
|
2024-03-13 11:20:15 -04:00
|
|
|
for tbl in plist_tables:
|
2022-08-10 11:19:29 -04:00
|
|
|
tbl.queue.complete()
|
|
|
|
self.assertTrue(tbl.loaded)
|
2024-03-13 11:20:15 -04:00
|
|
|
self.assertFalse(self.sql.loaded)
|
|
|
|
notify_loaded.assert_not_called()
|
|
|
|
|
|
|
|
self.sql.tracks.queue.complete()
|
|
|
|
self.assertTrue(self.sql.tracks.loaded)
|
|
|
|
self.assertTrue(self.sql.loaded)
|
|
|
|
notify_loaded.assert_called()
|
2022-05-26 17:18:21 -04:00
|
|
|
|
2024-03-13 11:20:15 -04:00
|
|
|
calls = [unittest.mock.call(self.sql, tbl) for tbl in all_tables]
|
2022-05-26 17:18:21 -04:00
|
|
|
table_loaded.assert_has_calls(calls)
|
2022-08-10 11:19:29 -04:00
|
|
|
|
2022-08-10 11:19:29 -04:00
|
|
|
def test_filter(self):
|
|
|
|
"""Check filtering the playlist tables."""
|
|
|
|
for tbl in self.sql.playlist_tables():
|
|
|
|
tbl.filter = unittest.mock.Mock()
|
|
|
|
|
|
|
|
self.sql.filter("*glob*")
|
|
|
|
for tbl in self.sql.playlist_tables():
|
|
|
|
tbl.filter.assert_called_with("*glob*")
|
|
|
|
|
2022-08-10 11:19:29 -04:00
|
|
|
def test_set_active_playlist(self):
|
|
|
|
"""Check setting the active playlist."""
|
|
|
|
table = tests.util.playlist.MockTable(self.sql)
|
|
|
|
plist1 = table.create(name="Playlist 1")
|
|
|
|
plist2 = table.create(name="Playlist 2")
|
|
|
|
self.assertIsNone(self.sql.active_playlist)
|
|
|
|
|
|
|
|
self.sql.set_active_playlist(plist1)
|
|
|
|
self.assertEqual(self.sql.active_playlist, plist1)
|
|
|
|
self.assertTrue(plist1.active)
|
|
|
|
|
|
|
|
self.sql.set_active_playlist(plist2)
|
|
|
|
self.assertEqual(self.sql.active_playlist, plist2)
|
|
|
|
self.assertFalse(plist1.active)
|
|
|
|
self.assertTrue(plist2.active)
|
|
|
|
|
2023-06-06 09:29:16 -04:00
|
|
|
notify = unittest.mock.Mock()
|
|
|
|
self.sql.connect("notify::active-playlist", notify)
|
|
|
|
self.sql.set_active_playlist(plist2)
|
|
|
|
notify.assert_not_called()
|
|
|
|
|
2022-08-10 11:19:29 -04:00
|
|
|
self.sql.set_active_playlist(None)
|
|
|
|
self.assertIsNone(self.sql.active_playlist)
|
|
|
|
self.assertFalse(plist2.active)
|