test_validate_post.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. from django.core.exceptions import ValidationError
  2. from django.urls import reverse
  3. from ...categories.models import Category
  4. from ...users.test import AuthenticatedUserTestCase
  5. class ValidatePostTests(AuthenticatedUserTestCase):
  6. def setUp(self):
  7. super().setUp()
  8. self.category = Category.objects.get(slug="first-category")
  9. self.api_link = reverse("misago:api:thread-list")
  10. def test_title_validation(self):
  11. """validate_post tests title"""
  12. response = self.client.post(
  13. self.api_link,
  14. data={
  15. "category": self.category.pk,
  16. "title": "Check our l33t CaSiNo!",
  17. "post": "Lorem ipsum dolor met!",
  18. },
  19. )
  20. self.assertEqual(response.status_code, 400)
  21. self.assertEqual(
  22. response.json(), {"non_field_errors": ["Don't discuss gambling!"]}
  23. )
  24. # clean title passes validation
  25. response = self.client.post(
  26. self.api_link,
  27. data={
  28. "category": self.category.pk,
  29. "title": "Check our l33t place!",
  30. "post": "Lorem ipsum dolor met!",
  31. },
  32. )
  33. self.assertEqual(response.status_code, 200)
  34. def test_post_validation(self):
  35. """validate_post tests post content"""
  36. response = self.client.post(
  37. self.api_link,
  38. data={
  39. "category": self.category.pk,
  40. "title": "Lorem ipsum dolor met!",
  41. "post": "Check our l33t CaSiNo!",
  42. },
  43. )
  44. self.assertEqual(response.status_code, 400)
  45. self.assertEqual(
  46. response.json(), {"non_field_errors": ["Don't discuss gambling!"]}
  47. )
  48. # clean post passes validation
  49. response = self.client.post(
  50. self.api_link,
  51. data={
  52. "category": self.category.pk,
  53. "title": "Lorem ipsum dolor met!",
  54. "post": "Check our l33t place!",
  55. },
  56. )
  57. self.assertEqual(response.status_code, 200)
  58. def test_empty_input(self):
  59. """validate_post handles empty input"""
  60. response = self.client.post(self.api_link, data={"category": self.category.pk})
  61. self.assertEqual(response.status_code, 400)
  62. self.assertEqual(
  63. response.json(),
  64. {
  65. "title": ["You have to enter thread title."],
  66. "post": ["You have to enter a message."],
  67. },
  68. )
  69. response = self.client.post(
  70. self.api_link, data={"category": self.category.pk, "title": "", "post": ""}
  71. )
  72. self.assertEqual(response.status_code, 400)
  73. self.assertEqual(
  74. response.json(),
  75. {
  76. "title": ["This field may not be blank."],
  77. "post": ["This field may not be blank."],
  78. },
  79. )
  80. def test_post_validators_hook_is_used_by_posting_api(db, user_client, mocker, thread):
  81. def validator(context, data):
  82. raise ValidationError("ERROR FROM PLUGIN")
  83. mocker.patch("misago.threads.validators.hooks.post_validators", [validator])
  84. response = user_client.post(
  85. f"/api/threads/{thread.id}/posts/", {"post": "Lorem ipsum dolor met"}
  86. )
  87. assert response.status_code == 400
  88. assert response.json() == {"non_field_errors": ["ERROR FROM PLUGIN"]}