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