test_page_models.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. from datetime import datetime, timedelta
  2. from django.test import Client
  3. from wagtail.test.utils import WagtailPageTests
  4. from coderedcms.models.page_models import (
  5. CoderedArticleIndexPage,
  6. CoderedArticlePage,
  7. CoderedEventIndexPage,
  8. CoderedEventPage,
  9. CoderedFormPage,
  10. CoderedLocationIndexPage,
  11. CoderedLocationPage,
  12. CoderedPage,
  13. CoderedStreamFormPage,
  14. CoderedWebPage,
  15. get_page_models,
  16. )
  17. from coderedcms.models.snippet_models import Classifier, ClassifierTerm
  18. from coderedcms.tests.testapp.models import (
  19. ArticleIndexPage,
  20. ArticlePage,
  21. EventIndexPage,
  22. EventPage,
  23. EventOccurrence,
  24. FormPage,
  25. IndexTestPage,
  26. LocationIndexPage,
  27. LocationPage,
  28. StreamFormPage,
  29. WebPage,
  30. )
  31. class BasicPageTestCase:
  32. """
  33. This is a testing mixin used to run common tests for basic versions of page types.
  34. """
  35. class Meta:
  36. abstract = True
  37. def setUp(self):
  38. self.client = Client()
  39. self.basic_page = self.model(title=str(self.model._meta.verbose_name))
  40. self.homepage = WebPage.objects.get(url_path="/home/")
  41. self.homepage.add_child(instance=self.basic_page)
  42. def tearDown(self):
  43. self.basic_page.delete()
  44. def test_get(self):
  45. """
  46. Tests to make sure a basic version of the page serves a 200 from a GET request.
  47. """
  48. response = self.client.get(self.basic_page.url, follow=True)
  49. self.assertEqual(response.status_code, 200)
  50. class AbstractPageTestCase:
  51. """
  52. This is a testing mixin used to run common tests for abstract page types.
  53. """
  54. class Meta:
  55. abstract = True
  56. def test_not_available(self):
  57. """
  58. Tests to make sure the page is not creatable and not in our global
  59. list of page models.
  60. """
  61. self.assertFalse(self.model.is_creatable)
  62. self.assertFalse(self.model in get_page_models())
  63. class ConcretePageTestCase:
  64. """
  65. This is a testing mixin used to run common tests for concrete page types.
  66. """
  67. class Meta:
  68. abstract = True
  69. def test_is_available(self):
  70. """
  71. Tests to make sure the page is creatable and in our global list of
  72. page models.
  73. """
  74. self.assertTrue(self.model.is_creatable)
  75. self.assertTrue(self.model in get_page_models())
  76. class ConcreteBasicPageTestCase(ConcretePageTestCase, BasicPageTestCase):
  77. class Meta:
  78. abstract = True
  79. class ConcreteFormPageTestCase(ConcreteBasicPageTestCase):
  80. class Meta:
  81. abstract = True
  82. def test_post(self):
  83. """
  84. Tests to make sure a basic version of the page accepts data and is
  85. viewable in the Wagtail admin.
  86. """
  87. # TODO: add form field via streamfield.
  88. response = self.client.post(
  89. self.basic_page.url, {"name": "Monty Python"}, follow=True
  90. )
  91. self.assertEqual(response.status_code, 200)
  92. # TODO: log in as superuser and get wagtail admin form submission page.
  93. def test_spam(self):
  94. """
  95. Test to check if the default spam catching works.
  96. """
  97. response = self.client.post(
  98. self.basic_page.url,
  99. {"cr-decoy-comments": "This is Spam"},
  100. follow=True,
  101. )
  102. messages = list(response.context["messages"])
  103. self.assertEqual(len(messages), 1)
  104. self.assertEqual(str(messages[0]), self.basic_page.get_spam_message())
  105. def test_not_spam(self):
  106. """
  107. Test to check if the default spam catching won't mark correct posts as spam.
  108. """
  109. response = self.client.post(self.basic_page.url)
  110. self.assertFalse(hasattr(response, "is_spam"))
  111. class CoderedArticleIndexPageTestCase(AbstractPageTestCase, WagtailPageTests):
  112. model = CoderedArticleIndexPage
  113. class CoderedArticlePageTestCase(AbstractPageTestCase, WagtailPageTests):
  114. model = CoderedArticlePage
  115. class CoderedFormPageTestCase(AbstractPageTestCase, WagtailPageTests):
  116. model = CoderedFormPage
  117. class CoderedPageTestCase(WagtailPageTests):
  118. model = CoderedPage
  119. def test_not_available(self):
  120. self.assertFalse(self.model.is_creatable)
  121. self.assertTrue(self.model in get_page_models())
  122. class CoderedWebPageTestCase(AbstractPageTestCase, WagtailPageTests):
  123. model = CoderedWebPage
  124. class CoderedLocationIndexPageTestCase(AbstractPageTestCase, WagtailPageTests):
  125. model = CoderedLocationIndexPage
  126. class CoderedLocationPageTestCase(AbstractPageTestCase, WagtailPageTests):
  127. model = CoderedLocationPage
  128. class CoderedEventIndexPageTestCase(AbstractPageTestCase, WagtailPageTests):
  129. model = CoderedEventIndexPage
  130. class CoderedEventPageTestCase(AbstractPageTestCase, WagtailPageTests):
  131. model = CoderedEventPage
  132. class CoderedStreamFormPageTestCase(AbstractPageTestCase, WagtailPageTests):
  133. model = CoderedStreamFormPage
  134. # -- CONCRETE PAGES ------------------------------------------------------------
  135. class ArticlePageTestCase(ConcreteBasicPageTestCase, WagtailPageTests):
  136. model = ArticlePage
  137. class ArticleIndexPageTestCase(ConcreteBasicPageTestCase, WagtailPageTests):
  138. model = ArticleIndexPage
  139. class FormPageTestCase(ConcreteFormPageTestCase, WagtailPageTests):
  140. model = FormPage
  141. class WebPageTestCase(ConcreteBasicPageTestCase, WagtailPageTests):
  142. model = WebPage
  143. class EventIndexPageTestCase(ConcreteBasicPageTestCase, WagtailPageTests):
  144. model = EventIndexPage
  145. class EventPageTestCase(ConcreteBasicPageTestCase, WagtailPageTests):
  146. model = EventPage
  147. def setUp(self):
  148. super().setUp()
  149. self.occurrence = EventOccurrence(
  150. start=datetime.now(),
  151. end=datetime.now() + timedelta(days=1),
  152. event=self.basic_page,
  153. )
  154. self.occurrence.save()
  155. def tearDown(self) -> None:
  156. super().tearDown()
  157. self.occurrence.delete()
  158. class LocationIndexPageTestCase(ConcreteBasicPageTestCase, WagtailPageTests):
  159. model = LocationIndexPage
  160. class LocationPageTestCase(ConcreteBasicPageTestCase, WagtailPageTests):
  161. model = LocationPage
  162. class StreamFormPageTestCase(ConcreteFormPageTestCase, WagtailPageTests):
  163. model = StreamFormPage
  164. # -- PAGES FOR TESTING SPECIFIC FUNCTIONALITY ----------------------------------
  165. class IndexTestCase(ConcreteBasicPageTestCase, WagtailPageTests):
  166. """
  167. Tests indexing features (show/sort/filter child pages).
  168. """
  169. model = IndexTestPage
  170. def setUp(self):
  171. super().setUp()
  172. # Create some child pages under this page.
  173. self.child_1 = WebPage(title=f"{self.basic_page.title} - Child 1")
  174. self.basic_page.add_child(instance=self.child_1)
  175. self.child_2 = WebPage(title=f"{self.basic_page.title} - Child 2")
  176. self.basic_page.add_child(instance=self.child_2)
  177. self.child_3 = WebPage(title=f"{self.basic_page.title} - Child 3")
  178. self.basic_page.add_child(instance=self.child_3)
  179. # Create some classifier terms for general purpose use.
  180. self.classifier = Classifier.objects.create(name="Classifier")
  181. self.term_a = ClassifierTerm.objects.create(
  182. classifier=self.classifier,
  183. name="Term A",
  184. sort_order=0,
  185. )
  186. self.term_b = ClassifierTerm.objects.create(
  187. classifier=self.classifier,
  188. name="Term B",
  189. sort_order=1,
  190. )
  191. def tearDown(self):
  192. super().tearDown()
  193. self.classifier.delete()
  194. def test_get_index_children(self):
  195. """
  196. Tests to make sure `get_index_children()` returns the correct queryset
  197. based on selected page settings.
  198. """
  199. # Test it without setting any options, ensure it is not broken.
  200. children = self.basic_page.get_index_children()
  201. self.assertIn(self.child_1, children)
  202. self.assertIn(self.child_2, children)
  203. self.assertIn(self.child_3, children)
  204. # Test index_order_by returns in the correct order.
  205. self.basic_page.index_order_by = "title"
  206. self.basic_page.save()
  207. children = self.basic_page.get_index_children()
  208. self.assertEqual(self.child_1, children[0])
  209. self.assertEqual(self.child_2, children[1])
  210. self.assertEqual(self.child_3, children[2])
  211. # Test index_order_by classifier returns in the correct order.
  212. self.basic_page.index_order_by_classifier = self.classifier
  213. self.basic_page.index_order_by = "title"
  214. self.basic_page.save()
  215. self.child_3.classifier_terms.add(self.term_a)
  216. self.child_3.save()
  217. self.child_1.classifier_terms.add(self.term_b)
  218. self.child_1.save()
  219. self.child_2.classifier_terms.add(self.term_b)
  220. self.child_2.save()
  221. children = self.basic_page.get_index_children()
  222. self.assertEqual(self.child_3, children[0])
  223. self.assertEqual(self.child_1, children[1])
  224. self.assertEqual(self.child_2, children[2])