chrono/tests/test_locks.py

103 lines
3.4 KiB
Python

import datetime
from argparse import Namespace
import pytest
from django.db import IntegrityError, transaction
from django.utils.timezone import now
from chrono.agendas.models import Agenda, Desk, Lease, MeetingType, Resource
@pytest.fixture
def lock(db):
agenda = Agenda.objects.create(
label=u'Foo bar Meeting', kind='meetings', minimal_booking_delay=1, maximal_booking_delay=56
)
meeting_type = MeetingType(agenda=agenda, label='Blah', duration=30)
meeting_type.save()
desk1 = Desk.objects.create(agenda=agenda, label='Desk 1')
desk2 = Desk.objects.create(agenda=agenda, label='Desk 2')
resource = Resource.objects.create(label='re', description='re')
return Namespace(**locals())
def test_lock_constraint_desk(lock):
Lease.objects.create(
agenda=lock.agenda,
desk=lock.desk1,
lock_code='1',
lock_expiration_datetime=now() + datetime.timedelta(minutes=5),
start_datetime=now(),
end_datetime=now() + datetime.timedelta(minutes=5),
)
Lease.objects.create(
agenda=lock.agenda,
desk=lock.desk2,
lock_code='2',
lock_expiration_datetime=now() + datetime.timedelta(minutes=5),
start_datetime=now(),
end_datetime=now() + datetime.timedelta(minutes=5),
)
Lease.objects.create(
resource=lock.resource,
lock_code='3',
lock_expiration_datetime=now() + datetime.timedelta(minutes=5),
start_datetime=now(),
end_datetime=now() + datetime.timedelta(minutes=5),
)
with pytest.raises(IntegrityError):
# prevent IntegrityError to break the current transaction
with transaction.atomic():
Lease.objects.create(
agenda=lock.agenda,
desk=lock.desk1,
lock_code='4',
lock_expiration_datetime=now() + datetime.timedelta(minutes=5),
# interval overlaps interval of first lock
start_datetime=now() + datetime.timedelta(minutes=4),
end_datetime=now() + datetime.timedelta(minutes=6),
)
def test_lock_constraint_resource(lock):
Lease.objects.create(
agenda=lock.agenda,
desk=lock.desk1,
lock_code='1',
lock_expiration_datetime=now() + datetime.timedelta(minutes=5),
start_datetime=now(),
end_datetime=now() + datetime.timedelta(minutes=5),
)
Lease.objects.create(
agenda=lock.agenda,
desk=lock.desk2,
lock_code='2',
lock_expiration_datetime=now() + datetime.timedelta(minutes=5),
start_datetime=now(),
end_datetime=now() + datetime.timedelta(minutes=5),
)
Lease.objects.create(
resource=lock.resource,
lock_code='3',
lock_expiration_datetime=now() + datetime.timedelta(minutes=5),
start_datetime=now(),
end_datetime=now() + datetime.timedelta(minutes=5),
)
with pytest.raises(IntegrityError):
# prevent IntegrityError to break the current transaction
with transaction.atomic():
Lease.objects.create(
resource=lock.resource,
lock_code='4',
lock_expiration_datetime=now() + datetime.timedelta(minutes=5),
# interval overlaps interval of first lock
start_datetime=now() + datetime.timedelta(minutes=4),
end_datetime=now() + datetime.timedelta(minutes=6),
)