misc: move tests (#86634)

This commit is contained in:
Lauréline Guérin 2024-02-21 18:11:34 +01:00
parent 84581ed02e
commit e6db17f145
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 180 additions and 176 deletions

View File

@ -1434,179 +1434,3 @@ def test_recurring_events_exceptions_report(settings, app, admin_user, freezer):
resp = app.get('/manage/agendas/%s/settings' % agenda.id)
assert 'warningnotice' not in resp.text
def test_unavailability_calendar_import_time_period_exception_from_ics(app, admin_user):
calendar = UnavailabilityCalendar.objects.create(label='Example')
login(app)
resp = app.get('/manage/unavailability-calendar/%d/settings' % calendar.pk)
assert 'Manage unavailabilities from ICS' in resp.text
resp = resp.click('Manage unavailabilities')
assert 'To add new exceptions, you can upload a file or specify an address to a remote calendar.' in resp
resp = resp.form.submit(status=200)
assert 'Please provide an ICS File or an URL.' in resp.text
assert TimePeriodExceptionSource.objects.filter(unavailability_calendar=calendar).count() == 0
resp.form['ics_file'] = Upload('exceptions.ics', b'invalid content', 'text/calendar')
resp = resp.form.submit(status=200)
assert 'File format is invalid' in resp.text
assert TimePeriodExceptionSource.objects.filter(unavailability_calendar=calendar).count() == 0
ics_with_exceptions = b"""BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//foo.bar//EN
BEGIN:VEVENT
DTSTART:20180101
DTEND:20180101
SUMMARY:New Year's Eve
END:VEVENT
END:VCALENDAR"""
resp = app.get('/manage/unavailability-calendar/%s/import-unavailabilities/' % calendar.pk)
resp.form['ics_file'] = Upload('exceptions.ics', ics_with_exceptions, 'text/calendar')
resp = resp.form.submit(status=302)
assert TimePeriodException.objects.filter(unavailability_calendar=calendar).count() == 1
assert TimePeriodExceptionSource.objects.filter(unavailability_calendar=calendar).count() == 1
source = calendar.timeperiodexceptionsource_set.get()
exception = calendar.timeperiodexception_set.get()
assert exception.source == source
assert source.ics_filename == 'exceptions.ics'
assert 'exceptions.ics' in source.ics_file.name
assert source.ics_url is None
resp = resp.follow()
assert 'Exceptions will be imported in a few minutes.' in resp.text
@mock.patch('chrono.agendas.models.requests.get')
def test_unavailability_calendar_import_time_period_exception_with_remote_ics(mocked_get, app, admin_user):
calendar = UnavailabilityCalendar.objects.create(label='Example')
login(app)
resp = app.get('/manage/unavailability-calendar/%s/import-unavailabilities/' % calendar.pk)
assert 'ics_file' in resp.form.fields
assert 'ics_url' in resp.form.fields
resp.form['ics_url'] = 'http://example.com/foo.ics'
mocked_response = mock.Mock()
mocked_response.text = """BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//foo.bar//EN
BEGIN:VEVENT
DTSTART:20180101
DTEND:20180101
SUMMARY:New Year's Eve
END:VEVENT
END:VCALENDAR"""
mocked_get.return_value = mocked_response
resp = resp.form.submit(status=302)
assert TimePeriodException.objects.filter(unavailability_calendar=calendar).count() == 1
assert TimePeriodExceptionSource.objects.filter(unavailability_calendar=calendar).count() == 1
source = calendar.timeperiodexceptionsource_set.get()
exception = calendar.timeperiodexception_set.get()
assert exception.source == source
assert source.ics_filename is None
assert source.ics_file.name == ''
assert source.ics_url == 'http://example.com/foo.ics'
def test_unavailability_calendar_delete_time_period_exception_source(app, admin_user):
calendar = UnavailabilityCalendar.objects.create(label='Example')
source1 = TimePeriodExceptionSource.objects.create(
unavailability_calendar=calendar, ics_url='https://example.com/test.ics'
)
TimePeriodException.objects.create(
unavailability_calendar=calendar,
source=source1,
start_datetime=now() - datetime.timedelta(days=1),
end_datetime=now() + datetime.timedelta(days=1),
)
source2 = TimePeriodExceptionSource.objects.create(
unavailability_calendar=calendar, ics_url='https://example.com/test.ics'
)
TimePeriodException.objects.create(
unavailability_calendar=calendar,
source=source2,
start_datetime=now() - datetime.timedelta(days=1),
end_datetime=now() + datetime.timedelta(days=1),
)
login(app)
resp = app.get('/manage/time-period-exceptions-source/%d/delete' % source2.pk)
resp = resp.form.submit()
assert TimePeriodException.objects.count() == 1
assert TimePeriodExceptionSource.objects.count() == 1
assert source1.timeperiodexception_set.count() == 1
assert TimePeriodExceptionSource.objects.filter(pk=source2.pk).exists() is False
def test_unavailability_calendar_replace_time_period_exception_source(app, admin_user, freezer):
freezer.move_to('2019-12-01')
calendar = UnavailabilityCalendar.objects.create(label='Example')
ics_file_content = b"""BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//foo.bar//EN
BEGIN:VEVENT
DTSTART:20180101
DTEND:20180101
SUMMARY:New Year's Eve
RRULE:FREQ=YEARLY
END:VEVENT
END:VCALENDAR"""
login(app)
# import a source from a file
resp = app.get('/manage/unavailability-calendar/%s/import-unavailabilities/' % calendar.pk)
resp.form['ics_file'] = Upload('exceptions.ics', ics_file_content, 'text/calendar')
resp = resp.form.submit(status=302).follow()
assert TimePeriodException.objects.filter(unavailability_calendar=calendar).count() == 2
source = TimePeriodExceptionSource.objects.latest('pk')
assert source.timeperiodexception_set.count() == 2
exceptions = list(source.timeperiodexception_set.order_by('pk'))
old_ics_file_path = source.ics_file.path
# replace the source
resp = app.get('/manage/time-period-exceptions-source/%d/replace' % source.pk)
resp.form['ics_newfile'] = Upload('exceptions-bis.ics', ics_file_content, 'text/calendar')
resp = resp.form.submit().follow()
source.refresh_from_db()
assert source.ics_file.path != old_ics_file_path
assert source.ics_filename == 'exceptions-bis.ics'
assert os.path.exists(old_ics_file_path) is False
assert TimePeriodException.objects.count() == 2
assert source.timeperiodexception_set.count() == 2
new_exceptions = list(source.timeperiodexception_set.order_by('pk'))
assert exceptions[0].pk != new_exceptions[0].pk
assert exceptions[1].pk != new_exceptions[1].pk
@mock.patch('chrono.agendas.models.requests.get')
def test_unavailability_calendar_refresh_time_period_exception_source(mocked_get, app, admin_user):
mocked_response = mock.Mock()
mocked_response.text = """BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//foo.bar//EN
BEGIN:VEVENT
DTSTART:20180101
DTEND:20180101
SUMMARY:New Year's Eve
END:VEVENT
END:VCALENDAR"""
mocked_get.return_value = mocked_response
calendar = UnavailabilityCalendar.objects.create(label='Example')
login(app)
# import a source from an url
resp = app.get('/manage/unavailability-calendar/%d/settings' % calendar.pk)
resp = resp.click('Manage unavailabilities')
resp.form['ics_url'] = 'http://example.com/foo.ics'
resp = resp.form.submit(status=302).follow()
assert TimePeriodException.objects.filter(unavailability_calendar=calendar).count() == 1
source = TimePeriodExceptionSource.objects.latest('pk')
assert source.timeperiodexception_set.count() == 1
exceptions = list(source.timeperiodexception_set.order_by('pk'))
# refresh the source
resp = app.get('/manage/unavailability-calendar/%d/settings' % calendar.pk)
resp = resp.click('Manage unavailabilities')
resp = resp.click(href='/manage/time-period-exceptions-source/%d/refresh' % source.pk)
assert TimePeriodException.objects.count() == 1
new_exceptions = list(source.timeperiodexception_set.order_by('pk'))
assert exceptions[0].pk != new_exceptions[0].pk

View File

@ -1,6 +1,9 @@
import datetime
import os
from unittest import mock
import pytest
from webtest import Upload
from chrono.agendas.models import (
Agenda,
@ -9,6 +12,7 @@ from chrono.agendas.models import (
Event,
MeetingType,
TimePeriodException,
TimePeriodExceptionSource,
UnavailabilityCalendar,
)
from chrono.utils.timezone import localtime, make_aware, now
@ -193,6 +197,182 @@ def test_unavailability_calendar_delete_time_period_exceptions(app, admin_user):
assert unavailability_calendar.timeperiodexception_set.count() == 0
def test_unavailability_calendar_import_time_period_exception_from_ics(app, admin_user):
calendar = UnavailabilityCalendar.objects.create(label='Example')
login(app)
resp = app.get('/manage/unavailability-calendar/%d/settings' % calendar.pk)
assert 'Manage unavailabilities from ICS' in resp.text
resp = resp.click('Manage unavailabilities')
assert 'To add new exceptions, you can upload a file or specify an address to a remote calendar.' in resp
resp = resp.form.submit(status=200)
assert 'Please provide an ICS File or an URL.' in resp.text
assert TimePeriodExceptionSource.objects.filter(unavailability_calendar=calendar).count() == 0
resp.form['ics_file'] = Upload('exceptions.ics', b'invalid content', 'text/calendar')
resp = resp.form.submit(status=200)
assert 'File format is invalid' in resp.text
assert TimePeriodExceptionSource.objects.filter(unavailability_calendar=calendar).count() == 0
ics_with_exceptions = b"""BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//foo.bar//EN
BEGIN:VEVENT
DTSTART:20180101
DTEND:20180101
SUMMARY:New Year's Eve
END:VEVENT
END:VCALENDAR"""
resp = app.get('/manage/unavailability-calendar/%s/import-unavailabilities/' % calendar.pk)
resp.form['ics_file'] = Upload('exceptions.ics', ics_with_exceptions, 'text/calendar')
resp = resp.form.submit(status=302)
assert TimePeriodException.objects.filter(unavailability_calendar=calendar).count() == 1
assert TimePeriodExceptionSource.objects.filter(unavailability_calendar=calendar).count() == 1
source = calendar.timeperiodexceptionsource_set.get()
exception = calendar.timeperiodexception_set.get()
assert exception.source == source
assert source.ics_filename == 'exceptions.ics'
assert 'exceptions.ics' in source.ics_file.name
assert source.ics_url is None
resp = resp.follow()
assert 'Exceptions will be imported in a few minutes.' in resp.text
@mock.patch('chrono.agendas.models.requests.get')
def test_unavailability_calendar_import_time_period_exception_with_remote_ics(mocked_get, app, admin_user):
calendar = UnavailabilityCalendar.objects.create(label='Example')
login(app)
resp = app.get('/manage/unavailability-calendar/%s/import-unavailabilities/' % calendar.pk)
assert 'ics_file' in resp.form.fields
assert 'ics_url' in resp.form.fields
resp.form['ics_url'] = 'http://example.com/foo.ics'
mocked_response = mock.Mock()
mocked_response.text = """BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//foo.bar//EN
BEGIN:VEVENT
DTSTART:20180101
DTEND:20180101
SUMMARY:New Year's Eve
END:VEVENT
END:VCALENDAR"""
mocked_get.return_value = mocked_response
resp = resp.form.submit(status=302)
assert TimePeriodException.objects.filter(unavailability_calendar=calendar).count() == 1
assert TimePeriodExceptionSource.objects.filter(unavailability_calendar=calendar).count() == 1
source = calendar.timeperiodexceptionsource_set.get()
exception = calendar.timeperiodexception_set.get()
assert exception.source == source
assert source.ics_filename is None
assert source.ics_file.name == ''
assert source.ics_url == 'http://example.com/foo.ics'
def test_unavailability_calendar_delete_time_period_exception_source(app, admin_user):
calendar = UnavailabilityCalendar.objects.create(label='Example')
source1 = TimePeriodExceptionSource.objects.create(
unavailability_calendar=calendar, ics_url='https://example.com/test.ics'
)
TimePeriodException.objects.create(
unavailability_calendar=calendar,
source=source1,
start_datetime=now() - datetime.timedelta(days=1),
end_datetime=now() + datetime.timedelta(days=1),
)
source2 = TimePeriodExceptionSource.objects.create(
unavailability_calendar=calendar, ics_url='https://example.com/test.ics'
)
TimePeriodException.objects.create(
unavailability_calendar=calendar,
source=source2,
start_datetime=now() - datetime.timedelta(days=1),
end_datetime=now() + datetime.timedelta(days=1),
)
login(app)
resp = app.get('/manage/time-period-exceptions-source/%d/delete' % source2.pk)
resp = resp.form.submit()
assert TimePeriodException.objects.count() == 1
assert TimePeriodExceptionSource.objects.count() == 1
assert source1.timeperiodexception_set.count() == 1
assert TimePeriodExceptionSource.objects.filter(pk=source2.pk).exists() is False
def test_unavailability_calendar_replace_time_period_exception_source(app, admin_user, freezer):
freezer.move_to('2019-12-01')
calendar = UnavailabilityCalendar.objects.create(label='Example')
ics_file_content = b"""BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//foo.bar//EN
BEGIN:VEVENT
DTSTART:20180101
DTEND:20180101
SUMMARY:New Year's Eve
RRULE:FREQ=YEARLY
END:VEVENT
END:VCALENDAR"""
login(app)
# import a source from a file
resp = app.get('/manage/unavailability-calendar/%s/import-unavailabilities/' % calendar.pk)
resp.form['ics_file'] = Upload('exceptions.ics', ics_file_content, 'text/calendar')
resp = resp.form.submit(status=302).follow()
assert TimePeriodException.objects.filter(unavailability_calendar=calendar).count() == 2
source = TimePeriodExceptionSource.objects.latest('pk')
assert source.timeperiodexception_set.count() == 2
exceptions = list(source.timeperiodexception_set.order_by('pk'))
old_ics_file_path = source.ics_file.path
# replace the source
resp = app.get('/manage/time-period-exceptions-source/%d/replace' % source.pk)
resp.form['ics_newfile'] = Upload('exceptions-bis.ics', ics_file_content, 'text/calendar')
resp = resp.form.submit().follow()
source.refresh_from_db()
assert source.ics_file.path != old_ics_file_path
assert source.ics_filename == 'exceptions-bis.ics'
assert os.path.exists(old_ics_file_path) is False
assert TimePeriodException.objects.count() == 2
assert source.timeperiodexception_set.count() == 2
new_exceptions = list(source.timeperiodexception_set.order_by('pk'))
assert exceptions[0].pk != new_exceptions[0].pk
assert exceptions[1].pk != new_exceptions[1].pk
@mock.patch('chrono.agendas.models.requests.get')
def test_unavailability_calendar_refresh_time_period_exception_source(mocked_get, app, admin_user):
mocked_response = mock.Mock()
mocked_response.text = """BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//foo.bar//EN
BEGIN:VEVENT
DTSTART:20180101
DTEND:20180101
SUMMARY:New Year's Eve
END:VEVENT
END:VCALENDAR"""
mocked_get.return_value = mocked_response
calendar = UnavailabilityCalendar.objects.create(label='Example')
login(app)
# import a source from an url
resp = app.get('/manage/unavailability-calendar/%d/settings' % calendar.pk)
resp = resp.click('Manage unavailabilities')
resp.form['ics_url'] = 'http://example.com/foo.ics'
resp = resp.form.submit(status=302).follow()
assert TimePeriodException.objects.filter(unavailability_calendar=calendar).count() == 1
source = TimePeriodExceptionSource.objects.latest('pk')
assert source.timeperiodexception_set.count() == 1
exceptions = list(source.timeperiodexception_set.order_by('pk'))
# refresh the source
resp = app.get('/manage/unavailability-calendar/%d/settings' % calendar.pk)
resp = resp.click('Manage unavailabilities')
resp = resp.click(href='/manage/time-period-exceptions-source/%d/refresh' % source.pk)
assert TimePeriodException.objects.count() == 1
new_exceptions = list(source.timeperiodexception_set.order_by('pk'))
assert exceptions[0].pk != new_exceptions[0].pk
def test_unavailability_calendar_in_desk(app, admin_user):
app = login(app)
unavailability_calendar = UnavailabilityCalendar.objects.create(label='Calendar')