ASCII media type support & fix a bug in file submission error handling
[mediagoblin.git] / mediagoblin / tests / test_submission.py
index b70138394fe4d8f56118f2f37f57c66b301b3a94..4a0543a86e7e4e30e243cb5a4c1f6507ef1c6da3 100644 (file)
@@ -1,3 +1,4 @@
+
 # GNU MediaGoblin -- federated, autonomous media hosting
 # Copyright (C) 2011 MediaGoblin contributors.  See AUTHORS.
 #
 
 import urlparse
 import pkg_resources
+import re
 
 from nose.tools import assert_equal, assert_true, assert_false
 
-from mediagoblin.auth import lib as auth_lib
-from mediagoblin.tests.tools import setup_fresh_app, get_test_app
+from mediagoblin.tests.tools import setup_fresh_app, get_test_app, \
+    fixture_add_user
 from mediagoblin import mg_globals
-from mediagoblin import util
+from mediagoblin.tools import template, common
 
 GOOD_JPG = pkg_resources.resource_filename(
   'mediagoblin.tests', 'test_submission/good.jpg')
@@ -45,13 +47,7 @@ class TestSubmission:
 
         # TODO: Possibly abstract into a decorator like:
         # @as_authenticated_user('chris')
-        test_user = mg_globals.database.User()
-        test_user['username'] = u'chris'
-        test_user['email'] = u'chris@example.com'
-        test_user['email_verified'] = True
-        test_user['status'] = u'active'
-        test_user['pw_hash'] = auth_lib.bcrypt_gen_password_hash('toast')
-        test_user.save()
+        test_user = fixture_add_user()
 
         self.test_user = test_user
 
@@ -63,20 +59,20 @@ class TestSubmission:
     def test_missing_fields(self):
         # Test blank form
         # ---------------
-        util.clear_test_template_context()
+        template.clear_test_template_context()
         response = self.test_app.post(
             '/submit/', {})
-        context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html']
+        context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html']
         form = context['submit_form']
         assert form.file.errors == [u'You must provide a file.']
 
         # Test blank file
         # ---------------
-        util.clear_test_template_context()
+        template.clear_test_template_context()
         response = self.test_app.post(
             '/submit/', {
                 'title': 'test title'})
-        context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html']
+        context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html']
         form = context['submit_form']
         assert form.file.errors == [u'You must provide a file.']
 
@@ -84,7 +80,7 @@ class TestSubmission:
     def test_normal_uploads(self):
         # Test JPG
         # --------
-        util.clear_test_template_context()
+        template.clear_test_template_context()
         response = self.test_app.post(
             '/submit/', {
                 'title': 'Normal upload 1'
@@ -96,12 +92,12 @@ class TestSubmission:
         assert_equal(
             urlparse.urlsplit(response.location)[2],
             '/u/chris/')
-        assert util.TEMPLATE_TEST_CONTEXT.has_key(
+        assert template.TEMPLATE_TEST_CONTEXT.has_key(
             'mediagoblin/user_pages/user.html')
 
         # Test PNG
         # --------
-        util.clear_test_template_context()
+        template.clear_test_template_context()
         response = self.test_app.post(
             '/submit/', {
                 'title': 'Normal upload 2'
@@ -112,13 +108,13 @@ class TestSubmission:
         assert_equal(
             urlparse.urlsplit(response.location)[2],
             '/u/chris/')
-        assert util.TEMPLATE_TEST_CONTEXT.has_key(
+        assert template.TEMPLATE_TEST_CONTEXT.has_key(
             'mediagoblin/user_pages/user.html')
 
     def test_tags(self):
         # Good tag string
         # --------
-        util.clear_test_template_context()
+        template.clear_test_template_context()
         response = self.test_app.post(
             '/submit/', {
                 'title': 'Balanced Goblin',
@@ -128,7 +124,7 @@ class TestSubmission:
 
         # New media entry with correct tags should be created
         response.follow()
-        context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/user_pages/user.html']
+        context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/user_pages/user.html']
         request = context['request']
         media = request.db.MediaEntry.find({'title': 'Balanced Goblin'})[0]
         assert_equal(media['tags'],
@@ -137,7 +133,7 @@ class TestSubmission:
 
         # Test tags that are too long
         # ---------------
-        util.clear_test_template_context()
+        template.clear_test_template_context()
         response = self.test_app.post(
             '/submit/', {
                 'title': 'Balanced Goblin',
@@ -146,14 +142,14 @@ class TestSubmission:
                     'file', GOOD_JPG)])
 
         # Too long error should be raised
-        context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html']
+        context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html']
         form = context['submit_form']
         assert form.tags.errors == [
             u'Tags must be shorter than 50 characters.  Tags that are too long'\
              ': ffffffffffffffffffffffffffuuuuuuuuuuuuuuuuuuuuuuuuuu']
 
     def test_delete(self):
-        util.clear_test_template_context()
+        template.clear_test_template_context()
         response = self.test_app.post(
             '/submit/', {
                 'title': 'Balanced Goblin',
@@ -163,7 +159,7 @@ class TestSubmission:
         # Post image
         response.follow()
 
-        request = util.TEMPLATE_TEST_CONTEXT[
+        request = template.TEMPLATE_TEST_CONTEXT[
             'mediagoblin/user_pages/user.html']['request']
 
         media = request.db.MediaEntry.find({'title': 'Balanced Goblin'})[0]
@@ -176,13 +172,14 @@ class TestSubmission:
         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': 'False'})
+                           user=self.test_user.username,
+                           media=media._id),
+            # no value means no confirm
+            {})
 
         response.follow()
 
-        request = util.TEMPLATE_TEST_CONTEXT[
+        request = template.TEMPLATE_TEST_CONTEXT[
             'mediagoblin/user_pages/user.html']['request']
 
         media = request.db.MediaEntry.find({'title': 'Balanced Goblin'})[0]
@@ -195,33 +192,34 @@ class TestSubmission:
         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': 'True'})
+                           user=self.test_user.username,
+                           media=media._id),
+            {'confirm': 'y'})
 
         response.follow()
 
-        request = util.TEMPLATE_TEST_CONTEXT[
+        request = template.TEMPLATE_TEST_CONTEXT[
             'mediagoblin/user_pages/user.html']['request']
 
         # Does media entry still exist?
         assert_false(
             request.db.MediaEntry.find(
-                {'_id': media['_id']}).count())
+                {'_id': media._id}).count())
 
     def test_malicious_uploads(self):
         # Test non-suppoerted file with non-supported extension
         # -----------------------------------------------------
-        util.clear_test_template_context()
+        template.clear_test_template_context()
         response = self.test_app.post(
             '/submit/', {
                 'title': 'Malicious Upload 1'
                 }, upload_files=[(
                     'file', EVIL_FILE)])
 
-        context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html']
+        context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html']
         form = context['submit_form']
-        assert form.file.errors == ['The file doesn\'t seem to be an image!']
+        assert re.match(r'^Could not extract any file extension from ".*?"$', str(form.file.errors[0]))
+        assert len(form.file.errors) == 1
 
         # NOTE: The following 2 tests will ultimately fail, but they
         #   *will* pass the initial form submission step.  Instead,
@@ -229,7 +227,7 @@ class TestSubmission:
 
         # Test non-supported file with .jpg extension
         # -------------------------------------------
-        util.clear_test_template_context()
+        template.clear_test_template_context()
         response = self.test_app.post(
            '/submit/', {
                'title': 'Malicious Upload 2'
@@ -245,11 +243,11 @@ class TestSubmission:
         assert_equal(entry['state'], 'failed')
         assert_equal(
             entry['fail_error'],
-            u'mediagoblin.process_media.errors:BadMediaFail')
+            u'mediagoblin.processing:BadMediaFail')
 
         # Test non-supported file with .png extension
         # -------------------------------------------
-        util.clear_test_template_context()
+        template.clear_test_template_context()
         response = self.test_app.post(
            '/submit/', {
                'title': 'Malicious Upload 3'
@@ -265,4 +263,4 @@ class TestSubmission:
         assert_equal(entry['state'], 'failed')
         assert_equal(
             entry['fail_error'],
-            u'mediagoblin.process_media.errors:BadMediaFail')
+            u'mediagoblin.processing:BadMediaFail')