test_attachmentadmin_views.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. from django.urls import reverse
  2. from .. import test
  3. from ...admin.test import AdminTestCase
  4. from ...categories.models import Category
  5. from ..models import Attachment, AttachmentType
  6. class AttachmentAdminViewsTests(AdminTestCase):
  7. def setUp(self):
  8. super().setUp()
  9. self.category = Category.objects.get(slug="first-category")
  10. self.post = test.post_thread(category=self.category).first_post
  11. self.filetype = AttachmentType.objects.order_by("id").first()
  12. self.admin_link = reverse("misago:admin:system:attachments:index")
  13. def mock_attachment(self, post=None, file=None, image=None, thumbnail=None):
  14. return Attachment.objects.create(
  15. secret=Attachment.generate_new_secret(),
  16. filetype=self.filetype,
  17. post=post,
  18. size=1000,
  19. uploader=self.user,
  20. uploader_name=self.user.username,
  21. uploader_slug=self.user.slug,
  22. filename="testfile_%s.zip" % (Attachment.objects.count() + 1),
  23. file=None,
  24. image=None,
  25. thumbnail=None,
  26. )
  27. def test_link_registered(self):
  28. """admin nav contains attachments link"""
  29. response = self.client.get(reverse("misago:admin:system:settings:index"))
  30. self.assertContains(response, self.admin_link)
  31. def test_list_view(self):
  32. """attachments list returns 200 and renders all attachments"""
  33. final_link = self.client.get(self.admin_link)["location"]
  34. response = self.client.get(final_link)
  35. self.assertEqual(response.status_code, 200)
  36. attachments = [
  37. self.mock_attachment(self.post, file="somefile.pdf"),
  38. self.mock_attachment(image="someimage.jpg"),
  39. self.mock_attachment(
  40. self.post, image="somelargeimage.png", thumbnail="somethumb.png"
  41. ),
  42. ]
  43. response = self.client.get(final_link)
  44. self.assertEqual(response.status_code, 200)
  45. for attachment in attachments:
  46. delete_link = reverse(
  47. "misago:admin:system:attachments:delete", kwargs={"pk": attachment.pk}
  48. )
  49. self.assertContains(response, attachment.filename)
  50. self.assertContains(response, delete_link)
  51. self.assertContains(response, attachment.get_absolute_url())
  52. self.assertContains(response, attachment.uploader.username)
  53. self.assertContains(response, attachment.uploader.get_absolute_url())
  54. if attachment.thumbnail:
  55. self.assertContains(response, attachment.get_thumbnail_url())
  56. def test_delete_multiple(self):
  57. """mass delete tool on list works"""
  58. attachments = [
  59. self.mock_attachment(self.post, file="somefile.pdf"),
  60. self.mock_attachment(image="someimage.jpg"),
  61. self.mock_attachment(
  62. self.post, image="somelargeimage.png", thumbnail="somethumb.png"
  63. ),
  64. ]
  65. self.post.attachments_cache = [{"id": attachments[-1].pk}]
  66. self.post.save()
  67. response = self.client.post(
  68. self.admin_link,
  69. data={"action": "delete", "selected_items": [a.pk for a in attachments]},
  70. )
  71. self.assertEqual(response.status_code, 302)
  72. self.assertEqual(Attachment.objects.count(), 0)
  73. # assert attachments were removed from post's cache
  74. attachments_cache = self.category.post_set.get(
  75. pk=self.post.pk
  76. ).attachments_cache
  77. self.assertIsNone(attachments_cache)
  78. def test_delete_view(self):
  79. """delete attachment view has no showstoppers"""
  80. attachment = self.mock_attachment(self.post)
  81. self.post.attachments_cache = [
  82. {"id": attachment.pk + 1},
  83. {"id": attachment.pk},
  84. {"id": attachment.pk + 2},
  85. ]
  86. self.post.save()
  87. action_link = reverse(
  88. "misago:admin:system:attachments:delete", kwargs={"pk": attachment.pk}
  89. )
  90. response = self.client.post(action_link)
  91. self.assertEqual(response.status_code, 302)
  92. # clean alert about item, grab final list url
  93. final_link = self.client.get(self.admin_link)["location"]
  94. response = self.client.get(final_link)
  95. self.assertEqual(response.status_code, 200)
  96. self.assertNotContains(response, action_link)
  97. # assert it was removed from post's attachments cache
  98. attachments_cache = self.category.post_set.get(
  99. pk=self.post.pk
  100. ).attachments_cache
  101. self.assertEqual(
  102. attachments_cache, [{"id": attachment.pk + 1}, {"id": attachment.pk + 2}]
  103. )