test_serializers.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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 Subsettable
  5. from misago.threads import testutils
  6. from misago.threads.models import Thread
  7. class SubsettableSerializerTests(TestCase):
  8. def test_create_subset_serializer(self):
  9. """classmethod subset creates new serializer"""
  10. category = Category.objects.get(slug='first-category')
  11. thread = testutils.post_thread(category=category)
  12. fields = ('id', 'title', 'replies', 'last_poster_name')
  13. serializer = TestSerializer.subset(*fields)
  14. self.assertEqual(
  15. serializer.__name__,
  16. 'TestSerializerIdTitleRepliesLastPosterNameSubset'
  17. )
  18. self.assertEqual(serializer.Meta.fields, fields)
  19. serialized_thread = serializer(thread).data
  20. self.assertEqual(serialized_thread, {
  21. 'id': thread.id,
  22. 'title': thread.title,
  23. 'replies': thread.replies,
  24. 'last_poster_name': thread.last_poster_name,
  25. })
  26. self.assertFalse(TestSerializer.Meta.fields == serializer.Meta.fields)
  27. def test_create_subset_serializer_exclude(self):
  28. """classmethod exclude creates new serializer"""
  29. category = Category.objects.get(slug='first-category')
  30. thread = testutils.post_thread(category=category)
  31. kept_fields = ('id', 'title', 'weight')
  32. removed_fields = tuple(set(TestSerializer.Meta.fields) - set(kept_fields))
  33. serializer = TestSerializer.subset_exclude(*removed_fields)
  34. self.assertEqual(serializer.__name__, 'TestSerializerIdTitleWeightSubset')
  35. self.assertEqual(serializer.Meta.fields, kept_fields)
  36. serialized_thread = serializer(thread).data
  37. self.assertEqual(serialized_thread, {
  38. 'id': thread.id,
  39. 'title': thread.title,
  40. 'weight': thread.weight,
  41. })
  42. self.assertFalse(TestSerializer.Meta.fields == serializer.Meta.fields)
  43. class TestRelatedSerializer(serializers.ModelSerializer):
  44. class Meta:
  45. model = Category
  46. fields = (
  47. 'id',
  48. 'title',
  49. 'replies',
  50. 'has_unapproved_posts',
  51. 'started_on',
  52. 'last_post_on',
  53. 'last_post_is_event',
  54. 'last_post',
  55. 'last_poster_name',
  56. 'is_unapproved',
  57. 'is_hidden',
  58. 'is_closed',
  59. 'weight',
  60. 'url',
  61. )
  62. class TestSerializer(serializers.ModelSerializer, Subsettable):
  63. url = serializers.SerializerMethodField()
  64. class Meta:
  65. model = Thread
  66. fields = (
  67. 'id',
  68. 'title',
  69. 'replies',
  70. 'has_unapproved_posts',
  71. 'started_on',
  72. 'last_post_on',
  73. 'last_post_is_event',
  74. 'last_post',
  75. 'last_poster_name',
  76. 'is_unapproved',
  77. 'is_hidden',
  78. 'is_closed',
  79. 'weight',
  80. 'url',
  81. )
  82. def get_url(self, obj):
  83. return {
  84. 'index': obj.get_absolute_url(),
  85. 'new_post': obj.get_new_post_url(),
  86. 'last_post': obj.get_last_post_url(),
  87. 'unapproved_post': obj.get_unapproved_post_url(),
  88. 'last_poster': self.get_last_poster_url(obj),
  89. }