emmental/db/test_user.py
Anna Schumaker 8917600970 db: Clear MappedPlaylists before deleting
Otherwise we end up with a bunch of (playlistid, trackid) pairs in the
map table that don't refer to a valid playlist anymore.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-10-27 11:24:56 -04:00

296 lines
12 KiB
Python

# Copyright 2021 (c) Anna Schumaker.
import db
import sqlite3
import unittest
from gi.repository import GObject
from . import sql
class TestCollection(unittest.TestCase):
def setUp(self): db.reset()
def test_init(self):
collection = db.user.Table.find("Collection")
self.assertIsInstance(collection, db.playlist.Playlist)
self.assertIsInstance(collection, db.user.Collection)
self.assertEqual(collection.name, "Collection")
self.assertEqual(collection.icon_name, "media-playback-start")
self.assertTrue(collection.plist_state.loop)
def test_n_tracks(self):
collection = db.user.Table.find("Collection")
self.assertEqual(collection.get_n_tracks(), 0)
track = db.make_fake_track(1, 1, "Test Track", "/a/b/c/1.ogg")
self.assertEqual(collection.get_n_tracks(), 1)
track.library.enabled = False
self.assertEqual(collection.get_n_tracks(), 0)
class TestFavorites(unittest.TestCase):
def setUp(self): db.reset()
def test_init(self):
favorites = db.user.Table.find("Favorites")
self.assertIsInstance(favorites, db.playlist.MappedPlaylist)
self.assertIsInstance(favorites, db.user.UserPlaylist)
self.assertEqual(favorites.name, "Favorites")
self.assertEqual(favorites.icon_name, "emmental-favorites")
self.assertEqual(favorites.map_table, "playlist_map")
self.assertFalse(favorites.plist_state.loop)
def test_add_remove_track(self):
favorites = db.user.Table.find("Favorites")
track = db.make_fake_track(1, 1, "Test Track", "/a/b/c/1.ogg")
self.assertEqual(favorites.get_n_tracks(), 0)
self.assertTrue(favorites.add_track(track))
self.assertFalse(favorites.add_track(track))
self.assertEqual(favorites.get_n_tracks(), 1)
self.assertTrue(favorites.remove_track(track))
self.assertFalse(favorites.remove_track(track))
self.assertEqual(favorites.get_n_tracks(), 0)
class TestNewTracks(unittest.TestCase):
def setUp(self): db.reset()
def test_init(self):
new = db.user.Table.find("New Tracks")
self.assertIsInstance(new, db.playlist.MappedPlaylist)
self.assertIsInstance(new, db.user.UserPlaylist)
self.assertEqual(new.name, "New Tracks")
self.assertEqual(new.icon_name, "starred")
self.assertEqual(new.map_table, "temp_playlist_map")
self.assertFalse(new.plist_state.loop)
def test_add_remove_track(self):
new = db.user.Table.find("New Tracks")
self.assertEqual(new.get_n_tracks(), 0)
track = db.make_fake_track(1, 1, "Test Track", "/a/b/c/1.ogg")
cur = sql.execute("SELECT * FROM temp_playlist_map "
"WHERE trackid=? AND playlistid=?",
[ track.rowid, new.rowid ])
self.assertEqual(cur.fetchone()["trackid"], track.rowid)
self.assertEqual(new.get_n_tracks(), 1)
self.assertTrue(new.remove_track(track))
self.assertFalse(new.remove_track(track))
self.assertEqual(new.get_n_tracks(), 0)
class TestPrevious(unittest.TestCase):
def setUp(self): db.reset()
def test_init(self):
previous = db.user.Table.find("Previous")
self.assertIsInstance(previous, db.user.UserPlaylist)
self.assertIsInstance(previous, db.user.Previous)
self.assertEqual(previous.name, "Previous")
self.assertEqual(previous.icon_name, "edit-undo")
self.assertEqual(previous.map_table, "temp_playlist_map")
self.assertEqual(previous.plist_state.sort, [ "temp_playlist_map.rowid DESC" ])
self.assertFalse(previous.plist_state.loop)
def test_add_remove_track(self):
previous = db.user.Table.find("Previous")
track1 = db.make_fake_track(1, 1, "Test Track", "/a/b/c/1.ogg")
self.assertEqual(previous.get_n_tracks(), 0)
self.assertTrue(previous.add_track(track1))
cur = sql.execute("SELECT *,rowid FROM temp_playlist_map "
"WHERE trackid=? AND playlistid=?",
[ track1.rowid, previous.rowid ])
self.assertEqual(cur.fetchone()["rowid"], 2)
self.assertEqual(previous.get_n_tracks(), 1)
db.make_fake_track(2, 2, "Test Track 2", "/a/b/c/2.ogg")
self.assertTrue(previous.add_track(track1))
cur = sql.execute("SELECT *,rowid FROM temp_playlist_map "
"WHERE trackid=? AND playlistid=?",
[ track1.rowid, previous.rowid ])
self.assertEqual(cur.fetchone()["rowid"], 4)
self.assertEqual(previous.get_n_tracks(), 1)
self.assertTrue(previous.remove_track(track1))
self.assertFalse(previous.remove_track(track1))
self.assertEqual(previous.get_n_tracks(), 0)
class TestQueuedTracks(unittest.TestCase):
def setUp(self): db.reset()
def test_init(self):
queued = db.user.Table.find("Queued Tracks")
self.assertIsInstance(queued, db.playlist.MappedPlaylist)
self.assertIsInstance(queued, db.user.UserPlaylist)
self.assertEqual(queued.name, "Queued Tracks")
self.assertEqual(queued.icon_name, "edit-redo")
self.assertEqual(queued.map_table, "playlist_map")
self.assertEqual(queued.plist_state.sort, [ "playlist_map.rowid ASC" ])
self.assertFalse(queued.plist_state.loop)
def test_add_remove_track(self):
queued = db.user.Table.find("Queued Tracks")
track = db.make_fake_track(1, 1, "Test Track", "/a/b/c/1.ogg")
self.assertEqual(queued.get_n_tracks(), 0)
self.assertTrue(queued.add_track(track))
self.assertFalse(queued.add_track(track))
self.assertEqual(queued.get_n_tracks(), 1)
self.assertTrue(queued.remove_track(track))
self.assertFalse(queued.remove_track(track))
self.assertEqual(queued.get_n_tracks(), 0)
class TestUserPlaylist(unittest.TestCase):
def setUp(self): db.reset()
def test_init(self):
plist = db.user.Table.find("Test Playlist")
self.assertIsInstance(plist, db.playlist.MappedPlaylist)
self.assertIsInstance(plist, db.user.UserPlaylist)
self.assertEqual(plist.name, "Test Playlist")
self.assertEqual(plist.icon_name, "audio-x-generic")
self.assertEqual(plist.map_table, "playlist_map")
self.assertFalse(plist.plist_state.loop)
def test_delete(self):
track = db.make_fake_track(1, 1, "Test Track", "/a/b/c/1.ogg")
plist = db.user.Table.find("Test Playlist")
plist.add_track(track)
plist.delete()
self.assertEqual(plist.get_n_tracks(), 0)
self.assertIsNone(db.user.Table.lookup("Test Playlist"))
def test_add_remove_track(self):
plist = db.user.Table.find("Test Playlist")
track = db.make_fake_track(1, 1, "Test Track", "/a/b/c/1.ogg")
self.assertEqual(plist.get_n_tracks(), 0)
self.assertTrue(plist.add_track(track))
self.assertFalse(plist.add_track(track))
self.assertEqual(plist.get_n_tracks(), 1)
self.assertTrue(plist.remove_track(track))
self.assertFalse(plist.remove_track(track))
self.assertEqual(plist.get_n_tracks(), 0)
class TestUserTable(unittest.TestCase):
def setUp(self):
db.reset()
def test_init(self):
table = db.user.UserTable()
self.assertIsInstance(table, db.playlist.Model)
self.assertEqual(table.table, "playlists")
self.assertEqual(table.order, "sort")
self.assertIsInstance(db.user.Table, db.user.UserTable)
db.sql.execute("SELECT playlistid,plstateid,name,sort FROM playlists")
def test_insert(self):
table = db.user.UserTable()
playlist = table.find("Test Playlist")
self.assertIsInstance(playlist, db.user.UserPlaylist)
self.assertEqual(playlist._name, "Test Playlist")
self.assertEqual(playlist._rowkey, "playlistid")
with self.assertRaises(sqlite3.IntegrityError):
db.user.Table.insert("Test Playlist")
def test_lookup(self):
playlist = db.user.Table.insert("Test Playlist")
self.assertEqual(db.user.Table.lookup("Test Playlist"), playlist)
self.assertIsNone(db.user.Table.lookup("none"))
def test_default_playlists(self):
table = db.user.UserTable()
self.assertEqual(table.get_n_items(), 5)
self.assertEqual(table.get_item(0).name, "Collection")
self.assertEqual(table.get_item(1).name, "Favorites")
self.assertEqual(table.get_item(2).name, "New Tracks")
self.assertEqual(table.get_item(3).name, "Previous")
self.assertEqual(table.get_item(4).name, "Queued Tracks")
class TestPlaylistMap(unittest.TestCase):
def setUp(self):
db.reset()
def test_playlist_map_init(self):
self.assertIsInstance(db.user.Map, db.user.PlaylistMap)
self.assertIsInstance(db.user.TempMap, db.user.PlaylistMap)
self.assertEqual(db.user.Map.map_lhs, db.user.Table.get)
self.assertEqual(db.user.Map.map_rhs, db.user.Map.get_track)
self.assertFalse(db.user.Map.temporary)
self.assertTrue( db.user.TempMap.temporary)
db.sql.execute("SELECT playlistid,trackid FROM playlist_map")
db.sql.execute("SELECT playlistid,trackid FROM temp_playlist_map")
def test_playlist_map_insert(self):
track = db.make_fake_track(1, 1.234, "Test Title", "/a/b.cde")
collection = db.user.Table.find("Collection")
db.user.Map.insert(collection, track)
with self.assertRaises(sqlite3.IntegrityError):
db.user.Map.insert(collection, track)
def test_playlist_map_delete(self):
track = db.make_fake_track(1, 1.234, "Test Title", "/a/b.cde")
playlist = db.user.Table.find("Test Playlist")
db.user.Map.insert(playlist, track)
db.user.Map.delete(playlist, track)
self.assertEqual(db.user.Map.lookup_tracks(playlist), [ ])
def test_playlist_map_lookup_tracks(self):
track1 = db.make_fake_track(1, 1.234, "Test Title", "/a/b.cde")
track2 = db.make_fake_track(2, 2.345, "Test Title 2", "/a/c.def")
playlist = db.user.Table.find("Collection")
db.user.Map.insert(playlist, track1)
db.user.Map.insert(playlist, track2)
lookup_res = db.user.Map.lookup_tracks(playlist)
self.assertEqual(lookup_res, [ track1, track2 ])
def test_playlist_map_lookup_playlists(self):
track = db.make_fake_track(1, 1.234, "Test Title", "/a/b.cde")
collection = db.user.Table.find("Collection")
favorites = db.user.Table.find("Favorites")
db.user.Map.insert(collection, track)
db.user.Map.insert(favorites, track)
lookup_res = db.user.Map.lookup_playlists(track)
self.assertEqual(lookup_res, [ collection, favorites ])
def test_playlist_map_delete_track(self):
track = db.make_fake_track(1, 1.234, "Test Title", "/a/b.cde")
collection = db.user.Table.find("Collection")
favorites = db.user.Table.find("Favorites")
db.user.Map.insert(collection, track)
db.user.Map.insert(favorites, track)
db.user.Map.delete_track(track)
self.assertEqual(db.user.Map.lookup_playlists(track), [ ])
def test_playlist_map_delete_playlist(self):
track1 = db.make_fake_track(1, 1.234, "Test Title", "/a/b.cde")
track2 = db.make_fake_track(2, 2.345, "Test Title 2", "/a/c.def")
playlist = db.user.Table.find("Collection")
db.user.Map.insert(playlist, track1)
db.user.Map.insert(playlist, track2)
db.user.Map.delete_playlist(playlist)
self.assertEqual(db.user.Map.lookup_tracks(playlist), [ ])