test_theme_creation_and_edition.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. import pytest
  2. from django.urls import reverse
  3. from ....test import assert_contains
  4. from ...models import Theme
  5. @pytest.fixture
  6. def create_link():
  7. return reverse("misago:admin:appearance:themes:new")
  8. @pytest.fixture
  9. def edit_link(theme):
  10. return reverse("misago:admin:appearance:themes:edit", kwargs={"pk": theme.pk})
  11. def test_theme_creation_form_is_displayed(admin_client, create_link):
  12. response = admin_client.get(create_link)
  13. assert response.status_code == 200
  14. assert_contains(response, "New theme")
  15. def test_theme_creation_form_reads_parent_from_url_and_preselects_it_in_parent_select(
  16. admin_client, create_link, theme
  17. ):
  18. response = admin_client.get("%s?parent=%s" % (create_link, theme.pk))
  19. assert_contains(response, '<option value="%s" selected>' % theme.pk)
  20. def test_theme_creation_form_reads_parent_from_url_and_discards_invalid_value(
  21. admin_client, create_link, theme
  22. ):
  23. response = admin_client.get("%s?parent=%s" % (create_link, theme.pk + 1))
  24. assert response.status_code == 200
  25. def test_theme_can_be_created(admin_client, create_link):
  26. admin_client.post(create_link, {"name": "New Theme"})
  27. Theme.objects.get(name="New Theme")
  28. def test_child_theme_for_custom_theme_can_be_created(admin_client, create_link, theme):
  29. admin_client.post(create_link, {"name": "New Theme", "parent": theme.pk})
  30. child_theme = Theme.objects.get(name="New Theme")
  31. assert child_theme.parent == theme
  32. def test_child_theme_for_default_theme_can_be_created(
  33. admin_client, create_link, default_theme
  34. ):
  35. admin_client.post(create_link, {"name": "New Theme", "parent": default_theme.pk})
  36. child_theme = Theme.objects.get(name="New Theme")
  37. assert child_theme.parent == default_theme
  38. def test_creating_child_theme_updates_themes_tree(admin_client, create_link, theme):
  39. admin_client.post(create_link, {"name": "New Theme", "parent": theme.pk})
  40. child_theme = Theme.objects.get(name="New Theme")
  41. assert child_theme.tree_id == theme.tree_id
  42. assert child_theme.lft == 2
  43. assert child_theme.rght == 3
  44. theme.refresh_from_db()
  45. assert theme.lft == 1
  46. assert theme.rght == 4
  47. def test_theme_creation_fails_if_name_is_not_given(admin_client, create_link):
  48. admin_client.post(create_link, {"name": ""})
  49. assert Theme.objects.count() == 1
  50. def test_theme_edition_form_is_displayed(admin_client, edit_link, theme):
  51. response = admin_client.get(edit_link)
  52. assert response.status_code == 200
  53. assert_contains(response, theme.name)
  54. def test_theme_name_can_be_edited(admin_client, edit_link, theme):
  55. admin_client.post(edit_link, {"name": "Edited Theme"})
  56. theme.refresh_from_db()
  57. assert theme.name == "Edited Theme"
  58. def test_theme_can_be_moved_under_other_theme(
  59. admin_client, edit_link, theme, default_theme
  60. ):
  61. admin_client.post(edit_link, {"name": theme.name, "parent": default_theme.pk})
  62. theme.refresh_from_db()
  63. assert theme.parent == default_theme
  64. def test_moving_theme_under_other_theme_updates_themes_tree(
  65. admin_client, edit_link, theme, default_theme
  66. ):
  67. admin_client.post(edit_link, {"name": theme.name, "parent": default_theme.pk})
  68. default_theme.refresh_from_db()
  69. theme.refresh_from_db()
  70. assert theme.tree_id == default_theme.tree_id
  71. assert theme.lft == 2
  72. assert theme.rght == 3
  73. assert default_theme.lft == 1
  74. assert default_theme.rght == 4
  75. def test_theme_cant_be_moved_under_itself(admin_client, edit_link, theme):
  76. admin_client.post(edit_link, {"name": theme.name, "parent": theme.pk})
  77. theme.refresh_from_db()
  78. assert not theme.parent
  79. def test_theme_cant_be_moved_under_its_child_theme(admin_client, edit_link, theme):
  80. child_theme = Theme.objects.create(name="Child Theme", parent=theme)
  81. admin_client.post(edit_link, {"name": theme.name, "parent": child_theme.pk})
  82. theme.refresh_from_db()
  83. assert not theme.parent
  84. def test_moving_child_theme_under_other_theme_updates_both_themes_trees(
  85. admin_client, theme, default_theme
  86. ):
  87. child_theme = Theme.objects.create(name="Child Theme", parent=theme)
  88. edit_link = reverse(
  89. "misago:admin:appearance:themes:edit", kwargs={"pk": child_theme.pk}
  90. )
  91. admin_client.post(edit_link, {"name": child_theme.name, "parent": default_theme.pk})
  92. default_theme.refresh_from_db()
  93. child_theme.refresh_from_db()
  94. theme.refresh_from_db()
  95. assert child_theme.parent == default_theme
  96. assert child_theme.tree_id == default_theme.tree_id
  97. assert child_theme.lft == 2
  98. assert child_theme.rght == 3
  99. assert default_theme.lft == 1
  100. assert default_theme.rght == 4
  101. assert theme.tree_id != default_theme.tree_id
  102. assert theme.lft == 1
  103. assert theme.rght == 2
  104. def test_moving_theme_under_root_updates_theme_tree_and_creates_new_one(
  105. admin_client, edit_link, theme, default_theme
  106. ):
  107. theme.parent = default_theme
  108. theme.save()
  109. admin_client.post(edit_link, {"name": theme.name})
  110. default_theme.refresh_from_db()
  111. theme.refresh_from_db()
  112. assert theme.parent is None
  113. assert theme.tree_id != default_theme.tree_id
  114. assert theme.lft == 1
  115. assert theme.rght == 2
  116. assert default_theme.lft == 1
  117. assert default_theme.rght == 2
  118. def test_moving_theme_with_child_under_root_updates_theme_tree_and_creates_new_one(
  119. admin_client, edit_link, theme, default_theme
  120. ):
  121. theme.parent = default_theme
  122. theme.save()
  123. child_theme = Theme.objects.create(name="Child Theme", parent=theme)
  124. admin_client.post(edit_link, {"name": theme.name})
  125. default_theme.refresh_from_db()
  126. child_theme.refresh_from_db()
  127. theme.refresh_from_db()
  128. assert theme.tree_id != default_theme.tree_id
  129. assert theme.lft == 1
  130. assert theme.rght == 4
  131. assert child_theme.parent == theme
  132. assert child_theme.tree_id == theme.tree_id
  133. assert child_theme.lft == 2
  134. assert child_theme.rght == 3
  135. assert default_theme.lft == 1
  136. assert default_theme.rght == 2