Permalink
Comparing changes
Open a pull request
- 3 commits
- 3 files changed
- 0 commit comments
- 1 contributor
Unified
Split
Showing
with
82 additions
and 20 deletions.
- +14 −7 conductor/blueprints/package/controllers.py
- +67 −12 tests/module/blueprints/package/test_controllers.py
- +1 −1 tox.ini
| @@ -106,10 +106,9 @@ def toggle_publish(name, token, toggle=False, publish=False): | ||
| def update_params(name, token, params): | ||
| ''' | ||
| Update package.defaultParams for the passed `name`. Only the owner can | ||
| update. | ||
| ''' | ||
| """ | ||
| Update package.defaultParams for the passed `name`. Only owner can update. | ||
| """ | ||
| try: | ||
| token = jwt.decode(token.encode('ascii'), | ||
| PUBLIC_KEY, | ||
| @@ -121,12 +120,20 @@ def update_params(name, token, params): | ||
| except jwt.InvalidTokenError: | ||
| return None | ||
| _, _, datapackage, _, _, _, _, _ = package_registry.get_raw(name) | ||
| try: | ||
| _, _, datapackage, *_ = package_registry.get_raw(name) | ||
| except KeyError: | ||
| # Can't find package by `name` | ||
| return None | ||
| datapackage['defaultParams'] = params | ||
| package_registry.update_model(name, datapackage=datapackage) | ||
| # Clear the cached entry for this package | ||
| api_cache.clear(name) | ||
| # Clear the cached entry for this package is api_cache isn't None. | ||
| try: | ||
| api_cache.clear(name) | ||
| except AttributeError: | ||
| pass | ||
| return {'success': True} | ||
| @@ -7,7 +7,6 @@ | ||
| from elasticsearch import Elasticsearch, NotFoundError | ||
| from os_package_registry import PackageRegistry | ||
| from ..config import LOCAL_ELASTICSEARCH | ||
| from werkzeug.exceptions import BadRequest, NotFound, Forbidden | ||
| try: | ||
| from unittest.mock import Mock, patch | ||
| @@ -21,7 +20,8 @@ | ||
| Response = namedtuple('Response', ['status_code']) | ||
| _cache = {} | ||
| callback = 'http://conductor/callback' | ||
| token = jwt.encode({'userid': 'owner'}, PRIVATE_KEY, algorithm='RS256').decode('ascii') | ||
| token = jwt.encode({'userid': 'owner'}, | ||
| PRIVATE_KEY, algorithm='RS256').decode('ascii') | ||
| def cache_get(key): | ||
| @@ -64,7 +64,8 @@ def assertResponse(self, ret, status=None, progress=None, error=None): | ||
| def test___load___good_request(self): | ||
| api_load = module.upload | ||
| self.requests.get = Mock(return_value=Response(200)) | ||
| self.assertResponse(api_load('bla', callback, token, cache_set), 'queued', 0) | ||
| self.assertResponse(api_load('bla', callback, token, cache_set), | ||
| 'queued', 0) | ||
| # def test___load___bad_request(self): | ||
| # api_load = module.upload | ||
| @@ -79,7 +80,8 @@ def test___load___good_request(self): | ||
| def test___callback___server_down(self): | ||
| api_load = module.upload | ||
| self.requests.get = Mock(return_value=Response(499)) | ||
| self.assertResponse(api_load('bla', callback, token, cache_set), 'fail', error='HTTP 499') | ||
| self.assertResponse(api_load('bla', callback, token, cache_set), | ||
| 'fail', error='HTTP 499') | ||
| def test___poll___good_request(self): | ||
| api_load = module.upload | ||
| @@ -100,47 +102,52 @@ def test___poll___nonexistent_request(self): | ||
| def test___callback___no_update(self): | ||
| # No parameters | ||
| api_callback = module.upload_status_update | ||
| self.assertEquals(api_callback('bla4', None, None, 0, cache_get, cache_set), None) | ||
| self.assertEquals(api_callback('bla4', None, None, 0, cache_get, | ||
| cache_set), None) | ||
| api_poll = module.upload_status | ||
| self.assertEquals(api_poll('bla4', cache_get), None) | ||
| def test___callback___just_status(self): | ||
| # No parameters | ||
| api_callback = module.upload_status_update | ||
| self.assertEquals(api_callback('bla5', 'status1', None, 0, cache_get, cache_set), None) | ||
| self.assertEquals(api_callback('bla5', 'status1', None, 0, cache_get, | ||
| cache_set), None) | ||
| api_poll = module.upload_status | ||
| self.assertResponse(api_poll('bla5', cache_get), 'status1', 0) | ||
| def test___callback___progress(self): | ||
| # No parameters | ||
| api_callback = module.upload_status_update | ||
| self.assertEquals(api_callback('bla6', 'status2', None, 123, cache_get, cache_set), None) | ||
| self.assertEquals(api_callback('bla6', 'status2', None, 123, cache_get, | ||
| cache_set), None) | ||
| api_poll = module.upload_status | ||
| self.assertResponse(api_poll('bla6', cache_get), 'status2', 123) | ||
| def test___callback___errormsg_wrong_status(self): | ||
| # No parameters | ||
| api_callback = module.upload_status_update | ||
| self.assertEquals(api_callback('bla7', 'status3', 'wtf', 123, cache_get, cache_set), None) | ||
| self.assertEquals(api_callback('bla7', 'status3', 'wtf', 123, | ||
| cache_get, cache_set), None) | ||
| api_poll = module.upload_status | ||
| self.assertResponse(api_poll('bla7', cache_get), 'status3', 123) | ||
| def test___callback___error_good_status(self): | ||
| # No parameters | ||
| api_callback = module.upload_status_update | ||
| self.assertEquals(api_callback('bla8', 'fail', 'wtf8', 0, cache_get, cache_set), None) | ||
| self.assertEquals(api_callback('bla8', 'fail', 'wtf8', 0, cache_get, | ||
| cache_set), None) | ||
| api_poll = module.upload_status | ||
| self.assertResponse(api_poll('bla8', cache_get), 'fail', 0, 'wtf8') | ||
| class PublishDeleteAPITests(unittest.TestCase): | ||
| DATASET_NAME='owner:datasetid' | ||
| DATASET_NAME = 'owner:datasetid' | ||
| def setUp(self): | ||
| # Clean index | ||
| @@ -154,7 +161,8 @@ def setUp(self): | ||
| time.sleep(1) | ||
| self.pr = PackageRegistry(es_connection_string=LOCAL_ELASTICSEARCH) | ||
| self.pr.save_model(self.DATASET_NAME, 'datapackage_url', {}, {}, 'dataset', 'author', '', True) | ||
| self.pr.save_model(self.DATASET_NAME, 'datapackage_url', {}, {}, | ||
| 'dataset', 'author', '', True) | ||
| def test__initial_value__none(self): | ||
| pkg = self.pr.get_package(self.DATASET_NAME) | ||
| @@ -206,7 +214,54 @@ def test__force_unpublish__correct(self): | ||
| assert(pkg.get('private') is True) | ||
| class UpdateDefaultParamsAPITests(unittest.TestCase): | ||
| DATASET_NAME = 'owner:datasetid' | ||
| DEFAULT_PARAMS = {'param1': True, 'param2': 'hello'} | ||
| def setUp(self): | ||
| # Clean index | ||
| self.es = Elasticsearch(hosts=[LOCAL_ELASTICSEARCH]) | ||
| try: | ||
| self.es.indices.delete(index='users') | ||
| self.es.indices.delete(index='packages') | ||
| except NotFoundError: | ||
| pass | ||
| self.es.indices.create('users') | ||
| time.sleep(1) | ||
| self.pr = PackageRegistry(es_connection_string=LOCAL_ELASTICSEARCH) | ||
| self.pr.save_model(self.DATASET_NAME, 'datapackage_url', {}, {}, | ||
| 'dataset', 'author', '', True) | ||
| def test__initial_value__none(self): | ||
| pkg = self.pr.get_package(self.DATASET_NAME) | ||
| assert(pkg.get('defaultParams') is None) | ||
| def test__update_params__empty_params(self): | ||
| module.update_params('owner:datasetid', token, {}) | ||
| pkg = self.pr.get_package(self.DATASET_NAME) | ||
| assert(pkg.get('defaultParams') == {}) | ||
| def test__update_params__with_value(self): | ||
| module.update_params('owner:datasetid', token, self.DEFAULT_PARAMS) | ||
| pkg = self.pr.get_package(self.DATASET_NAME) | ||
| assert(pkg.get('defaultParams') == self.DEFAULT_PARAMS) | ||
| def test__update_params__bad_owner(self): | ||
| module.update_params('badowner:datasetid', token, self.DEFAULT_PARAMS) | ||
| pkg = self.pr.get_package(self.DATASET_NAME) | ||
| assert(pkg.get('defaultParams') is None) | ||
| def test__update_params__bad_package_id(self): | ||
| module.update_params('owner:baddatasetid', token, self.DEFAULT_PARAMS) | ||
| pkg = self.pr.get_package(self.DATASET_NAME) | ||
| assert(pkg.get('defaultParams') is None) | ||
| class StatsTests(unittest.TestCase): | ||
| def test__stats__delegates_to_package_registry(self): | ||
| with patch('conductor.blueprints.package.models.package_registry.get_stats') as get_stats_mock: | ||
| stats_path = \ | ||
| 'conductor.blueprints.package.models.package_registry.get_stats' | ||
| with patch(stats_path) as get_stats_mock: | ||
| assert module.stats() == get_stats_mock() | ||
| @@ -11,7 +11,7 @@ deps = | ||
| nose | ||
| coverage | ||
| commands = | ||
| nosetests tests \ | ||
| nosetests -w tests \ | ||
| {posargs} \ | ||
| --with-coverage \ | ||
| --cover-package conductor | ||