From 370034cd571d1fd051f59883c79f66d3385c8522 Mon Sep 17 00:00:00 2001 From: Qixiang Wan Date: Jul 23 2019 11:04:30 +0000 Subject: Support querying events with state names With this change, we can query events with state names, like: /api/1/events/?state=building /api/1/events/?state=building&state=complete --- diff --git a/freshmaker/api_utils.py b/freshmaker/api_utils.py index db2a33e..55ecf97 100644 --- a/freshmaker/api_utils.py +++ b/freshmaker/api_utils.py @@ -22,7 +22,8 @@ from flask import request, url_for, jsonify from freshmaker import db -from freshmaker.types import ArtifactType, ArtifactBuildState +from freshmaker.errors import ValidationError +from freshmaker.types import ArtifactType, ArtifactBuildState, EventState from freshmaker.models import ArtifactBuild, Event @@ -154,7 +155,7 @@ def filter_events(flask_request): query = Event.query - for key in ['message_id', 'search_key', 'event_type_id', 'state']: + for key in ['message_id', 'search_key', 'event_type_id']: values = flask_request.args.getlist(key) if not values: continue @@ -165,6 +166,19 @@ def filter_events(flask_request): search_attr = getattr(Event, key) query = query.filter(search_attr.in_(values)) + states = flask_request.args.getlist("state") + search_states = [] + for state in states: + if state.isdigit(): + search_states.append(state) + else: + if state.upper() in [x.name for x in EventState]: + search_states.append(EventState[state.upper()].value) + else: + raise ValidationError("Invalid state was supplied: %s" % state) + if search_states: + query = query.filter(Event.state.in_(search_states)) + query = _order_by(flask_request, query, Event, ["id", "message_id"], "-id") diff --git a/tests/test_views.py b/tests/test_views.py index dea2f05..67a649d 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -367,6 +367,47 @@ class TestViews(helpers.ModelsTestCase): self.assertEqual(len(evs), 1) self.assertEqual(evs[0]['search_key'], 'RHSA-2018-101') + def test_query_event_by_state_name(self): + models.Event.create(db.session, + "2018-00000000-0000-0000-0123-000000000001", + "0123001", + events.MBSModuleStateChangeEvent, + state=EventState['COMPLETE'].value) + resp = self.client.get('/api/1/events/?state=complete') + evs = json.loads(resp.get_data(as_text=True))['items'] + self.assertEqual(len(evs), 1) + self.assertEqual(evs[0]['state'], EventState['COMPLETE'].value) + + def test_query_event_with_invalid_state_name(self): + resp = self.client.get('/api/1/events/?state=invalid') + data = json.loads(resp.get_data(as_text=True)) + self.assertEqual(data['status'], 400) + self.assertEqual(data['message'], "Invalid state was supplied: invalid") + + def test_query_event_by_multiple_state_names(self): + models.Event.create(db.session, + "2018-00000000-0000-0000-0123-000000000001", + "0123001", + events.MBSModuleStateChangeEvent, + state=EventState['BUILDING'].value) + models.Event.create(db.session, + "2018-00000000-0000-0000-0123-000000000002", + "0123002", + events.MBSModuleStateChangeEvent, + state=EventState['COMPLETE'].value) + models.Event.create(db.session, + "2018-00000000-0000-0000-0123-000000000003", + "0123003", + events.MBSModuleStateChangeEvent, + state=EventState['COMPLETE'].value) + resp = self.client.get('/api/1/events/?state=building&state=complete') + evs = json.loads(resp.get_data(as_text=True))['items'] + self.assertEqual(len(evs), 3) + building_events = [e for e in evs if e['state'] == EventState['BUILDING'].value] + complete_events = [e for e in evs if e['state'] == EventState['COMPLETE'].value] + self.assertEqual(len(building_events), 1) + self.assertEqual(len(complete_events), 2) + def test_query_event_order_by_default(self): resp = self.client.get('/api/1/events/') evs = json.loads(resp.get_data(as_text=True))['items']