]> kaliko git repositories - mpd-sima.git/blobdiff - tests/test_simadb.py
simadb: More consistent use of albumartist info in fetch_albums_history
[mpd-sima.git] / tests / test_simadb.py
index b71fa1baca973c13e8ac2e2e6581d1a62c0e68f1..42e897d9126eded521fdde2470bc892b0337d2e8 100644 (file)
@@ -4,9 +4,9 @@ import datetime
 import unittest
 import os
 
-from sima.lib.db import SimaDB
+from sima.lib.simadb import SimaDB
 from sima.lib.track import Track
-from sima.lib.meta import Album
+from sima.lib.meta import Album, Artist, MetaContainer
 
 
 DEVOLT = {
@@ -14,6 +14,7 @@ DEVOLT = {
     'albumartist': 'Devolt',
     'albumartistsort': 'Devolt',
     'artist': 'Devolt',
+    'genre': ['Rock'],
     'date': '2011-12-01',
     'disc': '1/1',
     'file': 'music/Devolt/2011-Grey/03-Devolt - Crazy.mp3',
@@ -28,7 +29,7 @@ DEVOLT = {
     'track': '3/6'}
 
 DB_FILE = 'file::memory:?cache=shared'
-KEEP_FILE = False  # File db in file to ease debug
+KEEP_FILE = True  # File db in file to ease debug
 if KEEP_FILE:
     DB_FILE = '/dev/shm/unittest.sqlite'
 CURRENT = datetime.datetime.utcnow()
@@ -69,12 +70,12 @@ class Test_00DB(Main):
     def test_01_add_track(self):
         trk = Track(**DEVOLT)
         trk_id = self.db.get_track(trk)
-        self.assertEqual(trk_id, self.db.get_track(trk),
+        self.assertEqual(trk_id, self.db.get_track(trk, add=False),
                          'Same track, same record')
 
     def test_02_history(self):
         # set records in the past to ease purging then
-        last = CURRENT - datetime.timedelta(hours=1)
+        last = CURRENT - datetime.timedelta(seconds=5)
         trk = Track(**DEVOLT)
         self.db.add_history(trk, date=last)
         self.db.add_history(trk, date=last)
@@ -97,7 +98,8 @@ class Test_00DB(Main):
         # recent first, oldest last
         hist = list()
         for i in range(1, 5):  # starts at 1 to ensure records are in the past
-            trk = Track(file=f'/foo/bar.{i}', name='{i}-baz', album='foolbum')
+            trk = Track(file=f'/foo/bar.{i}', name=f'{i}-baz',
+                        album='foolbum', genre=f'{i}')
             hist.append(trk)
             last = CURRENT - datetime.timedelta(minutes=i)
             self.db.add_history(trk, date=last)
@@ -145,9 +147,11 @@ class Test_00DB(Main):
         #
         trk03 = Track(file='03', **tr)
         self.db.add_history(trk03, CURRENT-datetime.timedelta(hours=1))
-        # got multiple tracks, same artist, got artist history len == 1
+        # got multiple tracks, same artist/album, got artist/album history len = 1
         art_history = self.db.fetch_artists_history()
+        alb_history = self.db.fetch_albums_history()
         self.assertEqual(len(art_history), 1)
+        self.assertEqual(len(alb_history), 1)
         self.assertEqual(art_history, [trk01.Artist])
 
         # Now add new artist to history
@@ -164,7 +168,77 @@ class Test_00DB(Main):
                          trk04.artist, trk03.artist],
                          art_history)
 
-    def test_04_triggers(self):
+    def test_albums_history(self):
+        # set records in the past to ease purging then
+        last = CURRENT - datetime.timedelta(seconds=5)
+        track = {
+            'album': 'album', 'title': 'title',
+            'albumartist': 'albumartist',
+            'artist': 'artist',
+            'file': 'foo/bar.flac',
+            'musicbrainz_albumartistid': 'd8e7e3e2-49ab-4f7c-b148-fc946d521f99',
+            'musicbrainz_albumid': 'ea2ef2cf-59e1-443a-817e-9066e3e0be4b',
+            'musicbrainz_artistid': 'd8e7e3e2-49ab-4f7c-b148-fc946d521f99',}
+        self.db.purge_history(duration=0)
+        self.db.add_history(Track(**track), last)
+        alb_history = self.db.fetch_albums_history()
+        alb = alb_history[0]
+        self.assertEqual(alb.Artist.name, track.get('albumartist'))
+        # Fetching Album history for "artist" should return "album"
+        artist = Artist(track.get('artist'), mbid=track.get('musicbrainz_artistid'))
+        alb_history = self.db.fetch_albums_history(artist)
+        self.assertTrue(alb_history)
+        # Falls back to album and MBID when albumartist and
+        # musicbrainz_albumartistid are not set
+        self.db.purge_history(duration=0)
+        track = {
+            'album': 'no albumartist set', 'title': 'title',
+            'artist': 'no album artist set',
+            'file': 'bar/foo.flac',
+            'musicbrainz_artistid': 'dddddddd-49ab-4f7c-b148-dddddddddddd',}
+        self.db.add_history(Track(**track), last)
+        alb_history = self.db.fetch_albums_history()
+        album = alb_history[0]
+        self.assertEqual(album.albumartist, track['artist'])
+        self.assertEqual(album.Artist.mbid, track['musicbrainz_artistid'])
+
+    def test_04_filtering_history(self):
+        # Controls artist history filtering
+        for i in range(0, 5):
+            trk = Track(file=f'/foo/bar.{i}', name=f'{i}-baz',
+                        artist=f'{i}-art', album=f'{i}-lbum')
+            last = CURRENT - datetime.timedelta(minutes=i)
+            self.db.add_history(trk, date=last)
+            if i == 5:  # bounce latest record
+                self.db.add_history(trk, date=last)
+        art_history = self.db.fetch_artists_history()
+        # Already checked but to be sure, we should have 5 artists in history
+        self.assertEqual(len(art_history), 5)
+        for needle in ['4-art', Artist(name='4-art')]:
+            art_history = self.db.fetch_artists_history(needle=needle)
+            self.assertEqual(art_history, [needle])
+        needle = Artist(name='not-art')
+        art_history = self.db.fetch_artists_history(needle=needle)
+        self.assertEqual(art_history, [])
+        # Controls artists history filtering
+        #   for a list of Artist objects
+        needle_list = [Artist(name='3-art'), Artist(name='4-art')]
+        art_history = self.db.fetch_artists_history(needle=needle_list)
+        self.assertEqual(art_history, needle_list)
+        #   for a MetaContainer
+        needle_meta = MetaContainer(needle_list)
+        art_history = self.db.fetch_artists_history(needle=needle_meta)
+        self.assertEqual(art_history, needle_list)
+        #   for a list of string (Meta object handles Artist/str comparison)
+        art_history = self.db.fetch_artists_history(['3-art', '4-art'])
+        self.assertEqual(art_history, needle_list)
+
+        # Controls album history filtering
+        needle = Artist(name='4-art')
+        alb_history = self.db.fetch_albums_history(needle=needle)
+        self.assertEqual(alb_history, [Album(name='4-lbum')])
+
+    def test_05_triggers(self):
         self.db.purge_history(duration=0)
         tracks_ids = list()
         #  Add a first track
@@ -204,10 +278,14 @@ class Test_00DB(Main):
         self.assertIn(('fooart',), artists)
         conn.close()
 
+    def test_06_add_album(self):
+        pass
 
 class Test_01BlockList(Main):
 
     def test_blocklist_addition(self):
+        trk = Track(file='/foo/bar/baz', name='title')
+        self.assertIs(self.db.get_bl_track(trk, add=False), None)
         tracks_ids = list()
         # Set 6 records, same album
         for i in range(1, 6):  # starts at 1 to ensure records are in the past
@@ -215,18 +293,31 @@ class Test_01BlockList(Main):
                         albumartist='fooalbart', album='foolbum',)
             # Add track, save its DB id
             tracks_ids.append(self.db.get_track(trk))
-            # set records in the past to ease purging then
-            last = CURRENT - datetime.timedelta(minutes=i)
-            self.db.add_history(trk, date=last)  # Add to history
             if i == 1:
                 self.db.get_bl_track(trk)
+                self.assertIsNot(self.db.get_bl_track(trk, add=False), None)
             if i == 2:
-                self.db.get_bl_track(trk)
                 self.db.get_bl_album(Album(name=trk.album))
             if i == 3:
                 self.db.get_bl_artist(trk.Artist)
+            if i == 4:
+                self.assertIs(self.db.get_bl_track(trk, add=False), None)
+
 
-    def test_blocklist_triggers(self):
+    def test_blocklist_triggers_00(self):
+        trk01 = Track(file='01', name='01', artist='artist A', album='album A')
+        blart01_id = self.db.get_bl_artist(trk01.Artist)
+        blalb01_id = self.db.get_bl_album(Album(name=trk01.album, mbid=trk01.musicbrainz_albumid))
+        conn = self.db.get_database_connection()
+        self.db._remove_blocklist_id(blart01_id, with_connection=conn)
+        self.db._remove_blocklist_id(blalb01_id, with_connection=conn)
+        albums = conn.execute('SELECT albums.name FROM albums;').fetchall()
+        artists = conn.execute('SELECT artists.name FROM artists;').fetchall()
+        conn.close()
+        self.assertNotIn((trk01.album,), albums)
+        self.assertNotIn((trk01.artist,), artists)
+
+    def test_blocklist_triggers_01(self):
         trk01 = Track(file='01', name='01', artist='artist A', album='album A')
         trk02 = Track(file='02', name='01', artist='artist A', album='album B')
         trk01_id = self.db.get_bl_track(trk01)
@@ -254,5 +345,31 @@ class Test_01BlockList(Main):
         conn.close()
 
 
+class Test_02Genre(Main):
+
+    def test_genre(self):
+        conn = self.db.get_database_connection()
+        self.db.get_genre('Post-Rock', with_connection=conn)
+        genres = list()
+        for i in range(1, 15):  # starts at 1 to ensure records are in the past
+            trk = Track(file=f'/foo/bar.{i}', name=f'{i}-baz',
+                        album='foolbum', artist=f'{i}-art', genre=f'{i}')
+            genres.append(f'{i}')
+            last = CURRENT - datetime.timedelta(minutes=i)
+            self.db.add_history(trk, date=last)
+        genre_hist = self.db.fetch_genres_history(limit=10)
+        self.assertEqual([g[0] for g in genre_hist], genres[:10])
+
+    def test_null_genres(self):
+        conn = self.db.get_database_connection()
+        genres = list()
+        for i in range(1, 2):  # starts at 1 to ensure records are in the past
+            trk = Track(file=f'/foo/bar.{i}', name=f'{i}-baz',
+                        album='foolbum', artist=f'{i}-art')
+            last = CURRENT - datetime.timedelta(minutes=i)
+            self.db.add_history(trk, date=last)
+        genre_hist = self.db.fetch_genres_history(limit=10)
+        self.assertEqual(genre_hist, [])
+
 # VIM MODLINE
 # vim: ai ts=4 sw=4 sts=4 expandtab fileencoding=utf8