passerelle/tests/test_holidays.py

134 lines
4.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 dHiver'
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 dHiver'
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