def test_deny_delete_referred_component(self): hosts = ComponentFactory(name='Hosts', alias='hosts') database = ComponentFactory(name='Database', alias='database') update_settings(environment=self.base, component=hosts, data={'db': 'localhost'}) update_settings(environment=self.base, component=database, data={ 'host': '${hosts.db}', 'port': 3567, 'user': '******', 'password': '', 'database': '' }) with pytest.raises(ComponentDeleteError) as exc_info: delete_component(hosts) assert str( exc_info.value ) == 'Component `database` is referring to component `hosts.db` key(s).'
def test_get_all_settings(self): update_settings(environment=self.base, component=self.db, data={ 'user': '******', 'pass': '' }) update_settings(environment=self.dev, component=self.db, data={ 'user': '******', 'pass': '******' }) data = get_all_settings() assert data == { 'base': { 'db': { 'user': '******', 'pass': '' } }, 'dev': { 'db': { 'user': '******', 'pass': '******' } } }
def test_get_undefined_environment_settings(self): update_settings(environment=self.base, component=self.db, data={ 'user': '******', 'pass': '' }) data = get_settings(environment=self.dev, component=self.db) assert data == {'user': '******', 'pass': ''}
def test_validate_settings_invalid_json_schema(self): self.db.require_schema = True self.db.schema = { '$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': { 'host': { 'type': 'string' }, 'port': { 'type': 'integer' }, 'user': { 'type': 'string' }, 'password': { 'type': 'string' }, 'database': { 'type': 'string' } }, 'required': [ 'host', 'port', 'user', 'password', 'database', ] } self.db.save() update_settings(environment=self.base, component=self.hosts, data={'db': { 'host': 'mysql-db', 'port': '3567' }}) with pytest.raises(InvalidSettingsError) as exc_info: validate_settings(environment=self.base, component=self.db, data={ 'host': '${hosts.db.host}', 'port': '${hosts.db.port}', 'user': '******', 'password': '', 'database': '' }) assert exc_info.value.message == 'Invalid settings schema: \'3567\' is not of type \'integer\'.'
def component_alias_changed_handler(sender, component: Component, old_alias: str, **kwargs): for environment in Environment.objects.all(): data_copy = copy.deepcopy( get_settings( environment=environment, component=old_alias, )) update_settings(environment=environment, component=component, data=data_copy, validate=False)
def test_delete_component(self): hosts = ComponentFactory(name='Hosts', alias='hosts') update_settings(environment=self.base, component=hosts, data={'db': 'localhost'}) assert Config.objects.filter(environment=self.base.alias, component=hosts.alias).exists() delete_component(hosts) assert not Config.objects.filter(environment=self.base, component=hosts).exists()
def test_get_missing_fallback_environment_settings(self): staging = EnvironmentFactory(alias='stag', name='Staging', fallback=self.dev) update_settings(environment=self.base, component=self.db, data={ 'host': 'localhost', 'port': 3452 }) data = get_settings(environment=staging, component=self.db) assert data == {'host': 'localhost', 'port': 3452}
def test_validate_settings_invalid_key_reference(self): update_settings(environment=self.base, component=self.hosts, data={'db': 'localhost'}) update_settings(environment=self.base, component=self.db, data={ 'host': '${hosts.db}', 'port': 3567, 'user': '******', 'password': '', 'database': '' }) with pytest.raises(InvalidSettingsError) as exc_info: validate_settings(environment=self.base, component=self.hosts, data={'db1': 'mysql-base'}) assert exc_info.value.message == 'Component `db` refers to changed key `hosts.db`.'
def test_get_inject_settings_keys(self): update_settings(environment=self.base, component=self.users, data={'db': 'admin'}) update_settings(environment=self.base, component=self.hosts, data={'db': 'test-db.hostname.com'}) update_settings(environment=self.base, component=self.credentials, data={ 'username': '******', 'password': '******' }) update_settings(environment=self.base, component=self.db, data={ 'host': '${hosts.db}', 'port': 3567, 'user': '******', 'pass': '******' }) inject_keys = get_settings_inject_keys(environment=self.base) assert inject_keys == { 'credentials': {'users.db'}, 'db': {'hosts.db', 'credentials.password', 'credentials.username'} } inject_keys = get_settings_inject_keys( environment=self.base, override_settings={ self.db.alias: { 'host': 'localhost', 'port': 3567, 'user': '******', 'pass': '******' } }) assert inject_keys == { 'credentials': {'users.db'}, 'db': {'credentials.password', 'credentials.username'} }
def test_validate_settings_invalid_remove_key(self): self.db.require_schema = False self.db.strict_keys = True self.db.save() update_settings(environment=self.base, component=self.db, data={ 'host': 'localhost', 'port': 3567, }) with pytest.raises(InvalidSettingsError) as exc_info: validate_settings(environment=self.dev, component=self.db, data={ 'host': 'mysql-dev', }) assert exc_info.value.message == ( 'Cannot remove keys from environment configuration. Removed key(s): <b>port</b>.' )
def test_validate_settings_invalid_add_key(self): self.db.require_schema = False self.db.strict_keys = True self.db.save() update_settings(environment=self.base, component=self.db, data={ 'host': 'localhost', 'port': 3567, }) with pytest.raises(InvalidSettingsError) as exc_info: validate_settings(environment=self.dev, component=self.db, data={ 'host': 'mysql-dev', 'port': 3567, 'test': '123123' }) assert exc_info.value.message == 'Cannot add new keys to environment configuration. New key(s): <b>test</b>.'
def test_get_component_settings(self): update_settings(environment=self.base, component=self.db, data={ 'user': '******', 'pass': '' }) update_settings(environment=self.dev, component=self.db, data={ 'user': '******', 'pass': '******' }) data = get_settings(environment=self.base, component=self.db) assert data == {'user': '******', 'pass': ''} data = get_settings(environment=self.dev, component=self.db) assert data == {'user': '******', 'pass': '******'}
def form_valid(self, form): component: Component = self.object old_settings = get_settings( environment=self.environment, component=component, ) new_settings = form.cleaned_data['settings'] # Update store settings update_settings( environment=self.environment, component=component, data=new_settings, validate=False ) # Notify about updated component settings settings_updated.send( sender=Component, component=component, environment=self.environment, old_settings=old_settings, new_settings=new_settings, user=self.request.user ) messages.success( self.request, _("Component %(component)s settings successfully updated.") % { 'component': component.name } ) return HttpResponseRedirect(self.success_url)
def test_inject_settings_params(self): update_settings(environment=self.base, component=self.users, data={'db': 'admin'}) update_settings(environment=self.base, component=self.hosts, data={'db': 'test-db.hostname.com'}) update_settings(environment=self.base, component=self.credentials, data={ 'username': '******', 'password': '******' }) update_settings(environment=self.base, component=self.db, data={ 'host': '${hosts.db}', 'port': 3567, 'user': '******', 'pass': '******' }) data = inject_settings(environment=self.base, data=get_settings(environment=self.base, component=self.db)) assert data == { 'host': 'test-db.hostname.com', 'port': 3567, 'user': '******', 'pass': '******' }
def test_create_and_load_backup(self): base = EnvironmentFactory(name='Base', alias='base') development = EnvironmentFactory(name='Development', alias='development') hosts = ComponentFactory(name='Hosts', alias='hosts') database = ComponentFactory(name='Database', alias='database') update_settings(environment=base, component=hosts, data={ 'a': '1', 'b': '2', 'c': '3', }) update_settings(environment=development, component=hosts, data={ 'a': '1!', 'b': '2!', 'c': '3!', }) update_settings(environment=base, component=database, data={ 'user': '******', 'pass': '', 'host': 'mysql-base', }) update_settings(environment=development, component=database, data={ 'user': '******', 'pass': '******', 'host': 'mysql-dev', }) backup = create_backup(comment='Test') # Delete all Environment.objects.all().delete() Component.objects.all().delete() Config.objects.all().delete() load_backup(backup) assert Environment.objects.filter(alias='base').exists() assert Environment.objects.filter(alias='development').exists() assert Component.objects.filter(alias='hosts').exists() assert Component.objects.filter(alias='database').exists() base_hosts_data = get_settings(environment=base, component=hosts) assert base_hosts_data == { 'a': '1', 'b': '2', 'c': '3', } development_hosts_data = get_settings(environment=development, component=hosts) assert development_hosts_data == { 'a': '1!', 'b': '2!', 'c': '3!', } base_database_data = get_settings(environment=base, component=database) assert base_database_data == { 'user': '******', 'pass': '', 'host': 'mysql-base', } development_database_data = get_settings(environment=development, component=database) assert development_database_data == { 'user': '******', 'pass': '******', 'host': 'mysql-dev', }
def test_get_env_settings(self): ######################### # Base settings ######################### update_settings(environment=self.base, component=self.hosts, data={ 'db': 'localhost:5671', }) update_settings(environment=self.base, component=self.db, data={ 'user': '******', 'pass': '' }) ######################### # Dev settings ######################### update_settings(environment=self.dev, component=self.hosts, data={ 'db': 'dev.hostname.com:5671', }) update_settings(environment=self.dev, component=self.db, data={ 'user': '******', 'pass': '******' }) data = get_environment_settings(self.dev) assert data == { 'users': {}, 'hosts': { 'db': 'dev.hostname.com:5671', }, 'credentials': {}, 'redis': {}, 'db': { 'user': '******', 'pass': '******' }, } data = get_environment_settings(self.dev, components=[self.hosts, self.db]) assert data == { 'hosts': { 'db': 'dev.hostname.com:5671', }, 'db': { 'user': '******', 'pass': '******' } }