test_css_links_creation_and_deletion.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. import pytest
  2. from django.urls import reverse
  3. from ....test import assert_contains, assert_has_error_message
  4. @pytest.fixture
  5. def create_link(theme):
  6. return reverse(
  7. "misago:admin:appearance:themes:new-css-link", kwargs={"pk": theme.pk}
  8. )
  9. @pytest.fixture
  10. def edit_link(theme, css_link):
  11. return reverse(
  12. "misago:admin:appearance:themes:edit-css-link",
  13. kwargs={"pk": theme.pk, "css_pk": css_link.pk},
  14. )
  15. @pytest.fixture
  16. def data():
  17. return {"name": "CSS link", "url": "https://example.com/cdn.css"}
  18. @pytest.fixture(autouse=True)
  19. def mock_task(mocker):
  20. delay = mocker.Mock()
  21. mocker.patch(
  22. "misago.themes.admin.views.update_remote_css_size", mocker.Mock(delay=delay)
  23. )
  24. return delay
  25. def test_css_link_creation_form_is_displayed(admin_client, create_link):
  26. response = admin_client.get(create_link)
  27. assert response.status_code == 200
  28. assert_contains(response, "New CSS link")
  29. def test_css_link_can_be_created(theme, admin_client, create_link, data):
  30. admin_client.post(create_link, data)
  31. assert theme.css.exists()
  32. def test_css_link_is_created_with_entered_name(theme, admin_client, create_link, data):
  33. admin_client.post(create_link, data)
  34. assert theme.css.last().name == data["name"]
  35. def test_css_link_name_can_be_descriptive(theme, admin_client, create_link, data):
  36. data["name"] = "font (from font.hosting.com)"
  37. admin_client.post(create_link, data)
  38. assert theme.css.last().name == data["name"]
  39. def test_css_link_creation_fails_if_name_is_not_given(
  40. theme, admin_client, create_link, data
  41. ):
  42. data["name"] = ""
  43. admin_client.post(create_link, data)
  44. assert not theme.css.exists()
  45. def test_css_link_creation_fails_if_name_is_already_taken_by_other_css_in_theme(
  46. theme, admin_client, create_link, data, css
  47. ):
  48. data["name"] = css.name
  49. admin_client.post(create_link, data)
  50. assert theme.css.count() == 1
  51. def test_css_link_name_usage_check_passess_if_name_is_used_by_other_theme_css(
  52. other_theme, admin_client, data, css
  53. ):
  54. create_link = reverse(
  55. "misago:admin:appearance:themes:new-css-link", kwargs={"pk": other_theme.pk}
  56. )
  57. data["name"] = css.name
  58. admin_client.post(create_link, data)
  59. assert other_theme.css.exists()
  60. def test_css_link_creation_fails_if_url_is_not_given(
  61. theme, admin_client, create_link, data
  62. ):
  63. data["url"] = ""
  64. admin_client.post(create_link, data)
  65. assert not theme.css.exists()
  66. def test_css_link_creation_fails_if_url_is_not_valid(
  67. theme, admin_client, create_link, data
  68. ):
  69. data["url"] = "invalid-url"
  70. admin_client.post(create_link, data)
  71. assert not theme.css.exists()
  72. def test_css_link_is_created_with_correct_order(
  73. theme, admin_client, create_link, css, data
  74. ):
  75. admin_client.post(create_link, data)
  76. css_link = theme.css.get(name=data["name"])
  77. assert css_link.order == 1
  78. def test_css_link_creation_queues_task_to_download_remote_css_size(
  79. theme, admin_client, create_link, css, data, mock_task
  80. ):
  81. admin_client.post(create_link, data)
  82. css_link = theme.css.last()
  83. mock_task.assert_called_once_with(css_link.pk)
  84. def test_error_message_is_set_if_user_attempts_to_create_css_link_in_default_theme(
  85. default_theme, admin_client
  86. ):
  87. create_link = reverse(
  88. "misago:admin:appearance:themes:new-css-link", kwargs={"pk": default_theme.pk}
  89. )
  90. response = admin_client.get(create_link)
  91. assert_has_error_message(response)
  92. def test_error_message_is_set_if_user_attempts_to_create_css_link_in_nonexisting_theme(
  93. nonexisting_theme, admin_client
  94. ):
  95. create_link = reverse(
  96. "misago:admin:appearance:themes:new-css-link",
  97. kwargs={"pk": nonexisting_theme.pk},
  98. )
  99. response = admin_client.get(create_link)
  100. assert_has_error_message(response)
  101. def test_css_link_creation_form_redirects_user_to_new_creation_form_after_creation(
  102. theme, admin_client, create_link, data
  103. ):
  104. data["stay"] = "1"
  105. response = admin_client.post(create_link, data)
  106. assert response["location"] == reverse(
  107. "misago:admin:appearance:themes:new-css-link", kwargs={"pk": theme.pk}
  108. )
  109. def test_css_link_edition_form_is_displayed(admin_client, edit_link, css_link):
  110. response = admin_client.get(edit_link)
  111. assert response.status_code == 200
  112. assert_contains(response, css_link.name)
  113. def test_css_link_name_can_be_changed(admin_client, edit_link, css_link, data):
  114. data["name"] = "new link name"
  115. admin_client.post(edit_link, data)
  116. css_link.refresh_from_db()
  117. assert css_link.name == data["name"]
  118. def test_css_link_url_can_be_changed(admin_client, edit_link, css_link, data):
  119. data["url"] = "https://new.css-link.com/test.css"
  120. admin_client.post(edit_link, data)
  121. css_link.refresh_from_db()
  122. assert css_link.url == data["url"]
  123. def test_changing_css_link_url_queues_task_to_download_remote_css_size(
  124. admin_client, edit_link, css_link, data, mock_task
  125. ):
  126. data["url"] = "https://new.css-link.com/test.css"
  127. admin_client.post(edit_link, data)
  128. css_link.refresh_from_db()
  129. mock_task.assert_called_once_with(css_link.pk)
  130. def test_not_changing_css_link_url_queues_task_to_download_remote_css_size(
  131. admin_client, edit_link, css_link, data, mock_task
  132. ):
  133. admin_client.post(edit_link, data)
  134. css_link.refresh_from_db()
  135. mock_task.assert_not_called()
  136. def test_css_order_stays_the_same_after_edit(admin_client, edit_link, css_link, data):
  137. original_order = css_link.order
  138. data["name"] = "changed link"
  139. admin_client.post(edit_link, data)
  140. css_link.refresh_from_db()
  141. assert css_link.order == original_order
  142. def test_error_message_is_set_if_user_attempts_to_edit_css_file_with_link_form(
  143. theme, admin_client, css
  144. ):
  145. edit_link = reverse(
  146. "misago:admin:appearance:themes:edit-css-link",
  147. kwargs={"pk": theme.pk, "css_pk": css.pk},
  148. )
  149. response = admin_client.get(edit_link)
  150. assert_has_error_message(response)