134 lines
4.7 KiB
Python
134 lines
4.7 KiB
Python
import os
|
||
|
||
import pytest
|
||
import vobject
|
||
from httmock import HTTMock, with_httmock
|
||
|
||
from passerelle.apps.holidays.models import Holidays
|
||
|
||
from .test_manager import login
|
||
|
||
pytestmark = pytest.mark.django_db
|
||
|
||
with open(os.path.join(os.path.dirname(__file__), 'data/holidays/Zone-A.ics')) as fd:
|
||
RESPONSE_ZONE_A = fd.read()
|
||
|
||
with open(os.path.join(os.path.dirname(__file__), 'data/holidays/Zone-B.ics')) as fd:
|
||
RESPONSE_ZONE_B = fd.read()
|
||
|
||
|
||
def ics_data(url, request):
|
||
if url.path == '/openscol/fr-en-calendrier-scolaire/Zone-A.ics':
|
||
return {'content': RESPONSE_ZONE_A, 'request': request, 'status_code': 200}
|
||
if url.path == '/openscol/fr-en-calendrier-scolaire/Zone-B.ics':
|
||
return {'content': RESPONSE_ZONE_B, 'request': request, 'status_code': 200}
|
||
|
||
|
||
@with_httmock(ics_data)
|
||
def test_holidays_ics(app):
|
||
connector = Holidays.objects.create(slug='test', zone='a', holidays=[])
|
||
|
||
resp = app.get('/holidays/test/holidays.ics')
|
||
calendar = vobject.readOne(resp.text)
|
||
assert not 'vevent' in calendar.contents
|
||
|
||
connector.holidays.append('winter_holidays')
|
||
connector.save()
|
||
|
||
resp = app.get('/holidays/test/holidays.ics')
|
||
calendar = vobject.readOne(resp.text)
|
||
first_event = calendar.contents['vevent'][0]
|
||
assert first_event.uid.value == 'winter_holidays-2018'
|
||
assert first_event.summary.value == 'Vacances d’Hiver'
|
||
assert first_event.categories.value == ['winter_holidays']
|
||
assert str(first_event.dtstart.value) == '2018-02-10'
|
||
assert str(first_event.dtend.value) == '2018-02-26'
|
||
|
||
for i, event in enumerate(calendar.contents['vevent'][1:], start=2019):
|
||
assert event.uid.value == 'winter_holidays-%s' % i
|
||
assert event.summary.value == 'Vacances d’Hiver'
|
||
assert event.categories.value == ['winter_holidays']
|
||
|
||
connector.zone = 'b'
|
||
connector.save()
|
||
|
||
resp = app.get('/holidays/test/holidays.ics')
|
||
calendar = vobject.readOne(resp.text)
|
||
first_event = calendar.contents['vevent'][0]
|
||
assert first_event.uid.value == 'winter_holidays-2018'
|
||
assert str(first_event.dtstart.value) == '2018-02-24'
|
||
assert str(first_event.dtend.value) == '2018-03-12'
|
||
|
||
connector.holidays.append('summer_holidays')
|
||
connector.save()
|
||
|
||
resp = app.get('/holidays/test/holidays.ics')
|
||
calendar = vobject.readOne(resp.text)
|
||
assert calendar.contents['vevent'][0].uid.value == 'winter_holidays-2018'
|
||
first_summer_event = next(x for x in calendar.contents['vevent'] if x.uid.value.startswith('summer'))
|
||
assert first_summer_event.uid.value == 'summer_holidays-2018'
|
||
assert first_summer_event.summary.value == 'Vacances d’Été'
|
||
assert first_summer_event.categories.value == ['summer_holidays']
|
||
assert str(first_summer_event.dtstart.value) == '2018-07-07'
|
||
assert str(first_summer_event.dtend.value) == '2018-09-03'
|
||
|
||
connector.holidays = [
|
||
'winter_holidays',
|
||
'spring_holidays',
|
||
'summer_holidays',
|
||
'all_saints_holidays',
|
||
'christmas_holidays',
|
||
]
|
||
connector.save()
|
||
|
||
resp = app.get('/holidays/test/holidays.ics')
|
||
calendar = vobject.readOne(resp.text)
|
||
holiday_ids = {x.categories.value[0] for x in calendar.contents['vevent']}
|
||
assert all(holiday_id in holiday_ids for holiday_id in connector.holidays)
|
||
|
||
|
||
def test_holidays_ics_invalid_responses(app):
|
||
Holidays.objects.create(slug='test', zone='a', holidays=[])
|
||
|
||
def server_error(url, request):
|
||
return {'content': 'error', 'status_code': 500}
|
||
|
||
with HTTMock(server_error):
|
||
resp = app.get('/holidays/test/holidays.ics')
|
||
assert resp.json['err'] == 1
|
||
assert 'Error while getting ICS file' in resp.json['err_desc']
|
||
|
||
def invalid_file(url, request):
|
||
return {'content': 'invalid', 'status_code': 200}
|
||
|
||
with HTTMock(invalid_file):
|
||
resp = app.get('/holidays/test/holidays.ics')
|
||
assert resp.json['err'] == 1
|
||
assert 'Invalid ICS file' in resp.json['err_desc']
|
||
|
||
def empty_file(url, request):
|
||
return {
|
||
'content': 'BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//PYVOBJECT//NONSGML Version 1//EN\r\nEND:VCALENDAR\r\n',
|
||
'status_code': 200,
|
||
}
|
||
|
||
with HTTMock(empty_file):
|
||
resp = app.get('/holidays/test/holidays.ics')
|
||
assert resp.json['err'] == 1
|
||
assert 'ICS file does not contain events' in resp.json['err_desc']
|
||
|
||
|
||
def test_holidays_manager(app, admin_user):
|
||
login(app)
|
||
|
||
resp = app.get('/manage/holidays/add')
|
||
resp.form['title'] = 'Holidays'
|
||
resp.form['slug'] = 'test'
|
||
resp.form['description'] = 'test'
|
||
resp.form['zone'] = 'c'
|
||
resp.form['holidays'] = ['summer_holidays', 'christmas_holidays']
|
||
|
||
resp = resp.form.submit().follow()
|
||
assert 'Holidays: Vacances d’Été, Vacances de Noël' in resp.text
|
||
assert 'Zone: C' in resp.text
|