From 2595214cc1520a64b3865e3ded804c200fc4bf25 Mon Sep 17 00:00:00 2001 From: Jon Schlueter Date: Tue, 7 May 2019 13:45:26 -0400 Subject: [PATCH] add ErrataConnector::get_filter() helper method - helper method to implement general filter query pattern - add support for release/product difference in nesting filter parameters - support for paginated requests - basic unittest for filter helper based on usage Works with the following et.get_filter('/api/v1/releases', 'filter', is_active="true", enabled="true", name='OpenStack 14.0.z for RHEL 7') works with the following et.get_filter('/errata', 'errata_filter[filter_params]', show_type_RHBA=1, show_type_RHEA=1, show_type_RHSA=1, show_state_NEW_FILES=1, show_state_QE=1, show_state_REL_PREP=1,show_state_PUSH_READY=1, open_closed_option='exclude', release=856) Note: errata endpoint releases and products have to be special handled to include extra [] and multiple entries if you want them Related: https://github.com/red-hat-storage/errata-tool/issues/132 --- errata_tool/connector.py | 34 ++++++++++++++++++++++++++++++++ errata_tool/tests/conftest.py | 8 ++++++++ errata_tool/tests/test_filter.py | 33 +++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 errata_tool/tests/test_filter.py diff --git a/errata_tool/connector.py b/errata_tool/connector.py index 5f1feac..761a3f2 100644 --- a/errata_tool/connector.py +++ b/errata_tool/connector.py @@ -310,3 +310,37 @@ def get_paginated_data(self, api_url): if page_number >= PAGE_LIMIT: raise RuntimeError('hit pagination timeout: %d' % page_number) return data + + def get_filter(self, endpoint, filter_arg, **kwargs): + """format and generate filter get request + + expose a general filter helper method to format kwargs up + as parameters for ET filter request. Then return generated + json object + """ + + if endpoint is None or filter_arg is None: + return None + + url = endpoint + "?" + param_list = [] + keys = list(kwargs) + keys.sort() + for k in keys: + v = kwargs[k] + if k in ('paginated'): + continue + if k in ('release', 'product'): + param_list.append("{0}[{1}][]={2}".format(filter_arg, k, v)) + else: + param_list.append("{0}[{1}]={2}".format(filter_arg, k, v)) + print(param_list) + url = url + "&".join(param_list) + if endpoint == '/errata': + url = url + '&format=json' + print(url) + + if 'paginated' in kwargs and kwargs['paginated']: + return {'data': self.get_paginated_data(url)} + + return self._get(url) diff --git a/errata_tool/tests/conftest.py b/errata_tool/tests/conftest.py index 6361355..a667a38 100644 --- a/errata_tool/tests/conftest.py +++ b/errata_tool/tests/conftest.py @@ -76,6 +76,14 @@ def mock_put(): return RequestRecorder() +@pytest.fixture +def sample_connector(monkeypatch, mock_get): + monkeypatch.delattr('requests.sessions.Session.request') + monkeypatch.setattr(ErrataConnector, '_auth', None) + monkeypatch.setattr(ErrataConnector, '_username', 'test') + monkeypatch.setattr(requests, 'get', mock_get) + return ErrataConnector() + @pytest.fixture def advisory(monkeypatch, mock_get): monkeypatch.delattr('requests.sessions.Session.request') diff --git a/errata_tool/tests/test_filter.py b/errata_tool/tests/test_filter.py new file mode 100644 index 0000000..c9d3ac7 --- /dev/null +++ b/errata_tool/tests/test_filter.py @@ -0,0 +1,33 @@ +import requests + + +class TestFilter(object): + + def test_filter_none(self, sample_connector): + assert sample_connector.get_filter(None, None) is None + + def test_filter_sample(self, sample_connector): + assert sample_connector.get_filter( + '/api/v1/releases', 'filter', name='rhceph-3.1') + + def test_filter_sample_check_url(self, monkeypatch, mock_get, + sample_connector): + monkeypatch.setattr(requests, 'get', mock_get) + assert sample_connector.get_filter( + '/api/v1/releases', 'filter', name='rhceph-3.1') + assert 'page' not in mock_get.response.url + + def test_filter_url_paginated_false(self, monkeypatch, + mock_get, sample_connector): + monkeypatch.setattr(requests, 'get', mock_get) + assert sample_connector.get_filter( + '/api/v1/releases', 'filter', name='rhceph-3.1', paginated=False) + assert 'page' not in mock_get.response.url + + def test_filter_sample_check_url_paginated(self, monkeypatch, mock_get, + sample_connector): + monkeypatch.setattr(requests, 'get', mock_get) + assert sample_connector.get_filter( + '/api/v1/external_tests/', 'filter', errata_id='33840', + test_type='rpmdiff', active='true', paginated=True) + assert 'page' in mock_get.response.url