232 lines
9.0 KiB
Python
232 lines
9.0 KiB
Python
import urllib.parse as urlparse
|
|
|
|
import pytest
|
|
|
|
from chrono.agendas.models import Booking, Lease, MeetingType, Resource
|
|
|
|
pytestmark = pytest.mark.django_db
|
|
|
|
|
|
def test_booking_api_meeting_lock_and_confirm(app, meetings_agenda, user):
|
|
agenda_id = meetings_agenda.slug
|
|
meeting_type = MeetingType.objects.get(agenda=meetings_agenda)
|
|
|
|
# list free slots, with or without a lock
|
|
resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id)
|
|
free_slots = len(resp.json['data'])
|
|
resp = app.get('/api/agenda/meetings/%s/datetimes/?lock_code=OTHERLOCK' % meeting_type.id)
|
|
assert free_slots == len(resp.json['data'])
|
|
resp = app.get('/api/agenda/meetings/%s/datetimes/?lock_code=MYLOCK' % meeting_type.id)
|
|
assert free_slots == len(resp.json['data'])
|
|
|
|
# lock a slot
|
|
event_id = resp.json['data'][2]['id']
|
|
assert urlparse.urlparse(
|
|
resp.json['data'][2]['api']['fillslot_url']
|
|
).path == '/api/agenda/%s/fillslot/%s/' % (meetings_agenda.slug, event_id)
|
|
app.authorization = ('Basic', ('john.doe', 'password'))
|
|
app.post('/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id), params={'lock_code': 'MYLOCK'})
|
|
assert Booking.objects.count() == 0
|
|
assert Lease.objects.count() == 1
|
|
assert (
|
|
Lease.objects.filter(
|
|
agenda=meetings_agenda,
|
|
desk=meetings_agenda.desk_set.get(),
|
|
lock_code='MYLOCK',
|
|
lock_expiration_datetime__isnull=False,
|
|
).count()
|
|
== 1
|
|
)
|
|
|
|
# list free slots: one is locked ...
|
|
resp2 = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id)
|
|
assert free_slots == len([x for x in resp2.json['data']])
|
|
assert len([x for x in resp2.json['data'] if x.get('disabled')]) == 1
|
|
|
|
resp2 = app.get('/api/agenda/meetings/%s/datetimes/?lock_code=OTHERLOCK' % meeting_type.id)
|
|
assert free_slots == len([x for x in resp2.json['data']])
|
|
assert len([x for x in resp2.json['data'] if x.get('disabled')]) == 1
|
|
|
|
# ... unless it's MYLOCK
|
|
resp2 = app.get('/api/agenda/meetings/%s/datetimes/?lock_code=MYLOCK' % meeting_type.id)
|
|
assert free_slots == len([x for x in resp2.json['data']])
|
|
assert len([x for x in resp2.json['data'] if x.get('disabled')]) == 0
|
|
|
|
# can't lock the same timeslot ...
|
|
resp_booking = app.post(
|
|
'/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id), params={'lock_code': 'OTHERLOCK'}
|
|
)
|
|
assert resp_booking.json['err'] == 1
|
|
assert resp_booking.json['reason'] == 'no more desk available'
|
|
|
|
# ... unless with MYLOCK (aka "relock")
|
|
resp_booking = app.post(
|
|
'/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id), params={'lock_code': 'MYLOCK'}
|
|
)
|
|
assert resp_booking.json['err'] == 0
|
|
assert Booking.objects.count() == 0
|
|
assert Lease.objects.count() == 1
|
|
assert (
|
|
Lease.objects.filter(
|
|
agenda=meetings_agenda,
|
|
desk=meetings_agenda.desk_set.get(),
|
|
lock_code='MYLOCK',
|
|
lock_expiration_datetime__isnull=False,
|
|
).count()
|
|
== 1
|
|
)
|
|
|
|
# can't book the slot ...
|
|
resp_booking = app.post('/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id))
|
|
assert resp_booking.json['err'] == 1
|
|
assert resp_booking.json['reason'] == 'no more desk available'
|
|
|
|
resp_booking = app.post(
|
|
'/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id), params={'confirm_after_lock': True}
|
|
)
|
|
assert resp_booking.json['err'] == 1
|
|
assert resp_booking.json['reason'] == 'no more desk available'
|
|
|
|
resp_booking = app.post(
|
|
'/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id),
|
|
params={'lock_code': 'OTHERLOCK', 'confirm_after_lock': True},
|
|
)
|
|
assert resp_booking.json['err'] == 1
|
|
assert resp_booking.json['reason'] == 'no more desk available'
|
|
|
|
# ... unless with MYLOCK (aka "confirm")
|
|
resp_booking = app.post(
|
|
'/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id),
|
|
params={'lock_code': 'MYLOCK', 'confirm_after_lock': True},
|
|
)
|
|
assert resp_booking.json['err'] == 0
|
|
assert Booking.objects.count() == 1
|
|
assert Lease.objects.count() == 0
|
|
|
|
|
|
def test_booking_api_meeting_lock_and_confirm_with_resource(app, meetings_agenda, user):
|
|
resource1 = Resource.objects.create(label='Resource 1', slug='re1')
|
|
resource2 = Resource.objects.create(label='Resource 2', slug='re2')
|
|
meetings_agenda.resources.add(resource1, resource2)
|
|
agenda_id = meetings_agenda.slug
|
|
meeting_type = MeetingType.objects.get(agenda=meetings_agenda)
|
|
|
|
# list free slots, with or without a lock
|
|
resp = app.get('/api/agenda/meetings/%s/datetimes/?resources=re1' % meeting_type.id)
|
|
free_slots = len(resp.json['data'])
|
|
resp = app.get('/api/agenda/meetings/%s/datetimes/?lock_code=OTHERLOCK&resources=re1' % meeting_type.id)
|
|
assert free_slots == len(resp.json['data'])
|
|
resp = app.get('/api/agenda/meetings/%s/datetimes/?lock_code=MYLOCK&resources=re1' % meeting_type.id)
|
|
assert free_slots == len(resp.json['data'])
|
|
|
|
# lock a slot
|
|
event_id = resp.json['data'][2]['id']
|
|
assert urlparse.urlparse(
|
|
resp.json['data'][2]['api']['fillslot_url']
|
|
).path == '/api/agenda/%s/fillslot/%s/' % (meetings_agenda.slug, event_id)
|
|
app.authorization = ('Basic', ('john.doe', 'password'))
|
|
app.post(
|
|
'/api/agenda/%s/fillslot/%s/?resources=re1' % (agenda_id, event_id), params={'lock_code': 'MYLOCK'}
|
|
)
|
|
assert Booking.objects.count() == 0
|
|
assert Lease.objects.count() == 2
|
|
assert (
|
|
Lease.objects.filter(
|
|
agenda=meetings_agenda,
|
|
desk=meetings_agenda.desk_set.get(),
|
|
resource__isnull=True,
|
|
lock_code='MYLOCK',
|
|
lock_expiration_datetime__isnull=False,
|
|
).count()
|
|
== 1
|
|
)
|
|
assert (
|
|
Lease.objects.filter(
|
|
agenda__isnull=True,
|
|
desk__isnull=True,
|
|
resource=resource1,
|
|
lock_code='MYLOCK',
|
|
lock_expiration_datetime__isnull=False,
|
|
).count()
|
|
== 1
|
|
)
|
|
old_lock_ids = set(Lease.objects.values_list('id', flat=True))
|
|
|
|
# list free slots: one is locked ...
|
|
resp2 = app.get('/api/agenda/meetings/%s/datetimes/?resources=re1' % meeting_type.id)
|
|
assert free_slots == len([x for x in resp2.json['data']])
|
|
assert len([x for x in resp2.json['data'] if x.get('disabled')]) == 1
|
|
|
|
resp2 = app.get('/api/agenda/meetings/%s/datetimes/?lock_code=OTHERLOCK&resources=re1' % meeting_type.id)
|
|
assert free_slots == len([x for x in resp2.json['data']])
|
|
assert len([x for x in resp2.json['data'] if x.get('disabled')]) == 1
|
|
|
|
# ... unless it's MYLOCK
|
|
resp2 = app.get('/api/agenda/meetings/%s/datetimes/?lock_code=MYLOCK&resources=re1' % meeting_type.id)
|
|
assert free_slots == len([x for x in resp2.json['data']])
|
|
assert len([x for x in resp2.json['data'] if x.get('disabled')]) == 0
|
|
|
|
# can't lock the same timeslot ...
|
|
resp_booking = app.post(
|
|
'/api/agenda/%s/fillslot/%s/?resources=re1' % (agenda_id, event_id), params={'lock_code': 'OTHERLOCK'}
|
|
)
|
|
assert resp_booking.json['err'] == 1
|
|
assert resp_booking.json['reason'] == 'no more desk available'
|
|
|
|
# ... unless with MYLOCK (aka "relock")
|
|
resp_booking = app.post(
|
|
'/api/agenda/%s/fillslot/%s/?resources=re1' % (agenda_id, event_id), params={'lock_code': 'MYLOCK'}
|
|
)
|
|
assert resp_booking.json['err'] == 0
|
|
assert Booking.objects.count() == 0
|
|
assert Lease.objects.count() == 2
|
|
assert (
|
|
Lease.objects.filter(
|
|
agenda=meetings_agenda,
|
|
desk=meetings_agenda.desk_set.get(),
|
|
lock_code='MYLOCK',
|
|
lock_expiration_datetime__isnull=False,
|
|
).count()
|
|
== 1
|
|
)
|
|
assert (
|
|
Lease.objects.filter(
|
|
agenda__isnull=True,
|
|
desk__isnull=True,
|
|
resource=resource1,
|
|
lock_code='MYLOCK',
|
|
lock_expiration_datetime__isnull=False,
|
|
).count()
|
|
== 1
|
|
)
|
|
new_lock_ids = set(Lease.objects.values_list('id', flat=True))
|
|
assert not (old_lock_ids & new_lock_ids)
|
|
|
|
# can't book the slot ...
|
|
resp_booking = app.post('/api/agenda/%s/fillslot/%s/?resources=re1' % (agenda_id, event_id))
|
|
assert resp_booking.json['err'] == 1
|
|
assert resp_booking.json['reason'] == 'no more desk available'
|
|
|
|
resp_booking = app.post(
|
|
'/api/agenda/%s/fillslot/%s/?resources=re1' % (agenda_id, event_id),
|
|
params={'confirm_after_lock': True},
|
|
)
|
|
assert resp_booking.json['err'] == 1
|
|
assert resp_booking.json['reason'] == 'no more desk available'
|
|
|
|
resp_booking = app.post(
|
|
'/api/agenda/%s/fillslot/%s/?resources=re1' % (agenda_id, event_id),
|
|
params={'lock_code': 'OTHERLOCK', 'confirm_after_lock': True},
|
|
)
|
|
assert resp_booking.json['err'] == 1
|
|
assert resp_booking.json['reason'] == 'no more desk available'
|
|
|
|
# ... unless with MYLOCK (aka "confirm")
|
|
resp_booking = app.post(
|
|
'/api/agenda/%s/fillslot/%s/?resources=re1' % (agenda_id, event_id),
|
|
params={'lock_code': 'MYLOCK', 'confirm_after_lock': True},
|
|
)
|
|
assert resp_booking.json['err'] == 0
|
|
assert Booking.objects.count() == 1
|
|
assert Lease.objects.count() == 0
|