diff --git a/tests/test_configurer.py b/tests/test_configurer.py new file mode 100644 index 0000000..cb4f2b7 --- /dev/null +++ b/tests/test_configurer.py @@ -0,0 +1,127 @@ +""" +Test +""" + +from tljh import configurer + + +class MockConfigurer: + """ + Mock a Traitlet Configurable object. + + Equivalent to the `c` in `c.JupyterHub.some_property` method of setting + traitlet properties. If an accessed attribute doesn't exist, a new instance + of EmtpyObject is returned. This lets us set arbitrary attributes two + levels deep. + + >>> c = MockConfigurer() + >>> c.FirstLevel.second_level = 'hi' + >>> c.FirstLevel.second_level == 'hi' + True + >>> hasattr(c.FirstLevel, 'does_not_exist') + False + """ + + class _EmptyObject: + """ + Empty class for putting attributes in. + """ + pass + + def __getattr__(self, k): + if k not in self.__dict__: + self.__dict__[k] = MockConfigurer._EmptyObject() + return self.__dict__[k] + + +def test_mock_configurer(): + """ + Test the MockConfigurer's mocking ability + """ + m = MockConfigurer() + m.SomethingSomething = 'hi' + m.FirstLevel.second_level = 'boo' + + assert m.SomethingSomething == 'hi' + assert m.FirstLevel.second_level == 'boo' + + assert not hasattr(m.FirstLevel, 'non_existent') + + +def apply_mock_config(overrides): + """ + Configure a mock configurer with given overrides. + + overrides should be a dict that matches what you parse from a config.yaml + """ + c = MockConfigurer() + configurer.apply_config(overrides, c) + return c + + +def test_app_default(): + """ + Test default application with no config overrides. + """ + c = apply_mock_config({}) + # default_url is not set, so JupyterHub will pick default. + assert not hasattr(c.Spawner, 'default_url') + + +def test_app_jupyterlab(): + """ + Test setting JupyterLab as default application + """ + c = apply_mock_config({'user_environment': {'default_app': 'jupyterlab'}}) + assert c.Spawner.default_url == '/lab' + + +def test_app_nteract(): + """ + Test setting nteract as default application + """ + c = apply_mock_config({'user_environment': {'default_app': 'nteract'}}) + assert c.Spawner.default_url == '/nteract' + + +def test_auth_default(): + """ + Test default authentication settings with no overrides + """ + c = apply_mock_config({}) + + assert c.JupyterHub.authenticator_class == 'firstuseauthenticator.FirstUseAuthenticator' + # Do not auto create users who haven't been manually added by default + assert not c.FirstUseAuthenticator.create_users + + +def test_auth_dummy(): + """ + Test setting Dummy Authenticator & password + """ + c = apply_mock_config({ + 'auth': { + 'type': 'dummy', + 'dummy': { + 'password': 'test' + } + } + }) + assert c.JupyterHub.authenticator_class == 'dummyauthenticator.DummyAuthenticator' + assert c.DummyAuthenticator.password == 'test' + + +def test_auth_firstuse(): + """ + Test setting FirstUse Authenticator options + """ + c = apply_mock_config({ + 'auth': { + 'type': 'firstuse', + 'firstuse': { + 'create_users': True + } + } + }) + assert c.JupyterHub.authenticator_class == 'firstuseauthenticator.FirstUseAuthenticator' + assert c.FirstUseAuthenticator.create_users