test_image_setting_handling.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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", "forum_address": "http://test.com", "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", "forum_address": "http://test.com", "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", "forum_address": "http://test.com", "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", "forum_address": "http://test.com", "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. {
  55. "forum_name": "Misago",
  56. "forum_address": "http://test.com",
  57. "logo": not_image,
  58. },
  59. )
  60. setting.refresh_from_db()
  61. assert not setting.image
  62. @pytest.fixture
  63. def setting_with_value(admin_client, setting):
  64. with open(IMAGE, "rb") as not_image:
  65. admin_client.post(
  66. reverse("misago:admin:settings:general:index"),
  67. {
  68. "forum_name": "Misago",
  69. "forum_address": "http://test.com",
  70. "logo": not_image,
  71. },
  72. )
  73. setting.refresh_from_db()
  74. return setting
  75. def test_image_setting_value_is_rendered_in_form(admin_client, setting_with_value):
  76. response = admin_client.get(reverse("misago:admin:settings:general:index"))
  77. assert_contains(response, setting_with_value.image.url)
  78. def test_invalid_file_is_not_set_as_value(admin_client, setting):
  79. with open(OTHER_FILE, "rb") as not_image:
  80. admin_client.post(
  81. reverse("misago:admin:settings:general:index"),
  82. {
  83. "forum_name": "Misago",
  84. "forum_address": "http://test.com",
  85. "logo": not_image,
  86. },
  87. )
  88. setting.refresh_from_db()
  89. assert not setting.image
  90. def test_uploading_invalid_file_doesnt_remove_already_set_image(
  91. admin_client, setting_with_value
  92. ):
  93. with open(OTHER_FILE, "rb") as not_image:
  94. admin_client.post(
  95. reverse("misago:admin:settings:general:index"),
  96. {
  97. "forum_name": "Misago",
  98. "forum_address": "http://test.com",
  99. "logo": not_image,
  100. },
  101. )
  102. setting_with_value.refresh_from_db()
  103. assert setting_with_value.image
  104. def test_set_image_is_still_rendered_when_invalid_file_was_uploaded(
  105. admin_client, setting_with_value
  106. ):
  107. with open(OTHER_FILE, "rb") as not_image:
  108. response = admin_client.post(
  109. reverse("misago:admin:settings:general:index"),
  110. {
  111. "forum_name": "Misago",
  112. "forum_address": "http://test.com",
  113. "logo": not_image,
  114. },
  115. )
  116. assert_contains(response, setting_with_value.image.url)
  117. def test_uploading_new_image_replaces_already_set_image(
  118. admin_client, setting_with_value
  119. ):
  120. with open(OTHER_IMAGE, "rb") as not_image:
  121. admin_client.post(
  122. reverse("misago:admin:settings:general:index"),
  123. {
  124. "forum_name": "Misago",
  125. "forum_address": "http://test.com",
  126. "logo": not_image,
  127. },
  128. )
  129. setting_with_value.refresh_from_db()
  130. assert str(setting_with_value.image.name).endswith(".d18644ab.png")
  131. def test_uploading_new_image_deletes_image_file(admin_client, setting_with_value):
  132. with open(OTHER_IMAGE, "rb") as not_image:
  133. admin_client.post(
  134. reverse("misago:admin:settings:general:index"),
  135. {
  136. "forum_name": "Misago",
  137. "forum_address": "http://test.com",
  138. "logo": not_image,
  139. },
  140. )
  141. assert not os.path.exists(setting_with_value.image.path)
  142. def test_omitting_setting_value_doesnt_remove_already_set_image(
  143. admin_client, setting_with_value
  144. ):
  145. admin_client.post(
  146. reverse("misago:admin:settings:general:index"),
  147. {"forum_name": "Misago", "forum_address": "http://test.com"},
  148. )
  149. setting_with_value.refresh_from_db()
  150. assert setting_with_value.image
  151. def test_set_image_can_be_deleted_by_extra_option(admin_client, setting_with_value):
  152. admin_client.post(
  153. reverse("misago:admin:settings:general:index"),
  154. {"forum_name": "Misago", "forum_address": "http://test.com", "logo_delete": 1},
  155. )
  156. setting_with_value.refresh_from_db()
  157. assert not setting_with_value.image
  158. def test_using_image_deletion_option_deletes_image_file(
  159. admin_client, setting_with_value
  160. ):
  161. admin_client.post(
  162. reverse("misago:admin:settings:general:index"),
  163. {"forum_name": "Misago", "forum_address": "http://test.com", "logo_delete": 1},
  164. )
  165. assert not os.path.exists(setting_with_value.image.path)