beets/test/test_ftintitle.py
Marc Addeo 4d4113e3a4 Refactor ftintitle to extract the code to find the featured artist
This removes the code that extracts the featured artist from the
original artist field from the ft_in_title function and puts it into its
own.

It also adds a custom ArtistNotFoundException that find_feat_part will
throw if the album artist is not in the artist field.

This allows us to easily test the results of finding a featured artist
in the artist sting, and thus adds tests for the usual test cases that
the split_on_feat gets tested for.
2014-12-28 20:15:09 -05:00

75 lines
3.4 KiB
Python

# This file is part of beets.
# Copyright 2014, 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."""
from _common import unittest
from beetsplug import ftintitle
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},
]
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')