import os import re import mutagen import pytest from symuid._tag_interface import ID3 # pylint: disable=protected-access @pytest.mark.parametrize('track_name', ['id3v2.4-empty.mp3']) def test_get_track_path(tracks_dir_path, track_name): track_path = os.path.join(tracks_dir_path, track_name) iface = ID3(mutagen.File(track_path)) assert track_path == iface.track_path @pytest.mark.parametrize(('track_name', 'tag_label', 'expected_text'), [ ('id3v2.4-typical.mp3', 'TPE1', 'some artist'), ('id3v2.4-typical.mp3', 'COMM::eng', 'some comment'), ]) def test__get_str(tracks_dir_path, track_name, tag_label, expected_text): iface = ID3(mutagen.File(os.path.join(tracks_dir_path, track_name))) assert expected_text == iface._get_str(tag_label) @pytest.mark.parametrize(('track_name', 'tag_label'), [ ('id3v2.4-empty.mp3', 'TPE1'), ('id3v2.4-typical.mp3', 'COMM'), ]) def test__get_str_missing(tracks_dir_path, track_name, tag_label): iface = ID3(mutagen.File(os.path.join(tracks_dir_path, track_name))) with pytest.raises(KeyError, match=re.escape(tag_label)): iface._get_str(tag_label) def test__get_free_str(empty_id3_path): mutagen_file = mutagen.File(empty_id3_path) mutagen_file.tags.add(mutagen.id3.TXXX( desc='foo', text='bar', )) mutagen_file.save() id3_iface = ID3(mutagen.File(empty_id3_path)) assert id3_iface._get_free_str('foo') == 'bar' def test__get_free_str_missing(empty_id3_path): iface = ID3(mutagen.File(empty_id3_path)) with pytest.raises(KeyError, match=r'TXXX:foo'): iface._get_free_str('foo') @pytest.mark.parametrize(('track_name', 'expected_comment'), [ ('id3v2.4-empty.mp3', None), ('id3v2.4-typical.mp3', 'some comment'), ]) def test_get_comment(tracks_dir_path, track_name, expected_comment): iface = ID3(mutagen.File(os.path.join(tracks_dir_path, track_name))) assert expected_comment == iface.get_comment() def test_set_comment(empty_id3_path): empty_id3_iface = ID3(mutagen.File(empty_id3_path)) assert empty_id3_iface.get_comment() is None empty_id3_iface.set_comment('latin') assert empty_id3_iface.get_comment() == 'latin' empty_id3_iface.set_comment('你好') assert empty_id3_iface.get_comment() == '你好' empty_id3_iface.save() tags = mutagen.File(empty_id3_iface.track_path).tags assert len(tags) == 1 tag = tags.values()[0] assert isinstance(tag, mutagen.id3.COMM) assert tag.lang == 'eng' assert tag.text == ['你好'] @pytest.mark.parametrize(('tag_label', 'tag_value', 'expected_value'), [ ('foo', '21/42', (21, 42)), ('bar', '-1/4', (-1, 4)), ('ham:egg', '0/-3', (0, -3)), ]) def test_get_free_int_ratio(empty_id3_path, tag_label, tag_value, expected_value): mutagen_file = mutagen.File(empty_id3_path) mutagen_file.tags.add(mutagen.id3.TXXX( encoding=mutagen.id3.Encoding.LATIN1, desc=tag_label, text=[tag_value], )) mutagen_file.save() id3_iface = ID3(mutagen.File(empty_id3_path)) assert id3_iface.get_free_int_ratio(tag_label) == expected_value @pytest.mark.parametrize( ('tag_label', 'nominator', 'denominator', 'expected_tag_value'), [('foo', 21, 42, '21/42'), ('bar', -1, 4, '-1/4'), ('ham:egg', 0, -3, '0/-3')], ) def test_set_free_int_ratio(empty_id3_path, tag_label, nominator, denominator, expected_tag_value): id3_iface = ID3(mutagen.File(empty_id3_path)) assert repr(id3_iface.set_free_int_ratio(tag_label, nominator, denominator)) id3_iface.save() mutagen_file = mutagen.File(empty_id3_path) assert len(mutagen_file.tags) == 1 assert mutagen_file.tags['TXXX:' + tag_label].text == [expected_tag_value]