Merge remote-tracking branch 'refs/remotes/elrond/sql/final'
authorChristopher Allan Webber <cwebber@dustycloud.org>
Sun, 1 Apr 2012 20:36:11 +0000 (15:36 -0500)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Sun, 1 Apr 2012 20:36:11 +0000 (15:36 -0500)
Conflicts:
mediagoblin/tests/test_submission.py

Also, WHOO SQL SWITCHOVER PARTY!

        ASCII DANCE PARTY

    /_o_/    \ /   \o_    o
     (       _|_    )    //)
     /\     / o \  /|     /|

      *BMCH BMCH BMCH BMCH*
%
 /_o_/   HHHYAAaaaaa
  /_
 / /
%
AAAAAHAHAHAHAHHHAAHA
       ,,          .------
      o_o ;;       /\\     \    $  __
      '\/ ||      // \\     #     /_/
        \//      // //\\     \
         )             \\     \   %
        \\              \\_____\
        | )            //-------
       /_/_           //     //

       SWITCH YOUR DATABASE
     FLIP A FUKKEN BOOLEAN
%
             __________
          .-'          '-.
        .'                '.
      .'  _--_        _--_  '.
     /   /  (_).     /  (_).  \
    .   |      |    |      |   .
    |    ._____,     ._____,   |
    |   ____________________   |
    |    |                 |   |
    '    \                 /   '
     \    '.        .----./   /
      \     '._    /     /   /
       '.      '--------'  .'
         '._            _.'
            '----------'

1  2 
mediagoblin/tests/test_submission.py

index b9b7388eab01bbab7cff4e48aae4a5e2fb888892,9b503f4fd70bc1cf9d14bf5eb4404a55bb56342f..8d1b3745ec5885c518198b5910d9c083adb3ed9f
@@@ -66,25 -61,6 +66,25 @@@ class TestSubmission
      def logout(self):
          self.test_app.get('/auth/logout/')
  
-     def check_comments(self, request, media, count):
-         comments = request.db.MediaComment.find({'media_entry': media._id})
 +    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 check_comments(self, request, media_id, count):
++        comments = request.db.MediaComment.find({'media_entry': media_id})
 +        assert_equal(count, len(list(comments)))
 +
      def test_missing_fields(self):
          # Test blank form
          # ---------------
      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']
 -        media = request.db.MediaEntry.find({'title': 'Balanced Goblin'})[0]
 +        response, request = self.do_post({'title': 'Balanced Goblin',
 +                                          'tags': GOOD_TAG_STRING},
 +                                         *REQUEST_CONTEXT, do_follow=True,
 +                                         **self.upload_data(GOOD_JPG))
 +        media = self.check_media(request, {'title': 'Balanced Goblin'}, 1)
-         assert_equal(media.tags,
-                      [{'name': u'yin', 'slug': u'yin'},
-                       {'name': u'yang', 'slug': u'yang'}])
+         assert media.tags[0]['name'] == u'yin'
+         assert media.tags[0]['slug'] == u'yin'
+         assert media.tags[1]['name'] == u'yang'
+         assert media.tags[1]['slug'] == u'yang'
  
          # 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']
 -        assert form.tags.errors == [
 -            u'Tags must be shorter than 50 characters.  Tags that are too long'\
 -             ': ffffffffffffffffffffffffffuuuuuuuuuuuuuuuuuuuuuuuuuu']
 +        response, form = self.do_post({'title': 'Balanced Goblin',
 +                                       'tags': BAD_TAG_STRING},
 +                                      *FORM_CONTEXT,
 +                                      **self.upload_data(GOOD_JPG))
 +        assert_equal(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']
 -
 -        media = request.db.MediaEntry.find({'title': 'Balanced Goblin'})[0]
 -
 -        # Does media entry exist?
 -        assert_true(media)
 +        response, request = self.do_post({'title': 'Balanced Goblin'},
 +                                         *REQUEST_CONTEXT, do_follow=True,
 +                                         **self.upload_data(GOOD_JPG))
 +        media = self.check_media(request, {'title': 'Balanced Goblin'}, 1)
++        media_id = media.id
  
          # Add a comment, so we can test for its deletion later.
-         self.check_comments(request, media, 0)
 -        media_id = media.id
 -        get_comments = lambda: list(
 -            request.db.MediaComment.find({'media_entry': media_id}))
 -        assert_false(get_comments())
 -        response = self.test_app.post(
 -            request.urlgen('mediagoblin.user_pages.media_post_comment',
 -                           user=self.test_user.username,
 -                           media=media._id),
 -            {'comment_content': 'i love this test'})
 -        response.follow()
 -        assert_true(get_comments())
++        self.check_comments(request, media_id, 0)
 +        comment_url = request.urlgen(
 +            'mediagoblin.user_pages.media_post_comment',
-             user=self.test_user.username, media=media._id)
++            user=self.test_user.username, media=media_id)
 +        response = self.do_post({'comment_content': 'i love this test'},
 +                                url=comment_url, do_follow=True)[0]
-         self.check_comments(request, media, 1)
++        self.check_comments(request, media_id, 1)
  
          # 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']
 -
 -        media = request.db.MediaEntry.find({'title': 'Balanced Goblin'})[0]
 -
 -        # Does media entry still exist?
 -        assert_true(media)
 +        delete_url = request.urlgen(
 +            'mediagoblin.user_pages.media_confirm_delete',
-             user=self.test_user.username, media=media._id)
++            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 = self.check_media(request, {'title': 'Balanced Goblin'}, 1)
++        media_id = media.id
  
          # 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']
 -
 -        # Does media entry still exist?
 -        assert_false(
 -            request.db.MediaEntry.find(
 -                {'_id': media._id}).count())
 +        response, request = self.do_post({'confirm': 'y'}, *REQUEST_CONTEXT,
 +                                         do_follow=True, url=delete_url)
-         self.check_media(request, {'_id': media._id}, 0)
-         self.check_comments(request, media, 0)
++        self.check_media(request, {'_id': media_id}, 0)
++        self.check_comments(request, media_id, 0)
  
 -        # How about the comment?
 -        assert_false(get_comments())
 -
 -    def test_malicious_uploads(self):
 +    def test_evil_file(self):
          # Test non-suppoerted file with non-supported extension
          # -----------------------------------------------------
 +        response, form = self.do_post({'title': 'Malicious Upload 1'},
 +                                      *FORM_CONTEXT,
 +                                      **self.upload_data(EVIL_FILE))
 +        assert_equal(len(form.file.errors), 1)
 +        assert 'Sorry, I don\'t support that file type :(' == \
 +                str(form.file.errors[0])
 +
 +    def test_sniffing(self):
 +        '''
 +        Test sniffing mechanism to assert that regular uploads work as intended
 +        '''
          template.clear_test_template_context()
          response = self.test_app.post(
              '/submit/', {
          # NOTE: The following 2 tests will ultimately fail, but they
          #   *will* pass the initial form submission step.  Instead,
          #   they'll be caught as failures during the processing step.
 +        response, context = self.do_post({'title': title}, do_follow=True,
 +                                         **self.upload_data(filename))
 +        self.check_url(response, '/u/{0}/'.format(self.test_user.username))
 +        entry = mg_globals.database.MediaEntry.find_one({'title': title})
 +        assert_equal(entry.state, 'failed')
 +        assert_equal(entry.fail_error, u'mediagoblin.processing:BadMediaFail')
  
 +    def test_evil_jpg(self):
          # 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()
 -        assert_equal(
 -            urlparse.urlsplit(response.location)[2],
 -            '/u/chris/')
 -
 -        entry = mg_globals.database.MediaEntry.find_one(
 -            {'title': 'Malicious Upload 2'})
 -        assert_equal(entry.state, 'failed')
 -        assert_equal(
 -            entry.fail_error,
 -            u'mediagoblin.processing:BadMediaFail')
 +        self.check_false_image('Malicious Upload 2', EVIL_JPG)
  
 +    def test_evil_png(self):
          # 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()
 -        assert_equal(
 -            urlparse.urlsplit(response.location)[2],
 -            '/u/chris/')
 -
 -        entry = mg_globals.database.MediaEntry.find_one(
 -            {'title': 'Malicious Upload 3'})
 -        assert_equal(entry.state, 'failed')
 -        assert_equal(
 -            entry.fail_error,
 -            u'mediagoblin.processing:BadMediaFail')
 +        self.check_false_image('Malicious Upload 3', EVIL_PNG)
 +
 +    def test_processing(self):
 +        data = {'title': 'Big Blue'}
 +        response, request = self.do_post(data, *REQUEST_CONTEXT, do_follow=True,
 +                                         **self.upload_data(BIG_BLUE))
 +        media = self.check_media(request, data, 1)
 +        last_size = 1024 ** 3  # Needs to be larger than bigblue.png
 +        for key, basename in (('original', 'bigblue.png'),
 +                              ('medium', 'bigblue.medium.png'),
 +                              ('thumb', 'bigblue.thumbnail.png')):
 +            # Does the processed image have a good filename?
 +            filename = resource_filename(
 +                'mediagoblin.tests',
 +                os.path.join('test_user_dev/media/public',
-                              *media['media_files'].get(key, [])))
++                             *media.media_files.get(key, [])))
 +            assert_true(filename.endswith('_' + basename))
 +            # Is it smaller than the last processed image we looked at?
 +            size = os.stat(filename).st_size
 +            assert_true(last_size > size)
 +            last_size = size