beets/test/plugins/test_ftintitle.py

186 lines
6.5 KiB
Python

# This file is part of beets.
# Copyright 2016, Fabrice Laporte.
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
"""Tests for the 'ftintitle' plugin."""
import unittest
from beets.test.helper import BeetsTestCase
from beetsplug import ftintitle
class FtInTitlePluginFunctional(BeetsTestCase):
def setUp(self):
"""Set up configuration"""
super().setUp()
self.load_plugins("ftintitle")
def tearDown(self):
self.unload_plugins()
super().tearDown()
def _ft_add_item(self, path, artist, title, aartist):
return self.add_item(
path=path,
artist=artist,
artist_sort=artist,
title=title,
albumartist=aartist,
)
def _ft_set_config(self, ftformat, drop=False, auto=True):
self.config["ftintitle"]["format"] = ftformat
self.config["ftintitle"]["drop"] = drop
self.config["ftintitle"]["auto"] = auto
def test_functional_drop(self):
item = self._ft_add_item("/", "Alice ft Bob", "Song 1", "Alice")
self.run_command("ftintitle", "-d")
item.load()
self.assertEqual(item["artist"], "Alice")
self.assertEqual(item["title"], "Song 1")
def test_functional_not_found(self):
item = self._ft_add_item("/", "Alice ft Bob", "Song 1", "George")
self.run_command("ftintitle", "-d")
item.load()
# item should be unchanged
self.assertEqual(item["artist"], "Alice ft Bob")
self.assertEqual(item["title"], "Song 1")
def test_functional_custom_format(self):
self._ft_set_config("feat. {0}")
item = self._ft_add_item("/", "Alice ft Bob", "Song 1", "Alice")
self.run_command("ftintitle")
item.load()
self.assertEqual(item["artist"], "Alice")
self.assertEqual(item["title"], "Song 1 feat. Bob")
self._ft_set_config("featuring {0}")
item = self._ft_add_item("/", "Alice feat. Bob", "Song 1", "Alice")
self.run_command("ftintitle")
item.load()
self.assertEqual(item["artist"], "Alice")
self.assertEqual(item["title"], "Song 1 featuring Bob")
self._ft_set_config("with {0}")
item = self._ft_add_item("/", "Alice feat Bob", "Song 1", "Alice")
self.run_command("ftintitle")
item.load()
self.assertEqual(item["artist"], "Alice")
self.assertEqual(item["title"], "Song 1 with Bob")
class FtInTitlePluginTest(unittest.TestCase):
def setUp(self):
"""Set up configuration"""
ftintitle.FtInTitlePlugin()
def test_find_feat_part(self):
test_cases = [
{
"artist": "Alice ft. Bob",
"album_artist": "Alice",
"feat_part": "Bob",
},
{
"artist": "Alice feat Bob",
"album_artist": "Alice",
"feat_part": "Bob",
},
{
"artist": "Alice featuring Bob",
"album_artist": "Alice",
"feat_part": "Bob",
},
{
"artist": "Alice & Bob",
"album_artist": "Alice",
"feat_part": "Bob",
},
{
"artist": "Alice and Bob",
"album_artist": "Alice",
"feat_part": "Bob",
},
{
"artist": "Alice With Bob",
"album_artist": "Alice",
"feat_part": "Bob",
},
{
"artist": "Alice defeat Bob",
"album_artist": "Alice",
"feat_part": None,
},
{
"artist": "Alice & Bob",
"album_artist": "Bob",
"feat_part": "Alice",
},
{
"artist": "Alice ft. Bob",
"album_artist": "Bob",
"feat_part": "Alice",
},
{
"artist": "Alice ft. Carol",
"album_artist": "Bob",
"feat_part": None,
},
]
for test_case in test_cases:
feat_part = ftintitle.find_feat_part(
test_case["artist"], test_case["album_artist"]
)
self.assertEqual(feat_part, test_case["feat_part"])
def test_split_on_feat(self):
parts = ftintitle.split_on_feat("Alice ft. Bob")
self.assertEqual(parts, ("Alice", "Bob"))
parts = ftintitle.split_on_feat("Alice feat Bob")
self.assertEqual(parts, ("Alice", "Bob"))
parts = ftintitle.split_on_feat("Alice feat. Bob")
self.assertEqual(parts, ("Alice", "Bob"))
parts = ftintitle.split_on_feat("Alice featuring Bob")
self.assertEqual(parts, ("Alice", "Bob"))
parts = ftintitle.split_on_feat("Alice & Bob")
self.assertEqual(parts, ("Alice", "Bob"))
parts = ftintitle.split_on_feat("Alice and Bob")
self.assertEqual(parts, ("Alice", "Bob"))
parts = ftintitle.split_on_feat("Alice With Bob")
self.assertEqual(parts, ("Alice", "Bob"))
parts = ftintitle.split_on_feat("Alice defeat Bob")
self.assertEqual(parts, ("Alice defeat Bob", None))
def test_contains_feat(self):
self.assertTrue(ftintitle.contains_feat("Alice ft. Bob"))
self.assertTrue(ftintitle.contains_feat("Alice feat. Bob"))
self.assertTrue(ftintitle.contains_feat("Alice feat Bob"))
self.assertTrue(ftintitle.contains_feat("Alice featuring Bob"))
self.assertTrue(ftintitle.contains_feat("Alice & Bob"))
self.assertTrue(ftintitle.contains_feat("Alice and Bob"))
self.assertTrue(ftintitle.contains_feat("Alice With Bob"))
self.assertFalse(ftintitle.contains_feat("Alice defeat Bob"))
self.assertFalse(ftintitle.contains_feat("Aliceft.Bob"))
def suite():
return unittest.TestLoader().loadTestsFromName(__name__)
if __name__ == "__main__":
unittest.main(defaultTest="suite")