# Copyright 2021 (c) Anna Schumaker. import db import pathlib import time import unittest from gi.repository import Gio from gi.repository import GLib from gi.repository import Gtk from . import queue from . import task from . import widgets main_context = GLib.main_context_default() test_album = pathlib.Path("./data/Test Album/").absolute() test_subdir = test_album / "Test Subdir" class FakeTask(task.Task): def run_task(self): return None class TestScannerProgressBar(unittest.TestCase): def test_init(self): q = queue.TaskQueue() pb = widgets.ProgressBar(q) self.assertIsInstance(pb, Gtk.ProgressBar) self.assertTrue( pb.get_hexpand()) self.assertFalse(pb.get_visible()) self.assertEqual(pb.get_valign(), Gtk.Align.CENTER) self.assertEqual(pb.queue, q) for i in range(3): q.push(FakeTask()) self.assertTrue(pb.get_visible()) self.assertTrue(widgets.ProgressBar(q).get_visible()) for i in [ 1, 2, 0 ]: q.run() self.assertEqual(pb.get_fraction(), i/3) self.assertFalse(pb.get_visible()) class DirectoryChooserWidget(unittest.TestCase): def test_init(self): dcw = widgets.DirectoryChooserWidget() self.assertIsInstance(dcw, Gtk.FileChooserWidget) self.assertIsInstance(dcw.filter, Gtk.FileFilter) self.assertEqual(dcw.get_action(), Gtk.FileChooserAction.SELECT_FOLDER) self.assertEqual(dcw.get_filter(), dcw.filter) self.assertFalse(dcw.get_create_folders()) gfile = Gio.File.new_for_path(str(test_album)) self.assertTrue(dcw.set_current_folder(gfile)) while main_context.iteration(may_block=False): pass self.assertEqual(dcw.selected_path(), test_album) gfile = Gio.File.new_for_path(str(test_subdir)) self.assertTrue(dcw.set_file(gfile)) while main_context.iteration(may_block=False): time.sleep(0.001) self.assertEqual(dcw.selected_path(), test_subdir) class DirectoryChooserPopover(unittest.TestCase): def test_init(self): db.reset() q = queue.TaskQueue() dcp = widgets.DirectoryChooserPopover(q) self.assertIsInstance(dcp, Gtk.Popover) self.assertIsInstance(dcp.chooser, widgets.DirectoryChooserWidget) self.assertIsInstance(dcp.cancel, Gtk.Button) self.assertIsInstance(dcp.select, Gtk.Button) self.assertIsInstance(dcp.grid, Gtk.Grid) self.assertEqual(dcp.queue, q) self.assertEqual(dcp.cancel.get_label(), "Cancel") self.assertEqual(dcp.select.get_label(), "Add Folder") self.assertTrue(dcp.has_css_class("normal-icons")) self.assertTrue(dcp.select.has_css_class("suggested-action")) self.assertEqual(dcp.get_child(), dcp.grid) self.assertIn(dcp.chooser, dcp.grid) self.assertIn(dcp.cancel, dcp.grid) self.assertIn(dcp.select, dcp.grid) gfile = Gio.File.new_for_path(str(test_album)) self.assertTrue(dcp.chooser.set_current_folder(gfile)) while main_context.iteration(may_block=False): pass dcp.select.emit("clicked") self.assertIsNotNone(db.library.Table.find(test_album)) self.assertEqual(len(q.tasks), 2) self.assertIsInstance(q.tasks[0], task.CheckSchedulerTask) self.assertIsInstance(q.tasks[1], task.DirectoryTask) q.tasks_finished() class TestScannerAddFolderButton(unittest.TestCase): def test_init(self): q = queue.TaskQueue() afb = widgets.AddFolderButton(q) self.assertIsInstance(afb, Gtk.MenuButton) self.assertIsInstance(afb.popover, widgets.DirectoryChooserPopover) self.assertEqual(afb.get_popover(), afb.popover) self.assertEqual(afb.get_icon_name(), "folder-new") self.assertEqual(afb.get_direction(), Gtk.ArrowType.UP) class TestScannerUpdateButton(unittest.TestCase): def test_init(self): lib = db.library.Table.find("/a/b/c") q = queue.TaskQueue() ub = widgets.UpdateButton(lib, q) self.assertIsInstance(ub, Gtk.Button) self.assertIsInstance(ub, widgets.ScannerButton) self.assertEqual(ub.get_icon_name(), "view-refresh") self.assertEqual(ub.library, lib) self.assertEqual(ub.queue, q) self.assertTrue(ub.get_hexpand()) ub.emit("clicked") self.assertEqual(len(q.tasks), 2) self.assertIsInstance(q.tasks[0], task.CheckSchedulerTask) self.assertIsInstance(q.tasks[1], task.DirectoryTask) q.tasks_finished() class TestScannerUpdateAllButton(unittest.TestCase): def test_init(self): db.reset() lib1 = db.library.Table.find("/a/b/c") lib2 = db.library.Table.find("/d/e/f") q = queue.TaskQueue() uba = widgets.UpdateAllButton(q) self.assertIsInstance(uba, Gtk.Button) self.assertIsInstance(uba, widgets.ScannerButton) self.assertEqual(uba.get_icon_name(), "view-refresh") self.assertEqual(uba.queue, q) self.assertTrue(uba.get_hexpand()) uba.emit("clicked") self.assertEqual(len(q.tasks), 4) self.assertIsInstance(q.tasks[0], task.CheckSchedulerTask) self.assertIsInstance(q.tasks[1], task.DirectoryTask) self.assertIsInstance(q.tasks[2], task.CheckSchedulerTask) self.assertIsInstance(q.tasks[3], task.DirectoryTask) q.tasks_finished() class TestScannerRemoveButton(unittest.TestCase): def test_init(self): lib = db.library.Table.find("/a/b/c") q = queue.TaskQueue() rb = widgets.RemoveButton(lib, q) self.assertIsInstance(rb, Gtk.Button) self.assertIsInstance(rb, widgets.ScannerButton) self.assertEqual(rb.get_icon_name(), "list-remove") self.assertEqual(rb.library, lib) self.assertEqual(rb.queue, q) self.assertTrue(rb.get_hexpand()) rb.emit("clicked") self.assertEqual(len(q.tasks), 1) self.assertIsInstance(q.tasks[0], task.RemoveLibrarySchedulerTask) q.tasks_finished() class TestEnableSwitch(unittest.TestCase): def test_init(self): lib = db.library.Table.find("/a/b/c") q = queue.TaskQueue() es = widgets.EnableSwitch(lib, q) self.assertIsInstance(es, Gtk.Switch) self.assertEqual(es.library, lib) self.assertEqual(es.queue, q) self.assertEqual(es.get_halign(), Gtk.Align.CENTER) self.assertEqual(es.get_valign(), Gtk.Align.CENTER) self.assertTrue(es.get_active()) es.set_active(False) self.assertFalse(es.library.enabled) self.assertFalse(widgets.EnableSwitch(lib, q).get_active()) es.set_active(True) self.assertTrue(lib.enabled)