test_deleting_themes.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. from pathlib import Path
  2. import pytest
  3. from django.core.files.base import ContentFile
  4. from django.urls import reverse
  5. from ....cache.test import assert_invalidates_cache
  6. from ....test import assert_has_error_message
  7. from ... import THEME_CACHE
  8. from ...models import Theme, Css, Media
  9. @pytest.fixture
  10. def delete_link(theme):
  11. return reverse("misago:admin:appearance:themes:delete", kwargs={"pk": theme.pk})
  12. def test_theme_without_children_can_be_deleted(admin_client, delete_link, theme):
  13. admin_client.post(delete_link)
  14. with pytest.raises(Theme.DoesNotExist):
  15. theme.refresh_from_db()
  16. def test_theme_css_are_deleted_together_with_theme(admin_client, delete_link, css):
  17. admin_client.post(delete_link)
  18. with pytest.raises(Css.DoesNotExist):
  19. css.refresh_from_db()
  20. def test_theme_source_css_files_are_deleted_together_with_theme(
  21. admin_client, delete_link, css
  22. ):
  23. admin_client.post(delete_link)
  24. assert not Path(css.source_file.path).exists()
  25. def test_theme_build_css_files_are_deleted_together_with_theme(
  26. admin_client, delete_link, css
  27. ):
  28. css.build_file = ContentFile("body {}", name="test.css")
  29. css.build_hash = "abcdefgh"
  30. css.save()
  31. admin_client.post(delete_link)
  32. assert not Path(css.build_file.path).exists()
  33. def test_theme_media_are_deleted_together_with_theme(admin_client, delete_link, media):
  34. admin_client.post(delete_link)
  35. with pytest.raises(Media.DoesNotExist):
  36. media.refresh_from_db()
  37. def test_theme_images_are_deleted_together_with_theme(admin_client, delete_link, image):
  38. admin_client.post(delete_link)
  39. with pytest.raises(Media.DoesNotExist):
  40. image.refresh_from_db()
  41. def test_theme_media_files_are_deleted_together_with_theme(
  42. admin_client, delete_link, media
  43. ):
  44. admin_client.post(delete_link)
  45. assert not Path(media.file.path).exists()
  46. def test_theme_image_files_are_deleted_together_with_theme(
  47. admin_client, delete_link, image
  48. ):
  49. admin_client.post(delete_link)
  50. assert not Path(image.thumbnail.path).exists()
  51. def test_theme_is_deleted_with_children(admin_client, delete_link, theme):
  52. Theme.objects.create(name="Child Theme", parent=theme)
  53. admin_client.post(delete_link)
  54. assert Theme.objects.count() == 1
  55. def test_theme_children_are_deleted_recursively(admin_client, delete_link, theme):
  56. child_theme = Theme.objects.create(name="Child Theme", parent=theme)
  57. Theme.objects.create(name="Descendant Theme", parent=child_theme)
  58. Theme.objects.create(name="Descendant Theme", parent=child_theme)
  59. admin_client.post(delete_link)
  60. assert Theme.objects.count() == 1
  61. def test_children_theme_can_be_deleted(admin_client, delete_link, theme, other_theme):
  62. theme.move_to(other_theme)
  63. theme.save()
  64. admin_client.post(delete_link)
  65. with pytest.raises(Theme.DoesNotExist):
  66. theme.refresh_from_db()
  67. def test_deleting_children_theme_doesnt_delete_parent_themes(
  68. admin_client, delete_link, theme, other_theme
  69. ):
  70. theme.move_to(other_theme)
  71. theme.save()
  72. admin_client.post(delete_link)
  73. other_theme.refresh_from_db()
  74. def test_deleting_theme_invalidates_themes_cache(admin_client, delete_link):
  75. with assert_invalidates_cache(THEME_CACHE):
  76. admin_client.post(delete_link)
  77. def test_deleting_default_theme_sets_error_message(admin_client, default_theme):
  78. delete_link = reverse(
  79. "misago:admin:appearance:themes:delete", kwargs={"pk": default_theme.pk}
  80. )
  81. response = admin_client.post(delete_link)
  82. assert_has_error_message(response)
  83. def test_default_theme_is_not_deleted(admin_client, default_theme):
  84. delete_link = reverse(
  85. "misago:admin:appearance:themes:delete", kwargs={"pk": default_theme.pk}
  86. )
  87. admin_client.post(delete_link)
  88. default_theme.refresh_from_db()
  89. def test_deleting_active_theme_sets_error_message(admin_client, theme):
  90. theme.is_active = True
  91. theme.save()
  92. delete_link = reverse(
  93. "misago:admin:appearance:themes:delete", kwargs={"pk": theme.pk}
  94. )
  95. response = admin_client.post(delete_link)
  96. assert_has_error_message(response)
  97. def test_active_theme_is_not_deleted(admin_client, theme):
  98. theme.is_active = True
  99. theme.save()
  100. delete_link = reverse(
  101. "misago:admin:appearance:themes:delete", kwargs={"pk": theme.pk}
  102. )
  103. admin_client.post(delete_link)
  104. theme.refresh_from_db()
  105. def test_deleting_theme_containing_active_child_theme_sets_error_message(
  106. admin_client, theme, other_theme
  107. ):
  108. other_theme.move_to(theme)
  109. other_theme.is_active = True
  110. other_theme.save()
  111. delete_link = reverse(
  112. "misago:admin:appearance:themes:delete", kwargs={"pk": theme.pk}
  113. )
  114. response = admin_client.post(delete_link)
  115. assert_has_error_message(response)
  116. def test_theme_containing_active_child_theme_is_not_deleted(
  117. admin_client, theme, other_theme
  118. ):
  119. other_theme.move_to(theme)
  120. other_theme.is_active = True
  121. other_theme.save()
  122. delete_link = reverse(
  123. "misago:admin:appearance:themes:delete", kwargs={"pk": theme.pk}
  124. )
  125. admin_client.post(delete_link)
  126. theme.refresh_from_db()