Projet

Général

Profil

0007-api-subscription-patch-endpoint-61077.patch

Lauréline Guérin, 27 janvier 2022 16:50

Télécharger (6,77 ko)

Voir les différences:

Subject: [PATCH 7/7] api: subscription patch endpoint (#61077)

 chrono/api/serializers.py      |   2 +-
 chrono/api/views.py            |  15 +++++
 tests/api/test_subscription.py | 109 +++++++++++++++++++++++++++++++++
 3 files changed, 125 insertions(+), 1 deletion(-)
chrono/api/serializers.py
349 349

  
350 350
    def validate(self, attrs):
351 351
        super().validate(attrs)
352
        if attrs['date_start'] > attrs['date_end']:
352
        if attrs.get('date_start') and attrs.get('date_end') and attrs['date_start'] > attrs['date_end']:
353 353
            raise ValidationError(_('start_datetime must be before end_datetime'))
354 354
        return attrs
chrono/api/views.py
1952 1952
        response.update({'err': 0})
1953 1953
        return Response(response)
1954 1954

  
1955
    def patch(self, request, *args, **kwargs):
1956
        serializer = self.serializer_class(self.subscription, data=request.data, partial=True)
1957

  
1958
        if not serializer.is_valid():
1959
            raise APIErrorBadRequest(N_('invalid payload'), errors=serializer.errors, err=4)
1960

  
1961
        serializer.save()
1962
        extra_data = {k: v for k, v in request.data.items() if k not in serializer.validated_data}
1963
        if extra_data:
1964
            self.subscription.extra_data = self.subscription.extra_data or {}
1965
            self.subscription.extra_data.update(extra_data)
1966
            self.subscription.save()
1967

  
1968
        return self.get(request, *args, **kwargs)
1969

  
1955 1970
    def delete(self, request, *args, **kwargs):
1956 1971
        self.subscription.delete()
1957 1972
        response = {'err': 0}
tests/api/test_subscription.py
314 314
    resp = app.delete('/api/agenda/%s/subscription/%s/' % (agenda.slug, subscription.pk))
315 315
    assert resp.json['err'] == 0
316 316
    assert Subscription.objects.filter(pk=subscription.pk).exists() is False
317

  
318

  
319
def test_api_patch_subscription(app, user):
320
    agenda = Agenda.objects.create(label='Foo bar', kind='events')
321
    subscription = Subscription.objects.create(
322
        agenda=agenda,
323
        user_external_id='xxx',
324
        user_first_name='Foo',
325
        user_last_name='BAR',
326
        user_email='foo@bar.com',
327
        user_phone_number='06',
328
        date_start=datetime.date(year=2021, month=9, day=1),
329
        date_end=datetime.date(year=2021, month=10, day=1),
330
    )
331
    other_agenda = Agenda.objects.create(label='Foo bar', kind='events')
332
    other_subscription = Subscription.objects.create(
333
        agenda=other_agenda,
334
        user_external_id='xxx',
335
        date_start=datetime.date(year=2021, month=9, day=1),
336
        date_end=datetime.date(year=2021, month=10, day=1),
337
    )
338

  
339
    resp = app.patch('/api/agenda/%s/subscription/%s/' % (agenda.slug, subscription.pk), status=401)
340

  
341
    app.authorization = ('Basic', ('john.doe', 'password'))
342

  
343
    resp = app.patch('/api/agenda/%s/subscription/%s/' % (agenda.slug, subscription.pk))
344
    assert resp.json == {
345
        'id': subscription.pk,
346
        'user_external_id': 'xxx',
347
        'user_first_name': 'Foo',
348
        'user_last_name': 'BAR',
349
        'user_email': 'foo@bar.com',
350
        'user_phone_number': '06',
351
        'date_start': '2021-09-01',
352
        'date_end': '2021-10-01',
353
        'extra_data': None,
354
        'err': 0,
355
    }
356

  
357
    to_test = [
358
        ('user_external_id', 'yyy', 'yyy'),
359
        ('user_first_name', 'fooo', 'fooo'),
360
        ('user_last_name', 'baaaar', 'baaaar'),
361
        ('user_email', '', ''),
362
        ('user_email', 'fooo@baaaar.com', 'fooo@baaaar.com'),
363
        ('user_phone_number', '', ''),
364
        ('user_phone_number', '0606', '0606'),
365
        ('date_start', '2021-08-31', datetime.date(2021, 8, 31)),
366
        ('date_end', '2022-07-31', datetime.date(2022, 7, 31)),
367
    ]
368
    for key, value, db_value in to_test:
369
        params = {
370
            key: value,
371
        }
372
        resp = app.patch('/api/agenda/%s/subscription/%s/' % (agenda.slug, subscription.pk), params=params)
373
        assert resp.json[key] == value
374
        subscription.refresh_from_db()
375
        assert getattr(subscription, key) == db_value
376

  
377
    params = {
378
        'foo': 'bar',
379
    }
380
    resp = app.patch('/api/agenda/%s/subscription/%s/' % (agenda.slug, subscription.pk), params=params)
381
    assert resp.json['extra_data'] == {'foo': 'bar'}
382
    subscription.refresh_from_db()
383
    assert subscription.extra_data == {'foo': 'bar'}
384
    params = {
385
        'foo': 'bar2',
386
    }
387
    resp = app.patch('/api/agenda/%s/subscription/%s/' % (agenda.slug, subscription.pk), params=params)
388
    assert resp.json['extra_data'] == {'foo': 'bar2'}
389
    subscription.refresh_from_db()
390
    assert subscription.extra_data == {'foo': 'bar2'}
391
    params = {
392
        'bar': 'baz',
393
    }
394
    resp = app.patch('/api/agenda/%s/subscription/%s/' % (agenda.slug, subscription.pk), params=params)
395
    assert resp.json['extra_data'] == {'foo': 'bar2', 'bar': 'baz'}
396
    subscription.refresh_from_db()
397
    assert subscription.extra_data == {'foo': 'bar2', 'bar': 'baz'}
398

  
399
    params = {
400
        'date_start': 'foobar',
401
        'date_end': 'foobar',
402
    }
403
    resp = app.patch(
404
        '/api/agenda/%s/subscription/%s/' % (agenda.slug, subscription.pk), params=params, status=400
405
    )
406
    assert resp.json['err_class'] == 'invalid payload'
407
    assert 'wrong format' in resp.json['errors']['date_start'][0]
408
    assert 'wrong format' in resp.json['errors']['date_end'][0]
409

  
410
    params = {
411
        'date_start': '2021-10-01',
412
        'date_end': '2021-09-01',
413
    }
414
    resp = app.patch(
415
        '/api/agenda/%s/subscription/%s/' % (agenda.slug, subscription.pk), params=params, status=400
416
    )
417
    assert resp.json['errors']['non_field_errors'][0] == 'start_datetime must be before end_datetime'
418

  
419
    app.patch('/api/agenda/%s/subscription/%s/' % (agenda.slug, other_subscription.pk), status=404)
420
    app.patch('/api/agenda/%s/subscription/%s/' % (agenda.slug, 0), status=404)
421
    app.patch('/api/agenda/%s/subscription/%s/' % ('unknown', subscription.pk), status=404)
422
    for kind in ['meetings', 'virtual']:
423
        agenda.kind = kind
424
        agenda.save()
425
        app.patch('/api/agenda/%s/subscription/%s/' % (agenda.slug, subscription.pk), status=404)
317
-