From 7de9323fc5d61a7265865f7d6cbedb5e7e443799 Mon Sep 17 00:00:00 2001 From: Alexander Kislitsky Date: Mon, 22 Aug 2016 13:25:49 +0300 Subject: [PATCH] Keys operations for empty levels list fixed. Also made several variable renames in the tests. Change-Id: I675826f2510b6690f6008fcbce9e08ad610a4fa1 Closes-Bug: #1614551 --- tuning_box/library/__init__.py | 2 +- tuning_box/library/components.py | 14 ++++++------- tuning_box/library/resource_values.py | 18 ++++++++-------- .../tests/library/test_resource_overrides.py | 21 +++++++++++++++++++ .../tests/library/test_resource_values.py | 21 +++++++++++++++++++ tuning_box/tests/test_app.py | 14 +++++++++---- 6 files changed, 69 insertions(+), 21 deletions(-) diff --git a/tuning_box/library/__init__.py b/tuning_box/library/__init__.py index f8383fe..3b2f474 100644 --- a/tuning_box/library/__init__.py +++ b/tuning_box/library/__init__.py @@ -80,7 +80,7 @@ def get_resource_values(environment, levels, res_def): res_values = db.ResourceValues.query.filter_by( environment_id=environment.id, resource_definition_id=res_def.id, - level_value_id=level_value.id, + level_value=level_value, ).all() if not res_values: diff --git a/tuning_box/library/components.py b/tuning_box/library/components.py index 1adf89a..a68a875 100644 --- a/tuning_box/library/components.py +++ b/tuning_box/library/components.py @@ -38,10 +38,10 @@ class ComponentsCollection(flask_restful.Resource): def post(self): component = db.Component(name=flask.request.json['name']) component.resource_definitions = [] - for resdef_data in flask.request.json.get('resource_definitions'): - resdef = db.ResourceDefinition(name=resdef_data['name'], - content=resdef_data.get('content')) - component.resource_definitions.append(resdef) + for res_def_data in flask.request.json.get('resource_definitions'): + res_def = db.ResourceDefinition( + name=res_def_data['name'], content=res_def_data.get('content')) + component.resource_definitions.append(res_def) db.db.session.add(component) return component, 201 @@ -57,9 +57,9 @@ class Component(flask_restful.Resource): component = db.Component.query.get_or_404(component_id) update_by = flask.request.json component.name = update_by.get('name', component.name) - resource_definitions = update_by.get('resource_definitions') - if resource_definitions is not None: - ids = [data['id'] for data in resource_definitions] + res_definitions = update_by.get('resource_definitions') + if res_definitions is not None: + ids = [data['id'] for data in res_definitions] resources = library.load_objects(db.ResourceDefinition, ids) component.resource_definitions = resources diff --git a/tuning_box/library/resource_values.py b/tuning_box/library/resource_values.py index 341532f..86f4dd1 100644 --- a/tuning_box/library/resource_values.py +++ b/tuning_box/library/resource_values.py @@ -25,16 +25,16 @@ class ResourceValues(flask_restful.Resource): @db.with_transaction def put(self, environment_id, levels, resource_id_or_name): environment = db.Environment.query.get_or_404(environment_id) - resdef = library.get_resource_definition( + res_def = library.get_resource_definition( resource_id_or_name, environment_id) - if resdef.id != resource_id_or_name: + if res_def.id != resource_id_or_name: from tuning_box.app import api return flask.redirect(api.url_for( ResourceValues, environment_id=environment_id, levels=levels, - resource_id_or_name=resdef.id, + resource_id_or_name=res_def.id, ), code=308) level_value = levels_hierarchy.get_environment_level_value( @@ -42,7 +42,7 @@ class ResourceValues(flask_restful.Resource): esv = db.get_or_create( db.ResourceValues, environment=environment, - resource_definition=resdef, + resource_definition=res_def, level_value=level_value, ) esv.values = flask.request.json @@ -51,15 +51,15 @@ class ResourceValues(flask_restful.Resource): @db.with_transaction def get(self, environment_id, resource_id_or_name, levels): environment = db.Environment.query.get_or_404(environment_id) - resdef = library.get_resource_definition( + res_def = library.get_resource_definition( resource_id_or_name, environment_id) - if resdef.id != resource_id_or_name: + if res_def.id != resource_id_or_name: from tuning_box.app import api url = api.url_for( ResourceValues, environment_id=environment_id, levels=levels, - resource_id_or_name=resdef.id, + resource_id_or_name=res_def.id, ) if flask.request.query_string: qs = flask.request.query_string.decode('utf-8') @@ -71,7 +71,7 @@ class ResourceValues(flask_restful.Resource): if 'effective' in flask.request.args: resource_values = db.ResourceValues.query.filter_by( - resource_definition=resdef, + resource_definition=res_def, environment=environment, ).all() result = {} @@ -88,7 +88,7 @@ class ResourceValues(flask_restful.Resource): else: level_value = level_values[-1] resource_values = db.ResourceValues.query.filter_by( - resource_definition=resdef, + resource_definition=res_def, environment=environment, level_value=level_value, ).one_or_none() diff --git a/tuning_box/tests/library/test_resource_overrides.py b/tuning_box/tests/library/test_resource_overrides.py index e0845ec..3f32183 100644 --- a/tuning_box/tests/library/test_resource_overrides.py +++ b/tuning_box/tests/library/test_resource_overrides.py @@ -177,6 +177,27 @@ class TestResourceOverrides(BaseTest): self.assertEqual({'key': 'key_over', 'key_x': 'key_x_over'}, actual) + def test_put_resource_overrides_set_no_levels(self): + self._fixture() + environment_id = 9 + res_def_id = 5 + values = {'key': 'val'} + self._add_resource_overrides(environment_id, res_def_id, (), values) + + obj_url = '/environments/{0}/resources/{1}/overrides'.format( + environment_id, res_def_id) + obj_keys_url = obj_url + '/keys/set' + + data = [['key', 'key_value'], ['key_x', 'key_x_value']] + res = self.client.put(obj_keys_url, data=data) + self.assertEqual(204, res.status_code) + + res = self.client.get(obj_url) + self.assertEqual(200, res.status_code) + actual = res.json + self.assertEqual({'key': 'key_value', 'key_x': 'key_x_value'}, + actual) + def test_put_resource_overrides_delete(self): self._fixture() environment_id = 9 diff --git a/tuning_box/tests/library/test_resource_values.py b/tuning_box/tests/library/test_resource_values.py index 5f801a7..33ebe5a 100644 --- a/tuning_box/tests/library/test_resource_values.py +++ b/tuning_box/tests/library/test_resource_values.py @@ -191,6 +191,27 @@ class TestResourceValues(BaseTest): self.assertEqual({'key': 'key_value', 'key_x': 'key_x_value'}, actual) + def test_put_resource_values_set_no_levels(self): + self._fixture() + environment_id = 9 + res_def_id = 5 + values = {'key': 'val'} + self._add_resource_values(environment_id, res_def_id, (), values) + + obj_url = '/environments/{0}/resources/{1}/values'.format( + environment_id, res_def_id) + obj_keys_url = obj_url + '/keys/set' + + data = [['key', 'key_value'], ['key_x', 'key_x_value']] + res = self.client.put(obj_keys_url, data=data) + self.assertEqual(204, res.status_code) + + res = self.client.get(obj_url) + self.assertEqual(200, res.status_code) + actual = res.json + self.assertEqual({'key': 'key_value', 'key_x': 'key_x_value'}, + actual) + def test_put_resource_values_delete(self): self._fixture() environment_id = 9 diff --git a/tuning_box/tests/test_app.py b/tuning_box/tests/test_app.py index 23df9ca..32e0bbc 100644 --- a/tuning_box/tests/test_app.py +++ b/tuning_box/tests/test_app.py @@ -73,12 +73,18 @@ class BaseTest(base.TestCase): environment.hierarchy_levels = hierarchy_levels db.db.session.add(environment) + def _levels_to_url(self, levels): + levels_url = '/'.join(itertools.chain.from_iterable(levels)) + if levels_url: + levels_url += '/' + return levels_url + def _add_resource_values(self, environment_id, res_def_id, levels, values): res = self.client.put( - '/environments/{0}/{1}/resources/{2}/values'.format( + '/environments/{0}/{1}resources/{2}/values'.format( environment_id, - '/'.join(itertools.chain.from_iterable(levels)), + self._levels_to_url(levels), res_def_id ), data=values @@ -88,9 +94,9 @@ class BaseTest(base.TestCase): def _add_resource_overrides(self, environment_id, res_def_id, levels, overrides): res = self.client.put( - '/environments/{0}/{1}/resources/{2}/overrides'.format( + '/environments/{0}/{1}resources/{2}/overrides'.format( environment_id, - '/'.join(itertools.chain.from_iterable(levels)), + self._levels_to_url(levels), res_def_id ), data=overrides