emmental/trackdb/test_trackdb.py

172 lines
6.4 KiB
Python

# Copyright 2020 (c) Anna Schumaker.
import lib
import pathlib
import trackdb
import unittest
test_tracks = pathlib.Path("./data/Test Album")
class TestLibraryTag(unittest.TestCase):
def tearDown(self):
trackdb.reset()
def test_library_tag_init(self):
library = trackdb.LibraryTag(test_tracks)
self.assertIsInstance(library, lib.tag.Tag)
self.assertIsInstance(library.clear, lib.thread.Thread)
self.assertIsInstance(library.scan, lib.thread.Thread)
def test_library_tag_state(self):
lib = trackdb.LibraryTag(test_tracks)
lib.scan().join()
state = lib.__getstate__()
self.assertEqual(set(state.keys()),
set([ "name", "sort", "current", "loop", "random", "tracks" ]))
self.assertEqual(state["name"], test_tracks)
self.assertEqual(state["tracks"], [ i for i in range(12) ])
lib.__dict__.clear()
lib.__setstate__(state)
lib.fix_tracks()
self.assertEqual(lib.name, test_tracks)
self.assertEqual(lib.tracks, [ trackdb.Tracks[i] for i in range(12) ])
self.assertEqual(lib.clear.func, lib.__do_clear__)
self.assertEqual(lib.scan.func, lib.__do_scan__)
def test_library_tag_scan(self):
lib = trackdb.LibraryTag(test_tracks)
lib.scan().join()
for i in range(12):
self.assertEqual(lib.tracks[i], trackdb.Tracks[i])
def test_library_tag_scan_new(self):
lib = trackdb.LibraryTag(test_tracks)
lib.scan().join()
for trak in [ trackdb.Tracks[0], trackdb.Tracks[11] ]:
lib.remove_track(trak)
trackdb.Tracks.remove(trak)
lib.scan().join()
self.assertEqual(len(lib.tracks), 12)
def test_library_tag_scan_remove(self):
lib = trackdb.LibraryTag(test_tracks)
lib.scan().join()
trak = trackdb.track.Track(trackdb.Tracks.nextid,
test_tracks / "01 - Test Track.ogg", lib)
trak.path = pathlib.Path("No Such File")
lib.tracks.append(trak)
trackdb.Tracks.tracks[trak.trackid] = trak
lib.scan().join()
self.assertNotIn(trak, lib.tracks)
def test_library_tag_clear(self):
lib = trackdb.LibraryTag(test_tracks)
lib.scan().join()
self.assertEqual(len(lib), 12)
lib.clear().join()
self.assertEqual(len(lib), 0)
self.assertEqual(len(trackdb.Tracks), 0)
class TestLibraryStore(unittest.TestCase):
def test_library_store(self):
store = trackdb.LibraryStore()
lib = store.add(test_tracks)
self.assertIsInstance(lib, trackdb.LibraryTag)
lib.scan().join()
self.assertEqual(len(lib), 12)
store.remove(lib)
lib.clear.join()
self.assertEqual(len(lib), 0)
class TestTrackDB(unittest.TestCase):
def tearDown(self):
trackdb.reset()
def test_trackdb_init(self):
self.assertIsInstance(trackdb.Bus, lib.bus.Bus)
self.assertIsInstance(trackdb.Tracks, trackdb.allocator.TrackAllocator)
self.assertIsInstance(trackdb.Stack, trackdb.stack.TagStack)
self.assertIsInstance(trackdb.Library, trackdb.LibraryStore)
self.assertEqual(trackdb.File, "trackdb.pickle")
self.assertEqual(trackdb.Bus.timeout, 500)
self.assertIn(trackdb.save, trackdb.Library.Added.subscribers)
self.assertIn(trackdb.save, trackdb.Library.Removed.subscribers)
self.assertIn(trackdb.save, trackdb.Tracks.Added.subscribers)
self.assertIn(trackdb.save, trackdb.Tracks.Removed.subscribers)
self.assertIn(trackdb.save, trackdb.Tracks.Updated.subscribers)
self.assertIn(trackdb.save, trackdb.tags.User.Added.subscribers)
self.assertIn(trackdb.save, trackdb.tags.User.Removed.subscribers)
self.assertIn(trackdb.save, trackdb.Stack.PushPop.subscribers)
self.assertIn(trackdb.save, trackdb.Stack.NextTrack.subscribers)
def test_trackdb_save_load(self):
db_file = lib.data.DataFile(trackdb.File, lib.data.READ)
library = trackdb.Library.add(test_tracks)
library.scan()
trackdb.Stack.push(library)
trackdb.save()
self.assertEqual(trackdb.Bus.passengers, [ (trackdb._do_save, ()) ])
self.assertFalse(db_file.exists())
library.scan.join()
trackdb.Bus.complete()
self.assertTrue(db_file.exists())
trackdb.tags.reset()
trackdb.Library.reset()
trackdb.Tracks.reset()
trackdb.Stack.reset()
trackdb.load()
self.assertEqual(len(trackdb.Tracks), 12)
self.assertEqual(len(trackdb.Library), 1)
self.assertEqual(len(trackdb.Library[test_tracks]), 12)
self.assertEqual(len(trackdb.tags.Artist), 3)
self.assertEqual(len(trackdb.tags.Album), 12)
self.assertEqual(len(trackdb.tags.Genre), 4)
self.assertEqual(len(trackdb.tags.Decade), 2)
self.assertEqual(len(trackdb.tags.Year), 2)
self.assertEqual(trackdb.Stack.tags, [ trackdb.Library[test_tracks] ])
self.assertIn(trackdb.save, trackdb.Library.Added.subscribers)
self.assertIn(trackdb.save, trackdb.Tracks.Added.subscribers)
self.assertIn(trackdb.save, trackdb.tags.User.Added.subscribers)
def test_trackdb_stress(self):
lib = trackdb.Library.add(pathlib.Path("./trier/Test Library/"))
lib.scan().join()
trackdb.Bus.complete()
trackdb.Library.remove(lib)
lib.clear.join()
trackdb.Bus.complete()
def test_trackdb_reset(self):
trackdb.Tracks.Added.register(1)
trackdb.Tracks.Removed.register(1)
trackdb.Tracks.Updated.register(1)
trackdb.Library.Added.register(1)
trackdb.Library.Removed.register(1)
trackdb.Library.store = { "a" : 1, "b" : 2, "c" : 3 }
with lib.data.DataFile(trackdb.File, lib.data.WRITE) as f:
f.pickle([ 0, [] ])
trackdb.reset()
self.assertEqual(len(trackdb.Library), 0)
self.assertIn(trackdb.save, trackdb.Tracks.Added.subscribers)
self.assertIn(trackdb.save, trackdb.Tracks.Removed.subscribers)
self.assertIn(trackdb.save, trackdb.Tracks.Updated.subscribers)
self.assertIn(trackdb.save, trackdb.Library.Added.subscribers)
self.assertIn(trackdb.save, trackdb.Library.Removed.subscribers)
self.assertFalse(lib.data.DataFile(trackdb.File, lib.data.READ).exists())