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

Add a mechanism for per-test configs #5657

Merged
merged 2 commits into from
Jul 12, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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