import codecs import datetime from unittest import mock import pytest import requests from django.core.management import call_command from django.db import connection from django.test.utils import CaptureQueriesContext from django.utils.timezone import localtime, make_aware, now from webtest import Upload from chrono.agendas.models import Agenda, Booking, Desk, Event, EventsType, Subscription from chrono.utils.lingo import CheckType from tests.utils import login pytestmark = pytest.mark.django_db def test_add_event(app, admin_user): events_type = EventsType.objects.create( label='Foo', custom_fields=[{'varname': 'foo', 'label': 'Foo', 'field_type': 'text'}] ) agenda = Agenda.objects.create(label='Foo bar', maximal_booking_delay=0, events_type=events_type) Desk.objects.create(agenda=agenda, slug='_exceptions_holder') app = login(app) resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200) assert "This agenda doesn't have any event yet." in resp.text year = now().year + 1 resp = resp.click('New Event') assert 'custom_field_foo' not in resp.context['form'].fields resp.form['start_datetime_0'] = '%s-02-15' % year resp.form['start_datetime_1'] = '17:00' resp.form['places'] = 10 resp = resp.form.submit() resp = resp.follow() event = Event.objects.get(places=10) assert event.publication_datetime is None assert "This agenda doesn't have any event yet." not in resp.text assert '/manage/agendas/%s/events/%s/' % (agenda.id, event.id) in resp.text assert ('Feb. 15, %s, 5 p.m.' % year) in resp.text resp_datetimes = app.get('/api/agenda/%s/datetimes/' % agenda.id) assert resp_datetimes.json['data'][0]['text'] == 'Feb. 15, %s, 5 p.m.' % year assert resp_datetimes.json['data'][0]['datetime'] == '%s-02-15 17:00:00' % year # add with errors in datetime parts for parts in ( ('', ''), ('invalid', ''), ('', 'invalid'), ('2019-02-24', 'invalid'), ('invalid', '17:00'), ): resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200) resp = resp.click('New Event') resp.form['start_datetime_0'] = parts[0] resp.form['start_datetime_1'] = parts[1] resp.form['places'] = 10 resp = resp.form.submit() assert ( resp.text.count('Enter a valid date') or resp.text.count('Enter a valid time') == 1 or resp.text.count('This field is required.') >= 1 ) @pytest.mark.freeze_time('2021-05-06 14:00') def test_add_recurring_event(app, admin_user): agenda = Agenda.objects.create(label='Foo bar', kind='events') Desk.objects.create(agenda=agenda, slug='_exceptions_holder') app = login(app) resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200) resp = resp.click('New Event') resp.form['start_datetime_0'] = '2021-06-01' resp.form['start_datetime_1'] = '17:00' resp.form['places'] = 10 resp.form['frequency'] = 'unique' # not a recurring event resp.form['recurrence_days'] = [1] resp.form.submit().follow() event = Event.objects.get() assert event.recurrence_days is None event.delete() # add recurring event resp.form['frequency'] = 'recurring' resp.form.submit().follow() event = Event.objects.get(primary_event__isnull=True) assert event.recurrence_days == [1] assert Event.objects.filter(primary_event=event).count() == 49 event.delete() # add recurring event with end date resp.form['recurrence_end_date'] = '2021-07-01' resp.form.submit().follow() event = Event.objects.get(primary_event__isnull=True) assert event.recurrence_days == [1] assert Event.objects.filter(primary_event=event).count() == 5 # add recurring event with end date in a very long time resp.form['recurrence_end_date'] = '2030-01-01' resp = resp.form.submit() assert 'Recurrence end date cannot be more than 3 years from now' in resp.text def test_add_event_on_missing_agenda(app, admin_user): app = login(app) app.get('/manage/agendas/%s/add-event' % '0', status=404) def test_add_event_as_manager(app, manager_user): agenda = Agenda(label='Foo bar') agenda.view_role = manager_user.groups.all()[0] agenda.save() Desk.objects.create(agenda=agenda, slug='_exceptions_holder') app = login(app, username='manager', password='manager') resp = app.get('/manage/agendas/%s/' % agenda.id, status=302) app.get('/manage/agendas/%s/add-event' % agenda.id, status=403) agenda.edit_role = manager_user.groups.all()[0] agenda.save() resp = app.get('/manage/agendas/%s/settings' % agenda.pk) assert '