Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Add a mechanism for per-test configs (#5657)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
richvdh authored Jul 12, 2019
1 parent a83577d commit 6bb0357
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 1 deletion.
1 change: 1 addition & 0 deletions changelog.d/5657.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add a mechanism for per-test homeserver configuration in the unit tests.
55 changes: 54 additions & 1 deletion tests/unittest.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,21 @@ class HomeserverTestCase(TestCase):
"""
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:
servlets (list[function]): List of servlet registration function.
user_id (str): The user ID to assume if auth is hijacked.
Expand All @@ -168,6 +183,13 @@ class HomeserverTestCase(TestCase):
hijack_auth = True
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):
"""
Set up the TestCase by calling the homeserver constructor, optionally
Expand Down Expand Up @@ -276,7 +298,14 @@ def default_config(self, name="test"):
Args:
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):
"""
Expand Down Expand Up @@ -534,3 +563,27 @@ def attempt_wrong_password_login(self, username, password):
)
self.render(request)
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

0 comments on commit 6bb0357

Please sign in to comment.