Refactor data posts into one do_post function.
authorBrett Smith <brettcsmith@brettcsmith.org>
Wed, 21 Mar 2012 02:07:32 +0000 (22:07 -0400)
committerBrett Smith <brettcsmith@brettcsmith.org>
Wed, 21 Mar 2012 02:07:32 +0000 (22:07 -0400)
All the data posts in these tests had a lot of common code.  Putting all
that into a function makes it easier to write more tests (which I'll be
doing in a bit) and see what's really being tested.

mediagoblin/tests/test_submission.py

index 2f11bdfbd726351d9d0f2ff06e3bf24381243ac5..730efbd289798ab4c9bf5ac6e3a05a3b0782960a 100644 (file)
@@ -39,6 +39,8 @@ EVIL_PNG = pkg_resources.resource_filename(
 GOOD_TAG_STRING = 'yin,yang'
 BAD_TAG_STRING = 'rage,' + 'f' * 26 + 'u' * 26
 
+FORM_CONTEXT = ['mediagoblin/submit/start.html', 'submit_form']
+REQUEST_CONTEXT = ['mediagoblin/user_pages/user.html', 'request']
 
 class TestSubmission:
     def setUp(self):
@@ -61,39 +63,39 @@ class TestSubmission:
     def logout(self):
         self.test_app.get('/auth/logout/')
 
+    def do_post(self, data, *context_keys, **kwargs):
+        url = kwargs.pop('url', '/submit/')
+        do_follow = kwargs.pop('do_follow', False)
+        template.clear_test_template_context()
+        response = self.test_app.post(url, data, **kwargs)
+        if do_follow:
+            response.follow()
+        context_data = template.TEMPLATE_TEST_CONTEXT
+        for key in context_keys:
+            context_data = context_data[key]
+        return response, context_data
+        
+    def upload_data(self, filename):
+        return {'upload_files': [('file', filename)]}
+
     def test_missing_fields(self):
         # Test blank form
         # ---------------
-        template.clear_test_template_context()
-        response = self.test_app.post(
-            '/submit/', {})
-        context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html']
-        form = context['submit_form']
+        response, form = self.do_post({}, *FORM_CONTEXT)
         assert form.file.errors == [u'You must provide a file.']
 
         # Test blank file
         # ---------------
-        template.clear_test_template_context()
-        response = self.test_app.post(
-            '/submit/', {
-                'title': 'test title'})
-        context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html']
-        form = context['submit_form']
+        response, form = self.do_post({'title': 'test title'}, *FORM_CONTEXT)
         assert form.file.errors == [u'You must provide a file.']
 
 
     def test_normal_uploads(self):
         # Test JPG
         # --------
-        template.clear_test_template_context()
-        response = self.test_app.post(
-            '/submit/', {
-                'title': 'Normal upload 1'
-                }, upload_files=[(
-                    'file', GOOD_JPG)])
-
-        # User should be redirected
-        response.follow()
+        response, context = self.do_post({'title': 'Normal upload 1'},
+                                         do_follow=True,
+                                         **self.upload_data(GOOD_JPG))
         assert_equal(
             urlparse.urlsplit(response.location)[2],
             '/u/chris/')
@@ -110,14 +112,9 @@ class TestSubmission:
 
         # Test PNG
         # --------
-        template.clear_test_template_context()
-        response = self.test_app.post(
-            '/submit/', {
-                'title': 'Normal upload 2'
-                }, upload_files=[(
-                    'file', GOOD_PNG)])
-
-        response.follow()
+        response, context = self.do_post({'title': 'Normal upload 2'},
+                                         do_follow=True,
+                                         **self.upload_data(GOOD_PNG))
         assert_equal(
             urlparse.urlsplit(response.location)[2],
             '/u/chris/')
@@ -127,18 +124,10 @@ class TestSubmission:
     def test_tags(self):
         # Good tag string
         # --------
-        template.clear_test_template_context()
-        response = self.test_app.post(
-            '/submit/', {
-                'title': 'Balanced Goblin',
-                'tags': GOOD_TAG_STRING
-                }, upload_files=[(
-                    'file', GOOD_JPG)])
-
-        # New media entry with correct tags should be created
-        response.follow()
-        context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/user_pages/user.html']
-        request = context['request']
+        response, request = self.do_post({'title': 'Balanced Goblin',
+                                          'tags': GOOD_TAG_STRING},
+                                         *REQUEST_CONTEXT, do_follow=True,
+                                         **self.upload_data(GOOD_JPG))
         media = request.db.MediaEntry.find({'title': 'Balanced Goblin'})[0]
         assert_equal(media.tags,
                      [{'name': u'yin', 'slug': u'yin'},
@@ -146,35 +135,18 @@ class TestSubmission:
 
         # Test tags that are too long
         # ---------------
-        template.clear_test_template_context()
-        response = self.test_app.post(
-            '/submit/', {
-                'title': 'Balanced Goblin',
-                'tags': BAD_TAG_STRING
-                }, upload_files=[(
-                    'file', GOOD_JPG)])
-
-        # Too long error should be raised
-        context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html']
-        form = context['submit_form']
+        response, form = self.do_post({'title': 'Balanced Goblin',
+                                       'tags': BAD_TAG_STRING},
+                                      *FORM_CONTEXT,
+                                      **self.upload_data(GOOD_JPG))
         assert form.tags.errors == [
             u'Tags must be shorter than 50 characters.  Tags that are too long'\
              ': ffffffffffffffffffffffffffuuuuuuuuuuuuuuuuuuuuuuuuuu']
 
     def test_delete(self):
-        template.clear_test_template_context()
-        response = self.test_app.post(
-            '/submit/', {
-                'title': 'Balanced Goblin',
-                }, upload_files=[(
-                    'file', GOOD_JPG)])
-
-        # Post image
-        response.follow()
-
-        request = template.TEMPLATE_TEST_CONTEXT[
-            'mediagoblin/user_pages/user.html']['request']
-
+        response, request = self.do_post({'title': 'Balanced Goblin'},
+                                         *REQUEST_CONTEXT, do_follow=True,
+                                         **self.upload_data(GOOD_JPG))
         media = request.db.MediaEntry.find({'title': 'Balanced Goblin'})[0]
 
         # Does media entry exist?
@@ -182,19 +154,11 @@ class TestSubmission:
 
         # Do not confirm deletion
         # ---------------------------------------------------
-        response = self.test_app.post(
-            request.urlgen('mediagoblin.user_pages.media_confirm_delete',
-                           # No work: user=media.uploader().username,
-                           user=self.test_user.username,
-                           media=media._id),
-            # no value means no confirm
-            {})
-
-        response.follow()
-
-        request = template.TEMPLATE_TEST_CONTEXT[
-            'mediagoblin/user_pages/user.html']['request']
-
+        delete_url = request.urlgen(
+            'mediagoblin.user_pages.media_confirm_delete',
+            user=self.test_user.username, media=media._id)
+        # Empty data means don't confirm
+        response = self.do_post({}, do_follow=True, url=delete_url)[0]
         media = request.db.MediaEntry.find({'title': 'Balanced Goblin'})[0]
 
         # Does media entry still exist?
@@ -202,18 +166,8 @@ class TestSubmission:
 
         # Confirm deletion
         # ---------------------------------------------------
-        response = self.test_app.post(
-            request.urlgen('mediagoblin.user_pages.media_confirm_delete',
-                           # No work: user=media.uploader().username,
-                           user=self.test_user.username,
-                           media=media._id),
-            {'confirm': 'y'})
-
-        response.follow()
-
-        request = template.TEMPLATE_TEST_CONTEXT[
-            'mediagoblin/user_pages/user.html']['request']
-
+        response, request = self.do_post({'confirm': 'y'}, *REQUEST_CONTEXT,
+                                         do_follow=True, url=delete_url)
         # Does media entry still exist?
         assert_false(
             request.db.MediaEntry.find(
@@ -222,15 +176,9 @@ class TestSubmission:
     def test_malicious_uploads(self):
         # Test non-suppoerted file with non-supported extension
         # -----------------------------------------------------
-        template.clear_test_template_context()
-        response = self.test_app.post(
-            '/submit/', {
-                'title': 'Malicious Upload 1'
-                }, upload_files=[(
-                    'file', EVIL_FILE)])
-
-        context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html']
-        form = context['submit_form']
+        response, form = self.do_post({'title': 'Malicious Upload 1'},
+                                      *FORM_CONTEXT,
+                                      **self.upload_data(EVIL_FILE))
         assert re.match(r'^Could not extract any file extension from ".*?"$', str(form.file.errors[0]))
         assert len(form.file.errors) == 1
 
@@ -240,13 +188,9 @@ class TestSubmission:
 
         # Test non-supported file with .jpg extension
         # -------------------------------------------
-        template.clear_test_template_context()
-        response = self.test_app.post(
-           '/submit/', {
-               'title': 'Malicious Upload 2'
-               }, upload_files=[(
-                   'file', EVIL_JPG)])
-        response.follow()
+        response, context = self.do_post({'title': 'Malicious Upload 2'},
+                                         do_follow=True,
+                                         **self.upload_data(EVIL_JPG))
         assert_equal(
             urlparse.urlsplit(response.location)[2],
             '/u/chris/')
@@ -260,13 +204,9 @@ class TestSubmission:
 
         # Test non-supported file with .png extension
         # -------------------------------------------
-        template.clear_test_template_context()
-        response = self.test_app.post(
-           '/submit/', {
-               'title': 'Malicious Upload 3'
-               }, upload_files=[(
-                   'file', EVIL_PNG)])
-        response.follow()
+        response, context = self.do_post({'title': 'Malicious Upload 3'},
+                                         do_follow=True,
+                                         **self.upload_data(EVIL_PNG))
         assert_equal(
             urlparse.urlsplit(response.location)[2],
             '/u/chris/')