test_serializers.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from django.test import TestCase
  2. from rest_framework import serializers
  3. from misago.categories.models import Category
  4. from misago.core.serializers import MutableFields
  5. from misago.threads import test
  6. from misago.threads.models import Thread
  7. class Serializer(serializers.ModelSerializer, MutableFields):
  8. url = serializers.SerializerMethodField()
  9. class Meta:
  10. model = Thread
  11. fields = [
  12. "id",
  13. "title",
  14. "replies",
  15. "has_unapproved_posts",
  16. "started_on",
  17. "last_post_on",
  18. "last_post_is_event",
  19. "last_post",
  20. "last_poster_name",
  21. "is_unapproved",
  22. "is_hidden",
  23. "is_closed",
  24. "weight",
  25. ]
  26. class MutableFieldsSerializerTests(TestCase):
  27. def test_subset_fields(self):
  28. """classmethod subset_fields creates new serializer"""
  29. category = Category.objects.get(slug="first-category")
  30. thread = test.post_thread(category=category)
  31. fields = ["id", "title", "replies", "last_poster_name"]
  32. serializer = Serializer.subset_fields(*fields)
  33. self.assertEqual(
  34. serializer.__name__, "SerializerIdTitleRepliesLastPosterNameSubset"
  35. )
  36. self.assertEqual(serializer.Meta.fields, fields)
  37. serialized_thread = serializer(thread).data
  38. self.assertEqual(
  39. serialized_thread,
  40. {
  41. "id": thread.id,
  42. "title": thread.title,
  43. "replies": thread.replies,
  44. "last_poster_name": thread.last_poster_name,
  45. },
  46. )
  47. self.assertFalse(Serializer.Meta.fields == serializer.Meta.fields)
  48. def test_exclude_fields(self):
  49. """classmethod exclude_fields creates new serializer"""
  50. category = Category.objects.get(slug="first-category")
  51. thread = test.post_thread(category=category)
  52. kept_fields = ["id", "title", "weight"]
  53. removed_fields = list(set(Serializer.Meta.fields) - set(kept_fields))
  54. serializer = Serializer.exclude_fields(*removed_fields)
  55. self.assertEqual(serializer.__name__, "SerializerIdTitleWeightSubset")
  56. self.assertEqual(serializer.Meta.fields, kept_fields)
  57. serialized_thread = serializer(thread).data
  58. self.assertEqual(
  59. serialized_thread,
  60. {"id": thread.id, "title": thread.title, "weight": thread.weight},
  61. )
  62. self.assertFalse(Serializer.Meta.fields == serializer.Meta.fields)
  63. def test_extend_fields(self):
  64. """classmethod extend_fields creates new serializer"""
  65. category = Category.objects.get(slug="first-category")
  66. thread = test.post_thread(category=category)
  67. serializer = Serializer.extend_fields("category")
  68. serialized_thread = serializer(thread).data
  69. self.assertEqual(serialized_thread["category"], category.pk)