Projet

Général

Profil

0001-use-err_desc-in-error-responses-24025.patch

Thomas Noël, 23 mai 2018 14:52

Télécharger (9,17 ko)

Voir les différences:

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(-)
chrono/api/views.py
323 323
        if not serializer.is_valid():
324 324
            return Response({
325 325
                'err': 1,
326
                'err_desc': 'invalid payload',
326 327
                'reason': 'invalid payload',
327 328
                'errors': serializer.errors
328 329
            }, status=status.HTTP_400_BAD_REQUEST)
......
341 342
            except ValueError:
342 343
                return Response({
343 344
                    'err': 1,
345
                    'err_desc': 'invalid value for count (%s)' % request.GET['count'],
344 346
                    'reason': 'invalid value for count (%s)' % request.GET['count'],
345 347
                }, status=status.HTTP_400_BAD_REQUEST)
346 348

  
......
361 363
                available_desk = slots[0].desk
362 364

  
363 365
            if not available_desk:
364
                return Response({'err': 1, 'reason': 'no more desk available'})
366
                return Response({'err': 1,
367
                                 'err_desc': 'no more desk available',
368
                                 'reason': 'no more desk available'})
365 369

  
366 370
            # booking requires a real Event object (not a lazy Timeslot);
367 371
            # create it now, with data from the timeslot and the desk we
......
385 389
                new_booking.in_waiting_list = True
386 390

  
387 391
                if (event.waiting_list + places_count) > event.waiting_list_places:
388
                    return Response({'err': 1, 'reason': 'sold out'})
392
                    return Response({'err': 1,
393
                                     'err_desc': 'sold out',
394
                                     'reason': 'sold out'})
389 395

  
390 396
        else:
391 397
            if (event.booked_places + places_count) > event.places:
392
                return Response({'err': 1, 'reason': 'sold out'})
398
                return Response({'err': 1,
399
                                 'err_desc': 'sold out',
400
                                 'reason': 'sold out'})
393 401

  
394 402
        new_booking.save()
395 403
        for i in range(places_count-1):
......
452 460
    def post(self, request, booking_pk=None, format=None):
453 461
        booking = get_object_or_404(Booking, id=booking_pk)
454 462
        if booking.cancellation_datetime:
455
            response = {'err': 1, 'reason': 'already cancelled'}
463
            response = {'err': 1,
464
                        'err_desc': 'already cancelled',
465
                        'reason': 'already cancelled'}
456 466
            return Response(response)
457 467
        booking.cancel()
458 468
        response = {'err': 0, 'booking_id': booking.id}
......
473 483
    def post(self, request, booking_pk=None, format=None):
474 484
        booking = get_object_or_404(Booking, id=booking_pk)
475 485
        if booking.cancellation_datetime:
476
            response = {'err': 1, 'reason': 'booking is cancelled'}
486
            response = {'err': 1,
487
                        'err_desc': 'booking is cancelled',
488
                        'reason': 'booking is cancelled'}
477 489
            return Response(response)
478 490
        if not booking.in_waiting_list:
479
            response = {'err': 2, 'reason': 'booking is not in waiting list'}
491
            response = {'err': 2,
492
                        'err_desc': 'booking is not in waiting list',
493
                        'reason': 'booking is not in waiting list'}
480 494
            return Response(response)
481 495
        booking.accept()
482 496
        response = {'err': 0, 'booking_id': booking.id}
tests/test_api.py
300 300
    app.authorization = ('Basic', ('john.doe', 'password'))
301 301
    resp = app.post(fillslot_url)
302 302
    assert resp.json['err'] == 1
303
    assert resp.json['reason'] == 'no more desk available'
303
    assert resp.json['reason'] == resp.json['err_desc'] == 'no more desk available'
304 304

  
305 305
def test_booking_api(app, some_data, user):
306 306
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
......
352 352
    resp = app.post_json('/api/agenda/%s/fillslot/%s/' % (agenda.id, event.id),
353 353
            params={'user_name': {'foo': 'bar'}}, status=400)
354 354
    assert resp.json['err'] == 1
355
    assert resp.json['reason'] == 'invalid payload'
355
    assert resp.json['reason'] == resp.json['err_desc'] == 'invalid payload'
356 356
    assert len(resp.json['errors']) == 1
357 357
    assert 'user_name' in resp.json['errors']
358 358

  
......
382 382
    # try booking the same timeslot
383 383
    resp2 = app.post('/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id))
384 384
    assert resp2.json['err'] == 1
385
    assert resp2.json['reason'] == 'no more desk available'
385
    assert resp2.json['reason'] == resp2.json['err_desc'] ==  'no more desk available'
386 386

  
387 387
    # try booking another timeslot
388 388
    event_id = resp.json['data'][3]['id']
......
551 551
    app.authorization = ('Basic', ('john.doe', 'password'))
552 552
    resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda_id, event.id), status=200)
553 553
    assert resp.json['err'] == 1
554
    assert resp.json['reason'] == 'sold out'
554
    assert resp.json['reason'] == resp.json['err_desc'] == 'sold out'
555 555

  
556 556
def test_status(app, some_data, user):
557 557
    agenda_id = Agenda.objects.filter(label=u'Foo bar')[0].id
......
641 641
    app.authorization = ('Basic', ('john.doe', 'password'))
642 642
    resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda_id, event.id), status=200)
643 643
    assert resp.json['err'] == 1
644
    assert resp.json['reason'] == 'sold out'
644
    assert resp.json['reason'] == resp.json['err_desc'] == 'sold out'
645 645

  
646 646
def test_accept_booking(app, some_data, user):
647 647
    agenda_id = Agenda.objects.filter(label=u'Foo bar')[0].id
......
686 686
    app.authorization = ('Basic', ('john.doe', 'password'))
687 687
    resp = app.post('/api/agenda/%s/fillslot/%s/?count=NaN' % (agenda.slug, event.id), status=400)
688 688
    assert resp.json['err'] == 1
689
    assert resp.json['reason'] == "invalid value for count (NaN)"
689
    assert resp.json['reason'] == resp.json['err_desc'] == "invalid value for count (NaN)"
690 690

  
691 691
    resp = app.post('/api/agenda/%s/fillslot/%s/?count=3' % (agenda.slug, event.id))
692 692
    Booking.objects.get(id=resp.json['booking_id'])
......
713 713
    # check waiting list overflow
714 714
    resp = app.post('/api/agenda/%s/fillslot/%s/?count=5' % (agenda.slug, event.id))
715 715
    assert resp.json['err'] == 1
716
    assert resp.json['reason'] == 'sold out'
716
    assert resp.json['reason'] == resp.json['err_desc'] == 'sold out'
717 717
    assert Event.objects.get(id=event.id).booked_places == 2
718 718
    assert Event.objects.get(id=event.id).waiting_list == 5
719 719

  
......
730 730

  
731 731
    resp = app.post('/api/agenda/%s/fillslot/%s/?count=5' % (agenda.slug, event.id))
732 732
    assert resp.json['err'] == 1
733
    assert resp.json['reason'] == 'sold out'
733
    assert resp.json['reason'] == resp.json['err_desc'] == 'sold out'
734 734

  
735 735
    resp = app.post('/api/agenda/%s/fillslot/%s/?count=3' % (agenda.slug, event.id))
736 736
    assert resp.json['err'] == 0
......
739 739

  
740 740
    resp = app.post('/api/agenda/%s/fillslot/%s/?count=3' % (agenda.slug, event.id))
741 741
    assert resp.json['err'] == 1
742
    assert resp.json['reason'] == 'sold out'
742
    assert resp.json['reason'] == resp.json['err_desc'] == 'sold out'
743 743

  
744 744
    resp = app.post('/api/agenda/%s/fillslot/%s/?count=2' % (agenda.slug, event.id))
745 745
    assert resp.json['err'] == 0
......
848 848
    resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id))
849 849
    assert Booking.objects.count() == 2
850 850
    assert resp.json['err'] == 1
851
    assert resp.json['reason'] == 'no more desk available'
851
    assert resp.json['reason'] == resp.json['err_desc'] == 'no more desk available'
852 852

  
853 853
    # cancel first booking and retry
854 854
    resp = app.post(cancel_url)
......
885 885
    # try booking the same timeslot again and fail
886 886
    resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id))
887 887
    assert resp.json['err'] == 1
888
    assert resp.json['reason'] == 'no more desk available'
888
    assert resp.json['reason'] == resp.json['err_desc'] == 'no more desk available'
889 889

  
890 890
    # fill the agenda and make sure big O is O(1)
891 891
    for idx, event_data in enumerate(resp2.json['data'][2:10]):
892
-