From c5262b23e210878b3ca744cce6f7dc9d7c6ca145 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Dec 14 2017 07:43:33 +0000 Subject: Order Events according to id in REST API response and allow filtering by multiple values for single key. --- diff --git a/freshmaker/api_utils.py b/freshmaker/api_utils.py index 7b08cac..6a067c5 100644 --- a/freshmaker/api_utils.py +++ b/freshmaker/api_utils.py @@ -118,16 +118,21 @@ def filter_events(flask_request): :param request: Flask request object :return: flask_sqlalchemy.Pagination """ - search_query = dict() - - for key in ['message_id', 'search_key', 'event_type_id']: - if flask_request.args.get(key, None): - search_query[key] = flask_request.args[key] query = Event.query - if search_query: - query = query.filter_by(**search_query) + for key in ['message_id', 'search_key', 'event_type_id', 'state']: + values = flask_request.args.getlist(key) + if not values: + continue + if len(values) == 1: + search_query = {key: values[0]} + query = query.filter_by(**search_query) + else: + search_attr = getattr(Event, key) + query = query.filter(search_attr.in_(values)) + + query = query.order_by(Event.id) page = flask_request.args.get('page', 1, type=int) per_page = flask_request.args.get('per_page', 10, type=int) diff --git a/tests/test_views.py b/tests/test_views.py index 25aaa71..769e1a7 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -26,7 +26,7 @@ import six from mock import patch from freshmaker import app, db, events, models -from freshmaker.types import ArtifactType, ArtifactBuildState +from freshmaker.types import ArtifactType, ArtifactBuildState, EventState class TestViews(unittest.TestCase): @@ -254,6 +254,51 @@ class TestViews(unittest.TestCase): self.assertEqual(data['message'], 'No such build state found.') +class TestViewsMultipleFilterValues(unittest.TestCase): + def setUp(self): + db.session.remove() + db.drop_all() + db.create_all() + db.session.commit() + + self._init_data() + + self.client = app.test_client() + + def _init_data(self): + event = models.Event.create( + db.session, "2017-00000000-0000-0000-0000-000000000001", + "RHSA-2018-101", events.TestingEvent) + event.state = EventState.BUILDING.value + build = models.ArtifactBuild.create(db.session, event, "ed", "module", 1234) + build.build_args = '{"key": "value"}' + models.ArtifactBuild.create(db.session, event, "mksh", "module", 1235) + models.ArtifactBuild.create(db.session, event, "bash", "module", 1236) + event2 = models.Event.create( + db.session, "2017-00000000-0000-0000-0000-000000000002", + "RHSA-2018-102", events.GitModuleMetadataChangeEvent) + event2.state = EventState.SKIPPED.value + event3 = models.Event.create( + db.session, "2017-00000000-0000-0000-0000-000000000003", + "RHSA-2018-103", events.MBSModuleStateChangeEvent) + event3.state = EventState.FAILED.value + db.session.commit() + db.session.expire_all() + + def test_query_event_multiple_states(self): + resp = self.client.get('/api/1/events/?state=%d&state=%d' % ( + EventState.SKIPPED.value, EventState.BUILDING.value)) + evs = json.loads(resp.data.decode('utf8'))['items'] + self.assertEqual(len(evs), 2) + + def test_query_event_multiple_event_type_ids(self): + resp = self.client.get('/api/1/events/?event_type_id=%d&event_type_id=%d' % ( + models.EVENT_TYPES[events.TestingEvent], + models.EVENT_TYPES[events.GitModuleMetadataChangeEvent])) + evs = json.loads(resp.data.decode('utf8'))['items'] + self.assertEqual(len(evs), 2) + + class TestManualTriggerRebuild(unittest.TestCase): def setUp(self): db.session.remove()