emmental/tests/playlist/test_model.py

193 lines
8.0 KiB
Python

# Copyright 2023 (c) Anna Schumaker.
"""Tests our TrackidModel."""
import pathlib
import unittest.mock
import tests.util
import emmental.playlist.model
from gi.repository import Gio
class TestTrackidModel(tests.util.TestCase):
"""Tests the Trackid Model."""
def setUp(self):
"""Set up common variables."""
super().setUp()
self.db_plist = self.sql.playlists.create("Test Playlist")
self.model = emmental.playlist.model.TrackidModel(self.sql)
self.library = self.sql.libraries.create(pathlib.Path("/a/b"))
self.album = self.sql.albums.create("Test Album", "Artist", "2023")
self.medium = self.sql.media.create(self.album, "", number=1)
self.year = self.sql.years.create(2023)
self.track1 = self.sql.tracks.create(self.library,
pathlib.Path("/a/b/1.ogg"),
self.medium, self.year, number=1)
self.track2 = self.sql.tracks.create(self.library,
pathlib.Path("/a/b/2.ogg"),
self.medium, self.year, number=2)
def test_init(self):
"""Test that the TrackidModel was set up correctly."""
self.assertIsInstance(self.model, Gio.ListModel)
self.assertEqual(self.model.sql, self.sql)
self.assertIsNone(self.model._TrackidModel__trackid_set)
def test_bisect(self):
"""Test the TrackidModel bisect() function."""
self.assertTupleEqual(self.model.bisect(self.track1.trackid),
(False, 0))
self.model.trackid_set = self.db_plist.tracks
self.db_plist.add_track(self.track1)
self.assertTupleEqual(self.model.bisect(self.track1.trackid),
(True, 0))
self.assertTupleEqual(self.model.bisect(self.track2.trackid),
(False, 1))
self.db_plist.add_track(self.track2)
self.assertTupleEqual(self.model.bisect(self.track2.trackid),
(True, 1))
def test_get_item_type(self):
"""Test the Gio.ListModel:get_item_type() function."""
self.assertEqual(self.model.get_item_type(),
emmental.db.tracks.Track.__gtype__)
def test_get_n_items(self):
"""Test the Gio.ListModel:get_n_items() function."""
self.model.trackid_set = self.db_plist.tracks
self.assertEqual(self.model.get_n_items(), 0)
self.db_plist.add_track(self.track1)
self.assertEqual(self.model.get_n_items(), 1)
self.db_plist.add_track(self.track2)
self.assertEqual(self.model.get_n_items(), 2)
def test_get_item(self):
"""Test the Gio.ListModel:get_item() function."""
self.assertIsNone(self.model.get_item(0))
self.model.trackid_set = self.db_plist.tracks
self.db_plist.add_track(self.track1)
self.db_plist.add_track(self.track2)
self.assertEqual(self.model.get_item(0), self.track1)
self.assertEqual(self.model.get_item(1), self.track2)
self.assertIsNone(self.model.get_item(2))
def test_index(self):
"""Test finding the index of a specific trackid."""
self.assertIsNone(self.model.index(self.track1.trackid))
self.model.trackid_set = self.db_plist.tracks
self.db_plist.add_track(self.track1)
self.db_plist.add_track(self.track2)
self.assertEqual(self.model.index(self.track1.trackid), 0)
self.assertEqual(self.model.index(self.track2.trackid), 1)
self.assertIsNone(self.model.index(self.track2.trackid + 1))
def test_trackid_added(self):
"""Test that the TrackidModel responds to the trackid-added signal."""
items_changed = unittest.mock.Mock()
self.model.connect("items-changed", items_changed)
self.model.trackid_set = self.db_plist.tracks
self.assertListEqual(self.model.trackids, [])
self.assertEqual(self.model.n_tracks, 0)
self.db_plist.add_track(self.track2)
self.assertListEqual(self.model.trackids, [self.track2.trackid])
self.assertEqual(self.model.n_tracks, 1)
items_changed.assert_called_with(self.model, 0, 0, 1)
self.db_plist.add_track(self.track1)
self.assertListEqual(self.model.trackids,
[self.track1.trackid, self.track2.trackid])
self.assertEqual(self.model.n_tracks, 2)
items_changed.assert_called_with(self.model, 0, 0, 1)
self.model.trackid_set = None
self.db_plist.tracks.trackids.clear()
items_changed.reset_mock()
self.db_plist.tracks.add_track(self.track1)
self.assertListEqual(self.model.trackids, [])
self.assertEqual(self.model.n_tracks, 0)
items_changed.assert_not_called()
def test_trackid_removed(self):
"""Test that the TrackModel responds to the trackid-removed signal."""
items_changed = unittest.mock.Mock()
self.model.connect("items-changed", items_changed)
self.db_plist.tracks.trackids = {self.track1.trackid,
self.track2.trackid}
self.model.trackid_set = self.db_plist.tracks
self.db_plist.remove_track(self.track2)
self.assertListEqual(self.model.trackids, [self.track1.trackid])
self.assertEqual(self.model.n_tracks, 1)
items_changed.assert_called_with(self.model, 1, 1, 0)
self.db_plist.remove_track(self.track1)
self.assertListEqual(self.model.trackids, [])
self.assertEqual(self.model.n_tracks, 0)
items_changed.assert_called_with(self.model, 0, 1, 0)
self.model.trackid_set = None
self.model.trackids = [self.track1.trackid]
self.db_plist.tracks.trackids = {self.track1.trackid}
items_changed.reset_mock()
self.db_plist.tracks.remove_track(self.track1)
self.assertListEqual(self.model.trackids, [self.track1.trackid])
self.assertEqual(self.model.n_tracks, 0)
items_changed.assert_not_called()
def test_trackids_reset(self):
"""Test that the TrackModel responds to the trackids-reset signal."""
items_changed = unittest.mock.Mock()
self.model.connect("items-changed", items_changed)
self.model.trackid_set = self.db_plist.tracks
self.db_plist.tracks.trackids = {self.track1.trackid,
self.track2.trackid}
self.assertListEqual(self.model.trackids, [self.track1.trackid,
self.track2.trackid])
self.assertEqual(self.model.n_tracks, 2)
items_changed.assert_called_with(self.model, 0, 0, 2)
self.model.trackid_set = None
self.db_plist.tracks.trackids.clear()
items_changed.reset_mock()
self.db_plist.tracks.trackids = {self.track1.trackid,
self.track2.trackid}
self.assertListEqual(self.model.trackids, [])
items_changed.assert_not_called()
def test_trackid_set(self):
"""Test the trackid-set property."""
items_changed = unittest.mock.Mock()
self.model.connect("items-changed", items_changed)
self.assertIsNone(self.model.trackid_set)
self.db_plist.tracks.trackids = {self.track1.trackid,
self.track2.trackid}
self.model.trackid_set = self.db_plist.tracks
self.assertEqual(self.model._TrackidModel__trackid_set,
self.db_plist.tracks)
self.assertEqual(self.model.trackid_set, self.db_plist.tracks)
self.assertEqual(self.model.trackids, [self.track1.trackid,
self.track2.trackid])
self.assertEqual(self.model.n_tracks, 2)
items_changed.assert_called_with(self.model, 0, 0, 2)
self.model.trackid_set = None
self.assertEqual(self.model.trackids, [])
self.assertEqual(self.model.n_tracks, 0)
items_changed.assert_called_with(self.model, 0, 2, 0)