class ConfigControllerTestCase(TestCase): @setup def setup_controller(self): self.filename = os.path.join(tempfile.gettempdir(), 'test_config') self.controller = ConfigController(self.filename) @teardown def teardown_controller(self): try: os.unlink(self.filename) except OSError: pass def test_read_config(self): content = "12345" with open(self.filename, 'w') as fh: fh.write(content) assert_equal(self.controller.read_config(), content) def test_read_config_missing(self): self.controller.filepath = '/bogggusssss' assert not self.controller.read_config() def test_rewrite_config(self): content = '123456' assert self.controller.rewrite_config(content) assert_equal(self.controller.read_config(), content) def test_rewrite_config_missing(self): self.controller.filepath = '/bogggusssss' assert not self.controller.rewrite_config('123')
def setup_controller(self): self.mcp = mock.create_autospec(mcp.MasterControlProgram) self.manager = mock.create_autospec(manager.ConfigManager) self.mcp.get_config_manager.return_value = self.manager self.controller = ConfigController(self.mcp)
class ConfigControllerTestCase(TestCase): @setup def setup_controller(self): self.mcp = mock.create_autospec(mcp.MasterControlProgram) self.manager = mock.create_autospec(manager.ConfigManager) self.mcp.get_config_manager.return_value = self.manager self.controller = ConfigController(self.mcp) def test_render_template(self): config_content = "asdf asdf" container = self.manager.load.return_value = mock.create_autospec( config_parse.ConfigContainer, ) container.get_node_names.return_value = ['one', 'two', 'three'] container.get_master.return_value.command_context = {'zing': 'stars'} content = self.controller.render_template(config_content) assert_in('# one\n# three\n# two\n', content) assert_in('# %-30s: %s' % ('zing', 'stars'), content) assert_in(config_content, content) def test_strip_header_master(self): name, content = 'MASTER', mock.Mock() assert_equal(self.controller.strip_header(name, content), content) def test_strip_header_named(self): expected = "\nthing" name, content = 'something', "{}{}".format( self.controller.TEMPLATE, expected, ) assert_equal(self.controller.strip_header(name, content), expected) def test_strip_header_named_missing(self): name, content = 'something', 'whatever content' assert_equal(self.controller.strip_header(name, content), content) def test_get_config_content_new(self): self.manager.__contains__.return_value = False content = self.controller._get_config_content('name') assert_equal(content, self.controller.DEFAULT_NAMED_CONFIG) assert not self.manager.read_raw_config.call_count def test_get_config_content_old(self): self.manager.__contains__.return_value = True name = 'the_name' content = self.controller._get_config_content(name) assert_equal(content, self.manager.read_raw_config.return_value) self.manager.read_raw_config.assert_called_with(name) def test_read_config_master(self): self.manager.__contains__.return_value = True name = 'MASTER' resp = self.controller.read_config(name) self.manager.read_raw_config.assert_called_with(name) self.manager.get_hash.assert_called_with(name) assert_equal(resp['config'], self.manager.read_raw_config.return_value) assert_equal(resp['hash'], self.manager.get_hash.return_value) def test_read_config_named(self): name = 'some_name' autospec_method(self.controller._get_config_content) autospec_method(self.controller.render_template) resp = self.controller.read_config(name) self.controller._get_config_content.assert_called_with(name) self.controller.render_template.assert_called_with( self.controller._get_config_content.return_value, ) assert_equal( resp['config'], self.controller.render_template.return_value, ) assert_equal(resp['hash'], self.manager.get_hash.return_value) def test_read_config_no_header(self): name = 'some_name' autospec_method(self.controller._get_config_content) autospec_method(self.controller.render_template) resp = self.controller.read_config(name, add_header=False) assert not self.controller.render_template.called assert_equal( resp['config'], self.controller._get_config_content.return_value, ) def test_update_config(self): autospec_method(self.controller.strip_header) name, content, config_hash = None, mock.Mock(), mock.Mock() self.manager.get_hash.return_value = config_hash assert not self.controller.update_config(name, content, config_hash) striped_content = self.controller.strip_header.return_value self.manager.write_config.assert_called_with(name, striped_content) self.mcp.reconfigure.assert_called_with() self.controller.strip_header.assert_called_with(name, content) self.manager.get_hash.assert_called_with(name) def test_update_config_failure(self): autospec_method(self.controller.strip_header) striped_content = self.controller.strip_header.return_value name, config_hash = None, mock.Mock() self.manager.get_hash.return_value = config_hash self.manager.write_config.side_effect = ConfigError("It broke") error = self.controller.update_config( name, striped_content, config_hash, ) assert_equal(error, "It broke") self.manager.write_config.assert_called_with(name, striped_content) assert not self.mcp.reconfigure.call_count def test_update_config_hash_mismatch(self): name, content, config_hash = None, mock.Mock(), mock.Mock() error = self.controller.update_config(name, content, config_hash) assert_equal(error, "Configuration has changed. Please try again.") def test_delete_config(self): name, content, config_hash = None, "", mock.Mock() self.manager.get_hash.return_value = config_hash assert not self.controller.delete_config(name, content, config_hash) self.manager.delete_config.assert_called_with(name) self.mcp.reconfigure.assert_called_with() self.manager.get_hash.assert_called_with(name) def test_delete_config_failure(self): name, content, config_hash = None, "", mock.Mock() self.manager.get_hash.return_value = config_hash self.manager.delete_config.side_effect = Exception("some error") error = self.controller.delete_config(name, content, config_hash) assert error self.manager.delete_config.assert_called_with(name) assert not self.mcp.reconfigure.call_count def test_delete_config_hash_mismatch(self): name, content, config_hash = None, "", mock.Mock() error = self.controller.delete_config(name, content, config_hash) assert_equal(error, "Configuration has changed. Please try again.") def test_delete_config_content_not_empty(self): name, content, config_hash = None, "content", mock.Mock() error = self.controller.delete_config(name, content, config_hash) assert error def test_get_namespaces(self): result = self.controller.get_namespaces() self.manager.get_namespaces.assert_called_with() assert_equal(result, self.manager.get_namespaces.return_value)
def setup_controller(self): self.filename = os.path.join(tempfile.gettempdir(), 'test_config') self.controller = ConfigController(self.filename)
class ConfigControllerTestCase(TestCase): BASE_CONFIG = """ config_name: MASTER nodes: - {hostname: localhost, name: local} ssh_options: {agent: true} state_persistence: {name: state_data.shelve, store_type: shelve} """ TEST_CONFIG_UPDATE = BASE_CONFIG + """ jobs: - actions: - {command: echo 'Echo!', name: echo_action} - {command: 'echo ''Today is %(shortdate)s, which is the same as %(year)s-%(month)s-%(day)s'' && false', name: another_echo_action} cleanup_action: {command: echo 'at last'} name: echo_job node: local schedule: interval 1 hour """ TEST_CONFIG_RESULT = """MASTER: config_name: MASTER jobs: - actions: - {command: echo 'Echo!', name: echo_action} - {command: 'echo ''Today is %(shortdate)s, which is the same as %(year)s-%(month)s-%(day)s'' && false', name: another_echo_action} cleanup_action: {command: echo 'at last'} name: echo_job node: local schedule: interval 1 hour nodes: - {hostname: localhost, name: local} ssh_options: {agent: true} state_persistence: {name: state_data.shelve, store_type: shelve} """ @setup def setup_controller(self): self.filename = os.path.join(tempfile.gettempdir(), 'test_config') self.controller = ConfigController(self.filename) @teardown def teardown_controller(self): try: os.unlink(self.filename) except OSError: pass def test_read_config(self): content = "12345" with open(self.filename, 'w') as fh: fh.write(content) assert_equal(self.controller.read_config(), content) def test_read_config_missing(self): self.controller.filepath = '/bogggusssss' assert not self.controller.read_config() def test_rewrite_config(self): assert self.controller.rewrite_config(self.TEST_CONFIG_UPDATE) assert_equal(self.controller.read_config(), self.TEST_CONFIG_RESULT) def test_rewrite_config_missing(self): self.controller.filepath = '/bogggusssss' assert not self.controller.rewrite_config(self.TEST_CONFIG_UPDATE) def test_missing_job_node(self): test_config = self.BASE_CONFIG + """ jobs: - name: "test_job0" node: bogussssss schedule: "interval 20s" actions: - name: "action0_0" command: "test_command0.0" cleanup_action: command: "test_command0.1" requires: [action0_0] """ assert_raises(ConfigError, update_config, self.filename, test_config) def test_missing_service_node(self): test_config = self.BASE_CONFIG + """ services: - name: "test_job0" node: bogusssss schedule: "interval 20s" actions: - name: "action0_0" command: "test_command0.0" cleanup_action: command: "test_command0.1" """ assert_raises(ConfigError, update_config, self.filename, test_config) def test_valid_original_config(self): test_config = self.BASE_CONFIG + """ jobs: - name: "test_job0" node: node0 schedule: "interval 20s" actions: """ expected_result = {'MASTER': {'nodes': [{'hostname': 'localhost', 'name': 'local'}], 'config_name': 'MASTER', 'jobs': [{'node': 'node0', 'name': 'test_job0', 'actions': None, 'schedule': 'interval 20s'}], 'ssh_options': {'agent': True}, 'state_persistence': {'store_type': 'shelve', 'name': 'state_data.shelve'}}} fd = open(self.filename,'w') fd.write(test_config) fd.close() assert_equal(expected_result, _initialize_original_config(self.filename))
class TestConfigController: @pytest.fixture(autouse=True) def setup_controller(self): self.mcp = mock.create_autospec(mcp.MasterControlProgram) self.manager = mock.create_autospec(manager.ConfigManager) self.mcp.get_config_manager.return_value = self.manager self.controller = ConfigController(self.mcp) def test_get_config_content_new(self): self.manager.__contains__.return_value = False content = self.controller._get_config_content('name') assert content == self.controller.DEFAULT_NAMED_CONFIG assert not self.manager.read_raw_config.call_count def test_get_config_content_old(self): self.manager.__contains__.return_value = True name = 'the_name' content = self.controller._get_config_content(name) assert content == self.manager.read_raw_config.return_value self.manager.read_raw_config.assert_called_with(name) def test_read_config(self): self.manager.__contains__.return_value = True name = 'MASTER' resp = self.controller.read_config(name) self.manager.read_raw_config.assert_called_with(name) self.manager.get_hash.assert_called_with(name) assert resp['config'] == self.manager.read_raw_config.return_value assert resp['hash'] == self.manager.get_hash.return_value def test_update_config(self): name, content, config_hash = None, mock.Mock(), mock.Mock() self.manager.get_hash.return_value = config_hash assert not self.controller.update_config(name, content, config_hash) self.manager.get_hash.assert_called_with(name) self.manager.write_config.assert_called_with(name, content) self.mcp.reconfigure.assert_called_with() def test_update_config_failure(self): name, content, old_content, config_hash = None, mock.Mock(), mock.Mock( ), mock.Mock() self.manager.get_hash.return_value = config_hash self.manager.write_config.side_effect = [ConfigError("It broke"), None] self.controller.read_config = mock.Mock( return_value={'config': old_content}) error = self.controller.update_config( name, content, config_hash, ) assert error == "It broke" self.manager.write_config.call_args_list = [(name, content), (name, old_content)] assert self.mcp.reconfigure.call_count == 1 def test_update_config_hash_mismatch(self): name, content, config_hash = None, mock.Mock(), mock.Mock() error = self.controller.update_config(name, content, config_hash) assert error == "Configuration has changed. Please try again." def test_delete_config(self): name, content, config_hash = None, "", mock.Mock() self.manager.get_hash.return_value = config_hash assert not self.controller.delete_config(name, content, config_hash) self.manager.delete_config.assert_called_with(name) self.mcp.reconfigure.assert_called_with() self.manager.get_hash.assert_called_with(name) def test_delete_config_failure(self): name, content, config_hash = None, "", mock.Mock() self.manager.get_hash.return_value = config_hash self.manager.delete_config.side_effect = Exception("some error") error = self.controller.delete_config(name, content, config_hash) assert error self.manager.delete_config.assert_called_with(name) assert not self.mcp.reconfigure.call_count def test_delete_config_hash_mismatch(self): name, content, config_hash = None, "", mock.Mock() error = self.controller.delete_config(name, content, config_hash) assert error == "Configuration has changed. Please try again." def test_delete_config_content_not_empty(self): name, content, config_hash = None, "content", mock.Mock() error = self.controller.delete_config(name, content, config_hash) assert error def test_get_namespaces(self): result = self.controller.get_namespaces() self.manager.get_namespaces.assert_called_with() assert result == self.manager.get_namespaces.return_value
class ConfigControllerTestCase(TestCase): @setup def setup_controller(self): self.mcp = mock.create_autospec(mcp.MasterControlProgram) self.manager = mock.create_autospec(manager.ConfigManager) self.mcp.get_config_manager.return_value = self.manager self.controller = ConfigController(self.mcp) def test_render_template(self): config_content = "asdf asdf" container = self.manager.load.return_value = mock.create_autospec( config_parse.ConfigContainer) container.get_node_names.return_value = ['one', 'two', 'three'] container.get_master.return_value.command_context = {'zing': 'stars'} content = self.controller.render_template(config_content) assert_in('# one\n# three\n# two\n', content) assert_in('# %-30s: %s' % ('zing', 'stars'), content) assert_in(config_content, content) def test_strip_header_master(self): name, content = 'MASTER', mock.Mock() assert_equal(self.controller.strip_header(name, content), content) def test_strip_header_named(self): expected = "\nthing" name, content = 'something', self.controller.TEMPLATE + expected assert_equal(self.controller.strip_header(name, content), expected) def test_strip_header_named_missing(self): name, content = 'something', 'whatever content' assert_equal(self.controller.strip_header(name, content), content) def test_get_config_content_new(self): self.manager.__contains__.return_value = False content = self.controller._get_config_content('name') assert_equal(content, self.controller.DEFAULT_NAMED_CONFIG) assert not self.manager.read_raw_config.call_count def test_get_config_content_old(self): self.manager.__contains__.return_value = True name = 'the_name' content = self.controller._get_config_content(name) assert_equal(content, self.manager.read_raw_config.return_value) self.manager.read_raw_config.assert_called_with(name) def test_read_config_master(self): self.manager.__contains__.return_value = True name = 'MASTER' resp = self.controller.read_config(name) self.manager.read_raw_config.assert_called_with(name) self.manager.get_hash.assert_called_with(name) assert_equal(resp['config'], self.manager.read_raw_config.return_value) assert_equal(resp['hash'], self.manager.get_hash.return_value) def test_read_config_named(self): name = 'some_name' autospec_method(self.controller._get_config_content) autospec_method(self.controller.render_template) resp = self.controller.read_config(name) self.controller._get_config_content.assert_called_with(name) self.controller.render_template.assert_called_with( self.controller._get_config_content.return_value) assert_equal(resp['config'], self.controller.render_template.return_value) assert_equal(resp['hash'], self.manager.get_hash.return_value) def test_read_config_no_header(self): name = 'some_name' autospec_method(self.controller._get_config_content) autospec_method(self.controller.render_template) resp = self.controller.read_config(name, add_header=False) assert not self.controller.render_template.called assert_equal(resp['config'], self.controller._get_config_content.return_value) def test_update_config(self): autospec_method(self.controller.strip_header) name, content, config_hash = None, mock.Mock(), mock.Mock() self.manager.get_hash.return_value = config_hash assert not self.controller.update_config(name, content, config_hash) striped_content = self.controller.strip_header.return_value self.manager.write_config.assert_called_with(name, striped_content) self.mcp.reconfigure.assert_called_with() self.controller.strip_header.assert_called_with(name, content) self.manager.get_hash.assert_called_with(name) def test_update_config_failure(self): autospec_method(self.controller.strip_header) striped_content = self.controller.strip_header.return_value name, content, config_hash = None, mock.Mock(), mock.Mock() self.manager.get_hash.return_value = config_hash self.manager.write_config.side_effect = ConfigError("It broke") error = self.controller.update_config(name, striped_content, config_hash) assert_equal(error, "It broke") self.manager.write_config.assert_called_with(name, striped_content) assert not self.mcp.reconfigure.call_count def test_update_config_hash_mismatch(self): name, content, config_hash = None, mock.Mock(), mock.Mock() error = self.controller.update_config(name, content, config_hash) assert_equal(error, "Configuration has changed. Please try again.") def test_get_namespaces(self): result = self.controller.get_namespaces() self.manager.get_namespaces.assert_called_with() assert_equal(result, self.manager.get_namespaces.return_value)
class TestConfigController: @pytest.fixture(autouse=True) def setup_controller(self): self.mcp = mock.create_autospec(mcp.MasterControlProgram) self.manager = mock.create_autospec(manager.ConfigManager) self.mcp.get_config_manager.return_value = self.manager self.controller = ConfigController(self.mcp) def test_get_config_content_new(self): self.manager.__contains__.return_value = False content = self.controller._get_config_content('name') assert content == self.controller.DEFAULT_NAMED_CONFIG assert not self.manager.read_raw_config.call_count def test_get_config_content_old(self): self.manager.__contains__.return_value = True name = 'the_name' content = self.controller._get_config_content(name) assert content == self.manager.read_raw_config.return_value self.manager.read_raw_config.assert_called_with(name) def test_read_config(self): self.manager.__contains__.return_value = True name = 'MASTER' resp = self.controller.read_config(name) self.manager.read_raw_config.assert_called_with(name) self.manager.get_hash.assert_called_with(name) assert resp['config'] == self.manager.read_raw_config.return_value assert resp['hash'] == self.manager.get_hash.return_value def test_update_config(self): name, content, config_hash = None, mock.Mock(), mock.Mock() self.manager.get_hash.return_value = config_hash assert not self.controller.update_config(name, content, config_hash) self.manager.get_hash.assert_called_with(name) self.manager.write_config.assert_called_with(name, content) self.mcp.reconfigure.assert_called_with() def test_update_config_failure(self): name, content, config_hash = None, mock.Mock(), mock.Mock() self.manager.get_hash.return_value = config_hash self.manager.write_config.side_effect = ConfigError("It broke") error = self.controller.update_config( name, content, config_hash, ) assert error == "It broke" self.manager.write_config.assert_called_with(name, content) assert not self.mcp.reconfigure.call_count def test_update_config_hash_mismatch(self): name, content, config_hash = None, mock.Mock(), mock.Mock() error = self.controller.update_config(name, content, config_hash) assert error == "Configuration has changed. Please try again." def test_delete_config(self): name, content, config_hash = None, "", mock.Mock() self.manager.get_hash.return_value = config_hash assert not self.controller.delete_config(name, content, config_hash) self.manager.delete_config.assert_called_with(name) self.mcp.reconfigure.assert_called_with() self.manager.get_hash.assert_called_with(name) def test_delete_config_failure(self): name, content, config_hash = None, "", mock.Mock() self.manager.get_hash.return_value = config_hash self.manager.delete_config.side_effect = Exception("some error") error = self.controller.delete_config(name, content, config_hash) assert error self.manager.delete_config.assert_called_with(name) assert not self.mcp.reconfigure.call_count def test_delete_config_hash_mismatch(self): name, content, config_hash = None, "", mock.Mock() error = self.controller.delete_config(name, content, config_hash) assert error == "Configuration has changed. Please try again." def test_delete_config_content_not_empty(self): name, content, config_hash = None, "content", mock.Mock() error = self.controller.delete_config(name, content, config_hash) assert error def test_get_namespaces(self): result = self.controller.get_namespaces() self.manager.get_namespaces.assert_called_with() assert result == self.manager.get_namespaces.return_value