# 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), [ ])