import unittest
from unittest import TestCase
import pytest
from django.conf import settings
from faker import Faker
from api.posts.serializers import (
CommentSerializer,
PostContentsSerializer,
PostMediaContentSerializer,
PostNotificationSerializer,
PostSerializer,
UpdateCommentSerializer,
WebhookPostSerializer,
)
from tests.posts.factories import CommentFactory, PostFactory, PostMediaFactory
from tests.users.factories import CategoryFactory, UserFactory # type: ignore
[docs]
class TestPostSerializer(TestCase):
[docs]
def setUp(self) -> None:
self.serializer = PostSerializer
self.author = UserFactory()
self.faker = Faker()
self.category = CategoryFactory()
[docs]
def test_expected_fields(self):
serializer = self.serializer(data={})
required_fields = [field_name for field_name, field in self.serializer().fields.items() if field.required]
required_fields_list = ["category"]
self.assertFalse(serializer.is_valid())
self.assertListEqual(list(serializer.errors.keys()), required_fields)
self.assertListEqual(list(serializer.errors.keys()), required_fields_list)
[docs]
def test_hasgtags_determination(self):
tags_raw = [self.faker.word() for _ in range(10)]
tags = [f"#{tag}" for tag in tags_raw]
serializer = self.serializer(
data={"author": self.author.pk, "title": " ".join(tags), "category": self.category.pk}
)
serializer.is_valid()
self.assertTrue(serializer.is_valid())
self.assertListEqual(tags_raw, serializer.validated_data["tags"])
[docs]
def test_hasgtags_with_title_determination(self):
tags_raw = [self.faker.word() for _ in range(10)]
tags = [f"#{tag}" for tag in tags_raw]
title = self.faker.catch_phrase()
full_title = f"{title} {' '.join(tags)}"
serializer = self.serializer(data={"author": self.author.pk, "title": full_title, "category": self.category.pk})
serializer.is_valid()
self.assertTrue(serializer.is_valid())
self.assertListEqual(tags_raw, serializer.validated_data["tags"])
self.assertEqual(title, serializer.validated_data["title"])
[docs]
@pytest.mark.usefixtures("jpg_file")
@pytest.mark.usefixtures("mp4_file")
class TestPostContentsSerializer(unittest.TestCase):
"""Test post contents serializer"""
[docs]
def setUp(self) -> None:
self.serializer = PostContentsSerializer
[docs]
def test_expected_fields(self):
serializer = self.serializer(data={})
self.assertFalse(serializer.is_valid())
self.assertListEqual(list(serializer.errors.keys()), ["content"])
[docs]
def test_upload_mixed_content(self):
data = {"content": [{"original": self.jpg_file}, {"original": self.mp4_file}]}
serializer = self.serializer(data=data)
self.assertFalse(serializer.is_valid())
self.assertListEqual(list(serializer.errors.keys()), ["content"])
self.assertEqual(serializer.errors["content"][0], "Unable to upload video and image together.")
[docs]
def test_upload_too_many_contents(self):
data = {"content": [{"original": self.jpg_file} for _ in range(0, settings.MAX_CONTENT_ITEMS + 1)]}
serializer = self.serializer(data=data)
self.assertFalse(serializer.is_valid())
self.assertListEqual(list(serializer.errors.keys()), ["content"])
self.assertEqual(
serializer.errors["content"][0],
"Content items cannot be bigger than %s items." % settings.MAX_CONTENT_ITEMS,
)
[docs]
def test_upload_two_video(self):
data = {"content": [{"original": self.mp4_file}, {"original": self.mp4_file}]}
serializer = self.serializer(data=data)
self.assertFalse(serializer.is_valid())
self.assertListEqual(list(serializer.errors.keys()), ["content"])
self.assertEqual(serializer.errors["content"][0], "Unable to upload more than 1 video.")
[docs]
def test_validate(self):
data = {"content": [{"original": self.jpg_file}]}
serializer = self.serializer(data=data)
self.assertTrue(serializer.is_valid())
self.assertListEqual(list(serializer.validated_data.keys()), ["content"])
[docs]
@pytest.mark.usefixtures("svg_file")
@pytest.mark.usefixtures("jpg_file")
@pytest.mark.usefixtures("oversize_png_file")
@pytest.mark.usefixtures("invalid_resolution_jpg_file")
@pytest.mark.usefixtures("mp4_file")
class TestPostMediaContentSerializer(unittest.TestCase):
"""Test post media content serializer"""
[docs]
def setUp(self) -> None:
self.serializer = PostMediaContentSerializer
[docs]
def test_expected_fields(self):
serializer = self.serializer(data={})
self.assertFalse(serializer.is_valid())
self.assertListEqual(list(serializer.errors.keys()), ["original"])
[docs]
def test_upload_unsupported_format(self):
data = {"original": self.svg_file}
serializer = self.serializer(data=data)
self.assertFalse(serializer.is_valid())
self.assertListEqual(list(serializer.errors.keys()), ["original"])
self.assertEqual(serializer.errors["original"][0], "Unsupported extension format.")
[docs]
def test_upload_image_invalid_size(self):
data = {"original": self.oversize_png_file}
serializer = self.serializer(data=data)
self.assertFalse(serializer.is_valid())
self.assertListEqual(list(serializer.errors.keys()), ["original"])
self.assertEqual(serializer.errors["original"][0], "The maximum file size that can be uploaded is 10MB.")
[docs]
def test_upload_image_invalid_resolution(self):
data = {"original": self.invalid_resolution_jpg_file}
serializer = self.serializer(data=data)
self.assertFalse(serializer.is_valid())
self.assertListEqual(list(serializer.errors.keys()), ["original"])
[docs]
def test_upload_valid_file(self):
data = {"original": self.jpg_file}
serializer = self.serializer(data=data)
self.assertTrue(serializer.is_valid())
self.assertListEqual(list(serializer.validated_data.keys()), ["original", "type"])
[docs]
def test_upload_valid_video(self):
data = {"original": self.mp4_file}
serializer = self.serializer(data=data)
self.assertTrue(serializer.is_valid())
self.assertListEqual(list(serializer.validated_data.keys()), ["original", "type"])
[docs]
class TestWebhookPostSerializer(unittest.TestCase):
"""Test webhook post serializer"""
[docs]
def setUp(self) -> None:
"""Set up method for WebhookPostSerializer"""
self.post = PostFactory()
self.post_media = PostMediaFactory(post=self.post)
self.serializer = WebhookPostSerializer
self.data = {
"post": self.post.id,
"post_media": self.post_media.id,
"upload_video_path": "media/post-content/%s/video/formated/stream.m3u8" % self.post_media.id,
"upload_preview_path": "media/post-content/%s/video/preview.jpg" % self.post_media.id,
}
[docs]
def test_expected_fields(self) -> None:
"""Test expected fields"""
serializer = self.serializer(data={})
self.assertFalse(serializer.is_valid())
self.assertListEqual(
list(serializer.errors.keys()), ["post", "post_media", "upload_video_path", "upload_preview_path"]
)
[docs]
def test_success(self) -> None:
"""Test succes case"""
serializer = self.serializer(data=self.data)
self.assertTrue(serializer.is_valid())
self.assertListEqual(
list(serializer.validated_data.keys()), ["post", "post_media", "upload_video_path", "upload_preview_path"]
)
self.assertNotIn("media", serializer.validated_data["upload_video_path"])
self.assertNotIn("media", serializer.validated_data["upload_preview_path"])
[docs]
class TestPostNotificationSerializer(unittest.TestCase):
"""Test post notification serializer"""
[docs]
def setUp(self) -> None:
self.post = PostFactory()
self.serializer = PostNotificationSerializer
[docs]
def test_data(self):
serializer = self.serializer(self.post)
self.assertListEqual(list(serializer.data.keys()), ["id", "preview"])