diff --git a/emmental/tracklist/selection.py b/emmental/tracklist/selection.py index 7aaab28..6a9897c 100644 --- a/emmental/tracklist/selection.py +++ b/emmental/tracklist/selection.py @@ -152,6 +152,7 @@ class MoveButtons(Gtk.Box): class OSD(Gtk.Overlay): """An Overlay with extra controls for the Tracklist.""" + sql = GObject.Property(type=db.Connection) playlist = GObject.Property(type=playlist.playlist.Playlist) selection = GObject.Property(type=Gtk.SelectionModel) @@ -161,7 +162,7 @@ class OSD(Gtk.Overlay): def __init__(self, sql: db.Connection, selection: Gtk.SelectionModel, **kwargs): """Initialize an OSD.""" - super().__init__(selection=selection, **kwargs) + super().__init__(sql=sql, selection=selection, **kwargs) self._add = PopoverButton(child=Adw.ButtonContent(label="Add", icon_name="list-add-symbolic"), halign=Gtk.Align.START, valign=Gtk.Align.END, @@ -206,12 +207,14 @@ class OSD(Gtk.Overlay): playlist: db.playlists.Playlist) -> None: for track in self.__get_selected_tracks(): playlist.add_track(track) + self.sql.commit() self.clear_selection() def __remove_clicked(self, button: Gtk.Button) -> None: if self.playlist is not None: for track in self.__get_selected_tracks(): self.playlist.remove_track(track) + self.sql.commit() self.clear_selection() def __move_track_down(self, move: MoveButtons) -> None: @@ -219,6 +222,7 @@ class OSD(Gtk.Overlay): index = self.selection.get_selection().get_nth(0) self.selection.get_model().set_incremental(False) self.playlist.move_track_down(self.selection[index]) + self.sql.commit() self.selection.get_model().set_incremental(True) self.__update_visibility() @@ -227,6 +231,7 @@ class OSD(Gtk.Overlay): index = self.selection.get_selection().get_nth(0) self.selection.get_model().set_incremental(False) self.playlist.move_track_up(self.selection[index]) + self.sql.commit() self.selection.get_model().set_incremental(True) self.__update_visibility() diff --git a/tests/tracklist/test_selection.py b/tests/tracklist/test_selection.py index 49e25f5..74da5b8 100644 --- a/tests/tracklist/test_selection.py +++ b/tests/tracklist/test_selection.py @@ -249,6 +249,7 @@ class TestOsd(tests.util.TestCase): self.assertIsInstance(self.osd, Gtk.Overlay) self.assertIsInstance(self.osd._sizegroup, Gtk.SizeGroup) self.assertEqual(self.osd.selection, self.selection) + self.assertEqual(self.osd.sql, self.sql) self.assertIsNone(self.osd.playlist) self.assertEqual(self.osd._sizegroup.get_mode(), @@ -296,12 +297,14 @@ class TestOsd(tests.util.TestCase): with unittest.mock.patch.object(self.db_plist, "add_track") as mock_add: self.selection.select_all() - self.osd._add.popover_child.emit("playlist-selected", - self.db_plist) - mock_add.assert_has_calls([unittest.mock.call(self.model[0]), - unittest.mock.call(self.model[1]), - unittest.mock.call(self.model[2])]) - self.assertEqual(self.osd.n_selected, 0) + with unittest.mock.patch.object(self.sql, "commit") as mock_commit: + self.osd._add.popover_child.emit("playlist-selected", + self.db_plist) + mock_add.assert_has_calls([unittest.mock.call(self.model[0]), + unittest.mock.call(self.model[1]), + unittest.mock.call(self.model[2])]) + mock_commit.assert_called_once() + self.assertEqual(self.osd.n_selected, 0) def test_remove_button(self): """Test the remove tracks button.""" @@ -341,16 +344,18 @@ class TestOsd(tests.util.TestCase): """Test clicking the remove button.""" with unittest.mock.patch.object(self.db_plist, "remove_track") as mock_remove: - self.selection.select_all() - self.osd._remove.emit("clicked") - mock_remove.assert_not_called() + with unittest.mock.patch.object(self.sql, "commit") as mock_commit: + self.selection.select_all() + self.osd._remove.emit("clicked") + mock_remove.assert_not_called() + mock_commit.assert_not_called() - self.osd.playlist = self.playlist - self.selection.select_all() - self.osd._remove.emit("clicked") - mock_remove.assert_has_calls([unittest.mock.call(self.model[0]), - unittest.mock.call(self.model[1]), - unittest.mock.call(self.model[2])]) + self.osd.playlist = self.playlist + self.selection.select_all() + self.osd._remove.emit("clicked") + mock_remove.assert_has_calls([unittest.mock.call(self.model[i]) + for i in range(3)]) + mock_commit.assert_called_once() def test_move_buttons(self): """Test the move buttons.""" @@ -372,18 +377,22 @@ class TestOsd(tests.util.TestCase): with unittest.mock.patch.object(self.playlist, "move_track_down") as mock_move_down: - self.osd._move.emit("move-down") - mock_move_down.assert_called_with(self.model[1]) - set_incremental.assert_has_calls([unittest.mock.call(False), - unittest.mock.call(True)]) + with unittest.mock.patch.object(self.sql, "commit") as mock_commit: + self.osd._move.emit("move-down") + mock_move_down.assert_called_with(self.model[1]) + set_incremental.assert_has_calls([unittest.mock.call(False), + unittest.mock.call(True)]) + mock_commit.assert_called_once() set_incremental.reset_mock() with unittest.mock.patch.object(self.playlist, "move_track_up") as mock_move_up: - self.osd._move.emit("move-up") - mock_move_up.assert_called_with(self.model[1]) - set_incremental.assert_has_calls([unittest.mock.call(False), - unittest.mock.call(True)]) + with unittest.mock.patch.object(self.sql, "commit") as mock_commit: + self.osd._move.emit("move-up") + mock_move_up.assert_called_with(self.model[1]) + set_incremental.assert_has_calls([unittest.mock.call(False), + unittest.mock.call(True)]) + mock_commit.assert_called_once() def test_move_buttons_sensitive(self): """Test the move button sensitivity."""