chrono/tests/manager/test_check_type.py

255 lines
10 KiB
Python

import pytest
from django.utils.timezone import now
from chrono.agendas.models import Agenda, Booking, CheckType, CheckTypeGroup, Desk, Event
from tests.utils import login
pytestmark = pytest.mark.django_db
@pytest.fixture
def agenda_with_restrictions(manager_user):
agenda = Agenda(label='Foo Bar')
agenda.view_role = manager_user.groups.all()[0]
agenda.save()
return agenda
def test_list_types_as_manager(app, manager_user, agenda_with_restrictions):
app = login(app, username='manager', password='manager')
app.get('/manage/check-types/', status=403)
resp = app.get('/manage/')
assert 'Check types' not in resp.text
def test_add_group(app, admin_user):
app = login(app)
resp = app.get('/manage/')
resp = resp.click('Check types')
resp = resp.click('New group')
resp.form['label'] = 'Foo bar'
resp = resp.form.submit()
group = CheckTypeGroup.objects.latest('pk')
assert resp.location.endswith('/manage/check-types/')
assert group.label == 'Foo bar'
assert group.slug == 'foo-bar'
def test_add_group_as_manager(app, manager_user, agenda_with_restrictions):
app = login(app, username='manager', password='manager')
app.get('/manage/check-type/group/add/', status=403)
def test_edit_group(app, admin_user):
group = CheckTypeGroup.objects.create(label='Foo bar')
group2 = CheckTypeGroup.objects.create(label='baz')
app = login(app)
resp = app.get('/manage/check-types/')
resp = resp.click(href='/manage/check-type/group/%s/edit/' % group.pk)
resp.form['label'] = 'Foo bar baz'
resp.form['slug'] = group2.slug
resp = resp.form.submit()
assert resp.context['form'].errors['slug'] == ['Check type group with this Identifier already exists.']
resp.form['slug'] = 'baz2'
resp = resp.form.submit()
assert resp.location.endswith('/manage/check-types/')
group.refresh_from_db()
assert group.label == 'Foo bar baz'
assert group.slug == 'baz2'
def test_edit_group_as_manager(app, manager_user, agenda_with_restrictions):
group = CheckTypeGroup.objects.create(label='Foo bar')
app = login(app, username='manager', password='manager')
app.get('/manage/check-type/group/%s/edit/' % group.pk, status=403)
def test_delete_group(app, admin_user):
group = CheckTypeGroup.objects.create(label='Foo bar')
CheckType.objects.create(label='Foo reason', group=group)
agenda = Agenda.objects.create(label='Foo bar')
event = Event.objects.create(agenda=agenda, start_datetime=now(), places=10)
Booking.objects.create(event=event)
app = login(app)
resp = app.get('/manage/check-types/')
resp = resp.click(href='/manage/check-type/group/%s/delete/' % group.pk)
resp = resp.form.submit()
assert resp.location.endswith('/manage/check-types/')
assert CheckTypeGroup.objects.exists() is False
assert CheckType.objects.exists() is False
def test_delete_group_as_manager(app, manager_user, agenda_with_restrictions):
group = CheckTypeGroup.objects.create(label='Foo bar')
app = login(app, username='manager', password='manager')
app.get('/manage/check-type/group/%s/delete/' % group.pk, status=403)
def test_add_check_type(app, admin_user):
group = CheckTypeGroup.objects.create(label='Foo bar')
app = login(app)
resp = app.get('/manage/')
resp = resp.click('Check types')
resp = resp.click('Add a check type')
resp.form['label'] = 'Foo reason'
assert 'slug' not in resp.context['form'].fields
assert 'disabled' not in resp.context['form'].fields
resp = resp.form.submit()
check_type = CheckType.objects.latest('pk')
assert resp.location.endswith('/manage/check-types/')
assert check_type.label == 'Foo reason'
assert check_type.group == group
assert check_type.slug == 'foo-reason'
assert check_type.kind == 'absence'
resp = app.get('/manage/check-type/group/%s/add/' % group.pk)
resp.form['label'] = 'Foo reason'
resp.form['kind'] = 'presence'
resp = resp.form.submit()
assert resp.location.endswith('/manage/check-types/')
check_type = CheckType.objects.latest('pk')
assert check_type.label == 'Foo reason'
assert check_type.slug == 'foo-reason-1'
assert check_type.kind == 'presence'
def test_add_check_type_as_manager(app, manager_user, agenda_with_restrictions):
group = CheckTypeGroup.objects.create(label='Foo bar')
app = login(app, username='manager', password='manager')
app.get('/manage/check-type/group/%s/add/' % group.pk, status=403)
def test_edit_check_type(app, admin_user):
group = CheckTypeGroup.objects.create(label='Foo bar')
check_type = CheckType.objects.create(label='Foo reason', group=group, kind='presence')
check_type2 = CheckType.objects.create(label='Baz', group=group)
group2 = CheckTypeGroup.objects.create(label='Foo bar')
check_type3 = CheckType.objects.create(label='Foo bar reason', group=group2)
agenda = Agenda.objects.create(label='Foo bar')
event = Event.objects.create(agenda=agenda, start_datetime=now(), places=10)
Booking.objects.create(event=event)
app = login(app)
resp = app.get('/manage/check-types/')
resp = resp.click(href='/manage/check-type/group/%s/%s/edit/' % (group.pk, check_type.pk))
assert 'This check type is set on some existing bookings, modify it with caution.' not in resp
resp.form['label'] = 'Foo bar reason'
resp.form['slug'] = check_type2.slug
resp.form['disabled'] = True
assert 'kind' not in resp.context['form'].fields
resp = resp.form.submit()
assert resp.context['form'].errors['slug'] == ['Another check type exists with the same identifier.']
resp.form['slug'] = check_type3.slug
resp = resp.form.submit()
assert resp.location.endswith('/manage/check-types/')
check_type.refresh_from_db()
assert check_type.label == 'Foo bar reason'
assert check_type.slug == 'foo-bar-reason'
assert check_type.kind == 'presence'
assert check_type.disabled is True
# check_type is used
Booking.objects.update(user_check_type_slug=check_type.slug)
resp = app.get('/manage/check-type/group/%s/%s/edit/' % (group.pk, check_type.pk))
assert 'This check type is set on some existing bookings, modify it with caution.' in resp
app.get('/manage/check-type/group/%s/%s/edit/' % (group2.pk, check_type.pk), status=404)
def test_edit_check_type_as_manager(app, manager_user, agenda_with_restrictions):
group = CheckTypeGroup.objects.create(label='Foo bar')
check_type = CheckType.objects.create(label='Foo reason', group=group)
app = login(app, username='manager', password='manager')
app.get('/manage/check-type/group/%s/%s/edit/' % (group.pk, check_type.pk), status=403)
def test_delete_check_type(app, admin_user):
group = CheckTypeGroup.objects.create(label='Foo bar')
check_type = CheckType.objects.create(label='Foo reason', group=group)
agenda = Agenda.objects.create(label='Foo bar')
event = Event.objects.create(agenda=agenda, start_datetime=now(), places=10)
Booking.objects.create(event=event)
app = login(app)
resp = app.get('/manage/check-types/')
resp = resp.click(href='/manage/check-type/group/%s/%s/delete/' % (group.pk, check_type.pk))
resp = resp.form.submit()
assert resp.location.endswith('/manage/check-types/')
assert CheckTypeGroup.objects.exists() is True
assert CheckType.objects.exists() is False
# check_type is used
check_type = CheckType.objects.create(label='Foo reason', group=group)
Booking.objects.update(user_check_type_slug=check_type.slug)
resp = app.get('/manage/check-type/group/%s/%s/delete/' % (group.pk, check_type.pk))
assert 'Can not delete this check type: it is set on some existing bookings.' in resp
resp.form.submit(status=404)
group2 = CheckTypeGroup.objects.create(label='Foo bar baz')
app.get('/manage/check-type/group/%s/%s/delete/' % (group2.pk, check_type.pk), status=404)
def test_delete_check_type_as_manager(app, manager_user, agenda_with_restrictions):
group = CheckTypeGroup.objects.create(label='Foo bar')
check_type = CheckType.objects.create(label='Foo reason', group=group)
app = login(app, username='manager', password='manager')
app.get('/manage/check-type/group/%s/%s/delete/' % (group.pk, check_type.pk), status=403)
def test_meetings_agenda_group(app, admin_user):
agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
CheckTypeGroup.objects.create(label='Foo bar')
app = login(app)
resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
assert 'has_check_types' not in resp.context
# not for meetings agenda
app.get('/manage/agendas/%s/check-types' % agenda.pk, status=404)
def test_agenda_group(app, admin_user):
agenda = Agenda.objects.create(label='Foo bar', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
event = Event.objects.create(agenda=agenda, start_datetime=now(), places=10)
booking = Booking.objects.create(event=event)
app = login(app)
resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
assert 'has_check_types' in resp.context
assert resp.context['has_check_types'] is False
assert 'No check types configured for this agenda.' not in resp
assert '/manage/agendas/%s/check-types' % agenda.pk not in resp
resp = resp.click(href='/manage/agendas/%s/check-options' % agenda.pk)
assert 'check_type_group' not in resp.context['form'].fields
group = CheckTypeGroup.objects.create(label='Foo bar')
check_type = CheckType.objects.create(label='Foo reason', group=group)
resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
assert 'has_check_types' in resp.context
assert resp.context['has_check_types'] is True
assert 'No check types configured for this agenda.' in resp
resp = resp.click(href='/manage/agendas/%s/check-options' % agenda.pk)
resp.form['check_type_group'] = group.pk
resp = resp.form.submit().follow()
agenda.refresh_from_db()
assert agenda.check_type_group == group
assert 'Check type group: Foo bar' in resp
# cannot change check_type group booking with non null check_type exists
booking.user_check_type_slug = check_type.slug
booking.save()
resp = app.get('/manage/agendas/%s/check-options' % agenda.pk)
assert 'check_type_group' not in resp.context['form'].fields