103 lines
3.4 KiB
Python
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),
|
|
)
|