Beispiel #1
0
    def test_video_tags_are_replaced_properly(self):
        attrs = {
            'category': self.test_category,
            'title': 'Jinja2 в Django',
            'recorded': '2013-12-09',
        }

        video = Video.objects.create(**attrs)
        video.tags = [
            Tag.objects.create(tag='foo'),
            Tag.objects.create(tag='jinja2')
        ]

        obj_tags = [tag.tag for tag in video.tags.all()]
        self.assertCountEqual(obj_tags, ['foo', 'jinja2'])

        data = {
            'category': self.test_category.pk,
            'title': 'Jinja2 в Django',
            'date': '2013-12-09',
            'url': 'http://example.org/',
            'tags': ['Jinja2', 'django', 'templates']  # foo has been removed
        }

        serializer = serializers.VideoSerializer(data=data)
        serializer.is_valid()
        self.assertFalse(serializer.errors)
        serializer.save()

        obj_tags = [tag.tag for tag in video.tags.all()]
        self.assertCountEqual(obj_tags, ['jinja2', 'django', 'templates'])
Beispiel #2
0
    def test_when_video_tag_list_emptied_the_tags_remain_in_db(self):
        attrs = {
            'category': self.test_category,
            'title': 'Foo',
            'source_url': 'http://example.org/',
        }
        video = Video.objects.create(**attrs)
        video.tags = [
            Tag.objects.create(tag='foo'),
            Tag.objects.create(tag='bar')
        ]

        self.assertEqual(video.tags.count(), 2)
        self.assertEqual(Tag.objects.count(), 2)

        data = {
            'category': self.test_category.pk,
            'title': 'Foo',
            'url': 'http://example.org/',
            'tags': [],
        }

        serializer = serializers.VideoSerializer(data=data)
        serializer.is_valid()
        serializer.save()
        self.assertEqual(serializer.object.pk, video.pk)

        self.assertEqual(video.tags.count(), 0)
        self.assertEqual(Tag.objects.count(), 2)
Beispiel #3
0
    def test_video_model_slug_is_not_editable(self):
        attrs = {
            'category': self.test_category,
            'title': 'Foo Bar Ham 2014',
            'description': 'Foo Description',
            'source_url': 'http://example.org/',
        }
        video = Video.objects.create(**attrs)

        self.assertEqual(video.slug, 'foo-bar-ham-2014')

        data = {
            'category': self.test_category.pk,
            'title': 'Foo Bar Ham 2014',
            'description': 'Foo Bar Ham 2014 Description',
            'slug': 'manually-inserted-slug',
            'url': 'http://example.org/',
        }

        serializer = serializers.VideoSerializer(data=data)
        serializer.is_valid()
        serializer.save()

        # ensure this is the same object
        self.assertEqual(serializer.object.pk, video.pk)

        video = Video.objects.get(pk=video.pk)
        # ensure description has been updated
        self.assertEqual(video.description, 'Foo Bar Ham 2014 Description')
        # while the slug has not
        self.assertEqual(video.slug, 'foo-bar-ham-2014')
Beispiel #4
0
    def test_updating_existing_video_url_keeps_its_state_unchanged(self):
        attrs = {
            'category': self.test_category,
            'title': 'Foo',
            'source_url': 'http://example.org/',
            'state': Video.STATE_LIVE,
            'embed': '<iframe src="http://example.org/"></iframe>'
        }
        video = Video.objects.create(**attrs)

        # the video is live
        self.assertEqual(
            Video.objects.get(pk=video.pk).state, Video.STATE_LIVE)

        data = {
            'category': self.test_category.pk,
            'title': 'Foo',
            'url': 'http://example.com/',
        }

        serializer = serializers.VideoSerializer(data=data)
        serializer.is_valid()
        serializer.save()

        video = Video.objects.get(pk=video.pk)
        self.assertEqual(video.embed, '')
        self.assertEqual(video.state, Video.STATE_LIVE)
Beispiel #5
0
    def test_speaker_list_contains_unique_names(self):
        Speaker.objects.create(name='Armin Ronacher')

        data = {
            'category':
            Category.objects.create(title='Pycon Russia 2014').pk,
            'title':
            'Writing Secure APIs',
            'date':
            '2014-06-02',
            'speakers': [
                'Armin Ronacher',
                'Armin Ronacher',
                'Armin Ronacher',
                'armin ronacher',
                'armin Ronacher',
                'Armin ronacher',
            ],
            'url':
            'http://example.org/',
        }

        serializer = serializers.VideoSerializer(data=data)
        self.assertTrue(serializer.is_valid())
        serializer.save()

        # no extra speaker objects were created
        self.assertEqual(Speaker.objects.count(), 1)
        # the speakers list was trimmed down to 1 entry
        self.assertEqual(serializer.object.speakers.count(), 1)
Beispiel #6
0
    def test_when_speakers_list_is_emptied_the_speakers_remain_in_db(self):
        attrs = {
            'category': self.test_category,
            'title': 'На что уходит память?',
            'recorded': '2014-06-02',
            'source_url': 'http://example.org/',
        }

        self.assertEqual(Video.objects.count(), 0)

        video = Video.objects.create(**attrs)
        video.speakers = [Speaker.objects.create(name='Константин Лопухин')]

        self.assertEqual(video.speakers.count(), 1)
        self.assertEqual(Video.objects.count(), 1)

        data = {
            'category': self.test_category.pk,
            'title': 'На что уходит память?',
            'date': '2014-06-02',
            'url': 'http://example.org/',
            # speaker list is emptied
        }

        serializer = serializers.VideoSerializer(data=data)
        serializer.is_valid()
        serializer.save()

        self.assertEqual(video.speakers.count(), 0)
        self.assertEqual(Video.objects.count(), 1)
Beispiel #7
0
 def test_good_values(self):
     good_values = (
         {
             'category': self.category.pk,
             'title': 'Bar',
             'url': 'http://example.org/'
         },
         {
             'category': self.category.pk,
             'title': 'Bar',
             'summary': 'Foo Bar',
             'url': 'http://example.org/'
         },
         {
             'category': self.category.pk,
             'title': 'Bar',
             'url': 'http://example.org/',
             'language': 'Russian'
         },
         {
             'category': self.category.pk,
             'title': 'Bar',
             'url': 'http://example.org/',
             'language': 'English'
         },
         {
             'category': self.category.pk,
             'title': 'Bar',
             'url': 'http://example.org/',
             'speakers': []
         },
         {
             'category': self.category.pk,
             'title': 'Bar',
             'url': 'http://example.org/',
             'tags': []
         },
         {
             'category': self.category.pk,
             'title': 'Bar',
             'url': 'http://example.org/',
             'speakers': ['Foo Bar', 'Bar Foo']
         },
         {
             'category': self.category.pk,
             'title': 'Bar',
             'url': 'http://example.org/',
             'tags': ['foo', 'bar']
         },
         {
             'category': self.category.pk,
             'title': 'Bar',
             'url': 'http://example.org/',
             'date': '2014-02-23'
         },
     )
     for data in good_values:
         serializer = serializers.VideoSerializer(data=data)
         self.assertTrue(serializer.is_valid(), 'data=%s' % data)
Beispiel #8
0
    def test_invalid_language(self):
        data = {
            'category': Category.objects.create(title='Foo').pk,
            'title': 'Bar',
            'language': 'Gibberish',
            'url': 'http://example.org/',
        }

        serializer = serializers.VideoSerializer(data=data)
        self.assertFalse(serializer.is_valid())
Beispiel #9
0
    def test_speakers_are_created(self):
        data = {
            'category': Category.objects.create(title='Moscow Django').pk,
            'title': 'Что нового в Django 1.5',
            'speakers': ['Илья Барышев'],
            'url': 'http://example.org/',
        }

        serializer = serializers.VideoSerializer(data=data)
        self.assertTrue(serializer.is_valid())
        serializer.save()

        Speaker.objects.get(name='Илья Барышев')
Beispiel #10
0
    def test_video_tag_list_is_unique(self):
        data = {
            'category': self.test_category.pk,
            'title': 'Bar',
            'tags': ['baz', 'baz', 'BaZ', 'BAZ', 'BAZ', 'foo'],
            'url': 'http://example.org/',
        }
        serializer = serializers.VideoSerializer(data=data)
        serializer.is_valid()
        serializer.save()

        obj_tags = [tag.tag for tag in serializer.object.tags.all()]
        self.assertCountEqual(obj_tags, ['baz', 'foo'])
Beispiel #11
0
    def test_new_video_is_saved_as_live(self):
        data = {
            'category': self.test_category.pk,
            'title': 'Foo',
            'url': 'http://example.org/',
        }

        serializer = serializers.VideoSerializer(data=data)
        serializer.is_valid()
        serializer.save()

        video = Video.objects.get(pk=serializer.object.pk)

        self.assertEqual(video.state, Video.STATE_LIVE)
Beispiel #12
0
    def test_language_field_value_is_case_insensitive(self):
        data = {
            'category': Category.objects.create(title='Moscow Django').pk,
            'title': 'Профилирование и отладка Django',
            'speakers': ['Владимир Рудных'],
            'language': 'russian',
            'url': 'http://example.org/',
        }

        serializer = serializers.VideoSerializer(data=data)
        serializer.is_valid()
        serializer.save()

        self.assertEqual(serializer.object.language.name, 'Russian')
Beispiel #13
0
    def test_video_tags_are_saved_lowercase(self):
        data = {
            'category': self.test_category.pk,
            'title': 'Bar',
            'tags': ['baz', 'BAR', 'haM'],
            'url': 'http://example.org/',
        }

        serializer = serializers.VideoSerializer(data=data)
        serializer.is_valid()
        serializer.save()

        obj_tags = [tag.tag for tag in serializer.object.tags.all()]

        self.assertCountEqual(obj_tags, ['baz', 'bar', 'ham'])
Beispiel #14
0
    def test_language_is_optional_the_default_value_is_assumed(self):
        data = {
            'category': Category.objects.create(title='Foo Category').pk,
            'title': 'Foo',
            'url': 'http://example.org/',
        }

        serializer = serializers.VideoSerializer(data=data)
        serializer.is_valid()
        serializer.save()

        obj_lang = serializer.object.language

        lang_name, lang_iso = settings.PROPOSAL_LANGUAGE

        self.assertEqual(obj_lang.name, lang_name)
        self.assertEqual(obj_lang.iso639_1, lang_iso)
Beispiel #15
0
    def test_existing_speakers_are_reused(self):
        speaker = Speaker.objects.create(name='Armin Ronacher')

        data = {
            'category': Category.objects.create(title='Pycon Russia 2014').pk,
            'title': 'Writing Secure APIs',
            'date': '2014-06-02',
            'speakers': ['Armin Ronacher'],
            'url': 'http://example.org/',
        }

        serializer = serializers.VideoSerializer(data=data)
        self.assertTrue(serializer.is_valid())
        serializer.save()

        self.assertEqual(Speaker.objects.count(), 1)
        self.assertEqual(serializer.object.speakers.all()[0].pk, speaker.pk)
Beispiel #16
0
    def test_video_titles_are_case_insensitive(self):
        category = Category.objects.create(title='Foo')
        video = category.videos.create(title='Bar')

        data = {
            'category': category.pk,
            'title': 'bar',
            'description': 'New Bar Description.',
            'url': 'http://example.org/',
        }

        serializer = serializers.VideoSerializer(data=data)
        serializer.is_valid()
        serializer.save()

        self.assertEqual(serializer.object.pk, video.pk)
        # description has been updated
        self.assertEqual(
            Video.objects.get(pk=video.pk).description, 'New Bar Description.')
Beispiel #17
0
    def test_when_multiple_videos_exist_under_the_same_name_the_first_entry_is_picked(
            self):
        category = Category.objects.create(title='Foo')

        videos = [
            category.videos.create(title='Bar'),
            category.videos.create(title='bar'),
            category.videos.create(title='BAR'),
        ]

        data = {
            'category': category.pk,
            'title': 'BAR',
            'url': 'http://example.org/',
        }

        serializer = serializers.VideoSerializer(data=data)
        serializer.is_valid()
        serializer.save()

        self.assertEqual(serializer.object.pk, videos[0].pk)
Beispiel #18
0
    def test_video_private_fields_are_not_exposed_to_public(self):
        attrs = {
            'category': self.test_category,
            'title': 'Foo',
            'source_url': 'http://example.org/',
            'embed': '<iframe src="http://example.org/"></iframe>',
            'thumbnail_url': 'http://example.org/thumnail.png',
        }
        video = Video.objects.create(**attrs)

        data = {
            'category': self.test_category.pk,
            'title': 'Foo',
            'url': 'http://example.org/',

            # attempt to alter public fields
            'summary': 'Foo Bar',
            'description': 'Foo Description',

            # attempt to alter private fields
            'embed': '<iframe src="http://malicious.site/"></iframe>',
            'thumbnail_url': 'http://malicious.site/',
        }

        serializer = serializers.VideoSerializer(data=data)
        serializer.is_valid()
        serializer.save()

        video = Video.objects.get(pk=video.pk)

        # public field values have been changed
        self.assertEqual(video.description, 'Foo Description')
        self.assertEqual(video.summary, 'Foo Bar')

        # private fileds have not not
        self.assertEqual(video.embed,
                         '<iframe src="http://example.org/"></iframe>')
        self.assertEqual(video.thumbnail_url,
                         'http://example.org/thumnail.png')
Beispiel #19
0
    def test_speaker_name_is_case_insensitive(self):
        Speaker.objects.create(name='Александр Козловский')
        Speaker.objects.create(name='Алексей Малашкевич')

        data = {
            'category': Category.objects.create(title='Pycon Russia 2014').pk,
            'title': 'Pony ORM - маппер нового поколения',
            'date': '2014-06-02',
            'speakers': ['Алексей Малашкевич', 'Александр Козловский'],
            'url': 'http://example.org/',
        }

        serializer = serializers.VideoSerializer(data=data)
        serializer.is_valid()
        serializer.save()

        # no extra speaker objects were created
        self.assertEqual(Speaker.objects.count(), 2)

        for speaker in serializer.object.speakers.all():
            self.assertTrue(speaker.name in ('Александр Козловский',
                                             'Алексей Малашкевич'))
Beispiel #20
0
    def test_speakers_are_saved_with_correct_slugs(self):
        speakers = {
            'Amaury Forgeot d\'Arc': 'amaury-forgeot-darc',
            'Amir Salihefendic': 'amir-salihefendic',
            'Валентин Синицын': 'valentin-sinitsyn',
            'Юрий Юревич': 'iurii-iurevich',
        }

        data = {
            'category': self.test_category.pk,
            'title': 'Bar',
            'speakers': list(speakers),
            'url': 'http://example.org/',
        }

        serializer = serializers.VideoSerializer(data=data)
        serializer.is_valid()
        serializer.save()

        obj_slugs = [
            speaker.slug for speaker in serializer.object.speakers.all()
        ]
        self.assertCountEqual(obj_slugs, list(speakers.values()))
Beispiel #21
0
    def test_bad_values(self):
        bad_values = (
            # no category
            {
                'title': 'Foo'
            },
            # no title
            {
                'category': self.category.pk,
                'title': None,
                'url': 'http://example.org/'
            },
            {
                'category': self.category.pk,
                'url': 'http://example.org/'
            },
            {
                'category': self.category.pk,
                'title': '',
                'url': 'http://example.org/'
            },
            # no source url
            {
                'title': 'Foo',
                'category': self.category.pk
            },
            # source_url is accessed as "url"
            {
                'category': self.category.pk,
                'title': 'Bar',
                'source_url': 'http://example.org/'
            },
            # invalid category
            {
                'category': 'eggs',
                'title': 'Bar',
                'url': 'http://example.org/'
            },
            {
                'category': None,
                'title': 'Bar',
                'url': 'http://example.org/'
            },
            # bad field name
            {
                'category': self.category.pk,
                'TITLE': 'Bar',
                'url': 'http://example.org/'
            },
            # invalid language
            {
                'category': self.category.pk,
                'title': 'Bar',
                'url': 'http://example.org/',
                'language': 'Gibberish'
            },
            # invalid speakers
            {
                'category': self.category.pk,
                'title': 'Bar',
                'url': 'http://example.org/',
                'speakers': None
            },
            {
                'category': self.category.pk,
                'title': 'Bar',
                'url': 'http://example.org/',
                'speakers': ''
            },
            # invalid tags
            {
                'category': self.category.pk,
                'title': 'Bar',
                'url': 'http://example.org/',
                'tags': None
            },
            {
                'category': self.category.pk,
                'title': 'Bar',
                'url': 'http://example.org/',
                'tags': ''
            },
            # invalid date
            {
                'category': self.category.pk,
                'title': 'Bar',
                'url': 'http://example.org/',
                'date': '2014'
            },
            # invalid source url
            {
                'category': self.category.pk,
                'title': 'Bar',
                'url': 'example',
                'date': '2014'
            },
        )

        for data in bad_values:
            serializer = serializers.VideoSerializer(data=data)
            self.assertFalse(serializer.is_valid(), 'data=%s' % data)