misc: move tests (#86634)
This commit is contained in:
parent
84581ed02e
commit
e6db17f145
|
@ -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
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Reference in New Issue