Add a mechanism for per-test configs (#5657)

It's useful to be able to tweak the homeserver config to be used for each
test. This PR adds a mechanism to do so.
This commit is contained in:
Richard van der Hoff 2019-07-12 10:16:23 +01:00 committed by GitHub
parent a83577d64f
commit 6bb0357c94
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 55 additions and 1 deletions

1
changelog.d/5657.misc Normal file
View file

@ -0,0 +1 @@
Add a mechanism for per-test homeserver configuration in the unit tests.

View file

@ -157,6 +157,21 @@ class HomeserverTestCase(TestCase):
""" """
A base TestCase that reduces boilerplate for HomeServer-using test cases. A base TestCase that reduces boilerplate for HomeServer-using test cases.
Defines a setUp method which creates a mock reactor, and instantiates a homeserver
running on that reactor.
There are various hooks for modifying the way that the homeserver is instantiated:
* override make_homeserver, for example by making it pass different parameters into
setup_test_homeserver.
* override default_config, to return a modified configuration dictionary for use
by setup_test_homeserver.
* On a per-test basis, you can use the @override_config decorator to give a
dictionary containing additional configuration settings to be added to the basic
config dict.
Attributes: Attributes:
servlets (list[function]): List of servlet registration function. servlets (list[function]): List of servlet registration function.
user_id (str): The user ID to assume if auth is hijacked. user_id (str): The user ID to assume if auth is hijacked.
@ -168,6 +183,13 @@ class HomeserverTestCase(TestCase):
hijack_auth = True hijack_auth = True
needs_threadpool = False needs_threadpool = False
def __init__(self, methodName, *args, **kwargs):
super().__init__(methodName, *args, **kwargs)
# see if we have any additional config for this test
method = getattr(self, methodName)
self._extra_config = getattr(method, "_extra_config", None)
def setUp(self): def setUp(self):
""" """
Set up the TestCase by calling the homeserver constructor, optionally Set up the TestCase by calling the homeserver constructor, optionally
@ -276,7 +298,14 @@ class HomeserverTestCase(TestCase):
Args: Args:
name (str): The homeserver name/domain. name (str): The homeserver name/domain.
""" """
return default_config(name) config = default_config(name)
# apply any additional config which was specified via the override_config
# decorator.
if self._extra_config is not None:
config.update(self._extra_config)
return config
def prepare(self, reactor, clock, homeserver): def prepare(self, reactor, clock, homeserver):
""" """
@ -534,3 +563,27 @@ class HomeserverTestCase(TestCase):
) )
self.render(request) self.render(request)
self.assertEqual(channel.code, 403, channel.result) self.assertEqual(channel.code, 403, channel.result)
def override_config(extra_config):
"""A decorator which can be applied to test functions to give additional HS config
For use
For example:
class MyTestCase(HomeserverTestCase):
@override_config({"enable_registration": False, ...})
def test_foo(self):
...
Args:
extra_config(dict): Additional config settings to be merged into the default
config dict before instantiating the test homeserver.
"""
def decorator(func):
func._extra_config = extra_config
return func
return decorator