296 lines
9.4 KiB
Python
296 lines
9.4 KiB
Python
# Standard library imports
|
|
import datetime as dt
|
|
import os
|
|
import unittest
|
|
|
|
# PyQt imports
|
|
|
|
# Third party imports
|
|
|
|
# App imports
|
|
from app import helpers
|
|
|
|
# Set up test database before importing db
|
|
# Mark subsequent lines to ignore E402, imports not at top of file
|
|
DB_FILE = "/tmp/mm.db"
|
|
if os.path.exists(DB_FILE):
|
|
os.unlink(DB_FILE)
|
|
os.environ["ALCHEMICAL_DATABASE_URI"] = "sqlite:///" + DB_FILE
|
|
from app.models import ( # noqa: E402
|
|
db,
|
|
NoteColours,
|
|
Playdates,
|
|
Playlists,
|
|
PlaylistRows,
|
|
Tracks,
|
|
)
|
|
|
|
|
|
class TestMMModels(unittest.TestCase):
|
|
def setUp(self):
|
|
db.create_all()
|
|
|
|
with db.Session() as session:
|
|
track1_path = "testdata/isa.mp3"
|
|
self.track1 = Tracks(session, **helpers.get_all_track_metadata(track1_path))
|
|
|
|
track2_path = "testdata/mom.mp3"
|
|
self.track2 = Tracks(session, **helpers.get_all_track_metadata(track2_path))
|
|
|
|
def tearDown(self):
|
|
db.drop_all()
|
|
|
|
def test_track_repr(self):
|
|
with db.Session() as session:
|
|
session.add(self.track1)
|
|
_ = str(self.track1)
|
|
|
|
def test_notecolours_get_colour(self):
|
|
"""Create a colour record and retrieve all colours"""
|
|
|
|
note_colour = "#0bcdef"
|
|
with db.Session() as session:
|
|
NoteColours(session, substring="substring", colour=note_colour)
|
|
|
|
records = NoteColours.get_all(session)
|
|
assert len(records) == 1
|
|
record = records[0]
|
|
assert record.colour == note_colour
|
|
|
|
def test_notecolours_get_all(self):
|
|
"""Create two colour records and retrieve them all"""
|
|
|
|
note1_colour = "#1bcdef"
|
|
note2_colour = "#20ff00"
|
|
with db.Session() as session:
|
|
NoteColours(session, substring="note1", colour=note1_colour)
|
|
NoteColours(session, substring="note2", colour=note2_colour)
|
|
|
|
records = NoteColours.get_all(session)
|
|
assert len(records) == 2
|
|
assert note1_colour in [n.colour for n in records]
|
|
assert note2_colour in [n.colour for n in records]
|
|
|
|
def test_notecolours_get_colour_none(self):
|
|
note_colour = "#3bcdef"
|
|
with db.Session() as session:
|
|
NoteColours(session, substring="substring", colour=note_colour)
|
|
|
|
result = NoteColours.get_colour(session, "xyz")
|
|
assert result is None
|
|
|
|
def test_notecolours_get_colour_match(self):
|
|
note_colour = "#4bcdef"
|
|
with db.Session() as session:
|
|
nc = NoteColours(session, substring="sub", colour=note_colour)
|
|
assert nc
|
|
|
|
result = NoteColours.get_colour(session, "The substring")
|
|
assert result == note_colour
|
|
|
|
def test_playdates_add_playdate(self):
|
|
"""Test playdate and last_played retrieval"""
|
|
|
|
with db.Session() as session:
|
|
session.add(self.track1)
|
|
playdate = Playdates(session, self.track1.id)
|
|
assert playdate
|
|
# test repr
|
|
_ = str(playdate)
|
|
|
|
last_played = Playdates.last_played(session, self.track1.id)
|
|
assert abs((playdate.lastplayed - last_played).total_seconds()) < 2
|
|
|
|
def test_playdates_played_after(self):
|
|
with db.Session() as session:
|
|
session.add(self.track1)
|
|
playdate = Playdates(session, self.track1.id)
|
|
yesterday = dt.datetime.now() - dt.timedelta(days=1)
|
|
played = Playdates.played_after(session, yesterday)
|
|
|
|
assert len(played) == 1
|
|
assert played[0] == playdate
|
|
|
|
def test_playlist_create(self):
|
|
TEMPLATE_NAME = "my template"
|
|
|
|
with db.Session() as session:
|
|
playlist = Playlists(session, "my playlist")
|
|
assert playlist
|
|
# test repr
|
|
_ = str(playlist)
|
|
|
|
# test clear tabs
|
|
Playlists.clear_tabs(session, [playlist.id])
|
|
|
|
# create template
|
|
Playlists.save_as_template(session, playlist.id, TEMPLATE_NAME)
|
|
|
|
# test create template
|
|
_ = Playlists.create_playlist_from_template(
|
|
session, playlist, "my new name"
|
|
)
|
|
|
|
# get all templates
|
|
all_templates = Playlists.get_all_templates(session)
|
|
assert len(all_templates) == 1
|
|
# Save as template creates new playlist
|
|
assert all_templates[0] != playlist
|
|
# test delete playlist
|
|
playlist.delete(session)
|
|
|
|
def test_playlist_open_and_close(self):
|
|
# We need a playlist
|
|
with db.Session() as session:
|
|
playlist = Playlists(session, "my playlist")
|
|
|
|
assert len(Playlists.get_open(session)) == 0
|
|
assert len(Playlists.get_closed(session)) == 1
|
|
|
|
playlist.mark_open()
|
|
|
|
assert len(Playlists.get_open(session)) == 1
|
|
assert len(Playlists.get_closed(session)) == 0
|
|
|
|
playlist.close(session)
|
|
|
|
assert len(Playlists.get_open(session)) == 0
|
|
assert len(Playlists.get_closed(session)) == 1
|
|
|
|
def test_playlist_get_all_and_by_id(self):
|
|
# We need two playlists
|
|
p1_name = "playlist one"
|
|
p2_name = "playlist two"
|
|
with db.Session() as session:
|
|
playlist1 = Playlists(session, p1_name)
|
|
_ = Playlists(session, p2_name)
|
|
|
|
all_playlists = Playlists.get_all(session)
|
|
assert len(all_playlists) == 2
|
|
assert p1_name in [p.name for p in all_playlists]
|
|
assert p2_name in [p.name for p in all_playlists]
|
|
assert session.get(Playlists, playlist1.id).name == p1_name
|
|
|
|
def test_tracks_get_all_tracks(self):
|
|
# Need two tracks
|
|
|
|
with db.Session() as session:
|
|
session.add(self.track1)
|
|
session.add(self.track2)
|
|
result = [a.path for a in Tracks.get_all(session)]
|
|
assert self.track1.path in result
|
|
assert self.track2.path in result
|
|
|
|
def test_tracks_by_path(self):
|
|
with db.Session() as session:
|
|
session.add(self.track1)
|
|
assert Tracks.get_by_path(session, self.track1.path) is self.track1
|
|
|
|
def test_tracks_by_id(self):
|
|
with db.Session() as session:
|
|
session.add(self.track1)
|
|
assert session.get(Tracks, self.track1.id) is self.track1
|
|
|
|
def test_tracks_search_artists(self):
|
|
track1_artist = "Fleetwood Mac"
|
|
|
|
with db.Session() as session:
|
|
session.add(self.track1)
|
|
assert len(Tracks.search_artists(session, track1_artist)) == 1
|
|
|
|
def test_tracks_search_titles(self):
|
|
track1_title = "I'm So Afraid"
|
|
|
|
with db.Session() as session:
|
|
session.add(self.track1)
|
|
assert len(Tracks.search_titles(session, track1_title)) == 1
|
|
|
|
def test_repr(self):
|
|
"""Just check for error retrieving reprs"""
|
|
|
|
with db.Session() as session:
|
|
nc = NoteColours(session, substring="x", colour="x")
|
|
_ = str(nc)
|
|
|
|
def test_get_colour(self):
|
|
"""Test for errors in execution"""
|
|
|
|
GOOD_STRING = "cantelope"
|
|
BAD_STRING = "ericTheBee"
|
|
SUBSTR = "ant"
|
|
COLOUR = "blue"
|
|
|
|
with db.Session() as session:
|
|
nc1 = NoteColours(
|
|
session, substring=SUBSTR, colour=COLOUR, is_casesensitive=True
|
|
)
|
|
|
|
_ = nc1.get_colour(session, "")
|
|
colour = nc1.get_colour(session, GOOD_STRING)
|
|
assert colour == COLOUR
|
|
|
|
colour = nc1.get_colour(session, BAD_STRING)
|
|
assert colour is None
|
|
|
|
nc2 = NoteColours(
|
|
session, substring=".*" + SUBSTR, colour=COLOUR, is_regex=True
|
|
)
|
|
colour = nc2.get_colour(session, GOOD_STRING)
|
|
assert colour == COLOUR
|
|
|
|
colour = nc2.get_colour(session, BAD_STRING)
|
|
assert colour is None
|
|
|
|
nc3 = NoteColours(
|
|
session,
|
|
substring=".*" + SUBSTR,
|
|
colour=COLOUR,
|
|
is_regex=True,
|
|
is_casesensitive=True,
|
|
)
|
|
|
|
colour = nc3.get_colour(session, GOOD_STRING)
|
|
assert colour == COLOUR
|
|
|
|
colour = nc3.get_colour(session, BAD_STRING)
|
|
assert colour is None
|
|
|
|
def test_name_available(self):
|
|
PLAYLIST_NAME = "a name"
|
|
RENAME = "new name"
|
|
|
|
with db.Session() as session:
|
|
if Playlists.name_is_available(session, PLAYLIST_NAME):
|
|
playlist = Playlists(session, PLAYLIST_NAME)
|
|
assert playlist
|
|
|
|
assert Playlists.name_is_available(session, PLAYLIST_NAME) is False
|
|
|
|
playlist.rename(session, RENAME)
|
|
|
|
def test_create_playlist_row(self):
|
|
PLAYLIST_NAME = "a name"
|
|
|
|
with db.Session() as session:
|
|
if Playlists.name_is_available(session, PLAYLIST_NAME):
|
|
playlist = Playlists(session, PLAYLIST_NAME)
|
|
|
|
plr = PlaylistRows(session, playlist.id, 1)
|
|
assert plr
|
|
_ = str(plr)
|
|
plr.append_note("a note")
|
|
plr.append_note("another note")
|
|
|
|
def test_delete_plr(self):
|
|
PLAYLIST_NAME = "a name"
|
|
|
|
with db.Session() as session:
|
|
if Playlists.name_is_available(session, PLAYLIST_NAME):
|
|
playlist = Playlists(session, PLAYLIST_NAME)
|
|
|
|
plr = PlaylistRows(session, playlist.id, 1)
|
|
assert plr
|
|
PlaylistRows.delete_higher_rows(session, plr.playlist_id, 10)
|
|
|
|
assert PlaylistRows.get_track_plr(session, 12, plr.playlist_id) is None
|