import pytest from django.utils.timezone import now from chrono.agendas.models import Agenda, Booking, Category, Event pytestmark = pytest.mark.django_db def test_statistics_list(app, user): Agenda.objects.create(label='Foo bar') Agenda.objects.create(label='Bar foo') Category.objects.create(label='Category A') Category.objects.create(label='Category B') # unauthorized app.get('/api/statistics/', status=401) app.authorization = ('Basic', ('john.doe', 'password')) resp = app.get('/api/statistics/') category_filter = [x for x in resp.json['data'][0]['filters'] if x['id'] == 'category'][0] assert len(category_filter['options']) == 3 agenda_filter = [x for x in resp.json['data'][0]['filters'] if x['id'] == 'agenda'][0] assert len(agenda_filter['options']) == 3 def test_statistics_bookings(app, user, freezer): freezer.move_to('2020-10-01') agenda = Agenda.objects.create( label='Foo bar', kind='events', minimal_booking_delay=0, maximal_booking_delay=0 ) event1 = Event.objects.create(start_datetime=now().replace(day=10), places=5, agenda=agenda) event2 = Event.objects.create(start_datetime=now().replace(day=15), places=5, agenda=agenda) app.authorization = ('Basic', ('john.doe', 'password')) resp = app.get('/api/statistics/') url = [x for x in resp.json['data'] if x['id'] == 'bookings_count'][0]['url'] resp = app.get(url) assert len(resp.json['data']['series']) == 0 for _ in range(10): Booking.objects.create(event=event1) Booking.objects.create(event=event1, cancellation_datetime=now()) Booking.objects.create(event=event2) resp = app.get(url + '?time_interval=day') assert resp.json['data']['x_labels'] == ['2020-10-10', '2020-10-15'] assert resp.json['data']['series'] == [{'label': 'Bookings Count', 'data': [10, 1]}] # period filter resp = app.get(url + '?start=2020-10-14&end=2020-10-16') assert resp.json['data']['x_labels'] == ['2020-10-15'] assert resp.json['data']['series'] == [{'label': 'Bookings Count', 'data': [1]}] category = Category.objects.create(label='Category A', slug='category-a') agenda = Agenda.objects.create(label='Bar foo', kind='events', category=category) event3 = Event.objects.create(start_datetime=now().replace(day=25), places=5, agenda=agenda) Booking.objects.create(event=event3) # category filter resp = app.get(url + '?category=category-a') assert resp.json['data']['x_labels'] == ['2020-10-25'] assert resp.json['data']['series'] == [{'label': 'Bookings Count', 'data': [1]}] # agenda filter resp = app.get(url + '?agenda=bar-foo') assert resp.json['data']['x_labels'] == ['2020-10-25'] assert resp.json['data']['series'] == [{'label': 'Bookings Count', 'data': [1]}] # invalid time_interval resp = app.get(url + '?time_interval=month', status=400) assert resp.json['err'] == 1 assert 'time_interval' in resp.json['errors'] # absence/presence for i in range(10): Booking.objects.create(event=event3, user_was_present=bool(i % 2)) event4 = Event.objects.create(start_datetime=now().replace(month=11, day=1), places=5, agenda=agenda) Booking.objects.create(event=event4, user_was_present=True) resp = app.get(url + '?group_by=user_was_present') assert resp.json['data']['x_labels'] == ['2020-10-10', '2020-10-15', '2020-10-25', '2020-11-01'] assert resp.json['data']['series'] == [ {'label': 'Absent', 'data': [None, None, 5, None]}, {'label': 'Booked', 'data': [10, 1, 1, None]}, {'label': 'Present', 'data': [None, None, 5, 1]}, ] for i in range(9): Booking.objects.create( event=event3 if i % 2 else event4, extra_data={'menu': 'vegetables'}, user_was_present=bool(i % 3) ) for i in range(5): Booking.objects.create( event=event3 if i % 2 else event4, extra_data={'menu': 'meet'}, user_was_present=bool(i % 3) ) resp = app.get(url + '?group_by=menu') assert resp.json['data']['x_labels'] == ['2020-10-10', '2020-10-15', '2020-10-25', '2020-11-01'] assert resp.json['data']['series'] == [ {'label': 'None', 'data': [10, 1, 11, 1]}, {'label': 'meet', 'data': [None, None, 2, 3]}, {'label': 'vegetables', 'data': [None, None, 4, 5]}, ] resp = app.get(url + '?group_by=user_was_present&group_by=menu') assert resp.json['data']['x_labels'] == ['2020-10-10', '2020-10-15', '2020-10-25', '2020-11-01'] assert resp.json['data']['series'] == [ {'label': 'Absent / None', 'data': [None, None, 5, None]}, {'label': 'Absent / meet', 'data': [None, None, 1, 1]}, {'label': 'Absent / vegetables', 'data': [None, None, 1, 2]}, {'label': 'Booked / None', 'data': [10, 1, 1, None]}, {'label': 'Present / None', 'data': [None, None, 5, 1]}, {'label': 'Present / meet', 'data': [None, None, 1, 2]}, {'label': 'Present / vegetables', 'data': [None, None, 3, 3]}, ] def test_statistics_bookings_subfilters_list(app, user): category = Category.objects.create(label='Category A') agenda = Agenda.objects.create(label='Foo bar', kind='events', category=category) app.authorization = ('Basic', ('john.doe', 'password')) resp = app.get('/api/statistics/') url = [x for x in resp.json['data'] if x['id'] == 'bookings_count'][0]['url'] resp = app.get(url) assert resp.json['data']['subfilters'] == [] resp = app.get(url + '?agenda=foo-bar') assert len(resp.json['data']['subfilters']) == 1 assert resp.json['data']['subfilters'][0]['id'] == 'group_by' assert len(resp.json['data']['subfilters'][0]['options']) == 1 assert resp.json['data']['subfilters'][0]['options'][0] == { 'id': 'user_was_present', 'label': 'Presence/Absence', } # extra data is shown in subfilters event = Event.objects.create(start_datetime=now(), places=5, agenda=agenda) Booking.objects.create(event=event, extra_data={'test': 'xxx'}) resp = app.get(url + '?agenda=foo-bar') assert len(resp.json['data']['subfilters'][0]['options']) == 2 assert resp.json['data']['subfilters'][0]['options'][0] == { 'id': 'user_was_present', 'label': 'Presence/Absence', } assert resp.json['data']['subfilters'][0]['options'][1] == {'id': 'test', 'label': 'Test'} resp = app.get(url + '?category=category-a') assert len(resp.json['data']['subfilters'][0]['options']) == 2 Category.objects.create(label='Category B') Agenda.objects.create(label='Other', kind='events', category=category) resp = app.get(url + '?agenda=other-agenda') assert len(resp.json['data']['subfilters'][0]['options']) == 1 resp = app.get(url + '?category=category-b') assert len(resp.json['data']['subfilters'][0]['options']) == 1