test_image_setting_handling.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. import os
  2. import pytest
  3. from django.urls import reverse
  4. from ....test import assert_contains
  5. from ...models import Setting
  6. BASE_DIR = os.path.dirname(os.path.abspath(__file__))
  7. IMAGE = os.path.join(BASE_DIR, "testfiles", "image.png")
  8. OTHER_IMAGE = os.path.join(BASE_DIR, "testfiles", "image-other.png")
  9. OTHER_FILE = os.path.join(BASE_DIR, "testfiles", "other")
  10. @pytest.fixture
  11. def setting(db):
  12. obj = Setting.objects.get(setting="logo")
  13. yield obj
  14. obj.refresh_from_db()
  15. if obj.image:
  16. obj.image.delete(save=False)
  17. def test_image_setting_can_be_set(admin_client, setting):
  18. with open(IMAGE, "rb") as image:
  19. admin_client.post(
  20. reverse("misago:admin:settings:general:index"),
  21. {"forum_name": "Misago", "logo": image},
  22. )
  23. setting.refresh_from_db()
  24. assert setting.image
  25. def test_setting_image_also_sets_its_dimensions(admin_client, setting):
  26. with open(IMAGE, "rb") as image:
  27. admin_client.post(
  28. reverse("misago:admin:settings:general:index"),
  29. {"forum_name": "Misago", "logo": image},
  30. )
  31. setting.refresh_from_db()
  32. assert setting.image_width == 4
  33. assert setting.image_height == 2
  34. def test_setting_image_filename_is_prefixed_with_setting_name(admin_client, setting):
  35. with open(IMAGE, "rb") as image:
  36. admin_client.post(
  37. reverse("misago:admin:settings:general:index"),
  38. {"forum_name": "Misago", "logo": image},
  39. )
  40. setting.refresh_from_db()
  41. assert ("%s." % setting.setting) in str(setting.image.name)
  42. def test_setting_image_filename_is_hashed(admin_client, setting):
  43. with open(IMAGE, "rb") as image:
  44. admin_client.post(
  45. reverse("misago:admin:settings:general:index"),
  46. {"forum_name": "Misago", "logo": image},
  47. )
  48. setting.refresh_from_db()
  49. assert str(setting.image.name).endswith(".c68ed127.png")
  50. def test_image_setting_rejects_non_image_file(admin_client, setting):
  51. with open(OTHER_FILE, "rb") as not_image:
  52. admin_client.post(
  53. reverse("misago:admin:settings:general:index"),
  54. {"forum_name": "Misago", "logo": not_image},
  55. )
  56. setting.refresh_from_db()
  57. assert not setting.image
  58. @pytest.fixture
  59. def setting_with_value(admin_client, setting):
  60. with open(IMAGE, "rb") as not_image:
  61. admin_client.post(
  62. reverse("misago:admin:settings:general:index"),
  63. {"forum_name": "Misago", "logo": not_image},
  64. )
  65. setting.refresh_from_db()
  66. return setting
  67. def test_image_setting_value_is_rendered_in_form(admin_client, setting_with_value):
  68. response = admin_client.get(reverse("misago:admin:settings:general:index"))
  69. assert_contains(response, setting_with_value.image.url)
  70. def test_invalid_file_is_not_set_as_value(admin_client, setting):
  71. with open(OTHER_FILE, "rb") as not_image:
  72. admin_client.post(
  73. reverse("misago:admin:settings:general:index"),
  74. {"forum_name": "Misago", "logo": not_image},
  75. )
  76. setting.refresh_from_db()
  77. assert not setting.image
  78. def test_uploading_invalid_file_doesnt_remove_already_set_image(
  79. admin_client, setting_with_value
  80. ):
  81. with open(OTHER_FILE, "rb") as not_image:
  82. admin_client.post(
  83. reverse("misago:admin:settings:general:index"),
  84. {"forum_name": "Misago", "logo": not_image},
  85. )
  86. setting_with_value.refresh_from_db()
  87. assert setting_with_value.image
  88. def test_set_image_is_still_rendered_when_invalid_file_was_uploaded(
  89. admin_client, setting_with_value
  90. ):
  91. with open(OTHER_FILE, "rb") as not_image:
  92. response = admin_client.post(
  93. reverse("misago:admin:settings:general:index"),
  94. {"forum_name": "Misago", "logo": not_image},
  95. )
  96. assert_contains(response, setting_with_value.image.url)
  97. def test_uploading_new_image_replaces_already_set_image(
  98. admin_client, setting_with_value
  99. ):
  100. with open(OTHER_IMAGE, "rb") as not_image:
  101. admin_client.post(
  102. reverse("misago:admin:settings:general:index"),
  103. {"forum_name": "Misago", "logo": not_image},
  104. )
  105. setting_with_value.refresh_from_db()
  106. assert str(setting_with_value.image.name).endswith(".d18644ab.png")
  107. def test_uploading_new_image_deletes_image_file(admin_client, setting_with_value):
  108. with open(OTHER_IMAGE, "rb") as not_image:
  109. admin_client.post(
  110. reverse("misago:admin:settings:general:index"),
  111. {"forum_name": "Misago", "logo": not_image},
  112. )
  113. assert not os.path.exists(setting_with_value.image.path)
  114. def test_omitting_setting_value_doesnt_remove_already_set_image(
  115. admin_client, setting_with_value
  116. ):
  117. admin_client.post(
  118. reverse("misago:admin:settings:general:index"), {"forum_name": "Misago"}
  119. )
  120. setting_with_value.refresh_from_db()
  121. assert setting_with_value.image
  122. def test_set_image_can_be_deleted_by_extra_option(admin_client, setting_with_value):
  123. admin_client.post(
  124. reverse("misago:admin:settings:general:index"),
  125. {"forum_name": "Misago", "logo_delete": 1},
  126. )
  127. setting_with_value.refresh_from_db()
  128. assert not setting_with_value.image
  129. def test_using_image_deletion_option_deletes_image_file(
  130. admin_client, setting_with_value
  131. ):
  132. admin_client.post(
  133. reverse("misago:admin:settings:general:index"),
  134. {"forum_name": "Misago", "logo_delete": 1},
  135. )
  136. assert not os.path.exists(setting_with_value.image.path)