from unittest import TestCase from jsonschema import ValidationError from redash.utils.configuration import ConfigurationContainer configuration_schema = { "type": "object", "properties": { "a": { "type": "integer" }, "e": { "type": "integer" }, "b": { "type": "string" } }, "required": ["a"], "secret": ["b"] } class TestConfigurationToJson(TestCase): def setUp(self): self.config = {'a': 1, 'b': 'test'} self.container = ConfigurationContainer(self.config, configuration_schema) def test_returns_plain_dict(self): self.assertDictEqual(self.config, self.container.to_dict()) def test_raises_exception_when_no_schema_set(self): self.container.set_schema(None) self.assertRaises(RuntimeError, lambda: self.container.to_dict(mask_secrets=True)) def test_returns_dict_with_masked_secrets(self): d = self.container.to_dict(mask_secrets=True) self.assertEqual(d['a'], self.config['a']) self.assertNotEqual(d['b'], self.config['b']) self.assertEqual(self.config['b'], self.container['b']) class TestConfigurationUpdate(TestCase): def setUp(self): self.config = {'a': 1, 'b': 'test'} self.container = ConfigurationContainer(self.config, configuration_schema) def test_rejects_invalid_new_config(self): self.assertRaises(ValidationError, lambda: self.container.update({'c': 3})) def test_fails_if_no_schema_set(self): self.container.set_schema(None) self.assertRaises(RuntimeError, lambda: self.container.update({'c': 3})) def test_ignores_secret_placehodler(self): self.container.update(self.container.to_dict(mask_secrets=True)) self.assertEqual(self.container['b'], self.config['b']) def test_updates_secret(self): new_config = {'a': 2, 'b': 'new'} self.container.update(new_config) self.assertDictEqual(self.container._config, new_config) def test_doesnt_leave_leftovers(self): container = ConfigurationContainer({'a': 1, 'b': 'test', 'e': 3}, configuration_schema) new_config = container.to_dict(mask_secrets=True) new_config.pop('e') container.update(new_config) self.assertEqual(container['a'], 1) self.assertEqual('test', container['b']) self.assertNotIn('e', container) def test_works_for_schema_without_secret(self): secretless = configuration_schema.copy() secretless.pop('secret') container = ConfigurationContainer({'a': 1, 'b': 'test', 'e': 3}, secretless) container.update({'a': 2}) self.assertEqual(container['a'], 2)