chrono/tests/api/test_locks.py

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