Projet

Général

Profil

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

Lauréline Guérin, 27 janvier 2022 11:52

Télécharger (6,35 ko)

Voir les différences:

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

 chrono/api/serializers.py      |   2 +-
 chrono/api/views.py            |  13 +++++
 tests/api/test_subscription.py | 103 +++++++++++++++++++++++++++++++++
 3 files changed, 117 insertions(+), 1 deletion(-)
chrono/api/serializers.py
348 348

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

  
1961
    def patch(self, request, *args, **kwargs):
1962
        serializer = self.serializer_class(self.subscription, data=request.data, partial=True)
1963

  
1964
        if not serializer.is_valid():
1965
            raise APIErrorBadRequest(N_('invalid payload'), errors=serializer.errors, err=4)
1966

  
1967
        serializer.save()
1968
        extra_data = {k: v for k, v in request.data.items() if k not in serializer.validated_data}
1969
        self.subscription.extra_data.update(extra_data)
1970
        self.subscription.save()
1971

  
1972
        return self.get(request, *args, **kwargs)
1973

  
1961 1974
    def delete(self, request, *args, **kwargs):
1962 1975
        self.subscription.delete()
1963 1976
        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
        extra_data={'foo': 'bar'},
329
        date_start=datetime.date(year=2021, month=9, day=1),
330
        date_end=datetime.date(year=2021, month=10, day=1),
331
    )
332
    other_agenda = Agenda.objects.create(label='Foo bar', kind='events')
333
    other_subscription = Subscription.objects.create(
334
        agenda=other_agenda,
335
        user_external_id='xxx',
336
        date_start=datetime.date(year=2021, month=9, day=1),
337
        date_end=datetime.date(year=2021, month=10, day=1),
338
    )
339

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

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

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

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

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

  
393
    params = {
394
        'date_start': 'foobar',
395
        'date_end': 'foobar',
396
    }
397
    resp = app.patch(
398
        '/api/agenda/%s/subscription/%s/' % (agenda.slug, subscription.pk), params=params, status=400
399
    )
400
    assert resp.json['err_class'] == 'invalid payload'
401
    assert 'wrong format' in resp.json['errors']['date_start'][0]
402
    assert 'wrong format' in resp.json['errors']['date_end'][0]
403

  
404
    params = {
405
        'date_start': '2021-10-01',
406
        'date_end': '2021-09-01',
407
    }
408
    resp = app.patch(
409
        '/api/agenda/%s/subscription/%s/' % (agenda.slug, subscription.pk), params=params, status=400
410
    )
411
    assert resp.json['errors']['non_field_errors'][0] == 'start_datetime must be before end_datetime'
412

  
413
    app.patch('/api/agenda/%s/subscription/%s/' % (agenda.slug, other_subscription.pk), status=404)
414
    app.patch('/api/agenda/%s/subscription/%s/' % (agenda.slug, 0), status=404)
415
    app.patch('/api/agenda/%s/subscription/%s/' % ('unknown', subscription.pk), status=404)
416
    for kind in ['meetings', 'virtual']:
417
        agenda.kind = kind
418
        agenda.save()
419
        app.patch('/api/agenda/%s/subscription/%s/' % (agenda.slug, subscription.pk), status=404)
317
-