From 2b6ae74885f3929fb802a6142c07c4ac536c4971 Mon Sep 17 00:00:00 2001
From: "J. Cliff Dyer" <cdyer@edx.org>
Date: Mon, 25 Jan 2016 19:22:58 +0000
Subject: [PATCH] fixup: dedupe test code.

---
 .../core/djangoapps/profile_images/images.py  |  5 +-
 .../profile_images/tests/helpers.py           |  2 +-
 .../profile_images/tests/test_images.py       | 60 +++++++++++--------
 3 files changed, 39 insertions(+), 28 deletions(-)

diff --git a/openedx/core/djangoapps/profile_images/images.py b/openedx/core/djangoapps/profile_images/images.py
index 190ea9c3189..5d0c7bdd0a4 100644
--- a/openedx/core/djangoapps/profile_images/images.py
+++ b/openedx/core/djangoapps/profile_images/images.py
@@ -210,7 +210,10 @@ def _update_exif_orientation(exif, orientation):
 
 
 def _get_exif_orientation(exif):
-    """Return the orientation value for the given Image object"""
+    """
+    Return the orientation value for the given Image object, or None if the
+    value is not set.
+    """
     exif_dict = piexif.load(exif)
     return exif_dict['0th'].get(piexif.ImageIFD.Orientation)
 
diff --git a/openedx/core/djangoapps/profile_images/tests/helpers.py b/openedx/core/djangoapps/profile_images/tests/helpers.py
index 42578f1bf2d..d3836017c8e 100644
--- a/openedx/core/djangoapps/profile_images/tests/helpers.py
+++ b/openedx/core/djangoapps/profile_images/tests/helpers.py
@@ -6,8 +6,8 @@ import os
 from tempfile import NamedTemporaryFile
 
 from django.core.files.uploadedfile import UploadedFile
-from PIL import Image
 import piexif
+from PIL import Image
 
 
 @contextmanager
diff --git a/openedx/core/djangoapps/profile_images/tests/test_images.py b/openedx/core/djangoapps/profile_images/tests/test_images.py
index 34efb2b6df7..253394b40b2 100644
--- a/openedx/core/djangoapps/profile_images/tests/test_images.py
+++ b/openedx/core/djangoapps/profile_images/tests/test_images.py
@@ -13,6 +13,7 @@ from django.test import TestCase
 from django.test.utils import override_settings
 import ddt
 import mock
+import piexif
 from PIL import Image
 
 from ..exceptions import ImageValidationError
@@ -127,6 +128,18 @@ class TestGenerateProfileImages(TestCase):
     """
     Test create_profile_images
     """
+
+    def check_exif_orientation(self, image, expected_orientation):
+        """
+        Check that the created object is a JPEG and that it has the expected
+        """
+        self.assertEqual(image.format, 'JPEG')
+        if expected_orientation is not None:
+            self.assertIn('exif', image.info)
+            self.assertEqual(_get_exif_orientation(image.info['exif']), expected_orientation)
+        else:
+            self.assertIsNone(_get_exif_orientation(image.info.get('exif', piexif.dump({}))))
+
     @ddt.data(
         *product(
             ["gif", "jpg", "png"],
@@ -148,44 +161,36 @@ class TestGenerateProfileImages(TestCase):
             1000: "thousand.jpg",
         }
         with make_uploaded_file(dimensions=dimensions, extension=extension, content_type=content_type) as uploaded_file:
-            names_and_files = self._create_mocked_profile_images(uploaded_file, requested_sizes)
+            names_and_images = self._create_mocked_profile_images(uploaded_file, requested_sizes)
             actual_sizes = {}
-            self.assertEqual(len(names_and_files), 3)
-            for name, file_ in names_and_files:
+            for name, image_obj in names_and_images:
                 # get the size of the image file and ensure it's square jpeg
-                with closing(Image.open(file_)) as image_obj:
-                    width, height = image_obj.size
-                    self.assertEqual(width, height)
-                    self.assertEqual(image_obj.format, 'JPEG')
-                    actual_sizes[width] = name
+                width, height = image_obj.size
+                self.assertEqual(width, height)
+                actual_sizes[width] = name
             self.assertEqual(requested_sizes, actual_sizes)
 
     def test_jpeg_with_exif_orientation(self):
-        requested_images = {10: "ten.jpg"}
+        requested_images = {10: "ten.jpg", 100: "hunnert.jpg"}
         rotate_90_clockwise = 8  # Value used in EXIF Orientation field.
         with make_image_file(orientation=rotate_90_clockwise, extension='.jpg') as imfile:
-            names_and_files = self._create_mocked_profile_images(imfile, requested_images)
-        self.assertEqual(len(names_and_files), 1)
-        for file_ in [nf[1] for nf in names_and_files]:
-            with closing(Image.open(file_)) as image_obj:
-                self.assertEqual(image_obj.format, 'JPEG')
-                self.assertIn('exif', image_obj.info)
-                self.assertEqual(_get_exif_orientation(image_obj.info['exif']), rotate_90_clockwise)
+            for _, image in self._create_mocked_profile_images(imfile, requested_images):
+                self.check_exif_orientation(image, rotate_90_clockwise)
 
     def test_jpeg_without_exif_orientation(self):
-        requested_images = {10: "ten.jpg"}
+        requested_images = {10: "ten.jpg", 100: "hunnert.jpg"}
         with make_image_file(extension='.jpg') as imfile:
-            names_and_files = self._create_mocked_profile_images(imfile, requested_images)
-        self.assertEqual(len(names_and_files), 1)
-        for file_ in [nf[1] for nf in names_and_files]:
-            with closing(Image.open(file_)) as image_obj:
-                self.assertEqual(image_obj.format, 'JPEG')
-                self.assertNotIn('exif', image_obj.info)
+            for _, image in self._create_mocked_profile_images(imfile, requested_images):
+                self.check_exif_orientation(image, None)
 
     def _create_mocked_profile_images(self, image_file, requested_images):
         """
-        Create image files with mocked-out storage.  Return a list of tuples
-        consisting of the name and content of the file.
+        Create image files with mocked-out storage.
+
+        Verifies that an image was created for each element in
+        requested_images, and returns an iterator of 2-tuples representing
+        those imageswhere each tuple consists of a filename and a PIL.Image
+        object.
         """
         mock_storage = mock.Mock()
         with mock.patch(
@@ -194,7 +199,10 @@ class TestGenerateProfileImages(TestCase):
         ):
             create_profile_images(image_file, requested_images)
         names_and_files = [v[0] for v in mock_storage.save.call_args_list]
-        return names_and_files
+        self.assertEqual(len(names_and_files), len(requested_images))
+        for name, file_ in names_and_files:
+            with closing(Image.open(file_)) as image:
+                yield name, image
 
 
 @unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Profile Image API is only supported in LMS')
-- 
GitLab