159 lines
3.8 KiB
Python
159 lines
3.8 KiB
Python
import os
|
|
import unittest
|
|
|
|
import django_functest
|
|
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
|
|
from django.template import Context
|
|
from django.template import Template
|
|
from django.test import override_settings
|
|
from django.test import TestCase
|
|
from django.urls import reverse
|
|
from wiki.models import URLPath
|
|
|
|
SUPERUSER1_USERNAME = "admin"
|
|
SUPERUSER1_PASSWORD = "secret"
|
|
|
|
NORMALUSER1_USERNAME = "normaluser"
|
|
NORMALUSER1_PASSWORD = "secret"
|
|
|
|
|
|
class RequireSuperuserMixin:
|
|
def setUp(self):
|
|
super().setUp()
|
|
|
|
from django.contrib.auth import get_user_model
|
|
|
|
User = get_user_model()
|
|
|
|
self.superuser1 = User.objects.create_superuser(
|
|
SUPERUSER1_USERNAME, "nobody@example.com", SUPERUSER1_PASSWORD
|
|
)
|
|
|
|
|
|
class RequireBasicData(RequireSuperuserMixin):
|
|
"""
|
|
Mixin that creates common data required for all tests.
|
|
"""
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
|
|
from django.contrib.auth import get_user_model
|
|
|
|
User = get_user_model()
|
|
|
|
self.normaluser1 = User.objects.create_user(
|
|
NORMALUSER1_USERNAME, "nobody@example.com", NORMALUSER1_PASSWORD
|
|
)
|
|
|
|
|
|
class TestBase(RequireBasicData, TestCase):
|
|
pass
|
|
|
|
|
|
class RequireRootArticleMixin:
|
|
def setUp(self):
|
|
super().setUp()
|
|
self.root = URLPath.create_root()
|
|
self.root_article = URLPath.root().article
|
|
rev = self.root_article.current_revision
|
|
rev.title = "Root Article"
|
|
rev.content = "root article content"
|
|
rev.save()
|
|
|
|
|
|
class ArticleTestBase(RequireRootArticleMixin, TestBase):
|
|
"""
|
|
Sets up basic data for testing with an article and some revisions
|
|
"""
|
|
|
|
pass
|
|
|
|
|
|
class DjangoClientTestBase(TestBase):
|
|
def setUp(self):
|
|
super().setUp()
|
|
|
|
self.client.login(
|
|
username=SUPERUSER1_USERNAME, password=SUPERUSER1_PASSWORD
|
|
)
|
|
|
|
|
|
class WebTestCommonMixin(RequireBasicData, django_functest.ShortcutLoginMixin):
|
|
"""
|
|
Common setup required for WebTest and Selenium tests
|
|
"""
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
|
|
self.shortcut_login(
|
|
username=SUPERUSER1_USERNAME, password=SUPERUSER1_PASSWORD
|
|
)
|
|
|
|
|
|
class WebTestBase(
|
|
WebTestCommonMixin, django_functest.FuncWebTestMixin, TestCase
|
|
):
|
|
pass
|
|
|
|
|
|
INCLUDE_SELENIUM_TESTS = os.environ.get("INCLUDE_SELENIUM_TESTS", "0") == "1"
|
|
|
|
|
|
@unittest.skipUnless(INCLUDE_SELENIUM_TESTS, "Skipping Selenium tests")
|
|
class SeleniumBase(
|
|
WebTestCommonMixin,
|
|
django_functest.FuncSeleniumMixin,
|
|
StaticLiveServerTestCase,
|
|
):
|
|
driver_name = "Chrome"
|
|
display = os.environ.get("SELENIUM_SHOW_BROWSER", "0") == "1"
|
|
|
|
if not INCLUDE_SELENIUM_TESTS:
|
|
# Don't call super() in setUpClass(), it will attempt to instantiate
|
|
# a browser instance which is slow and might fail
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
pass
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
pass
|
|
|
|
|
|
class ArticleWebTestUtils:
|
|
def get_by_path(self, path):
|
|
"""
|
|
Get the article response for the path.
|
|
Example: self.get_by_path("Level1/Slug2/").title
|
|
"""
|
|
return self.client.get(reverse("wiki:get", kwargs={"path": path}))
|
|
|
|
|
|
class TemplateTestCase(TestCase):
|
|
@property
|
|
def template(self):
|
|
raise NotImplementedError("Subclasses must implement this")
|
|
|
|
def render(self, context):
|
|
return Template(self.template).render(Context(context))
|
|
|
|
|
|
# See
|
|
# https://github.com/django-wiki/django-wiki/pull/382
|
|
class wiki_override_settings(override_settings):
|
|
def enable(self):
|
|
super().enable()
|
|
self.reload_wiki_settings()
|
|
|
|
def disable(self):
|
|
super().disable()
|
|
self.reload_wiki_settings()
|
|
|
|
def reload_wiki_settings(self):
|
|
from importlib import reload
|
|
from wiki.conf import settings
|
|
|
|
reload(settings)
|