chrono/tests/test_data_migrations.py

94 lines
3.5 KiB
Python

import datetime
import pytest
import django
from django.db import connection
from django.db.migrations.executor import MigrationExecutor
from django.utils.timezone import make_aware
from chrono.agendas.models import MeetingType
pytestmark = pytest.mark.django_db
def test_meeting_type_slug_migration():
if connection.vendor == 'sqlite' and django.VERSION > (1, 11, 0):
pytest.skip('SQLite schema editor cannot be used while foreign key constraint checks are enabled.')
return
executor = MigrationExecutor(connection)
migrate_from = [('agendas', '0011_meetingtype_slug')]
migrate_to = [('agendas', '0013_auto_20161028_1603')]
executor.migrate(migrate_from)
executor.loader.build_graph()
old_apps = executor.loader.project_state(migrate_from).apps
OldAgenda = old_apps.get_model('agendas', 'Agenda')
OldMeetingType = old_apps.get_model('agendas', 'MeetingType')
agenda = OldAgenda(label=u'Foo bar')
agenda.save()
meeting_type = OldMeetingType(agenda=agenda, label=u'Baz')
meeting_type.save()
executor.migrate(migrate_to)
assert MeetingType.objects.get(id=meeting_type.id).slug == 'baz'
def test_timeperiod_data_migrations():
if connection.vendor == 'sqlite' and django.VERSION > (1, 11, 0):
pytest.skip('SQLite schema editor cannot be used while foreign key constraint checks are enabled.')
return
executor = MigrationExecutor(connection)
app = 'agendas'
migrate_from = [(app, '0016_desk')]
migrate_to = [(app, '0018_event_desk')]
executor.migrate(migrate_from)
old_apps = executor.loader.project_state(migrate_from).apps
Agenda = old_apps.get_model(app, 'Agenda')
MeetingType = old_apps.get_model(app, 'MeetingType')
TimePeriod = old_apps.get_model(app, 'TimePeriod')
Event = old_apps.get_model(app, 'Event')
agenda = Agenda.objects.create(label='foo', slug='foo', kind='meetings')
agenda2 = Agenda.objects.create(label='bar', slug='bar', kind='events')
TimePeriod.objects.create(
agenda=agenda, weekday=1, start_time=datetime.time(8, 0), end_time=datetime.time(12, 0)
)
TimePeriod.objects.create(
agenda=agenda, weekday=2, start_time=datetime.time(8, 0), end_time=datetime.time(10, 0)
)
TimePeriod.objects.create(
agenda=agenda, weekday=3, start_time=datetime.time(9, 0), end_time=datetime.time(12, 0)
)
meeting_type = MeetingType.objects.create(agenda=agenda, label='foo', slug='foo', duration=60)
Event.objects.create(
agenda=agenda,
places=1,
meeting_type=meeting_type,
start_datetime=make_aware(datetime.datetime(2017, 5, 22, 9, 30)),
)
Event.objects.create(
agenda=agenda,
places=1,
meeting_type=meeting_type,
start_datetime=make_aware(datetime.datetime(2017, 5, 22, 10, 0)),
)
Event.objects.create(
agenda=agenda2, places=5, start_datetime=make_aware(datetime.datetime(2017, 5, 22, 10, 0))
)
executor.loader.build_graph()
executor.migrate(migrate_to)
new_apps = executor.loader.project_state(migrate_to).apps
Agenda = new_apps.get_model(app, 'Agenda')
agenda = Agenda.objects.get(slug='foo')
TimePeriod = new_apps.get_model(app, 'TimePeriod')
for time_period in TimePeriod.objects.all():
assert time_period.desk.label == 'Guichet 1'
assert time_period.desk.slug == 'guichet-1'
Event = new_apps.get_model(app, 'Event')
for event in Event.objects.filter(agenda=agenda):
assert event.desk.label == 'Guichet 1'
assert event.desk.slug == 'guichet-1'