chrono/tests/api/test_shared_custody.py

244 lines
9.2 KiB
Python

import pytest
from django.core.files.base import ContentFile
from chrono.agendas.models import Person, SharedCustodyAgenda, UnavailabilityCalendar
pytestmark = pytest.mark.django_db
with open('tests/data/holidays.ics') as f:
ICS_HOLIDAYS = f.read()
def test_add_shared_custody_agenda(app, user, settings):
app.authorization = ('Basic', ('john.doe', 'password'))
params = {
'guardian_first_name': 'John',
'guardian_last_name': 'Doe',
'guardian_id': 'xxx',
'other_guardian_first_name': 'Jane',
'other_guardian_last_name': 'Doe',
'other_guardian_id': 'yyy',
'children': [
{
'first_name': 'James',
'last_name': 'Doe',
'user_external_id': 'zzz',
},
{
'first_name': 'Arthur',
'last_name': 'Doe',
'user_external_id': '123',
},
],
}
resp = app.post_json('/api/shared-custody/', params=params)
first_guardian = Person.objects.get(user_external_id='xxx', first_name='John', last_name='Doe')
second_guardian = Person.objects.get(user_external_id='yyy', first_name='Jane', last_name='Doe')
first_chidren = Person.objects.get(user_external_id='zzz', first_name='James', last_name='Doe')
second_children = Person.objects.get(user_external_id='123', first_name='Arthur', last_name='Doe')
agenda = SharedCustodyAgenda.objects.get()
assert agenda.first_guardian == first_guardian
assert agenda.second_guardian == second_guardian
assert set(agenda.children.all()) == {first_chidren, second_children}
assert resp.json['data'] == {
'id': agenda.pk,
'settings_url': 'http://testserver/manage/shared-custody/%s/settings/' % agenda.pk,
'backoffice_url': 'http://testserver/manage/shared-custody/%s/' % agenda.pk,
}
params = {
'guardian_first_name': 'John',
'guardian_last_name': 'Doe',
'guardian_id': 'xxx',
'other_guardian_first_name': 'Other',
'other_guardian_last_name': 'Doe',
'other_guardian_id': 'other',
'children': [
{
'first_name': 'Bruce',
'last_name': 'Doe',
'user_external_id': 'bruce',
},
],
}
resp = app.post_json('/api/shared-custody/', params=params)
assert resp.json['data']['id'] != agenda.pk
assert SharedCustodyAgenda.objects.filter(first_guardian=first_guardian).count() == 2
def test_add_shared_custody_agenda_with_rules(app, user, settings):
app.authorization = ('Basic', ('john.doe', 'password'))
# configure holidays
unavailability_calendar = UnavailabilityCalendar.objects.create(label='Calendar', slug='chrono-holidays')
source = unavailability_calendar.timeperiodexceptionsource_set.create(
ics_filename='holidays.ics', ics_file=ContentFile(ICS_HOLIDAYS, name='holidays.ics')
)
source.refresh_timeperiod_exceptions_from_ics()
params = {
'guardian_first_name': 'John',
'guardian_last_name': 'Doe',
'guardian_id': 'xxx',
'other_guardian_first_name': 'Jane',
'other_guardian_last_name': 'Doe',
'other_guardian_id': 'yyy',
'children': [
{
'first_name': 'James',
'last_name': 'Doe',
'user_external_id': 'zzz',
},
],
}
resp = app.post_json('/api/shared-custody/', params={'weeks': '', **params})
agenda = SharedCustodyAgenda.objects.get(pk=resp.json['data']['id'])
assert not agenda.is_complete()
assert not agenda.rules.exists()
resp = app.post_json('/api/shared-custody/', params={'weeks': 'even', **params})
agenda = SharedCustodyAgenda.objects.get(pk=resp.json['data']['id'])
assert agenda.is_complete()
assert agenda.rules.filter(guardian__first_name='John', weeks='even').exists()
assert agenda.rules.filter(guardian__first_name='Jane', weeks='odd').exists()
resp = app.post_json('/api/shared-custody/', params={'weeks': 'odd', **params})
agenda = SharedCustodyAgenda.objects.get(pk=resp.json['data']['id'])
assert agenda.is_complete()
assert agenda.rules.filter(guardian__first_name='John', weeks='odd').exists()
assert agenda.rules.filter(guardian__first_name='Jane', weeks='even').exists()
resp = app.post_json(
'/api/shared-custody/', params={'christmas_holidays:periodicity': 'first-half', **params}
)
agenda = SharedCustodyAgenda.objects.get(pk=resp.json['data']['id'])
assert agenda.holiday_rules.filter(
guardian__first_name='John', holiday__slug='christmas_holidays', periodicity='first-half', years=''
).exists()
assert agenda.holiday_rules.filter(
guardian__first_name='Jane', holiday__slug='christmas_holidays', periodicity='second-half', years=''
).exists()
assert agenda.periods.count() == 12
resp = app.post_json(
'/api/shared-custody/',
params={
'summer_holidays:periodicity': 'first-and-third-quarters',
'summer_holidays:years': 'odd',
**params,
},
)
agenda = SharedCustodyAgenda.objects.get(pk=resp.json['data']['id'])
assert agenda.holiday_rules.filter(
guardian__first_name='John',
holiday__slug='summer_holidays',
periodicity='first-and-third-quarters',
years='odd',
).exists()
assert agenda.holiday_rules.filter(
guardian__first_name='John',
holiday__slug='summer_holidays',
periodicity='second-and-fourth-quarters',
years='even',
).exists()
assert agenda.holiday_rules.filter(
guardian__first_name='Jane',
holiday__slug='summer_holidays',
periodicity='first-and-third-quarters',
years='even',
).exists()
assert agenda.holiday_rules.filter(
guardian__first_name='Jane',
holiday__slug='summer_holidays',
periodicity='second-and-fourth-quarters',
years='odd',
).exists()
assert agenda.periods.count() == 20
# unknown holiday
resp = app.post_json(
'/api/shared-custody/', params={'unknown:periodicity': 'first-half', **params}, status=400
)
assert resp.json['errors']['non_field_errors'][0] == 'Unknown holiday: unknown'
# unknown holiday param
resp = app.post_json(
'/api/shared-custody/', params={'summer_holidays:unknown': 'first-half', **params}, status=400
)
assert (
resp.json['errors']['non_field_errors'][0] == 'Unknown parameter for holiday summer_holidays: unknown'
)
# years without periodicity
resp = app.post_json(
'/api/shared-custody/', params={'summer_holidays:years': 'even', **params}, status=400
)
assert resp.json['errors']['non_field_errors'][0] == 'Missing periodicity for holiday: summer_holidays'
# quarters with short holiday
resp = app.post_json(
'/api/shared-custody/',
params={'christmas_holidays:periodicity': 'first-and-third-quarters', **params},
status=400,
)
assert resp.json['errors']['non_field_errors'][0] == 'Short holidays cannot be cut into quarters.'
def test_shared_custody_agenda_add_child(app, user, settings):
father = Person.objects.create(user_external_id='father_id', first_name='John', last_name='Doe')
mother = Person.objects.create(user_external_id='mother_id', first_name='Jane', last_name='Doe')
agenda = SharedCustodyAgenda.objects.create(first_guardian=father, second_guardian=mother)
app.authorization = ('Basic', ('john.doe', 'password'))
params = {
'first_name': 'James',
'last_name': 'Doe',
'user_external_id': 'xxx',
}
resp = app.post_json('/api/shared-custody/%s/add-child/' % agenda.pk, params=params)
child = Person.objects.get(first_name='James', last_name='Doe', user_external_id='xxx')
assert resp.json['data']['child_id'] == child.pk
assert agenda.children.count() == 1
assert Person.objects.count() == 3
# adding again throws error
resp = app.post_json('/api/shared-custody/%s/add-child/' % agenda.pk, params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'This child already has one custody agenda.'
assert agenda.children.count() == 1
assert Person.objects.count() == 3
params = {
'first_name': 'Jack',
'last_name': 'Doe',
'user_external_id': 'yyy',
}
resp = app.post_json('/api/shared-custody/%s/add-child/' % agenda.pk, params=params)
child = Person.objects.get(first_name='Jack', last_name='Doe', user_external_id='yyy')
assert resp.json['data']['child_id'] == child.pk
assert agenda.children.count() == 2
assert Person.objects.count() == 4
other_father = Person.objects.create(
user_external_id='other_father_id', first_name='John', last_name='Doe'
)
other_mother = Person.objects.create(
user_external_id='other_mother_id', first_name='Jane', last_name='Doe'
)
other_agenda = SharedCustodyAgenda.objects.create(
first_guardian=other_father, second_guardian=other_mother
)
resp = app.post_json('/api/shared-custody/%s/add-child/' % other_agenda.pk, params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'This child already has one custody agenda.'