test_serializers.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from rest_framework import serializers
  2. from django.test import TestCase
  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)