from django.contrib.auth.models import User from django.contrib.sites.models import Site from django.urls import reverse from django.test import TestCase from django.utils import timezone from django.contrib import messages from datetime import datetime, timedelta from xml.etree import ElementTree as ET from icalendar import Calendar import pytz from .models import * from .forms import VolunteerForm class VolunteersTests(TestCase): def setUp(self): site = Site.objects.first() conf = site.conference conf.name = 'PonyConf' conf.save() a, b, c = (User.objects.create_user(guy, email='%s@example.org' % guy, password=guy) for guy in 'abc') Volunteer.objects.create(site=site, name='A', email=a.email) Activity.objects.create(site=site, name='Everythings') c.is_superuser = True c.save() def test_enrollment_is_open(self): conf = Conference.objects.first() self.assertFalse(conf.volunteers_enrollment_is_open()) conf.volunteers_opening_date = timezone.now() + timedelta(hours=1) self.assertFalse(conf.volunteers_enrollment_is_open()) conf.volunteers_opening_date = timezone.now() - timedelta(hours=1) self.assertTrue(conf.volunteers_enrollment_is_open()) conf.volunteers_closing_date = timezone.now() - timedelta(hours=1) self.assertFalse(conf.volunteers_enrollment_is_open()) conf.volunteers_closing_date = timezone.now() + timedelta(hours=1) self.assertTrue(conf.volunteers_enrollment_is_open()) conf.volunteers_opening_date = timezone.now() + timedelta(hours=1) self.assertFalse(conf.volunteers_enrollment_is_open()) conf.volunteers_opening_date = None self.assertFalse(conf.volunteers_enrollment_is_open()) def test_enrole_logged_out(self): self.assertEqual(self.client.get(reverse('volunteer-enrole')).status_code, 403) conf = Conference.objects.first() conf.volunteers_opening_date = timezone.now() - timedelta(hours=1) conf.save() self.assertEqual(self.client.get(reverse('volunteer-enrole')).status_code, 200) n = Volunteer.objects.count() response = self.client.post(reverse('volunteer-enrole'), {'name': 'B', 'email': 'b@example.org'}) self.assertEqual(Volunteer.objects.count(), n+1) v = Volunteer.objects.get(name='B') self.assertRedirects(response, reverse('volunteer-dashboard', kwargs={'volunteer_token': v.token}), status_code=302, target_status_code=200) def test_enrole_logged_in(self): self.client.login(username='a', password='a') self.assertRedirects(self.client.get(reverse('volunteer-enrole')), reverse('volunteer-dashboard')) self.client.login(username='b', password='b') self.assertEqual(self.client.get(reverse('volunteer-enrole')).status_code, 403) conf = Conference.objects.first() conf.volunteers_opening_date = timezone.now() - timedelta(hours=1) conf.save() user = User.objects.get(username='b') user.first_name = 'Jean' user.last_name = 'Mi' user.save() user.profile.phone_number = '0123456789' user.profile.save() response = self.client.get(reverse('volunteer-enrole')) self.assertEqual(response.status_code, 200) self.assertContains(response, 'value="Jean Mi"') self.assertContains(response, 'value="0123456789"') n = Volunteer.objects.count() response = self.client.post(reverse('volunteer-enrole'), {'name': 'B'}) self.assertEqual(Volunteer.objects.count(), n+1) v = Volunteer.objects.get(name='B') self.assertRedirects(response, reverse('volunteer-dashboard', kwargs={'volunteer_token': v.token}), status_code=302, target_status_code=200) self.assertRedirects(self.client.get(reverse('volunteer-enrole')), reverse('volunteer-dashboard')) def test_dashboard(self): v = Volunteer.objects.get(name='A') self.assertEqual(self.client.get(reverse('volunteer-dashboard', kwargs={'volunteer_token': v.token})).status_code, 200) def test_profile(self): v = Volunteer.objects.get(name='A') dashboard_url = reverse('volunteer-dashboard', kwargs={'volunteer_token': v.token}) profile_url = reverse('volunteer-profile-edit', kwargs={'volunteer_token': v.token}) self.assertEqual(self.client.get(profile_url).status_code, 200) form = VolunteerForm(instance=v, conference=v.site.conference) form.initial.update({'name': 'Abis'}) self.assertRedirects(self.client.post(profile_url, form.initial), dashboard_url) v = Volunteer.objects.get(pk=v.pk) self.assertEqual(v.name, 'Abis') def test_update_activity(self): v = Volunteer.objects.get(name='A') a = Activity.objects.get(name='Everythings') self.assertEqual(self.client.get(reverse('volunteer-join', kwargs={'volunteer_token': v.token, 'activity': a.pk})).status_code, 404) conf = Conference.objects.first() conf.volunteers_opening_date = timezone.now() - timedelta(hours=1) conf.save() self.assertRedirects(self.client.get(reverse('volunteer-join', kwargs={'volunteer_token': v.token, 'activity': a.slug})), reverse('volunteer-dashboard', kwargs={'volunteer_token': v.token}), status_code=302, target_status_code=200) self.assertRedirects(self.client.get(reverse('volunteer-quit', kwargs={'volunteer_token': v.token, 'activity': a.slug})), reverse('volunteer-dashboard', kwargs={'volunteer_token': v.token}), status_code=302, target_status_code=200) def test_volunteer_mail_token(self): v = Volunteer.objects.get(name='A') self.assertEqual(self.client.get(reverse('volunteer-mail-token')).status_code, 200) response = self.client.post(reverse('volunteer-mail-token'), {'email': 'notfound@example.org'}) self.assertEqual(response.status_code, 200) self.assertTrue(any(map(lambda m: m.level == messages.ERROR and 'do not know this email' in m.message, response.context['messages']))) response = self.client.post(reverse('volunteer-mail-token'), {'email': 'a@example.org'}) self.assertRedirects(response, reverse('volunteer-mail-token')) class ProposalTest(TestCase): def setUp(self): user = User.objects.create_user('jean-mi', email='jean-mi@example.org', password='jean-mi', first_name='Jean', last_name='Mi') admin = User.objects.create_user('admin', email='admin@example.org', password='admin', is_superuser=True) site = Site.objects.first() conf = Conference.objects.get(site=site) conf.name = 'PonyConf' conf.save() category_conf = TalkCategory.objects.create(site=site, name='Conference', label='conference') category_ws = TalkCategory.objects.create(site=site, name='Workshop', label='workshop') speaker1 = Participant.objects.create(site=site, name='Speaker 1', email='1@example.org') speaker2 = Participant.objects.create(site=site, name='Speaker 2', email='2@example.org') speaker3 = Participant.objects.create(site=site, name='Speaker 3', email='3@example.org') speaker4 = Participant.objects.create(site=site, name='Speaker 4', email='4@example.org') talk1 = Talk.objects.create(site=site, category=category_conf, title='Talk 1', description='This is a 1st talk.') talk1.speakers.add(speaker1) talk1.speakers.add(speaker2) talk2 = Talk.objects.create(site=site, category=category_conf, title='Talk 2', description='This is a 2nd talk.') talk2.speakers.add(speaker3) talk3 = Talk.objects.create(site=site, category=category_conf, title='Talk 3', description='This is a 3rd talk.') talk3.speakers.add(speaker1) talk3.speakers.add(speaker4) def test_home(self): self.assertRedirects(self.client.get(reverse('home')), reverse('proposal-home'), status_code=302) site = Site.objects.first() conf = Conference.objects.get(site=site) conf.home = '**Welcome!**' conf.save() response = self.client.get(reverse('home')) self.assertEqual(response.status_code, 200) self.assertContains(response, 'Welcome!') def test_proposal_closed(self): conf = Conference.objects.get(name='PonyConf') Talk.objects.filter(site=conf.site).all().delete() TalkCategory.objects.filter(site=conf.site).all().delete() response = self.client.get(reverse('proposal-home')) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, 'cfp/closed.html') def test_proposal_logged_out(self): conf = Conference.objects.get(name='PonyConf') site = conf.site self.assertEqual(self.client.get(reverse('proposal-home')).status_code, 200) response = self.client.post(reverse('proposal-home'), { 'name': 'Jean-Mi', 'email': 'jean@mi.me', 'biography': 'I am Jean-Mi!', 'category': conf.opened_categories.first().pk, 'title': 'PonyConf', 'description': 'PonyConf is cool.', }) speaker = Participant.objects.get(site=site, name='Jean-Mi') talk = Talk.objects.get(site=site, title='PonyConf') self.assertRedirects(response, reverse('proposal-talk-details', kwargs=dict(speaker_token=speaker.token, talk_id=talk.pk)), 302) self.assertTrue(speaker in talk.speakers.all()) def test_proposal_logged_in(self): self.client.login(username='jean-mi', password='jean-mi') conf = Conference.objects.get(name='PonyConf') site = conf.site response = self.client.get(reverse('proposal-home')) self.assertEqual(response.status_code, 200) self.assertContains(response, 'Jean Mi') response = self.client.post(reverse('proposal-home'), { 'name': 'Jean-Mi', 'biography': 'I am Jean-Mi!', 'category': conf.opened_categories.first().pk, 'title': 'PonyConf', 'description': 'PonyConf is cool.', }) speaker = Participant.objects.get(site=site, name='Jean-Mi') self.assertEqual(speaker.email, 'jean-mi@example.org') talk = Talk.objects.get(site=site, title='PonyConf') self.assertRedirects(response, reverse('proposal-talk-details', kwargs=dict(speaker_token=speaker.token, talk_id=talk.pk)), 302) self.assertTrue(speaker in talk.speakers.all()) response = self.client.get(reverse('proposal-home')) self.assertRedirects(response, reverse('proposal-dashboard')) def test_proposal_dashboard(self): speaker = Participant.objects.get(name='Speaker 1') self.assertEqual(self.client.get(reverse('proposal-dashboard', kwargs=dict(speaker_token=speaker.token))).status_code, 200) def test_proposal_profile_edit(self): speaker = Participant.objects.get(name='Speaker 1') url = reverse('proposal-profile-edit', kwargs=dict(speaker_token=speaker.token)) self.assertEqual(self.client.get(url).status_code, 200) self.assertRedirects(self.client.post(url, { 'name': 'New name', 'email': 'new-mail@example.org', 'biography': 'New bio', }), reverse('proposal-dashboard', kwargs={'speaker_token': speaker.token})) speaker = Participant.objects.get(pk=speaker.pk) self.assertEqual(speaker.name, 'New name') self.assertEqual(speaker.email, 'new-mail@example.org') self.assertEqual(speaker.biography, 'New bio') def test_proposal_talk_details(self): speaker1 = Participant.objects.get(name='Speaker 1') speaker2 = Participant.objects.get(name='Speaker 2') talk1 = Talk.objects.get(title='Talk 1') talk2 = Talk.objects.get(title='Talk 2') self.assertEqual(self.client.get(reverse('proposal-talk-details', kwargs=dict(speaker_token=speaker1.token, talk_id=talk1.pk))).status_code, 200) self.assertEqual(self.client.get(reverse('proposal-talk-details', kwargs=dict(speaker_token=speaker2.token, talk_id=talk1.pk))).status_code, 200) self.assertEqual(self.client.get(reverse('proposal-talk-details', kwargs=dict(speaker_token=speaker1.token, talk_id=talk2.pk))).status_code, 404) def test_proposal_talk_add(self): conf = Conference.objects.get(name='PonyConf') speaker = Participant.objects.get(name='Speaker 1') url = reverse('proposal-talk-add', kwargs=dict(speaker_token=speaker.token)) self.assertEqual(self.client.get(url).status_code, 200) response = self.client.post(url, { 'category': conf.opened_categories.first().pk, 'title': 'New talk', 'description': 'Talk description', }) talk = Talk.objects.get(title='New talk') self.assertEqual(talk.description, 'Talk description') self.assertRedirects(response, reverse('proposal-talk-details', kwargs=dict(speaker_token=speaker.token, talk_id=talk.pk))) def test_proposal_talk_edit(self): speaker = Participant.objects.get(name='Speaker 1') talk = Talk.objects.get(title='Talk 1') url = reverse('proposal-talk-edit', kwargs={'speaker_token': speaker.token, 'talk_id': talk.pk}) response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertRedirects(self.client.post(url, { 'title': 'New title', 'description': 'New description', }), reverse('proposal-talk-details', kwargs=dict(speaker_token=speaker.token, talk_id=talk.pk))) talk = Talk.objects.get(pk=talk.pk) self.assertEqual(talk.title, 'New title') self.assertEqual(talk.description, 'New description') def test_proposal_speaker_add(self): speaker1 = Participant.objects.get(name='Speaker 1') speaker4 = Participant.objects.get(name='Speaker 4') talk = Talk.objects.get(title='Talk 1') speaker_count = talk.speakers.count() url_talk = reverse('proposal-talk-details', kwargs={'speaker_token': speaker1.token, 'talk_id': talk.pk}) url_add = reverse('proposal-speaker-add', kwargs={'speaker_token': speaker1.token, 'talk_id': talk.pk}) response = self.client.get(url_add) self.assertEqual(response.status_code, 200) # The speaker 4 is suggested as co-speaker because speaker 1 and 4 have talk 3 in common url_add_existing = reverse('proposal-speaker-add-existing', kwargs={'speaker_token': speaker1.token, 'talk_id': talk.pk, 'speaker_id': speaker4.pk}) self.assertContains(response, url_add_existing) response = self.client.post(url_add, { 'name': 'Speaker 5', 'email': '5@example.org', 'biography': 'Biography 5', 'notify': 1, }) self.assertRedirects(response, url_talk) self.assertEqual(talk.speakers.count(), speaker_count+1) speaker5 = Participant.objects.get(name='Speaker 5') self.assertTrue(speaker5 in talk.speakers.all()) self.assertFalse(speaker4 in talk.speakers.all()) response = self.client.get(url_add_existing) self.assertRedirects(response, url_talk) self.assertEqual(talk.speakers.count(), speaker_count+2) self.assertTrue(speaker4 in talk.speakers.all()) def test_proposal_speaker_edit(self): speaker = Participant.objects.get(name='Speaker 1') co_speaker = Participant.objects.get(name='Speaker 2') talk = Talk.objects.get(title='Talk 1') talk_url = reverse('proposal-talk-details', kwargs=dict(speaker_token=speaker.token, talk_id=talk.pk)) speaker_url = reverse('proposal-speaker-edit', kwargs=dict(speaker_token=speaker.token, talk_id=talk.pk, co_speaker_id=speaker.pk)) co_speaker_url = reverse('proposal-speaker-edit', kwargs=dict(speaker_token=speaker.token, talk_id=talk.pk, co_speaker_id=co_speaker.pk)) self.assertEqual(self.client.get(speaker_url).status_code, 200) self.assertRedirects(self.client.post(speaker_url, { 'name': 'New name 1', 'email': 'new-mail-1@example.org', 'biography': 'New bio 1', }), talk_url) self.assertEqual(self.client.get(co_speaker_url).status_code, 200) self.assertRedirects(self.client.post(co_speaker_url, { 'name': 'New name 2', 'email': 'new-mail-2@example.org', 'biography': 'New bio 2', }), talk_url) def test_proposal_speaker_remove(self): speaker = Participant.objects.get(name='Speaker 1') co_speaker = Participant.objects.get(name='Speaker 2') talk = Talk.objects.get(title='Talk 1') self.assertEqual(self.client.get(reverse('proposal-speaker-remove', kwargs=dict(speaker_token=speaker.token, talk_id=talk.pk, co_speaker_id=speaker.pk))).status_code, 403) self.assertRedirects( self.client.get(reverse('proposal-speaker-remove', kwargs=dict(speaker_token=speaker.token, talk_id=talk.pk, co_speaker_id=co_speaker.pk))), reverse('proposal-talk-details', kwargs=dict(speaker_token=speaker.token, talk_id=talk.pk)), status_code=302) def test_proposal_mail_token(self): p = Participant.objects.get(name='Speaker 1') self.assertEqual(self.client.get(reverse('proposal-mail-token')).status_code, 200) response = self.client.post(reverse('proposal-mail-token'), {'email': 'notfound@example.org'}) self.assertEqual(response.status_code, 200) self.assertTrue(any(map(lambda m: m.level == messages.ERROR and 'do not know this email' in m.message, response.context['messages']))) response = self.client.post(reverse('proposal-mail-token'), {'email': p.email}) self.assertRedirects(response, reverse('proposal-mail-token')) def test_talk_acknowledgment(self): conf = Conference.objects.get(name='PonyConf') speaker1 = Participant.objects.get(name='Speaker 1') speaker3 = Participant.objects.get(name='Speaker 3') talk = Talk.objects.get(title='Talk 1') talk_url = reverse('proposal-talk-details', kwargs={'speaker_token': speaker1.token, 'talk_id': talk.pk}) confirm_url = reverse('proposal-talk-confirm', kwargs={'speaker_token': speaker1.token, 'talk_id': talk.pk}) desist_url = reverse('proposal-talk-desist', kwargs={'speaker_token': speaker1.token, 'talk_id': talk.pk}) conf.acceptances_disclosure_date = timezone.now() - timedelta(hours=1) conf.save() self.assertTrue(conf.disclosed_acceptances) talk.accepted = None talk.save() for url in [confirm_url, desist_url]: self.assertEqual(self.client.get(url).status_code, 403) talk.accepted = False talk.save() for url in [confirm_url, desist_url]: self.assertEqual(self.client.get(url).status_code, 403) talk.accepted = True talk.save() conf.save() self.assertRedirects(self.client.get(confirm_url), talk_url) self.assertRedirects(self.client.get(confirm_url), talk_url) talk = Talk.objects.get(pk=talk.pk) self.assertTrue(talk.confirmed) self.assertRedirects(self.client.get(desist_url), talk_url) self.assertRedirects(self.client.get(desist_url), talk_url) talk = Talk.objects.get(pk=talk.pk) self.assertFalse(talk.confirmed) conf.acceptances_disclosure_date = timezone.now() + timedelta(hours=1) conf.save() self.assertFalse(conf.disclosed_acceptances) talk.confirmed = None talk.save() self.assertTrue(self.client.get(confirm_url).status_code, 403) talk = Talk.objects.get(pk=talk.pk) self.assertTrue(talk.confirmed is None) self.assertTrue(self.client.get(desist_url).status_code, 403) talk = Talk.objects.get(pk=talk.pk) self.assertTrue(talk.confirmed is None) class StaffTest(TestCase): def setUp(self): user1, user2, user3 = (User.objects.create_user('user%s' % guy, email='user%s@example.org' % guy, password=guy) for guy in '123') admin = User.objects.create_user('admin', email='admin@example.org', password='admin', is_superuser=True) site = Site.objects.first() conf = Conference.objects.get(site=site) conf.name = 'PonyConf' conf.save() room1 = Room.objects.create(site=site, name='Room 1') room2 = Room.objects.create(site=site, name='Room 2') category_conf = TalkCategory.objects.create(site=site, name='Conference', label='conference') category_ws = TalkCategory.objects.create(site=site, name='Workshop', label='workshop') speaker1 = Participant.objects.create(site=site, name='Speaker 1', email='1@example.org') speaker2 = Participant.objects.create(site=site, name='Speaker 2', email='2@example.org') speaker3 = Participant.objects.create(site=site, name='Speaker 3', email='3@example.org') talk1 = Talk.objects.create(site=site, category=category_conf, title='Talk 1', description='This is a 1st talk.') talk1.speakers.add(speaker1) talk1.speakers.add(speaker2) talk2 = Talk.objects.create(site=site, category=category_conf, title='Talk 2', description='This is a 2nd talk.') talk2.speakers.add(speaker3) v = Volunteer.objects.create(site=site, name='Volunteer 1', email=user1.email) a1 = Activity.objects.create(site=site, name='Activity 1') a2 = Activity.objects.create(site=site, name='Activity 2') v.activities.add(a1) v.activities.add(a2) def test_staff(self): url = reverse('staff') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') self.assertEqual(self.client.get(url).status_code, 200) def test_admin(self): url = reverse('admin') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') self.assertEqual(self.client.get(url).status_code, 200) def test_volunteer_list(self): url = reverse('volunteer-list') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertContains(response, 'Volunteer 1') response = self.client.get(url + '?format=csv') self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Disposition'), 'attachment; filename="volunteers.csv"') self.assertContains(response, 'Volunteer 1') def test_volunteer_details(self): v = Volunteer.objects.get(name='Volunteer 1') url = reverse('volunteer-details', kwargs=dict(volunteer_id=v.pk)) self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) self.assertEqual(response.status_code, 200) for activity in v.activities.all(): self.assertContains(response, activity.name) def test_volunteer_remove(self): pass def test_activity_list(self): url = reverse('activity-list') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) self.assertEqual(response.status_code, 200) def test_activity_add(self): url = reverse('activity-list') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) self.assertEqual(response.status_code, 200) def test_activity_edit(self): conf = Conference.objects.get(name='PonyConf') activity = Activity.objects.filter(site=conf.site).first() url = reverse('activity-edit', kwargs={'slug': activity.slug}) self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') self.assertEqual(self.client.get(url).status_code, 200) response = self.client.post(url, { 'name': 'New activity name', }) self.assertRedirects(response, reverse('activity-list')) activity = Activity.objects.get(pk=activity.pk) self.assertEqual(activity.name, 'New activity name') def test_activity_remove(self): pass def test_speaker_list(self): url = reverse('participant-list') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertContains(response, 'Speaker 1') self.assertContains(response, 'Speaker 2') response = self.client.get(url + '?format=csv') self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Disposition'), 'attachment; filename="participants.csv"') self.assertContains(response, 'Speaker 1') self.assertContains(response, 'Speaker 2') def test_speaker_details(self): speaker1 = Participant.objects.get(name='Speaker 1') speaker2 = Participant.objects.get(name='Speaker 2') url = reverse('participant-details', kwargs={'participant_id': speaker1.pk}) self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertContains(response, 'Speaker 1') self.assertContains(response, 'Speaker 2') self.assertNotContains(response, 'Speaker 3') self.assertContains(response, 'Talk 1') self.assertNotContains(response, 'Talk 3') def test_speaker_edit(self): speaker = Participant.objects.get(name='Speaker 1') url = reverse('participant-edit', kwargs={'participant_id': speaker.pk}) self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertRedirects(self.client.post(url, { 'name': 'New name', 'email': 'new-mail@example.org', 'biography': 'New bio', }), reverse('participant-details', kwargs={'participant_id': speaker.pk})) speaker = Participant.objects.get(pk=speaker.pk) self.assertEqual(speaker.name, 'New name') self.assertEqual(speaker.email, 'new-mail@example.org') self.assertEqual(speaker.biography, 'New bio') def test_speaker_add_talk(self): speaker = Participant.objects.get(name='Speaker 1') url = reverse('participant-add-talk', kwargs={'participant_id': speaker.pk}) self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) self.assertEqual(response.status_code, 200) def test_talk_list(self): url = reverse('talk-list') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertContains(response, 'Talk 1') response = self.client.get(url + '?format=csv') self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Disposition'), 'attachment; filename="talks.csv"') def test_talk_details(self): talk = Talk.objects.get(title='Talk 1') url = reverse('talk-details', kwargs=dict(talk_id=talk.pk)) self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertContains(response, talk.title) def test_conference(self): conf = Conference.objects.get(name='PonyConf') url = reverse('conference-edit') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) self.assertEqual(response.status_code, 200) def test_conference_opened_categories(self): # TODO cover all cases conf = Conference.objects.get(name='PonyConf') all_categories_pk = TalkCategory.objects.filter(site=conf.site).values_list('pk', flat=True) self.assertQuerysetEqual(conf.opened_categories, all_categories_pk, transform=lambda category: category.pk, ordered=False) def test_conference_schedule_available(self): # TODO cover all cases pass def test_conference_disclosed_acceptances(self): conf = Conference.objects.get(name='PonyConf') conf.acceptances_disclosure_date = None conf.schedule_publishing_date = None conf.save() self.assertFalse(conf.disclosed_acceptances) conf.acceptances_disclosure_date = timezone.now() - timedelta(hours=1) conf.save() self.assertTrue(conf.disclosed_acceptances) conf.acceptances_disclosure_date = timezone.now() + timedelta(hours=1) conf.save() self.assertFalse(conf.disclosed_acceptances) conf.acceptances_disclosure_date = None conf.schedule_publishing_date = timezone.now() - timedelta(hours=1) conf.save() self.assertTrue(conf.disclosed_acceptances) conf.schedule_publishing_date = timezone.now() + timedelta(hours=1) conf.save() self.assertFalse(conf.disclosed_acceptances) conf.acceptances_disclosure_date = timezone.now() + timedelta(hours=1) conf.schedule_publishing_date = timezone.now() - timedelta(hours=1) conf.save() self.assertTrue(conf.disclosed_acceptances) conf.acceptances_disclosure_date = timezone.now() - timedelta(hours=1) conf.schedule_publishing_date = timezone.now() + timedelta(hours=1) conf.save() self.assertTrue(conf.disclosed_acceptances) conf.acceptances_disclosure_date = timezone.now() + timedelta(hours=1) conf.schedule_publishing_date = timezone.now() + timedelta(hours=1) conf.save() self.assertFalse(conf.disclosed_acceptances) def test_conference_videos_available(self): conf = Conference.objects.get(name='PonyConf') talk = Talk.objects.get(title='Talk 1') talk.room = Room.objects.filter(site=conf.site).first() now = timezone.now() if now.hour > 22: now -= timedelta(hours=1) talk.start_date = now talk.duration = 60 talk.accepted = True talk.video = 'this-is-a-video-location' talk.save() xml_url = reverse('public-schedule') + 'xml/' conf.schedule_publishing_date = now - timedelta(hours=1) conf.video_publishing_date = None conf.save() self.assertContains(self.client.get(xml_url), 'Talk 1') self.assertFalse(conf.videos_available) self.assertNotContains(self.client.get(xml_url), talk.video) conf.video_publishing_date = now + timedelta(hours=2) conf.save() self.assertFalse(conf.videos_available) self.assertNotContains(self.client.get(xml_url), talk.video) conf.video_publishing_date = now - timedelta(hours=1) conf.save() self.assertTrue(conf.videos_available) self.assertContains(self.client.get(xml_url), talk.video) def test_talk_decide(self): talk = Talk.objects.get(title='Talk 1') talk.accepted = None talk.save() details_url = reverse('talk-details', kwargs={'talk_id': talk.pk}) accept_url = reverse('talk-accept', kwargs={'talk_id': talk.pk}) decline_url = reverse('talk-decline', kwargs={'talk_id': talk.pk}) self.assertRedirects(self.client.get(accept_url), reverse('login') + '?next=' + accept_url) self.assertRedirects(self.client.get(decline_url), reverse('login') + '?next=' + decline_url) self.client.login(username='admin', password='admin') self.assertEqual(self.client.get(accept_url).status_code, 200) self.assertRedirects(self.client.post(accept_url), details_url) talk = Talk.objects.get(pk=talk.pk) self.assertTrue(talk.accepted) talk.accepted = None talk.save() self.assertRedirects(self.client.post(accept_url, {'message': 'Ok'}), details_url) talk = Talk.objects.get(pk=talk.pk) self.assertTrue(talk.accepted) self.assertEqual(self.client.get(decline_url).status_code, 200) self.assertRedirects(self.client.post(decline_url), details_url) talk = Talk.objects.get(pk=talk.pk) self.assertFalse(talk.accepted) talk.accepted = None talk.save() self.assertRedirects(self.client.post(decline_url, {'message': 'Not ok'}), details_url) talk = Talk.objects.get(pk=talk.pk) self.assertFalse(talk.accepted) def test_talk_acknowledgment(self): talk = Talk.objects.get(title='Talk 1') talk.accepted = None talk.confirmed = None talk.save() details_url = reverse('talk-details', kwargs={'talk_id': talk.pk}) confirm_url = reverse('talk-confirm-by-staff', kwargs={'talk_id': talk.pk}) desist_url = reverse('talk-desist-by-staff', kwargs={'talk_id': talk.pk}) self.assertRedirects(self.client.get(confirm_url), reverse('login') + '?next=' + confirm_url) self.assertRedirects(self.client.get(desist_url), reverse('login') + '?next=' + desist_url) self.client.login(username='admin', password='admin') self.assertEqual(self.client.get(confirm_url).status_code, 403) self.assertEqual(self.client.get(desist_url).status_code, 403) talk.accepted = False talk.save() self.assertEqual(self.client.get(confirm_url).status_code, 403) self.assertEqual(self.client.get(desist_url).status_code, 403) talk.accepted = True talk.save() self.assertRedirects(self.client.get(confirm_url), details_url) talk = Talk.objects.get(pk=talk.pk) self.assertTrue(talk.confirmed) self.assertEqual(self.client.get(confirm_url).status_code, 403) self.assertRedirects(self.client.get(desist_url), details_url) talk = Talk.objects.get(pk=talk.pk) self.assertFalse(talk.confirmed) self.assertEqual(self.client.get(desist_url).status_code, 403) def test_category_list(self): url = reverse('category-list') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) self.assertEqual(response.status_code, 200) def test_category_add(self): url = reverse('category-add') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) self.assertEqual(response.status_code, 200) def test_tag_list(self): url = reverse('tag-list') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) self.assertEqual(response.status_code, 200) def test_tag_add(self): url = reverse('tag-add') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) self.assertEqual(response.status_code, 200) class ScheduleTest(TestCase): def setUp(self): site = Site.objects.first() conf = Conference.objects.get(site=site) user = User.objects.create_user('user', email='user@example.org', password='user') admin = User.objects.create_user('admin', email='admin@example.org', password='admin', is_superuser=True) room = Room.objects.create(site=site, name='Room 1') category = TalkCategory.objects.create(site=site, name='Conference', label='conference') participant = Participant.objects.create(site=site, name='Participant 1', email='1@example.org') t1 = Tag.objects.create(site=site, name='Private tag', public=False) t2 = Tag.objects.create(site=site, name='Public tag', public=True) t3 = Tag.objects.create(site=site, name='Not staff tag', staff=False) t3 = Tag.objects.create(site=site, name='Staff tag', staff=True) start_date = datetime(year=2000, month=1, day=1, hour=10, tzinfo=pytz.timezone('Europe/Paris')) pending_talk = Talk.objects.create(site=site, title='Talk', description='A talk.', category=category) pending_talk.speakers.add(participant) accepted_talk = Talk.objects.create(site=site, title='Talk', description='A talk.', category=category, room=room, start_date=start_date, duration=60, accepted=True) accepted_talk.speakers.add(participant) accepted_talk.tags.add(t1) accepted_talk.tags.add(t2) accepted_talk.tags.add(t3) def test_public_schedule(self): site = Site.objects.first() conf = Conference.objects.get(site=site) self.assertEqual(self.client.get(reverse('public-schedule')).status_code, 403) conf.schedule_publishing_date = timezone.now() - timedelta(hours=1) conf.save() self.assertEqual(self.client.get(reverse('public-schedule')).status_code, 200) conf.schedule_redirection_url ='http://example.net/schedule.html' conf.save() self.assertRedirects(self.client.get(reverse('public-schedule')), conf.schedule_redirection_url, status_code=302, fetch_redirect_response=False) def test_staff_schedule(self): self.assertEqual(self.client.get(reverse('staff-schedule')).status_code, 302) self.client.login(username='admin', password='admin') self.assertEqual(self.client.get(reverse('staff-schedule')).status_code, 200) def test_xml(self): self.client.login(username='admin', password='admin') response = self.client.get(reverse('staff-schedule') + 'xml/') self.assertEqual(response.status_code, 200) self.assertContains(response, 'Public tag') self.assertNotContains(response, 'Private tag') ET.fromstring(response.content) def test_ics(self): self.client.login(username='admin', password='admin') response = self.client.get(reverse('staff-schedule') + 'ics/') self.assertEqual(response.status_code, 200) Calendar.from_ical(response.content) def test_html(self): self.client.login(username='admin', password='admin') response = self.client.get(reverse('staff-schedule') + 'html/') self.assertContains(response, 'Staff tag') self.assertNotContains(response, 'Not staff tag') self.assertEqual(response.status_code, 200) def test_inexistent_format(self): self.client.login(username='admin', password='admin') self.assertEqual(self.client.get(reverse('staff-schedule') + 'inexistent/').status_code, 404)