test_reordering_css.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. import pytest
  2. from django.urls import reverse
  3. from ....cache.test import assert_invalidates_cache
  4. from ....test import assert_has_error_message
  5. from ... import THEME_CACHE
  6. from ..css import get_next_css_order
  7. FIRST = 0
  8. MIDDLE = 1
  9. LAST = 2
  10. @pytest.fixture
  11. def css_list(theme):
  12. return [
  13. theme.css.create(name="CSS", url="https://test.cdn/font.css", order=FIRST),
  14. theme.css.create(name="CSS", url="https://test.cdn/font.css", order=MIDDLE),
  15. theme.css.create(name="CSS", url="https://test.cdn/font.css", order=LAST),
  16. ]
  17. @pytest.fixture
  18. def move_up(admin_client):
  19. def move_up_client(theme, css):
  20. url = reverse(
  21. "misago:admin:appearance:themes:move-css-up",
  22. kwargs={"pk": theme.pk, "css_pk": css.pk},
  23. )
  24. return admin_client.post(url)
  25. return move_up_client
  26. @pytest.fixture
  27. def move_down(admin_client):
  28. def move_down_client(theme, css):
  29. url = reverse(
  30. "misago:admin:appearance:themes:move-css-down",
  31. kwargs={"pk": theme.pk, "css_pk": css.pk},
  32. )
  33. return admin_client.post(url)
  34. return move_down_client
  35. def test_first_css_cant_be_moved_up(move_up, theme, css_list):
  36. first_css = css_list[FIRST]
  37. move_up(theme, first_css)
  38. first_css.refresh_from_db()
  39. assert first_css.order == FIRST
  40. def test_last_css_cant_be_moved_down(move_down, theme, css_list):
  41. last_css = css_list[LAST]
  42. move_down(theme, last_css)
  43. last_css.refresh_from_db()
  44. assert last_css.order == LAST
  45. def test_first_css_can_be_moved_down(move_down, theme, css_list):
  46. first_css = css_list[FIRST]
  47. move_down(theme, first_css)
  48. first_css.refresh_from_db()
  49. assert first_css.order == MIDDLE
  50. def test_last_css_can_be_moved_up(move_up, theme, css_list):
  51. last_css = css_list[LAST]
  52. move_up(theme, last_css)
  53. last_css.refresh_from_db()
  54. assert last_css.order == MIDDLE
  55. def test_middle_css_can_be_moved_down(move_down, theme, css_list):
  56. middle_css = css_list[MIDDLE]
  57. move_down(theme, middle_css)
  58. middle_css.refresh_from_db()
  59. assert middle_css.order == LAST
  60. def test_middle_css_can_be_moved_up(move_up, theme, css_list):
  61. middle_css = css_list[MIDDLE]
  62. move_up(theme, middle_css)
  63. middle_css.refresh_from_db()
  64. assert middle_css.order == FIRST
  65. def test_first_css_changes_order_with_middle_css_when_moved_down(
  66. move_down, theme, css_list
  67. ):
  68. move_down(theme, css_list[FIRST])
  69. middle_css = css_list[MIDDLE]
  70. middle_css.refresh_from_db()
  71. assert middle_css.order == FIRST
  72. def test_last_css_changes_order_with_middle_css_when_moved_up(move_up, theme, css_list):
  73. move_up(theme, css_list[LAST])
  74. middle_css = css_list[MIDDLE]
  75. middle_css.refresh_from_db()
  76. assert middle_css.order == LAST
  77. def test_middle_css_changes_order_with_last_css_when_moved_down(
  78. move_down, theme, css_list
  79. ):
  80. move_down(theme, css_list[MIDDLE])
  81. last_css = css_list[LAST]
  82. last_css.refresh_from_db()
  83. assert last_css.order == MIDDLE
  84. def test_middle_css_changes_order_with_first_css_when_moved_up(
  85. move_up, theme, css_list
  86. ):
  87. move_up(theme, css_list[MIDDLE])
  88. first_css = css_list[FIRST]
  89. first_css.refresh_from_db()
  90. assert first_css.order == MIDDLE
  91. def test_first_css_changes_order_with_last_css_when_moved_down_after_middle_deletion(
  92. move_down, theme, css_list
  93. ):
  94. css_list[MIDDLE].delete()
  95. move_down(theme, css_list[FIRST])
  96. last_css = css_list[LAST]
  97. last_css.refresh_from_db()
  98. assert last_css.order == FIRST
  99. def test_last_css_changes_order_with_first_css_when_moved_up_after_middle_deletion(
  100. move_up, theme, css_list
  101. ):
  102. css_list[MIDDLE].delete()
  103. move_up(theme, css_list[LAST])
  104. first_css = css_list[FIRST]
  105. first_css.refresh_from_db()
  106. assert first_css.order == LAST
  107. def test_if_css_doesnt_belong_to_theme_move_down_action_sets_error_message(
  108. move_down, other_theme, css_list
  109. ):
  110. response = move_down(other_theme, css_list[MIDDLE])
  111. assert_has_error_message(response)
  112. def test_if_css_doesnt_belong_to_theme_move_up_action_sets_error_message(
  113. move_up, other_theme, css_list
  114. ):
  115. response = move_up(other_theme, css_list[MIDDLE])
  116. assert_has_error_message(response)
  117. def test_if_ran_for_default_theme_move_down_action_sets_error_message(
  118. move_down, default_theme, css_list
  119. ):
  120. response = move_down(default_theme, css_list[MIDDLE])
  121. assert_has_error_message(response)
  122. def test_if_ran_for_default_theme_move_up_action_sets_error_message(
  123. move_up, default_theme, css_list
  124. ):
  125. response = move_up(default_theme, css_list[MIDDLE])
  126. assert_has_error_message(response)
  127. def test_if_given_nonexisting_css_id_move_down_action_sets_error_message(
  128. mocker, move_down, theme, css_list
  129. ):
  130. response = move_down(theme, mocker.Mock(pk=css_list[LAST].pk + 1))
  131. assert_has_error_message(response)
  132. def test_if_given_nonexisting_css_id_move_up_action_sets_error_message(
  133. mocker, move_up, theme, css_list
  134. ):
  135. response = move_up(theme, mocker.Mock(pk=css_list[LAST].pk + 1))
  136. assert_has_error_message(response)
  137. def test_if_given_nonexisting_theme_id_move_down_action_sets_error_message(
  138. mocker, move_down, nonexisting_theme, css_list
  139. ):
  140. response = move_down(nonexisting_theme, css_list[FIRST])
  141. assert_has_error_message(response)
  142. def test_if_given_nonexisting_theme_id_move_up_action_sets_error_message(
  143. mocker, move_up, nonexisting_theme, css_list
  144. ):
  145. response = move_up(nonexisting_theme, css_list[LAST])
  146. assert_has_error_message(response)
  147. def test_next_new_css_order_is_larger_than_largest_existing_css_order(theme):
  148. theme.css.create(name="CSS", url="https://test.cdn/font.css", order=4)
  149. assert get_next_css_order(theme) == 5
  150. def test_moving_css_up_invalidates_theme_cache(move_up, theme, css_list):
  151. with assert_invalidates_cache(THEME_CACHE):
  152. move_up(theme, css_list[LAST])
  153. def test_moving_css_down_invalidates_theme_cache(move_down, theme, css_list):
  154. with assert_invalidates_cache(THEME_CACHE):
  155. move_down(theme, css_list[FIRST])