diff --git a/cfp/tests.py b/cfp/tests.py index 545899f..13a0f49 100644 --- a/cfp/tests.py +++ b/cfp/tests.py @@ -6,6 +6,7 @@ from django.utils import timezone from datetime import datetime, timedelta from xml.etree import ElementTree as ET +from icalendar import Calendar import pytz from .models import * @@ -49,6 +50,32 @@ class VolunteersTests(TestCase): self.assertRedirects(response, reverse('volunteer-home', kwargs=dict(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-home')) + 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-home', kwargs=dict(volunteer_token=v.token)), + status_code=302, target_status_code=200) + self.assertRedirects(self.client.get(reverse('volunteer-enrole')), reverse('volunteer-home')) + def test_home(self): v = Volunteer.objects.get(name='A') self.assertEqual(self.client.get(reverse('volunteer-home', kwargs=dict(volunteer_token=v.token))).status_code, 200) @@ -65,6 +92,17 @@ class VolunteersTests(TestCase): self.assertRedirects(self.client.get(reverse('volunteer-quit', kwargs=dict(volunteer_token=v.token, activity=a.slug))), reverse('volunteer-home', kwargs=dict(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) + + def test_volunteer_list(self): + self.client.login(username='c', password='c') + self.assertEqual(self.client.get(reverse('volunteer-list')).status_code, 200) + response = self.client.get(reverse('volunteer-list') + '?format=csv') + self.assertEqual(response.status_code, 200) + self.assertEqual(response.get('Content-Disposition'), 'attachment; filename="volunteers.csv"') + class ProposalTest(TestCase): def setUp(self): @@ -80,6 +118,16 @@ class ProposalTest(TestCase): talk.speakers.add(speaker1) talk.speakers.add(speaker2) + 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.assertEquals(response.status_code, 200) + self.assertContains(response, 'Welcome!') + def test_opened_categories(self): # TODO cover all cases conf = Conference.objects.get(name='PonyConf') @@ -87,7 +135,21 @@ class ProposalTest(TestCase): self.assertQuerysetEqual(conf.opened_categories, all_categories_pk, transform=lambda category: category.pk, ordered=False) def test_proposal_home(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_dashboard(self): speaker = Participant.objects.get(name='Speaker 1') @@ -141,6 +203,8 @@ class ScheduleTest(TestCase): 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) @@ -148,11 +212,45 @@ class ScheduleTest(TestCase): 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.assertEquals(self.client.get(reverse('public-schedule')).status_code, 403) + conf.schedule_publishing_date = timezone.now() - timedelta(hours=1) + conf.save() + self.assertEquals(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.assertEqual(self.client.get(reverse('staff-schedule') + 'xml/').status_code, 302) self.client.login(username='admin', password='admin') response = self.client.get(reverse('staff-schedule') + 'xml/') + self.assertEquals(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.assertEquals(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.assertEquals(response.status_code, 200) + + def test_inexistent_format(self): + self.client.login(username='admin', password='admin') + self.assertEquals(self.client.get(reverse('staff-schedule') + 'inexistent/').status_code, 404) diff --git a/cfp/views.py b/cfp/views.py index d155948..62b11e0 100644 --- a/cfp/views.py +++ b/cfp/views.py @@ -43,18 +43,17 @@ def home(request): def volunteer_enrole(request): + if request.user.is_authenticated() and Volunteer.objects.filter(site=request.conference.site, email=request.user.email).exists(): + return redirect(reverse('volunteer-home')) if not request.conference.volunteers_enrollment_is_open(): raise PermissionDenied initial = {} - if request.user.is_authenticated(): - if Volunteer.objects.filter(site=request.conference.site, email=request.user.email).exists(): - return redirect(reverse('volunteer-home')) - elif not request.POST: - initial.update({ - 'name': request.user.get_full_name(), - 'phone_number': request.user.profile.phone_number, - 'sms_prefered': request.user.profile.sms_prefered, - }) + if request.user.is_authenticated() and not request.POST: + initial.update({ + 'name': request.user.get_full_name(), + 'phone_number': request.user.profile.phone_number, + 'sms_prefered': request.user.profile.sms_prefered, + }) form = VolunteerForm(request.POST or None, initial=initial, conference=request.conference) if request.user.is_authenticated(): form.fields.pop('email')