chrono/tests/manager/test_partial_bookings.py

112 lines
3.9 KiB
Python

import datetime
import pytest
from chrono.agendas.models import Agenda, Booking, Event
from chrono.utils.timezone import make_aware
from tests.utils import login
pytestmark = pytest.mark.django_db
def test_manager_partial_bookings_add_agenda(app, admin_user, settings):
app = login(app)
resp = app.get('/manage/agendas/add/')
assert 'partial-bookings' not in resp.text
settings.PARTIAL_BOOKINGS_ENABLED = True
resp = app.get('/manage/agendas/add/')
resp.form['label'] = 'Foo bar'
resp.form['kind'] = 'partial-bookings'
resp = resp.form.submit().follow()
agenda = Agenda.objects.get(label='Foo bar')
assert agenda.kind == 'events'
assert agenda.partial_bookings is True
assert agenda.default_view == 'day'
resp = resp.click('Options')
assert 'default_view' not in resp.form.fields
def test_manager_partial_bookings_add_event(app, admin_user):
agenda = Agenda.objects.create(label='Foo bar', kind='events', partial_bookings=True)
app = login(app)
resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
resp = resp.click('New Event')
assert 'duration' not in resp.form.fields
resp.form['start_datetime_0'] = '2023-02-15'
resp.form['start_datetime_1'] = '08:00'
resp.form['end_time'] = '18:00'
resp.form['places'] = 10
resp = resp.form.submit().follow()
event = Event.objects.get()
assert event.end_time == datetime.time(18, 00)
assert event.duration is None
resp = app.get('/manage/agendas/%s/events/%s/edit' % (agenda.pk, event.pk))
assert 'duration' not in resp.form.fields
assert resp.form['end_time'].value == '18:00'
def test_manager_partial_bookings_day_view(app, admin_user, freezer):
agenda = Agenda.objects.create(label='Foo bar', kind='events', partial_bookings=True)
start_datetime = make_aware(datetime.datetime(2023, 5, 2, 8, 0))
event = Event.objects.create(
label='Event', start_datetime=start_datetime, end_time=datetime.time(18, 00), places=10, agenda=agenda
)
Booking.objects.create(
user_external_id='xxx',
user_first_name='Jane',
user_last_name='Doe',
start_time=datetime.time(11, 00),
end_time=datetime.time(13, 30),
event=event,
)
Booking.objects.create(
user_external_id='yyy',
user_first_name='Jon',
user_last_name='Doe',
start_time=datetime.time(8, 00),
end_time=datetime.time(10, 00),
event=event,
)
Booking.objects.create(
user_external_id='yyy',
user_first_name='Jon',
user_last_name='Doe',
start_time=datetime.time(12, 00),
end_time=datetime.time(14, 00),
event=event,
)
app = login(app)
today = start_datetime.date()
resp = app.get('/manage/agendas/%s/day/%d/%d/%d/' % (agenda.pk, today.year, today.month, today.day))
assert 'Week' not in resp.text
assert 'Month' not in resp.text
# time range from one hour before event start to one hour after end
assert (
resp.pyquery('thead th').text()
== '7 a.m. 8 a.m. 9 a.m. 10 a.m. 11 a.m. noon 1 p.m. 2 p.m. 3 p.m. 4 p.m. 5 p.m. 6 p.m. 7 p.m.'
)
assert len(resp.pyquery('tbody tr')) == 2
assert resp.pyquery('tbody tr th')[0].text == 'Jane Doe'
assert resp.pyquery('tbody tr th')[1].text == 'Jon Doe'
assert resp.pyquery('tbody tr div.booking')[0].text == '11 a.m. - 1:30 p.m.'
assert resp.pyquery('tbody tr div.booking')[0].attrib['style'] == 'left: 400%; width: 250%;'
assert resp.pyquery('tbody tr div.booking')[1].text == '8 a.m. - 10 a.m.'
assert resp.pyquery('tbody tr div.booking')[1].attrib['style'] == 'left: 100%; width: 200%;'
assert resp.pyquery('tbody tr div.booking')[2].text == 'noon - 2 p.m.'
assert resp.pyquery('tbody tr div.booking')[2].attrib['style'] == 'left: 500%; width: 200%;'
resp = resp.click('Next day')
assert 'No opening hours this day.' in resp.text