2021-06-01 10:41:09 +02:00
|
|
|
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):
|
2022-11-09 11:41:22 +01:00
|
|
|
Agenda.objects.create(label='Foo bar')
|
|
|
|
Agenda.objects.create(label='Bar foo')
|
2021-06-01 10:41:09 +02:00
|
|
|
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
|
2021-06-30 16:56:40 +02:00
|
|
|
agenda_filter = [x for x in resp.json['data'][0]['filters'] if x['id'] == 'agenda'][0]
|
|
|
|
assert len(agenda_filter['options']) == 3
|
2021-06-01 10:41:09 +02:00
|
|
|
|
|
|
|
|
|
|
|
def test_statistics_bookings(app, user, freezer):
|
2021-06-30 11:32:55 +02:00
|
|
|
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)
|
2021-06-01 10:41:09 +02:00
|
|
|
|
|
|
|
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):
|
2021-06-30 11:32:55 +02:00
|
|
|
Booking.objects.create(event=event1)
|
2022-08-09 09:40:22 +02:00
|
|
|
Booking.objects.create(event=event1, cancellation_datetime=now())
|
2021-06-30 11:32:55 +02:00
|
|
|
Booking.objects.create(event=event2)
|
2021-06-01 10:41:09 +02:00
|
|
|
|
|
|
|
resp = app.get(url + '?time_interval=day')
|
2022-11-09 11:41:22 +01:00
|
|
|
assert resp.json['data']['x_labels'] == ['2020-10-10', '2020-10-15']
|
|
|
|
assert resp.json['data']['series'] == [{'label': 'Bookings Count', 'data': [10, 1]}]
|
2021-06-01 10:41:09 +02:00
|
|
|
|
|
|
|
# period filter
|
|
|
|
resp = app.get(url + '?start=2020-10-14&end=2020-10-16')
|
2022-11-09 11:41:22 +01:00
|
|
|
assert resp.json['data']['x_labels'] == ['2020-10-15']
|
|
|
|
assert resp.json['data']['series'] == [{'label': 'Bookings Count', 'data': [1]}]
|
2021-06-01 10:41:09 +02:00
|
|
|
|
|
|
|
category = Category.objects.create(label='Category A', slug='category-a')
|
2021-06-30 16:56:40 +02:00
|
|
|
agenda = Agenda.objects.create(label='Bar foo', kind='events', category=category)
|
2021-06-30 11:32:55 +02:00
|
|
|
event3 = Event.objects.create(start_datetime=now().replace(day=25), places=5, agenda=agenda)
|
|
|
|
Booking.objects.create(event=event3)
|
2021-06-01 10:41:09 +02:00
|
|
|
|
|
|
|
# category filter
|
|
|
|
resp = app.get(url + '?category=category-a')
|
2022-11-09 11:41:22 +01:00
|
|
|
assert resp.json['data']['x_labels'] == ['2020-10-25']
|
|
|
|
assert resp.json['data']['series'] == [{'label': 'Bookings Count', 'data': [1]}]
|
2021-06-01 10:41:09 +02:00
|
|
|
|
2021-06-30 16:56:40 +02:00
|
|
|
# agenda filter
|
|
|
|
resp = app.get(url + '?agenda=bar-foo')
|
2022-11-09 11:41:22 +01:00
|
|
|
assert resp.json['data']['x_labels'] == ['2020-10-25']
|
|
|
|
assert resp.json['data']['series'] == [{'label': 'Bookings Count', 'data': [1]}]
|
2021-06-30 16:56:40 +02:00
|
|
|
|
2021-06-01 10:41:09 +02:00
|
|
|
# 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):
|
2021-06-30 11:32:55 +02:00
|
|
|
Booking.objects.create(event=event3, user_was_present=bool(i % 2))
|
2021-06-01 10:41:09 +02:00
|
|
|
|
2021-06-30 11:32:55 +02:00
|
|
|
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)
|
2021-06-01 10:41:09 +02:00
|
|
|
|
2021-07-07 11:30:56 +02:00
|
|
|
resp = app.get(url + '?group_by=user_was_present')
|
2022-11-09 11:41:22 +01:00
|
|
|
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]},
|
|
|
|
]
|
2021-07-07 11:30:56 +02:00
|
|
|
|
|
|
|
for i in range(9):
|
2021-10-13 11:54:24 +02:00
|
|
|
Booking.objects.create(
|
|
|
|
event=event3 if i % 2 else event4, extra_data={'menu': 'vegetables'}, user_was_present=bool(i % 3)
|
|
|
|
)
|
2021-07-07 11:30:56 +02:00
|
|
|
for i in range(5):
|
2021-10-13 11:54:24 +02:00
|
|
|
Booking.objects.create(
|
|
|
|
event=event3 if i % 2 else event4, extra_data={'menu': 'meet'}, user_was_present=bool(i % 3)
|
|
|
|
)
|
2021-07-07 11:30:56 +02:00
|
|
|
|
|
|
|
resp = app.get(url + '?group_by=menu')
|
2022-11-09 11:41:22 +01:00
|
|
|
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]},
|
|
|
|
]
|
2021-10-13 11:54:24 +02:00
|
|
|
|
|
|
|
resp = app.get(url + '?group_by=user_was_present&group_by=menu')
|
2022-11-09 11:41:22 +01:00
|
|
|
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',
|
2021-10-13 11:54:24 +02:00
|
|
|
}
|
2022-11-09 11:41:22 +01:00
|
|
|
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
|