def test_no_config_file( self, mock_os, mock_path_exists, mock_psws, mock_management_util, mock_tabpy_state, mock_parse_arguments, ): pkg_path = os.path.dirname(tabpy.__file__) obj_path = os.path.join(pkg_path, "tmp", "query_objects") state_path = os.path.join(pkg_path, "tabpy_server") mock_os.environ = { "TABPY_PORT": "9004", "TABPY_QUERY_OBJECT_PATH": obj_path, "TABPY_STATE_PATH": state_path, } TabPyApp(None) self.assertEqual(len(mock_psws.mock_calls), 1) self.assertEqual(len(mock_tabpy_state.mock_calls), 1) self.assertEqual(len(mock_path_exists.mock_calls), 1) self.assertTrue(len(mock_management_util.mock_calls) > 0) mock_os.makedirs.assert_not_called()
def test_config_file_present( self, mock_os, mock_path_exists, mock_psws, mock_management_util, mock_tabpy_state, ): self.assertTrue(self.config_file is not None) config_file = self.config_file config_file.write( "[TabPy]\n" "TABPY_QUERY_OBJECT_PATH = foo\n" "TABPY_STATE_PATH = bar\n".encode() ) config_file.close() mock_os.path.realpath.return_value = "bar" mock_os.environ = {"TABPY_PORT": "1234"} app = TabPyApp(config_file.name) self.assertEqual(app.settings["port"], "1234") self.assertEqual( app.settings["server_version"], open("tabpy/VERSION").read().strip() ) self.assertEqual(app.settings["upload_dir"], "foo") self.assertEqual(app.settings["state_file_path"], "bar") self.assertEqual(app.settings["transfer_protocol"], "http") self.assertTrue("certificate_file" not in app.settings) self.assertTrue("key_file" not in app.settings) self.assertEqual(app.settings["log_request_context"], False) self.assertEqual(app.settings["evaluate_timeout"], 30)
def test_config_file_present(self, mock_os, mock_path_exists, mock_psws, mock_management_util, mock_tabpy_state, mock_parse_arguments): self.assertTrue(self.config_file is not None) config_file = self.config_file config_file.write('[TabPy]\n' 'TABPY_QUERY_OBJECT_PATH = foo\n' 'TABPY_STATE_PATH = bar\n'.encode()) config_file.close() mock_parse_arguments.return_value = Namespace(config=config_file.name) mock_os.getenv.side_effect = [1234] mock_os.path.realpath.return_value = 'bar' app = TabPyApp(config_file.name) getenv_calls = [call('TABPY_PORT')] mock_os.getenv.assert_has_calls(getenv_calls, any_order=True) self.assertEqual(app.settings['port'], 1234) self.assertEqual(app.settings['server_version'], open('VERSION').read().strip()) self.assertEqual(app.settings['upload_dir'], 'foo') self.assertEqual(app.settings['state_file_path'], 'bar') self.assertEqual(app.settings['transfer_protocol'], 'http') self.assertTrue('certificate_file' not in app.settings) self.assertTrue('key_file' not in app.settings) self.assertEqual(app.settings['log_request_context'], False) self.assertEqual(app.settings['evaluate_timeout'], 30)
def test_no_state_ini_file_or_state_dir(self, mock_os, mock_path_exists, mock_psws, mock_management_util, mock_tabpy_state, mock_parse_arguments): TabPyApp(None) self.assertEqual(len(mock_os.makedirs.mock_calls), 1)
def test_http(self): self.fp.write("[TabPy]\n" "TABPY_TRANSFER_PROTOCOL = http") self.fp.close() app = TabPyApp(self.fp.name) self.assertEqual(app.settings['transfer_protocol'], 'http')
def main(): args = docopt.docopt(__doc__) config = args["--config"] or None from tabpy.tabpy_server.app.app import TabPyApp app = TabPyApp(config) app.run()
def test_given_no_pwd_file_expect_empty_credentials_list(self): self._set_file(self.config_file.name, "[TabPy]\n" "TABPY_TRANSFER_PROTOCOL = http") app = TabPyApp(self.config_file.name) self.assertDictEqual( app.credentials, {}, 'Expected no credentials with no password file provided')
def test_env_variables_in_config(self, mock_state, mock_get_state, mock_path_exists, mock_os): mock_os.environ = {'foo': 'baz'} config_file = self.config_file config_file.write('[TabPy]\n' 'TABPY_PORT = %(foo)sbar'.encode()) config_file.close() app = TabPyApp(self.config_file.name) self.assertEqual(app.settings['port'], 'bazbar')
def test_env_variables_in_config(self, mock_state, mock_get_state, mock_path_exists, mock_os): mock_os.environ = {"foo": "baz"} config_file = self.config_file config_file.write("[TabPy]\n" "TABPY_PORT = %(foo)sbar".encode()) config_file.close() app = TabPyApp(self.config_file.name) self.assertEqual(app.settings["port"], "bazbar")
def test_custom_evaluate_timeout_valid( self, mock_state, mock_get_state_from_file, mock_path_exists ): self.assertTrue(self.config_file is not None) config_file = self.config_file config_file.write("[TabPy]\n" "TABPY_EVALUATE_TIMEOUT = 1996".encode()) config_file.close() app = TabPyApp(self.config_file.name) self.assertEqual(app.settings["evaluate_timeout"], 1996.0)
def test_given_missing_pwd_file_expect_app_fails(self): self._set_file(self.config_file.name, "[TabPy]\n" "TABPY_PWD_FILE = foo") with self.assertRaises(RuntimeError) as cm: TabPyApp(self.config_file.name) ex = cm.exception self.assertEqual( f"Failed to read password file {self.pwd_file.name}", ex.args[0])
def test_custom_evaluate_timeout_invalid(self, mock_state, mock_get_state_from_file, mock_path_exists): self.assertTrue(self.config_file is not None) config_file = self.config_file config_file.write("[TabPy]\n" 'TABPY_EVALUATE_TIMEOUT = "im not a float"'.encode()) config_file.close() with self.assertRaises(ValueError): TabPyApp(self.config_file.name)
def test_config_file_does_not_exist(self): app = TabPyApp('/folder_does_not_exit/file_does_not_exist.conf') self.assertEqual(app.settings['port'], 9004) self.assertEqual(app.settings['server_version'], open('tabpy/VERSION').read().strip()) self.assertEqual(app.settings['transfer_protocol'], 'http') self.assertTrue('certificate_file' not in app.settings) self.assertTrue('key_file' not in app.settings) self.assertEqual(app.settings['log_request_context'], False) self.assertEqual(app.settings['evaluate_timeout'], 30)
def test_config_file_does_not_exist(self): app = TabPyApp("/folder_does_not_exit/file_does_not_exist.conf") self.assertEqual(app.settings["port"], 9004) self.assertEqual(app.settings["server_version"], open("tabpy/VERSION").read().strip()) self.assertEqual(app.settings["transfer_protocol"], "http") self.assertTrue("certificate_file" not in app.settings) self.assertTrue("key_file" not in app.settings) self.assertEqual(app.settings["log_request_context"], False) self.assertEqual(app.settings["evaluate_timeout"], 30)
def test_custom_evaluate_timeout_invalid(self, mock_state, mock_get_state_from_file, mock_path_exists): self.assertTrue(self.config_file is not None) config_file = self.config_file config_file.write('[TabPy]\n' 'TABPY_EVALUATE_TIMEOUT = "im not a float"'.encode()) config_file.close() app = TabPyApp(self.config_file.name) self.assertEqual(app.settings['evaluate_timeout'], 30.0)
def test_https_success(self, mock_isfile, mock_validate_cert): self.fp.write("[TabPy]\n" "TABPY_TRANSFER_PROTOCOL = HtTpS\n" "TABPY_CERTIFICATE_FILE = foo\n" "TABPY_KEY_FILE = bar") self.fp.close() app = TabPyApp(self.fp.name) self.assertEqual(app.settings['transfer_protocol'], 'https') self.assertEqual(app.settings['certificate_file'], 'foo') self.assertEqual(app.settings['key_file'], 'bar')
def test_given_empty_pwd_file_expect_app_fails(self): self._set_file(self.config_file.name, '[TabPy]\n' f'TABPY_PWD_FILE = {self.pwd_file.name}') self._set_file(self.pwd_file.name, "# just a comment") with self.assertRaises(RuntimeError) as cm: TabPyApp(self.config_file.name) ex = cm.exception self.assertEqual( f'Failed to read password file {self.pwd_file.name}', ex.args[0])
def test_given_one_password_in_pwd_file_expect_one_credentials_entry(self): self._set_file(self.config_file.name, "[TabPy]\n" f"TABPY_PWD_FILE = {self.pwd_file.name}") login = "******" pwd = "someting@something_else" self._set_file(self.pwd_file.name, "# passwords\n" "\n" f"{login} {pwd}") app = TabPyApp(self.config_file.name) self.assertEqual(len(app.credentials), 1) self.assertIn(login, app.credentials) self.assertEqual(app.credentials[login], pwd)
def test_given_multiple_credentials_expect_all_parsed(self): self._set_file(self.config_file.name, "[TabPy]\n" f"TABPY_PWD_FILE = {self.pwd_file.name}") creds = {"user_1": "pwd_1", "user@2": "pwd@2", "user#3": "pwd#3"} pwd_file_context = "" for login in creds: pwd_file_context += f"{login} {creds[login]}\n" self._set_file(self.pwd_file.name, pwd_file_context) app = TabPyApp(self.config_file.name) self.assertCountEqual(creds, app.credentials) for login in creds: self.assertIn(login, app.credentials) self.assertEqual(creds[login], app.credentials[login])
def test_given_different_cases_in_pwd_file_expect_app_fails(self): self._set_file(self.config_file.name, "[TabPy]\n" f'TABPY_PWD_FILE = {self.pwd_file.name}') self._set_file( self.pwd_file.name, "# passwords\n" "user1 pwd1\n" "user_2 pwd#2" "UseR1 pwd@3") with self.assertRaises(RuntimeError) as cm: TabPyApp(self.config_file.name) ex = cm.exception self.assertEqual( f'Failed to read password file {self.pwd_file.name}', ex.args[0])
def test_given_multiple_credentials_expect_all_parsed(self): self._set_file(self.config_file.name, "[TabPy]\n" f'TABPY_PWD_FILE = {self.pwd_file.name}') creds = {'user_1': 'pwd_1', 'user@2': 'pwd@2', 'user#3': 'pwd#3'} pwd_file_context = "" for login in creds: pwd_file_context += f'{login} {creds[login]}\n' self._set_file(self.pwd_file.name, pwd_file_context) app = TabPyApp(self.config_file.name) self.assertCountEqual(creds, app.credentials) for login in creds: self.assertIn(login, app.credentials) self.assertEqual(creds[login], app.credentials[login])
def test_given_username_but_no_password_expect_parsing_fails(self): self._set_file(self.config_file.name, "[TabPy]\n" f'TABPY_PWD_FILE = {self.pwd_file.name}') login = '******' pwd = '' self._set_file(self.pwd_file.name, "# passwords\n" "\n" f'{login} {pwd}') with self.assertRaises(RuntimeError) as cm: TabPyApp(self.config_file.name) ex = cm.exception self.assertEqual( f'Failed to read password file {self.pwd_file.name}', ex.args[0])
def test_given_duplicate_usernames_expect_parsing_fails(self): self._set_file(self.config_file.name, "[TabPy]\n" f"TABPY_PWD_FILE = {self.pwd_file.name}") login = "******" pwd = "hashedpw" self._set_file(self.pwd_file.name, "# passwords\n" "\n" f"{login} {pwd}\n{login} {pwd}") with self.assertRaises(RuntimeError) as cm: TabPyApp(self.config_file.name) ex = cm.exception self.assertEqual( f"Failed to read password file {self.pwd_file.name}", ex.args[0])
def test_given_one_line_with_too_many_params_expect_app_fails(self): self._set_file(self.config_file.name, "[TabPy]\n" f"TABPY_PWD_FILE = {self.pwd_file.name}") self._set_file( self.pwd_file.name, "# passwords\n" "user1 pwd1\n" "user_2 pwd#2" "user1 pwd@3", ) with self.assertRaises(RuntimeError) as cm: TabPyApp(self.config_file.name) ex = cm.exception self.assertEqual( f"Failed to read password file {self.pwd_file.name}", ex.args[0])
def test_no_config_file(self, mock_os, mock_path_exists, mock_psws, mock_management_util, mock_tabpy_state, mock_parse_arguments): pkg_path = os.path.dirname(tabpy.__file__) obj_path = os.path.join(pkg_path, 'tmp', 'query_objects') state_path = os.path.join(pkg_path, 'tabpy_server') mock_os.getenv.side_effect = [9004, obj_path, state_path] TabPyApp(None) getenv_calls = [ call('TABPY_PORT'), call('TABPY_QUERY_OBJECT_PATH'), call('TABPY_STATE_PATH')] mock_os.getenv.assert_has_calls(getenv_calls, any_order=True) self.assertEqual(len(mock_psws.mock_calls), 1) self.assertEqual(len(mock_tabpy_state.mock_calls), 1) self.assertEqual(len(mock_path_exists.mock_calls), 1) self.assertTrue(len(mock_management_util.mock_calls) > 0) mock_os.makedirs.assert_not_called()
def get_app(self): if hasattr(self, 'config_file') and hasattr(self.config_file, 'name'): self.app = TabPyApp(self.config_file.name) else: self.app = TabPyApp() return self.app._create_tornado_web_app()
def get_app(self): self.app = TabPyApp(self.config_file.name) return self.app._create_tornado_web_app()
def get_app(self): self.app = TabPyApp(None) return self.app._create_tornado_web_app()
def assertTabPyAppRaisesRuntimeError(self, expected_message): with self.assertRaises(RuntimeError) as err: TabPyApp(self.fp.name) self.assertEqual(err.exception.args[0], expected_message)
def main(): from tabpy.tabpy_server.app.app import TabPyApp app = TabPyApp() app.run()