Source code for duck.tests.test_server

"""
Minimal test base for Duck webserver using external BASE_URL.
"""
import os
import urllib3
import unittest
import warnings
import random

from typing import Any, Dict


VERBOSE_TESTS = os.getenv("DUCK_TESTS_VERBOSE")


[docs] def set_settings(settings: Dict[str, Any]): # This must be called before any use of the duck.settings module e.g. through duck.app os.environ["DUCK_SETTINGS_MODULE"] = "duck.etc.structures.projects.testing.web.settings" os.environ["DJANGO_SETTINGS_MODULE"] = "duck.etc.structures.projects.testing.web.backend.django.duckapp.duckapp.settings" # Import settings after setting the settings module from duck.settings import SETTINGS # Edit settings inplace. for key, value in settings.items(): SETTINGS[key.upper()] = value if VERBOSE_TESTS: SETTINGS['SILENT'] = SETTINGS['DJANGO_SILENT'] = False
[docs] class TestBaseServer(unittest.TestCase): """ Base class for Duck server tests using a predefined BASE_URL. """ settings: Dict[str, Any] = { "silent": True, "django_silent": True, "log_to_file": False, "auto_reload": False, "force_https": False, "enable_https": False, "use_django": False, } _app = None @property def app(self): from duck.app import App from duck.settings import SETTINGS app = type(self)._app if not app: type(self)._app = app = App( addr="localhost", port=random.randint(8000, 9000), uses_ipv6=False, domain="localhost", disable_signal_handler=False, disable_ipc_handler=True, ) return app @property def base_url(self) -> str: return self.app.absolute_uri
[docs] def setUp(self): warnings.filterwarnings("ignore", category=ResourceWarning) warnings.filterwarnings("ignore", category=urllib3.exceptions.InsecureRequestWarning) if not self.app.started: self.app.run()
# Set dynamic testing settings set_settings(TestBaseServer.settings) if __name__ == "__main__": unittest.main()