diff --git a/test/test_mediafile.py b/test/test_mediafile.py index 85b235f7e..6380da856 100644 --- a/test/test_mediafile.py +++ b/test/test_mediafile.py @@ -23,7 +23,7 @@ import time import _common from _common import unittest -from beets.mediafile import MediaFile +from beets.mediafile import MediaFile, TagImage class ArtTestMixin(object): @@ -63,6 +63,112 @@ class ArtTestMixin(object): self.assertEqual(mediafile.art, self.jpg_data) +class ImageStructureTestMixin(object): + """Test reading and writing multiple image tags. + + The tests use the `image` media file fixture. The tags of these files + include two images, on in the PNG format, the other in JPEG format. If + the tag format supports it they also include additional metadata. + """ + + def test_read_image_structures(self): + mediafile = self._mediafile_fixture('image') + + self.assertEqual(len(mediafile.images), 2) + + image = mediafile.images[0] + self.assertEqual(image.data, self.png_data) + self.assertEqual(image.mime_type, 'image/png') + self.assertExtendedImageAttributes(image, desc='album cover', + type='front') + + image = mediafile.images[1] + self.assertEqual(image.data, self.jpg_data) + self.assertEqual(image.mime_type, 'image/jpg') + self.assertExtendedImageAttributes(image, desc='the artist', + type='performer') + + def test_set_image_structure(self): + mediafile = self._mediafile_fixture('empty') + image = TagImage(data=self.png_data, desc='album cover', type=TagImage.FRONT) + mediafile.images = [image] + mediafile.save() + + mediafile = MediaFile(mediafile.path) + self.assertEqual(len(mediafile.images), 1) + + image = mediafile.images[0] + self.assertEqual(image.data, self.png_data) + self.assertEqual(image.mime_type, 'image/png') + self.assertExtendedImageAttributes(image, desc='album cover', + type='front') + + def test_add_image_structure(self): + mediafile = self._mediafile_fixture('image') + self.assertEqual(len(mediafile.images), 2) + + image = TagImage(data=self.png_data, desc='the composer', + type=TagImage.COMPOSER) + mediafile.images += image + mediafile.write() + + mediafile = MediaFile(mediafile.path) + self.assertEqual(len(mediafile.images), 3) + self.assertExtendedImageAttributes(mediafile.images[2], + desc='another cover', type='composer') + + def test_mutate_image_structure(self): + mediafile = self._mediafile_fixture('image') + self.assertEqual(len(mediafile.images), 2) + + image = mediafile.images[0] + self.assertEqual(image.data, self.png_data) + self.assertEqual(image.mime_type, 'image/png') + self.assertExtendedImageAttributes(image, desc='album cover', + type='front') + + image.data = self.jpg_data + image.desc = 'new description' + image.type = TagImage.COMPOSER + mediafile.write() + + mediafile = MediaFile(mediafile.path) + self.assertEqual(len(mediafile.images), 2) + + image = mediafile.images[0] + self.assertEqual(image.data, self.jpg_data) + self.assertEqual(image.mime_type, 'image/jpeg') + self.assertExtendedImageAttributes(image, desc='new description', + type='composer') + + def test_delete_image_structure(self): + mediafile = self._mediafile_fixture('image') + self.assertEqual(len(mediafile.images), 2) + + del mediafile.images[0] + mediafile.write() + + mediafile = MediaFile(mediafile.path) + self.assertEqual(len(mediafile.images), 1) + self.assertEqual(image.data, self.png_data) + self.assertEqual(image.mime_type, 'image/jpg') + self.assertExtendedImageAttributes(image, desc='the artist', + type='performer') + + def assertExtendedImageAttributes(image, **kwargs): + """Ignore extended image attributes in the base tests. + """ + pass + + +class ExtendedImageStructureTestMixin(ImageStructureTestMixin): + """Checks for additional attributes in the image structure.""" + + def assertExtendedImageAttributes(image, desc, type): + self.assertEqual(image.desc, desc) + self.assertEqual(image.type, type) + + # TODO include this in ReadWriteTestBase if implemented class LazySaveTestMixin(object): """Mediafile should only write changes when tags have changed