From 80112b4b8589a11b8391c96305bec64190a47d33 Mon Sep 17 00:00:00 2001 From: Thomas NOEL Date: Wed, 23 May 2018 14:51:51 +0200 Subject: [PATCH] use err_desc in error responses (#24025) --- chrono/api/views.py | 26 ++++++++++++++++++++------ tests/test_api.py | 22 +++++++++++----------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/chrono/api/views.py b/chrono/api/views.py index 2ced85b..b874586 100644 --- a/chrono/api/views.py +++ b/chrono/api/views.py @@ -323,6 +323,7 @@ class Fillslot(APIView): if not serializer.is_valid(): return Response({ 'err': 1, + 'err_desc': 'invalid payload', 'reason': 'invalid payload', 'errors': serializer.errors }, status=status.HTTP_400_BAD_REQUEST) @@ -341,6 +342,7 @@ class Fillslot(APIView): except ValueError: return Response({ 'err': 1, + 'err_desc': 'invalid value for count (%s)' % request.GET['count'], 'reason': 'invalid value for count (%s)' % request.GET['count'], }, status=status.HTTP_400_BAD_REQUEST) @@ -361,7 +363,9 @@ class Fillslot(APIView): available_desk = slots[0].desk if not available_desk: - return Response({'err': 1, 'reason': 'no more desk available'}) + return Response({'err': 1, + 'err_desc': 'no more desk available', + 'reason': 'no more desk available'}) # booking requires a real Event object (not a lazy Timeslot); # create it now, with data from the timeslot and the desk we @@ -385,11 +389,15 @@ class Fillslot(APIView): new_booking.in_waiting_list = True if (event.waiting_list + places_count) > event.waiting_list_places: - return Response({'err': 1, 'reason': 'sold out'}) + return Response({'err': 1, + 'err_desc': 'sold out', + 'reason': 'sold out'}) else: if (event.booked_places + places_count) > event.places: - return Response({'err': 1, 'reason': 'sold out'}) + return Response({'err': 1, + 'err_desc': 'sold out', + 'reason': 'sold out'}) new_booking.save() for i in range(places_count-1): @@ -452,7 +460,9 @@ class CancelBooking(APIView): def post(self, request, booking_pk=None, format=None): booking = get_object_or_404(Booking, id=booking_pk) if booking.cancellation_datetime: - response = {'err': 1, 'reason': 'already cancelled'} + response = {'err': 1, + 'err_desc': 'already cancelled', + 'reason': 'already cancelled'} return Response(response) booking.cancel() response = {'err': 0, 'booking_id': booking.id} @@ -473,10 +483,14 @@ class AcceptBooking(APIView): def post(self, request, booking_pk=None, format=None): booking = get_object_or_404(Booking, id=booking_pk) if booking.cancellation_datetime: - response = {'err': 1, 'reason': 'booking is cancelled'} + response = {'err': 1, + 'err_desc': 'booking is cancelled', + 'reason': 'booking is cancelled'} return Response(response) if not booking.in_waiting_list: - response = {'err': 2, 'reason': 'booking is not in waiting list'} + response = {'err': 2, + 'err_desc': 'booking is not in waiting list', + 'reason': 'booking is not in waiting list'} return Response(response) booking.accept() response = {'err': 0, 'booking_id': booking.id} diff --git a/tests/test_api.py b/tests/test_api.py index d5ddcbe..eb061d1 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -300,7 +300,7 @@ def test_datetimes_api_meetings_agenda_short_time_periods(app, meetings_agenda, app.authorization = ('Basic', ('john.doe', 'password')) resp = app.post(fillslot_url) assert resp.json['err'] == 1 - assert resp.json['reason'] == 'no more desk available' + assert resp.json['reason'] == resp.json['err_desc'] == 'no more desk available' def test_booking_api(app, some_data, user): agenda = Agenda.objects.filter(label=u'Foo bar')[0] @@ -352,7 +352,7 @@ def test_booking_api(app, some_data, user): resp = app.post_json('/api/agenda/%s/fillslot/%s/' % (agenda.id, event.id), params={'user_name': {'foo': 'bar'}}, status=400) assert resp.json['err'] == 1 - assert resp.json['reason'] == 'invalid payload' + assert resp.json['reason'] == resp.json['err_desc'] == 'invalid payload' assert len(resp.json['errors']) == 1 assert 'user_name' in resp.json['errors'] @@ -382,7 +382,7 @@ def test_booking_api_meeting(app, meetings_agenda, user): # try booking the same timeslot resp2 = app.post('/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id)) assert resp2.json['err'] == 1 - assert resp2.json['reason'] == 'no more desk available' + assert resp2.json['reason'] == resp2.json['err_desc'] == 'no more desk available' # try booking another timeslot event_id = resp.json['data'][3]['id'] @@ -551,7 +551,7 @@ def test_soldout(app, some_data, user): app.authorization = ('Basic', ('john.doe', 'password')) resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda_id, event.id), status=200) assert resp.json['err'] == 1 - assert resp.json['reason'] == 'sold out' + assert resp.json['reason'] == resp.json['err_desc'] == 'sold out' def test_status(app, some_data, user): agenda_id = Agenda.objects.filter(label=u'Foo bar')[0].id @@ -641,7 +641,7 @@ def test_waiting_list_booking(app, some_data, user): app.authorization = ('Basic', ('john.doe', 'password')) resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda_id, event.id), status=200) assert resp.json['err'] == 1 - assert resp.json['reason'] == 'sold out' + assert resp.json['reason'] == resp.json['err_desc'] == 'sold out' def test_accept_booking(app, some_data, user): agenda_id = Agenda.objects.filter(label=u'Foo bar')[0].id @@ -686,7 +686,7 @@ def test_multiple_booking_api(app, some_data, user): app.authorization = ('Basic', ('john.doe', 'password')) resp = app.post('/api/agenda/%s/fillslot/%s/?count=NaN' % (agenda.slug, event.id), status=400) assert resp.json['err'] == 1 - assert resp.json['reason'] == "invalid value for count (NaN)" + assert resp.json['reason'] == resp.json['err_desc'] == "invalid value for count (NaN)" resp = app.post('/api/agenda/%s/fillslot/%s/?count=3' % (agenda.slug, event.id)) Booking.objects.get(id=resp.json['booking_id']) @@ -713,7 +713,7 @@ def test_multiple_booking_api(app, some_data, user): # check waiting list overflow resp = app.post('/api/agenda/%s/fillslot/%s/?count=5' % (agenda.slug, event.id)) assert resp.json['err'] == 1 - assert resp.json['reason'] == 'sold out' + assert resp.json['reason'] == resp.json['err_desc'] == 'sold out' assert Event.objects.get(id=event.id).booked_places == 2 assert Event.objects.get(id=event.id).waiting_list == 5 @@ -730,7 +730,7 @@ def test_multiple_booking_api(app, some_data, user): resp = app.post('/api/agenda/%s/fillslot/%s/?count=5' % (agenda.slug, event.id)) assert resp.json['err'] == 1 - assert resp.json['reason'] == 'sold out' + assert resp.json['reason'] == resp.json['err_desc'] == 'sold out' resp = app.post('/api/agenda/%s/fillslot/%s/?count=3' % (agenda.slug, event.id)) assert resp.json['err'] == 0 @@ -739,7 +739,7 @@ def test_multiple_booking_api(app, some_data, user): resp = app.post('/api/agenda/%s/fillslot/%s/?count=3' % (agenda.slug, event.id)) assert resp.json['err'] == 1 - assert resp.json['reason'] == 'sold out' + assert resp.json['reason'] == resp.json['err_desc'] == 'sold out' resp = app.post('/api/agenda/%s/fillslot/%s/?count=2' % (agenda.slug, event.id)) assert resp.json['err'] == 0 @@ -848,7 +848,7 @@ def test_agenda_meeting_api_multiple_desk(app, meetings_agenda, user): resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id)) assert Booking.objects.count() == 2 assert resp.json['err'] == 1 - assert resp.json['reason'] == 'no more desk available' + assert resp.json['reason'] == resp.json['err_desc'] == 'no more desk available' # cancel first booking and retry resp = app.post(cancel_url) @@ -885,7 +885,7 @@ def test_agenda_meeting_api_multiple_desk(app, meetings_agenda, user): # try booking the same timeslot again and fail resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id)) assert resp.json['err'] == 1 - assert resp.json['reason'] == 'no more desk available' + assert resp.json['reason'] == resp.json['err_desc'] == 'no more desk available' # fill the agenda and make sure big O is O(1) for idx, event_data in enumerate(resp2.json['data'][2:10]): -- 2.17.0