def test_staff_area_potential_display_completed(self): '''staff_area view should load everything but rejected same code for event & staff area, so not retesting ''' context = StaffAreaContext() context.conference.status = "completed" context.conference.save() vol1, opp1 = context.book_volunteer() vol2, opp2 = context.book_volunteer(role="Pending Volunteer") vol3, opp3 = context.book_volunteer(role="Waitlisted") vol4, opp4 = context.book_volunteer(role="Rejected") grant_privilege(self.profile, 'Act Coordinator') login_as(self.profile, self) response = self.client.get( "%s?filter=Potential" % reverse('staff_area', urlconf="gbe.reporting.urls", args=[context.area.pk])) self.assertEqual(response.status_code, 200) self.assertContains(response, str(vol1)) self.assertContains(response, str(vol2)) self.assertContains(response, str(vol3)) self.assertNotContains(response, str(vol4)) self.assertContains(response, role_commit_map["Pending Volunteer"][1]) self.assertContains(response, role_commit_map["Waitlisted"][1]) self.assertContains(response, "?filter=Committed") self.assertNotContains(response, reverse("edit_staff", urlconf='gbe.scheduling.urls', args=[context.area.pk]))
def test_send_email_failure_preserve_choices(self): staffcontext = StaffAreaContext(conference=self.context.conference) volunteer, booking = staffcontext.book_volunteer() showcontext = ShowContext(conference=self.context.conference) showcontext.set_producer(producer=staffcontext.staff_lead) login_as(self.privileged_profile, self) data = { 'to': volunteer.user_object.email, 'sender': "*****@*****.**", 'html_message': "<p>Test Message</p>", 'email-select-conference': [self.context.conference.pk], 'email-select-roles': [ "Interested", ], 'event-select-events': showcontext.show.pk, 'event-select-staff_areas': staffcontext.area.pk, 'event-select-event_collections': "Volunteer", 'send': True } response = self.client.post(self.url, data=data, follow=True) assert_checkbox(response, "conference", 0, self.context.conference.pk, self.context.conference.conference_slug) assert_checkbox(response, "roles", 0, "Interested", "Interested") assert_checkbox(response, "events", 0, showcontext.show.pk, showcontext.show.e_title, prefix="event-select") assert_checkbox(response, "event_collections", 2, "Volunteer", "All Volunteer Events", prefix="event-select")
def test_good_user_get_volunteer_w_teacher_as_persona(self): grant_privilege(self.privileged_user, 'Volunteer Coordinator') login_as(self.privileged_user, self) staff_context = StaffAreaContext() volunteer_sched_event = staff_context.add_volunteer_opp() volunteer_sched_event.approval_needed = True volunteer_sched_event.save() teacher = PersonaFactory() teacher, alloc = staff_context.book_volunteer( volunteer_sched_event=volunteer_sched_event, volunteer=teacher, role="Teacher") url = reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[staff_context.conference.conference_slug, volunteer_sched_event.pk]) response = self.client.get(url) self.assertContains( response, '<input type="checkbox" name="approval" ' + 'id="id_approval" checked />', html=True) self.assertContains( response, '<option value="%d" selected>%s</option>' % ( staff_context.area.pk, staff_context.area), html=True)
def test_send_email_success_email_sent(self): staffcontext = StaffAreaContext(conference=self.context.conference) volunteer, booking = staffcontext.book_volunteer() showcontext = ShowContext(conference=self.context.conference) showcontext.set_producer(producer=staffcontext.staff_lead) login_as(staffcontext.staff_lead, self) data = { 'to': volunteer.user_object.email, 'sender': staffcontext.staff_lead.user_object.email, 'subject': "Subject", 'html_message': "<p>Test Message</p>", 'email-select-conference': [self.context.conference.pk], 'email-select-roles': [ "Volunteer", ], 'event-select-events': showcontext.show.pk, 'event-select-staff_areas': staffcontext.area.pk, 'event-select-event_collections': "Volunteer", 'send': True } response = self.client.post(self.url, data=data, follow=True) assert_queued_email( [ volunteer.user_object.email, ], data['subject'], data['html_message'], data['sender'], )
def test_send_email_success_email_sent(self): staffcontext = StaffAreaContext(conference=self.context.conference) volunteer, booking = staffcontext.book_volunteer() showcontext = ShowContext(conference=self.context.conference) showcontext.set_producer(producer=staffcontext.staff_lead) login_as(staffcontext.staff_lead, self) data = { 'to': volunteer.user_object.email, 'sender': staffcontext.staff_lead.user_object.email, 'subject': "Subject", 'html_message': "<p>Test Message</p>", 'email-select-conference': [self.context.conference.pk], 'email-select-roles': ["Volunteer", ], 'event-select-events': showcontext.show.pk, 'event-select-staff_areas': staffcontext.area.pk, 'event-select-event_collections': "Volunteer", 'send': True } response = self.client.post(self.url, data=data, follow=True) assert_queued_email( [volunteer.user_object.email, ], data['subject'], data['html_message'], data['sender'], )
def test_volunteer_changestate_gives_event_over_full_warning(self): ProfilePreferencesFactory(profile=self.volunteer.profile) context = StaffAreaContext( conference=self.volunteer.b_conference, ) opp = context.add_volunteer_opp() context.book_volunteer( volunteer_sched_event=opp, volunteer=context.staff_lead) url = reverse(self.view_name, args=[self.volunteer.pk], urlconf='gbe.urls') login_as(self.privileged_user, self) data = {'conference': self.volunteer.b_conference, 'events': [opp.pk], 'accepted': 3} response = self.client.post(url, data=data, follow=True) self.assertContains(response, "OCCURRENCE_OVERBOOKED")
def test_get_staff_area(self): staff_context = StaffAreaContext(conference=self.context.conference) volunteer, booking = staff_context.book_volunteer( role="Pending Volunteer") login_as(self.privileged_user, self) response = self.client.get( self.url, {'conf_slug': self.context.conference.conference_slug}) self.assert_volunteer_state(response, booking) self.assertContains(response, str(staff_context.area))
def test_staff_area_role_display(self): '''staff_area view should load only the actually assigned volunteer ''' context = StaffAreaContext() vol1, opp1 = context.book_volunteer() vol2, opp2 = context.book_volunteer(role="Pending Volunteer") vol3, opp3 = context.book_volunteer(role="Waitlisted") vol4, opp4 = context.book_volunteer(role="Rejected") grant_privilege(self.profile, 'Act Reviewers') login_as(self.profile, self) response = self.client.get(self.url) self.assertEqual(response.status_code, 200) self.assertContains(response, str(vol1)) self.assertContains(response, str(vol2)) self.assertContains(response, str(vol3)) self.assertNotContains(response, str(vol4)) self.assertContains( response, reverse("review_pending", urlconf='gbe.scheduling.urls')) self.assertContains(response, context.area.title)
def test_no_available_volunteers(self): context = StaffAreaContext() volunteer_opp = context.add_volunteer_opp() volunteer, alloc = context.book_volunteer(volunteer_opp) login_as(self.privileged_profile, self) response = self.client.get(reverse( self.view_name, args=[context.conference.conference_slug, volunteer_opp.pk], urlconf="gbe.scheduling.urls"), follow=True) assert ("no available volunteers" in response.content)
def test_no_available_volunteers(self): context = StaffAreaContext() volunteer_opp = context.add_volunteer_opp() volunteer, alloc = context.book_volunteer( volunteer_opp) login_as(self.privileged_profile, self) response = self.client.get( reverse( self.view_name, args=[context.conference.conference_slug, volunteer_opp.pk], urlconf="gbe.scheduling.urls"), follow=True) assert ("no available volunteers" in response.content)
def test_view_volunteers_waitlisted(self): context = StaffAreaContext(conference=self.conf) volunteer, booking = context.book_volunteer(role="Waitlisted") opportunity = booking.event opportunity.starttime = datetime.now() + timedelta(days=1) opportunity.save() login_as(volunteer, self) url = reverse("event_list", urlconf="gbe.scheduling.urls", args=["Volunteer"]) response = self.client.get( url, data={"conference": self.conf.conference_slug}) self.assertContains(response, opportunity.eventitem.e_title) self.assertContains(response, "You were waitlisted for this shift.")
def test_staff_area_with_inactive(self): '''staff_area view should load ''' context = StaffAreaContext() inactive = ProfileFactory(display_name="DON'T SEE THIS", user_object__is_active=False) vol, opp = context.book_volunteer(volunteer=inactive) grant_privilege(self.profile, 'Act Reviewers') login_as(self.profile, self) response = self.client.get("%s?area=Staff" % reverse( 'staff_area', urlconf="gbe.reporting.urls", args=[context.area.pk ])) self.assertEqual(response.status_code, 200) self.assertTrue('<tr style="color:red;">' in response.content)
def test_staff_area_role_display(self): vol_context = VolunteerContext(event=self.context.show, sched_event=self.context.sched_event) context = StaffAreaContext(conference=self.context.conference) EventLabelFactory(event=vol_context.opp_event, text=context.area.slug) vol1, opp1 = context.book_volunteer( volunteer_sched_event=vol_context.opp_event) vol2, opp2 = context.book_volunteer( volunteer_sched_event=vol_context.opp_event, role="Pending Volunteer") vol3, opp3 = context.book_volunteer( volunteer_sched_event=vol_context.opp_event, role="Waitlisted") vol4, opp4 = context.book_volunteer( volunteer_sched_event=vol_context.opp_event, role="Rejected") login_as(self.profile, self) response = self.client.get(self.url) self.assertEqual(response.status_code, 200) self.assertContains(response, str(vol1)) self.assertContains(response, str(vol2)) self.assertContains(response, str(vol3)) self.assertNotContains(response, str(vol4)) self.assertNotContains( response, reverse("approve_volunteer", urlconf='gbe.scheduling.urls', args=['approve', vol1.pk, opp1.pk])) self.assertContains( response, reverse("approve_volunteer", urlconf='gbe.scheduling.urls', args=['approve', vol2.pk, opp2.pk])) self.assertContains( response, reverse("approve_volunteer", urlconf='gbe.scheduling.urls', args=['approve', vol3.pk, opp3.pk])) self.assertContains(response, context.area.title)
def test_good_user_get_volunteer_w_teacher_as_persona(self): grant_privilege(self.privileged_user, 'Volunteer Coordinator') login_as(self.privileged_user, self) staff_context = StaffAreaContext() volunteer_sched_event = staff_context.add_volunteer_opp() teacher = PersonaFactory() teacher, alloc = staff_context.book_volunteer( volunteer_sched_event=volunteer_sched_event, volunteer=teacher, role="Teacher") url = reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[staff_context.conference.conference_slug, volunteer_sched_event.pk]) response = self.client.get(url)
def test_staff_area_default_display(self): '''staff_area view should load only the actually assigned volunteer ''' context = StaffAreaContext() vol1, opp1 = context.book_volunteer() vol2, opp2 = context.book_volunteer(role="Pending Volunteer") vol3, opp3 = context.book_volunteer(role="Waitlisted") vol4, opp4 = context.book_volunteer(role="Rejected") grant_privilege(self.profile, 'Act Coordinator') login_as(self.profile, self) response = self.client.get( reverse('staff_area', urlconf="gbe.reporting.urls", args=[context.area.pk])) self.assertEqual(response.status_code, 200) self.assertContains(response, str(vol1)) self.assertContains(response, role_commit_map["Volunteer"][1]) self.assertNotContains(response, str(vol2)) self.assertNotContains(response, str(vol3)) self.assertNotContains(response, str(vol4)) self.assertContains(response, "?filter=Potential") self.assertContains(response, reverse("edit_staff", urlconf='gbe.scheduling.urls', args=[context.area.pk]))
def test_pick_all_vol_reduced_priv(self): staffcontext = StaffAreaContext() volunteer, booking = staffcontext.book_volunteer() special = GenericEventFactory( e_conference=staffcontext.conference) specialstaffcontext = VolunteerContext( event=special, ) login_as(staffcontext.staff_lead, self) data = { 'email-select-conference': [staffcontext.conference.pk, ], 'email-select-roles': ['Volunteer', ], 'event-select-event_collections': "Volunteer", 'refine': True, } response = self.client.post(self.url, data=data, follow=True) self.assertNotContains( response, self.context.teacher.contact.user_object.email) self.assertContains( response, volunteer.user_object.email) self.assertContains( response, specialstaffcontext.profile.user_object.email) assert_checkbox( response, "events", 0, special.pk, special.e_title, checked=False, prefix="event-select") assert_checkbox( response, "staff_areas", 0, staffcontext.area.pk, staffcontext.area.title, checked=False, prefix="event-select") assert_checkbox( response, "event_collections", 0, "Volunteer", "All Volunteer Events", prefix="event-select")
def test_staff_lead_button(self): show_context = ActTechInfoContext(schedule_rehearsal=True) vol_context = VolunteerContext(event=show_context.show, sched_event=show_context.sched_event) context = StaffAreaContext(conference=show_context.conference) EventLabelFactory(event=vol_context.opp_event, text=context.area.slug) vol1, opp1 = context.book_volunteer( volunteer_sched_event=vol_context.opp_event, volunteer=context.staff_lead) self.profile = context.staff_lead response = self.get_landing_page() self.assertContains(response, reverse( 'show_dashboard', urlconf='gbe.scheduling.urls', args=[show_context.sched_event.pk]))
def test_view_volunteer_filled(self): staff_context = StaffAreaContext(conference=self.conf) volunteer, booking = staff_context.book_volunteer() opportunity = booking.event opportunity.starttime = datetime.now() + timedelta(days=1) opportunity.max_volunteers = 1 opportunity.save() url = reverse("event_list", urlconf="gbe.scheduling.urls", args=["Volunteer"]) response = self.client.get( url, data={"conference": self.conf.conference_slug}) vol_link = reverse('set_volunteer', args=[opportunity.pk, 'on'], urlconf='gbe.scheduling.urls') self.assertContains(response, opportunity.eventitem.e_title) self.assertContains(response, 'This event has all the volunteers it needs.')
def test_volunteer_approval_pending(self): context = StaffAreaContext() volunteer, booking = context.book_volunteer(role="Pending Volunteer") opportunity = booking.event opportunity.approval_needed = True opportunity.starttime = datetime.now() + timedelta(days=1) opportunity.save() login_as(volunteer, self) url = reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[opportunity.eventitem_id]) response = self.client.get(url) vol_link = reverse('set_volunteer', args=[opportunity.pk, 'off'], urlconf='gbe.scheduling.urls') self.assertContains(response, opportunity.eventitem.e_title) self.assertContains(response, vol_link) self.assertContains(response, 'awaiting_approval.gif')
def test_send_email_failure_preserve_choices(self): staffcontext = StaffAreaContext(conference=self.context.conference) volunteer, booking = staffcontext.book_volunteer() showcontext = ShowContext(conference=self.context.conference) showcontext.set_producer(producer=staffcontext.staff_lead) login_as(self.privileged_profile, self) data = { 'to': volunteer.user_object.email, 'sender': "*****@*****.**", 'html_message': "<p>Test Message</p>", 'email-select-conference': [self.context.conference.pk], 'email-select-roles': ["Interested", ], 'event-select-events': showcontext.show.pk, 'event-select-staff_areas': staffcontext.area.pk, 'event-select-event_collections': "Volunteer", 'send': True } response = self.client.post(self.url, data=data, follow=True) assert_checkbox( response, "conference", 0, self.context.conference.pk, self.context.conference.conference_slug) assert_checkbox( response, "roles", 0, "Interested", "Interested") assert_checkbox( response, "events", 0, showcontext.show.pk, showcontext.show.e_title, prefix="event-select") assert_checkbox( response, "event_collections", 2, "Volunteer", "All Volunteer Events", prefix="event-select")
def test_send_email_success_status(self): staffcontext = StaffAreaContext(conference=self.context.conference) volunteer, booking = staffcontext.book_volunteer() login_as(self.privileged_profile, self) data = { 'to': volunteer.user_object.email, 'sender': self.privileged_profile.user_object.email, 'subject': "Subject", 'html_message': "<p>Test Message</p>", 'email-select-conference': [self.context.conference.pk], 'email-select-roles': ["Performer", "Volunteer"], 'event-select-staff_areas': staffcontext.area.pk, 'event-select-event_collections': "Volunteer", 'send': True } response = self.client.post(self.url, data=data, follow=True) assert_alert_exists( response, 'success', 'Success', "%s%s" % (send_email_success_msg, volunteer.user_object.email))
def test_staff_area_with_inactive(self): '''staff_area view should load ''' context = StaffAreaContext() inactive = ProfileFactory( display_name="DON'T SEE THIS", user_object__is_active=False ) vol, opp = context.book_volunteer(volunteer=inactive) grant_privilege(self.profile, 'Act Coordinator') login_as(self.profile, self) response = self.client.get( reverse('staff_area', urlconf="gbe.reporting.urls", args=[context.area.pk])) self.assertEqual(response.status_code, 200) self.assertContains( response, '<tr class="gbe-form-error">')
def test_staff_area_conference_completed(self): '''staff_area view should load everything but rejected same code for event & staff area, so not retesting ''' context = StaffAreaContext() context.conference.status = "completed" context.conference.save() vol1, opp1 = context.book_volunteer() grant_privilege(self.profile, 'Act Reviewers') login_as(self.profile, self) response = self.client.get( "%s?conf_slug=%s" % (self.url, context.conference.conference_slug)) self.assertEqual(response.status_code, 200) self.assertContains(response, str(vol1)) self.assertNotContains( response, reverse('edit_event', urlconf='gbe.scheduling.urls', args=[context.conference.conference_slug, opp1.event.pk]))
def test_staff_area_with_inactive(self): '''staff_area view should load ''' context = StaffAreaContext() inactive = ProfileFactory( display_name="DON'T SEE THIS", user_object__is_active=False ) vol, opp = context.book_volunteer(volunteer=inactive) grant_privilege(self.profile, 'Act Reviewers') login_as(self.profile, self) response = self.client.get( "%s?area=Staff" % reverse('staff_area', urlconf="gbe.reporting.urls", args=[context.area.pk])) self.assertEqual(response.status_code, 200) self.assertTrue( '<tr style="color:red;">' in response.content)
def test_pick_all_vol_reduced_priv(self): staffcontext = StaffAreaContext() volunteer, booking = staffcontext.book_volunteer() special = GenericEventFactory(e_conference=staffcontext.conference) specialstaffcontext = VolunteerContext(event=special, ) login_as(staffcontext.staff_lead, self) data = { 'email-select-conference': [ staffcontext.conference.pk, ], 'email-select-roles': [ 'Volunteer', ], 'event-select-event_collections': "Volunteer", 'refine': True, } response = self.client.post(self.url, data=data, follow=True) self.assertNotContains(response, self.context.teacher.contact.user_object.email) self.assertContains(response, volunteer.user_object.email) self.assertContains(response, specialstaffcontext.profile.user_object.email) assert_checkbox(response, "events", 0, special.pk, special.e_title, checked=False, prefix="event-select") assert_checkbox(response, "staff_areas", 0, staffcontext.area.pk, staffcontext.area.title, checked=False, prefix="event-select") assert_checkbox(response, "event_collections", 0, "Volunteer", "All Volunteer Events", prefix="event-select")
def test_send_email_success_status(self): staffcontext = StaffAreaContext(conference=self.context.conference) volunteer, booking = staffcontext.book_volunteer() login_as(self.privileged_profile, self) data = { 'to': volunteer.user_object.email, 'sender': self.privileged_profile.user_object.email, 'subject': "Subject", 'html_message': "<p>Test Message</p>", 'email-select-conference': [self.context.conference.pk], 'email-select-roles': ["Performer", "Volunteer"], 'event-select-staff_areas': staffcontext.area.pk, 'event-select-event_collections': "Volunteer", 'send': True } response = self.client.post(self.url, data=data, follow=True) assert_alert_exists( response, 'success', 'Success', "%s%s" % ( send_email_success_msg, volunteer.user_object.email))
def test_good_user_get_no_create_edit(self): old_conf_day = ConferenceDayFactory( conference__status="completed", day=self.day.day + timedelta(3)) context = ClassContext(conference=old_conf_day.conference) vol_context = VolunteerContext(conference=old_conf_day.conference) staff_context = StaffAreaContext(conference=old_conf_day.conference) booking, self.vol_opp = staff_context.book_volunteer() data = { "%s-calendar_type" % old_conf_day.conference.conference_slug: [ 0, 1, 2], "filter": "Filter", } login_as(self.privileged_profile, self) url = reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[old_conf_day.conference.conference_slug]) response = self.client.get(url, data) self.assertContains( response, '<i class="fa fa-trash-o" aria-hidden="true">') self.assertNotContains( response, '<i class="fa fa-pencil" aria-hidden="true">') self.assertNotContains( response, '<i class="fa fa-plus" aria-hidden="true">') self.assertContains(response, vol_context.opportunity.e_title) self.assertContains(response, reverse( 'detail_view', urlconf='gbe.scheduling.urls', args=[vol_context.event.eventitem_id])) self.assertContains(response, vol_context.event.e_title) self.assertNotContains(response, reverse( "edit_staff", urlconf="gbe.scheduling.urls", args=[staff_context.area.pk]))
class TestCalendarView(TestCase): def setUp(self): self.client = Client() clear_conferences() conference = ConferenceFactory() save_the_date = datetime(2016, 2, 6, 12, 0, 0) day = ConferenceDayFactory( conference=conference, day=date(2016, 2, 6)) self.staffcontext = StaffAreaContext( conference=conference, starttime=save_the_date) self.showcontext = ShowContext(conference=conference, starttime=save_the_date) self.other_conference = ConferenceFactory( status='completed') self.other_conf_day = ConferenceDayFactory( conference=self.other_conference, day=date(2015, 2, 6)) self.other_show = ShowContext(conference=self.other_conference) self.classcontext = ClassContext( conference=conference, starttime=save_the_date) self.volunteeropp = self.staffcontext.add_volunteer_opp() def test_calendar_generic_w_default_conf(self): url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['General']) response = self.client.get(url) self.assertContains( response, '<div class="col-lg-12">%s' % ( self.showcontext.conference.conference_name)) self.assertContains(response, self.showcontext.show.e_title) self.assertContains( response, self.showcontext.sched_event.starttime.strftime("%-I:%M %p")) self.assertContains( response, self.showcontext.sched_event.end_time.strftime("%-I:%M %p")) self.assertNotContains(response, self.other_show.show.e_title) self.assertNotContains(response, self.classcontext.bid.e_title) self.assertNotContains(response, self.volunteeropp.eventitem.e_title) self.assertNotContains(response, reverse( 'show_dashboard', urlconf='gbe.scheduling.urls', args=[self.showcontext.sched_event.pk])) def test_calendar_priv_dash_link(self): profile = ProfileFactory() grant_privilege(profile, 'Schedule Mavens') login_as(profile, self) url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['General']) response = self.client.get(url) self.assertContains(response, self.showcontext.show.e_title) self.assertContains(response, reverse( 'show_dashboard', urlconf='gbe.scheduling.urls', args=[self.showcontext.sched_event.pk])) def test_calendar_conference_w_default_conf(self): url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['Conference']) response = self.client.get(url) self.assertContains( response, '<div class="col-lg-12">%s' % ( self.showcontext.conference.conference_name)) self.assertNotContains(response, self.showcontext.show.e_title) self.assertNotContains(response, self.other_show.show.e_title) self.assertContains(response, self.classcontext.bid.e_title) self.assertContains(response, "Teacher: %s" % ( self.classcontext.bid.teacher.name)) self.assertNotContains(response, self.volunteeropp.eventitem.e_title) def test_calendar_volunteer_w_default_conf(self): url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['Volunteer']) response = self.client.get(url) self.assertContains( response, '<div class="col-lg-12">%s' % ( self.showcontext.conference.conference_name)) self.assertNotContains(response, self.showcontext.show.e_title) self.assertNotContains(response, self.other_show.show.e_title) self.assertNotContains(response, self.classcontext.bid.e_title) self.assertContains(response, self.volunteeropp.eventitem.e_title) def test_calendar_conference_w_default_conf_public_days(self): conference_day = ConferenceDayFactory( conference=self.staffcontext.conference, day=date(2016, 2, 5), open_to_public=False) conference_day = ConferenceDayFactory( conference=self.staffcontext.conference, day=date(2016, 2, 7), open_to_public=False) url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['Conference']) response = self.client.get(url) self.assertContains(response, "btn disabled", 2) self.assertContains(response, "Feb. 6, 2016", 1) def test_calendar_volunteer_w_default_conf_public_days(self): conference_day = ConferenceDayFactory( conference=self.staffcontext.conference, day=date(2016, 2, 5), open_to_public=False) conference_day = ConferenceDayFactory( conference=self.staffcontext.conference, day=date(2016, 2, 7), open_to_public=False) url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['Volunteer']) data = {'day': "02-06-2016"} response = self.client.get(url, data=data) self.assertNotContains(response, "btn disabled") def test_calendar_shows_requested_conference(self): url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['General']) data = {'conference': self.other_conference.conference_slug} response = self.client.get(url, data=data) self.assertNotContains(response, self.showcontext.show.e_title) self.assertContains(response, self.other_show.show.e_title) def test_no_conference_days(self): clear_conferences() ConferenceFactory(status='upcoming') url = reverse('calendar', urlconf='gbe.scheduling.urls', args=['Conference']) response = self.client.get(url) self.assertContains( response, 'This calendar is not currently available.') def test_bad_day(self): ''' There is a day, but that's not the day we're asking for. ''' clear_conferences() conference = ConferenceFactory(status='upcoming') conference_day = ConferenceDayFactory( conference=conference, day=date(2016, 2, 6)) url = reverse('calendar', urlconf='gbe.scheduling.urls', args=['Conference']) data = {'day': "02-02-2016"} response = self.client.get(url, data=data, follow=True) self.assertEqual(response.status_code, 404) def test_invalid_day(self): ''' There is a day, but that's not the day we're asking for. ''' url = reverse('calendar', urlconf='gbe.scheduling.urls', args=['Conference']) data = {'day': "DEADBEEF"} response = self.client.get(url, data=data, follow=True) self.assertEqual(response.status_code, 404) def test_bad_cal_type(self): url = reverse('calendar', urlconf='gbe.scheduling.urls', args=['Bad']) response = self.client.get(url, follow=True) self.assertEqual(response.status_code, 404) def test_one_day(self): ''' There is no day but today, so no navigation ''' clear_conferences() conference = ConferenceFactory(status='upcoming') conference_day = ConferenceDayFactory( conference=conference, day=date(2016, 2, 6)) url = reverse('calendar', urlconf='gbe.scheduling.urls', args=['Conference']) data = {'day': "02-06-2016"} response = self.client.get(url, data=data) self.assertContains(response, "btn disabled", 2) def test_day_before(self): ''' There is no day but today, so no navigation ''' url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['General']) ConferenceDayFactory( conference=self.other_conference, day=date(2015, 2, 7)) data = {'day': "02-06-2015"} response = self.client.get(url, data=data) self.assertContains( response, '<a href="?day=02-07-2015" ' + 'data-toggle="tooltip" title="02-07-2015">') def test_day_after(self): ''' There is no day but today, so no navigation ''' url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['General']) ConferenceDayFactory( conference=self.other_conference, day=date(2015, 2, 7)) data = {'day': "02-07-2015"} response = self.client.get(url, data=data) self.assertContains( response, '<a href="?day=02-06-2015" ' + 'data-toggle="tooltip" title="02-06-2015">') def test_no_sched_events(self): ''' There is a day, but that's not the day we're asking for. ''' url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['General']) ConferenceDayFactory( conference=self.other_conference, day=date(2015, 2, 7)) data = {'day': "02-07-2015"} response = self.client.get(url, data=data) self.assertContains( response, "There are no general events scheduled for this day.") def test_calendar_1_event_per_hour(self): url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['Volunteer']) response = self.client.get(url) self.assertContains( response, '<div class="col-lg-12 col-md-12 col-sm-12 col-12">', 1) def test_calendar_2_event_per_hour(self): two_opp = self.staffcontext.add_volunteer_opp() url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['Volunteer']) response = self.client.get(url) self.assertContains( response, '<div class="col-lg-6 col-md-6 col-sm-6 col-12">', 2) self.assertContains(response, two_opp.eventitem.e_title) def test_calendar_3_event_per_hour(self): self.staffcontext.add_volunteer_opp() three_opp = self.staffcontext.add_volunteer_opp() url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['Volunteer']) response = self.client.get(url) self.assertContains( response, '<div class="col-lg-4 col-md-4 col-sm-6 col-12">', 3) def test_calendar_4_event_per_hour(self): for n in range(0, 2): self.staffcontext.add_volunteer_opp() three_opp = self.staffcontext.add_volunteer_opp() url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['Volunteer']) response = self.client.get(url) self.assertContains( response, '<div class="col-lg-3 col-md-4 col-sm-6 col-12">', 4) def test_calendar_6_event_per_hour(self): for n in range(0, 4): self.staffcontext.add_volunteer_opp() three_opp = self.staffcontext.add_volunteer_opp() url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['Volunteer']) response = self.client.get(url) self.assertContains( response, '<div class="col-lg-2 col-md-4 col-sm-6 col-12">', 6) def test_calendar_10_event_per_hour(self): for n in range(0, 8): self.staffcontext.add_volunteer_opp() three_opp = self.staffcontext.add_volunteer_opp() url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['Volunteer']) response = self.client.get(url) self.assertContains( response, '<div class="col-lg-2 col-md-4 col-sm-6 col-12">', 10) def test_logged_in_no_interest(self): profile = ProfileFactory() login_as(profile, self) url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['General']) data = {'day': "02-06-2016"} response = self.client.get(url, data=data) set_fav_link = reverse( "set_favorite", args=[self.showcontext.sched_event.pk, "on"], urlconf="gbe.scheduling.urls") self.assertContains(response, "%s?next=%s" % ( set_fav_link, url)) def test_logged_in_have_interest(self): profile = self.showcontext.set_interest() login_as(profile, self) url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['General']) data = {'day': "02-06-2016"} response = self.client.get(url, data=data) set_fav_link = reverse( "set_favorite", args=[self.showcontext.sched_event.pk, "off"], urlconf="gbe.scheduling.urls") self.assertContains(response, "%s?next=%s" % ( set_fav_link, url)) self.assertContains( response, '<div class="col-lg-12 col-md-12 col-sm-12 col-12 interested">') def test_logged_in_no_profile(self): user = UserFactory() login_as(user, self) url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['General']) data = {'day': "02-06-2016"} response = self.client.get(url, data=data) set_fav_link = reverse( "set_favorite", args=[self.showcontext.sched_event.pk, "on"], urlconf="gbe.scheduling.urls") self.assertContains(response, "%s?next=%s" % ( set_fav_link, url)) def test_calendar_old_conference(self): url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['General']) data = {'conference': self.other_conference.conference_slug} response = self.client.get(url, data=data) self.assertNotContains(response, self.showcontext.show.e_title) set_fav_link = reverse( "set_favorite", args=[self.showcontext.sched_event.pk, "off"], urlconf="gbe.scheduling.urls") self.assertNotContains(response, "%s?next=%s" % ( set_fav_link, url)) set_unfav_link = reverse( "set_favorite", args=[self.showcontext.sched_event.pk, "on"], urlconf="gbe.scheduling.urls") self.assertNotContains(response, "%s?next=%s" % ( set_unfav_link, url)) def test_logged_in_teacher(self): login_as(self.classcontext.teacher.performer_profile, self) url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['Conference']) data = {'day': "02-06-2016"} response = self.client.get(url, data=data) self.assertContains( response, '<a href="#" class="cal-favorite detail_link-disabled') self.assertContains( response, '<div class="col-lg-12 col-md-12 col-sm-12 col-12 teacher">') self.assertNotContains(response, 'fa-tachometer') def test_logged_in_performer(self): login_as(self.showcontext.performer.performer_profile, self) url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['General']) data = {'day': "02-06-2016"} response = self.client.get(url, data=data) self.assertContains( response, '<a href="#" class="cal-favorite detail_link-disabled') self.assertContains( response, '<div class="col-lg-12 col-md-12 col-sm-12 col-12 performer">') def test_logged_in_volunteer(self): volunteer, booking = self.staffcontext.book_volunteer() opportunity = booking.event opportunity.starttime = datetime.now() + timedelta(days=1) opportunity.save() ConferenceDayFactory(conference=self.staffcontext.conference, day=opportunity.starttime) login_as(volunteer, self) url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['Volunteer']) response = self.client.get(url, data={ 'day': opportunity.starttime.strftime('%m-%d-%Y')}, follow=True) self.assertContains(response, opportunity.eventitem.e_title) self.assertContains(response, 'class="volunteer-icon" alt="You\'ve signed up"/>') def test_volunteer_event_full(self): volunteer, booking = self.staffcontext.book_volunteer() opportunity = booking.event opportunity.starttime = datetime.now() + timedelta(days=1) opportunity.max_volunteers = 1 opportunity.save() ConferenceDayFactory(conference=self.staffcontext.conference, day=opportunity.starttime) url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['Volunteer']) response = self.client.get(url, data={ 'day': opportunity.starttime.strftime('%m-%d-%Y')}, follow=True) self.assertContains(response, opportunity.eventitem.e_title) self.assertContains( response, 'This event has all the volunteers it needs.') def test_disabled_eval(self): eval_profile = self.classcontext.set_eval_answerer() url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['Conference']) login_as(eval_profile, self) data = {'day': "02-06-2016"} response = self.client.get(url, data=data) eval_link = reverse( "eval_event", args=[self.classcontext.sched_event.pk, ], urlconf="gbe.scheduling.urls") self.assertNotContains(response, "%s?next=%s" % ( eval_link, url)) self.assertContains(response, "You have already rated this class") def test_eval_ready(self): self.classcontext.setup_eval() url = reverse('calendar', urlconf="gbe.scheduling.urls", args=['Conference']) data = {'day': "02-06-2016"} response = self.client.get(url, data=data) eval_link = reverse( "eval_event", args=[self.classcontext.sched_event.pk, ], urlconf="gbe.scheduling.urls") self.assertContains(response, "%s?next=%s" % ( eval_link, url))
class TestVolunteerSignupView(TestCase): def setUp(self): self.url = reverse('volunteer_signup', urlconf="gbe.scheduling.urls") self.client = Client() self.profile = ProfileFactory() clear_conferences() conference = ConferenceFactory() save_the_date = datetime(2016, 2, 6, 12, 0, 0) day = ConferenceDayFactory(conference=conference, day=date(2016, 0o2, 0o6)) self.staffcontext = StaffAreaContext(conference=conference, starttime=save_the_date) self.volunteeropp = self.staffcontext.add_volunteer_opp() def basic_event_check(self, response, conference, occurrence, image, action="on"): self.assertContains(response, conference.conference_name) self.assertContains(response, occurrence.eventitem.child().e_title) self.assertContains(response, occurrence.start_time.strftime("%-I:%M %p")) self.assertContains(response, occurrence.end_time.strftime("%-I:%M %p")) self.assertContains(response, image) self.assertContains( response, reverse('set_volunteer', args=[occurrence.pk, action], urlconf="gbe.scheduling.urls")) def test_signup_w_available_slot(self): other_conference = ConferenceFactory(status='completed') response = self.client.get(self.url) self.assertNotContains(response, other_conference.conference_name) self.basic_event_check(response, self.staffcontext.conference, self.volunteeropp, "not_yet_volunteered.gif") self.assertContains(response, volunteer_instructions) self.assertContains(response, "btn btn-default disabled", 2) def test_signup_w_need_approval_slot(self): self.volunteeropp.approval_needed = True self.volunteeropp.save() response = self.client.get(self.url) self.basic_event_check(response, self.staffcontext.conference, self.volunteeropp, "needs_approval.gif") self.assertContains(response, pending_note) def test_signup_w_signed_up_slot(self): UserMessage.objects.all().delete() msg = UserMessageFactory(view='VolunteerSignupView', code='VOLUNTEER_INSTRUCTIONS') self.staffcontext.book_volunteer( volunteer_sched_event=self.volunteeropp, volunteer=self.profile) login_as(self.profile, self) response = self.client.get( "%s?conference=%s" % (self.url, self.staffcontext.conference.conference_slug)) self.basic_event_check(response, self.staffcontext.conference, self.volunteeropp, "volunteered.gif", action="off") self.assertContains(response, msg.description) def test_signup_w_approved_slot(self): UserMessage.objects.all().delete() msg = UserMessageFactory(view='VolunteerSignupView', code='PENDING_INSTRUCTIONS') self.volunteeropp.approval_needed = True self.volunteeropp.save() self.staffcontext.book_volunteer( volunteer_sched_event=self.volunteeropp, volunteer=self.profile) login_as(self.profile, self) response = self.client.get(self.url) self.basic_event_check(response, self.staffcontext.conference, self.volunteeropp, "approved.gif", action="off") self.assertContains(response, msg.description) def test_signup_w_pending_slot(self): self.volunteeropp.approval_needed = True self.volunteeropp.save() self.staffcontext.book_volunteer( volunteer_sched_event=self.volunteeropp, volunteer=self.profile, role="Pending Volunteer") login_as(self.profile, self) response = self.client.get(self.url) self.basic_event_check(response, self.staffcontext.conference, self.volunteeropp, "awaiting_approval.gif", action="off") self.assertContains(response, self.staffcontext.area.description) def test_signup_w_waitlisted_volunteer(self): self.volunteeropp.approval_needed = True self.volunteeropp.save() self.staffcontext.book_volunteer( volunteer_sched_event=self.volunteeropp, volunteer=self.profile, role="Waitlisted") login_as(self.profile, self) response = self.client.get(self.url) self.basic_event_check(response, self.staffcontext.conference, self.volunteeropp, "awaiting_approval.gif", action="off") self.assertContains(response, self.staffcontext.area.description) def test_other_days(self): earlier_day = ConferenceDayFactory( conference=self.staffcontext.conference, day=date(2016, 0o2, 0o5)) later_day = ConferenceDayFactory( conference=self.staffcontext.conference, day=date(2016, 0o2, 0o7)) login_as(self.profile, self) response = self.client.get("%s?day=02-06-2016" % self.url) self.assertContains(response, "?day=02-05-2016") self.assertContains(response, "?day=02-07-2016") def test_no_conference_days(self): clear_conferences() ConferenceFactory(status='upcoming') response = self.client.get(self.url) self.assertContains(response, 'This calendar is not currently available.') def test_bad_day(self): # There is a day, but that's not the day we're asking for. url = "%s?day=02-02-2016" % self.url response = self.client.get(url, follow=True) self.assertEqual(response.status_code, 404) def test_no_events(self): earlier_day = ConferenceDayFactory( conference=self.staffcontext.conference, day=date(2016, 0o2, 0o5)) login_as(self.profile, self) response = self.client.get("%s?day=02-05-2016" % self.url) self.assertContains( response, "There are no volunteer events scheduled for this day.") def test_two_upcoming_conf(self): second_conference = ConferenceFactory() save_the_date = datetime(2017, 2, 6, 12, 0, 0) second_day = ConferenceDayFactory(conference=second_conference, day=date(2017, 0o2, 0o6)) staffcontext = StaffAreaContext(conference=second_conference, starttime=save_the_date) volunteeropp = staffcontext.add_volunteer_opp() login_as(self.profile, self) response = self.client.get( "%s?conference=%s" % (self.url, second_conference.conference_slug)) self.assertContains(response, staffcontext.conference.conference_name) self.assertContains(response, volunteeropp.eventitem.e_title) def test_no_space_in_event(self): full_opp = self.staffcontext.add_volunteer_opp() full_opp.max_volunteer = 0 full_opp.save() response = self.client.get(self.url) self.assertNotContains(response, full_opp.eventitem.e_title) def test_user_is_rejected(self): self.staffcontext.book_volunteer( volunteer_sched_event=self.volunteeropp, volunteer=self.profile, role="Rejected") login_as(self.profile, self) response = self.client.get(self.url) self.assertNotContains(response, self.volunteeropp.eventitem.e_title) def test_slot_with_show(self): vol_context = VolunteerContext() login_as(vol_context.profile, self) response = self.client.get( "%s?conference=%s" % (self.url, vol_context.conference.conference_slug)) self.basic_event_check(response, vol_context.conference, vol_context.opp_event, "volunteered.gif", action="off") self.assertContains(response, vol_context.event.e_title) self.assertContains( response, reverse("detail_view", urlconf="gbe.scheduling.urls", args=[vol_context.event.pk]))
class TestManageWorker(TestCase): view_name = "manage_workers" def setUp(self): self.client = Client() self.user = ProfileFactory.create().user_object self.privileged_profile = ProfileFactory() self.privileged_user = self.privileged_profile.user_object grant_privilege(self.privileged_user, 'Volunteer Coordinator') grant_privilege(self.privileged_user, 'Scheduling Mavens') self.context = StaffAreaContext() self.volunteer_opp = self.context.add_volunteer_opp() self.volunteer, self.alloc = self.context.book_volunteer( self.volunteer_opp) self.url = reverse(self.view_name, args=[ self.context.conference.conference_slug, self.volunteer_opp.pk ], urlconf="gbe.scheduling.urls") def get_edit_data(self): data = self.get_either_data() data['alloc_id'] = self.alloc.pk return data def get_create_data(self): data = self.get_either_data() data['alloc_id'] = -1 return data def get_either_data(self): data = { 'worker': self.volunteer.pk, 'role': 'Volunteer', 'label': 'Do these notes work?' } return data def assert_post_contents(self, response, volunteer_opp, volunteer, alloc, notes, role="Volunteer", allocations=2): if volunteer == -1: self.assertContains( response, '<option value="" selected="selected">---------</option>') else: self.assertContains( response, '<option value="' + str(volunteer.pk) + '" selected="selected">' + str(volunteer) + '</option>') self.assertContains( response, '<option value="' + role + '" selected="selected">' + role + '</option>') self.assertContains( response, '<input id="id_alloc_id" name="alloc_id" type="hidden" value="' + str(alloc.pk) + '" />') self.assertContains( response, '<input id="id_label" maxlength="100" name="label" type="text" ' + 'value="' + notes + '" />') self.assertContains( response, '<form method="POST" action="%s' % (reverse('manage_workers', urlconf='gbe.scheduling.urls', args=[ volunteer_opp.eventitem.e_conference.conference_slug, volunteer_opp.pk ]))) def assert_good_post(self, response, volunteer_opp, volunteer, alloc, notes, role="Volunteer", allocations=2): self.assertRedirects( response, "%s?worker_open=True&changed_id=%d" % (reverse('edit_volunteer', urlconf='gbe.scheduling.urls', args=[ volunteer_opp.eventitem.e_conference.conference_slug, volunteer_opp.pk ]), alloc.pk)) self.assert_post_contents( response, volunteer_opp, volunteer, alloc, notes, role, allocations, ) self.assertNotContains(response, '<ul class="errorlist">') def test_no_login_gives_error(self): response = self.client.get(self.url, follow=True) redirect_url = reverse('login', urlconf='gbe.urls') + "/?next=" + self.url self.assertRedirects(response, redirect_url) self.assertTrue(is_login_page(response)) def test_bad_user(self): login_as(ProfileFactory(), self) response = self.client.post(self.url, data=self.get_create_data()) self.assertEqual(response.status_code, 403) def test_post_form_valid_make_new_allocation(self): context = StaffAreaContext() volunteer_opp = context.add_volunteer_opp() allocations = volunteer_opp.resources_allocated.all() volunteer = ProfileFactory() url = reverse( self.view_name, args=[context.conference.conference_slug, volunteer_opp.pk], urlconf="gbe.scheduling.urls") data = self.get_create_data() data['worker'] = volunteer.pk, login_as(self.privileged_profile, self) response = self.client.post(url, data=data, follow=True) alloc = volunteer_opp.resources_allocated.all().order_by( 'pk').reverse().first() self.assertIsNotNone(alloc) self.assert_good_post(response, volunteer_opp, volunteer, alloc, 'Do these notes work?', allocations=3) assert len(volunteer.volunteering.all().filter( b_conference=volunteer_opp.eventitem.get_conference())) == 1 def test_post_form_valid_make_new_allocation_volunteer_exists(self): context = StaffAreaContext() volunteer_opp = context.add_volunteer_opp() volunteer = VolunteerFactory(submitted=False, accepted=2, b_conference=context.conference) VolunteerInterestFactory( volunteer=volunteer, interest=volunteer_opp.as_subtype.volunteer_type) url = reverse( self.view_name, args=[context.conference.conference_slug, volunteer_opp.pk], urlconf="gbe.scheduling.urls") data = self.get_create_data() data['worker'] = volunteer.profile.pk, login_as(self.privileged_profile, self) response = self.client.post(url, data=data, follow=True) alloc = volunteer_opp.resources_allocated.all().order_by( 'pk').reverse().first() self.assertIsNotNone(alloc) self.assert_good_post(response, volunteer_opp, volunteer.profile, alloc, 'Do these notes work?', allocations=3) assert len(volunteer.profile.volunteering.all().filter( b_conference=volunteer_opp.eventitem.get_conference())) == 1 updated = get_object_or_404(Volunteer, pk=volunteer.pk) assert updated.submitted assert updated.accepted == 3 def test_post_form_edit_exiting_allocation(self): new_volunteer = ProfileFactory() data = self.get_edit_data() data['worker'] = new_volunteer.pk, data['role'] = 'Producer', login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assert_good_post(response, self.volunteer_opp, new_volunteer, self.alloc, 'Do these notes work?', "Producer") def test_post_form_edit_bad_label(self): big_label = 'Do these notes work?Do these notes work?' + \ 'Do these notes work?Do these notes work?' + \ 'Do these notes work?Do these notes work?' + \ 'Do these notes work?Do these notes work?' data = self.get_edit_data() data['label'] = big_label login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assertEqual(response.status_code, 200) self.assert_post_contents(response, self.volunteer_opp, self.volunteer, self.alloc, big_label) self.assertContains( response, '<li>Ensure this value has at most 100 characters ' + '(it has ' + str(len(big_label)) + ').</li>') def test_post_form_edit_bad_role(self): data = self.get_edit_data() data['role'] = '' login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assertEqual(response.status_code, 200) self.assert_post_contents(response, self.volunteer_opp, self.volunteer, self.alloc, 'Do these notes work?') self.assertContains(response, '<li>This field is required.</li>') def test_post_form_edit_bad_role_and_booking(self): data = self.get_edit_data() data['role'] = '' data['alloc_id'] = self.alloc.pk + 100 login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) assert_alert_exists( response, 'danger', 'Error', 'BOOKING_NOT_FOUND Booking id %s for occurrence %d not found' % (self.alloc.pk + 100, self.volunteer_opp.pk)) def test_post_form_create_bad_role(self): data = self.get_create_data() data['role'] = '', login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assertEqual(response.status_code, 200) self.assert_post_contents(response, self.volunteer_opp, self.volunteer, self.alloc, 'Do these notes work?') self.assertContains(response, '<li>This field is required.</li>') self.assertContains( response, '<a href="#" data-toggle="tooltip" title="Delete">', count=1) self.assertContains(response, '<a href="#" data-toggle="tooltip" title="Edit">', count=1) self.assertContains( response, '<a href="#" data-toggle="tooltip" title="Create New">', count=1) def test_post_form_valid_delete_allocation(self): data = self.get_edit_data() data['delete'] = 1 login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assertRedirects( response, "%s?worker_open=True&changed_id=%d" % (reverse('edit_volunteer', urlconf='gbe.scheduling.urls', args=[ self.context.conference.conference_slug, self.volunteer_opp.pk ]), self.alloc.pk)) self.assertNotContains( response, '<option value="' + str(self.volunteer.pk) + '" selected="selected">' + str(self.volunteer) + '</option>') self.assertNotContains( response, '<input id="id_alloc_id" name="alloc_id" type="hidden" value="' + str(self.alloc.pk) + '" />') self.assertContains( response, '<form method="POST" action="%s' % (reverse(self.view_name, urlconf='gbe.scheduling.urls', args=[ self.context.conference.conference_slug, self.volunteer_opp.pk ]))) def test_post_form_valid_delete_allocation_sends_notification(self): data = self.get_edit_data() data['delete'] = 1 login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assertRedirects( response, "%s?worker_open=True&changed_id=%d" % (reverse('edit_volunteer', urlconf='gbe.scheduling.urls', args=[ self.context.conference.conference_slug, self.volunteer_opp.pk ]), self.alloc.pk)) msg = assert_email_template_used( "A change has been made to your Volunteer Schedule!") assert ("http://%s%s" % (Site.objects.get_current().domain, reverse('home', urlconf='gbe.urls')) in msg.body) def test_post_form_valid_notification_template_fail(self): EmailTemplateSenderFactory( from_email="*****@*****.**", template__name='volunteer schedule update', template__subject="test template", template__content="stuff {% url 'gbehome' %} more stuff") data = self.get_edit_data() data['delete'] = 1 login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assertRedirects( response, "%s?worker_open=True&changed_id=%d" % (reverse('edit_volunteer', urlconf='gbe.scheduling.urls', args=[ self.context.conference.conference_slug, self.volunteer_opp.pk ]), self.alloc.pk)) self.assertContains(response, volunteer_allocate_email_fail_msg) def test_post_form_valid_delete_allocation_w_bad_data(self): data = self.get_edit_data() data['role'] = '' data['delete'] = 1 login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assertContains(response, 'This field is required.') def test_post_form_valid_delete_allocation_w_no_alloc(self): data = self.get_edit_data() data['alloc_id'] = '' data['delete'] = 1 login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) assert_alert_exists( response, 'danger', 'Error', 'NO_BOOKING No booking id for occurrence id %d.' % (self.volunteer_opp.pk)) def test_post_form_valid_delete_allocation_w_bad_alloc(self): data = self.get_edit_data() data['alloc_id'] = self.alloc.pk + 100 data['delete'] = 1 login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) assert_alert_exists( response, 'danger', 'Error', 'BOOKING_NOT_FOUND Could not find booking id ' + '%d for occurrence id %d.' % (self.alloc.pk + 100, self.volunteer_opp.pk)) def test_post_form_edit_exiting_allocation(self): new_volunteer = ProfileFactory() data = self.get_edit_data() data['worker'] = new_volunteer.pk, data['role'] = 'Producer', login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) assert_email_template_used( "A change has been made to your Volunteer Schedule!") def test_post_form_edit_notification_template_fail(self): EmailTemplateSenderFactory( from_email="*****@*****.**", template__name='volunteer schedule update', template__subject="test template", template__content="stuff {% url 'gbehome' %} more stuff") new_volunteer = ProfileFactory() data = self.get_edit_data() data['worker'] = new_volunteer.pk, data['role'] = 'Producer', login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assertContains(response, volunteer_allocate_email_fail_msg) def test_post_form_valid_make_new_allocation_w_confict(self): data = self.get_create_data() login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) assert_alert_exists( response, 'warning', 'Warning', 'SCHEDULE_CONFLICT <br>- Affected user: %s<br>- ' % (self.volunteer.display_name) + 'Conflicting booking: %s, Start Time: %s' % (self.volunteer_opp.eventitem.e_title, 'Fri, Feb 5 12:00 PM')) def test_post_form_valid_make_new_allocation_w_overfull(self): data = self.get_create_data() login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assertContains(response, "Over booked by 1 volunteers") def test_post_form_edit_w_conflict(self): overbook_opp = self.context.add_volunteer_opp() self.context.book_volunteer(volunteer_sched_event=overbook_opp, volunteer=self.volunteer) data = self.get_edit_data() login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) assert_alert_exists( response, 'warning', 'Warning', 'SCHEDULE_CONFLICT <br>- Affected user: %s<br>- ' % (self.volunteer.display_name) + 'Conflicting booking: %s, Start Time: %s' % (self.volunteer_opp.eventitem.e_title, 'Fri, Feb 5 12:00 PM'))
class TestEventList(TestCase): view_name = 'manage_event_list' def setUp(self): AvailableInterest.objects.all().delete() self.client = Client() self.user = ProfileFactory.create().user_object self.privileged_profile = ProfileFactory() self.privileged_user = self.privileged_profile.user_object grant_privilege(self.privileged_user, 'Scheduling Mavens') self.url = reverse(self.view_name, urlconf="gbe.scheduling.urls") self.volunteer_context = VolunteerContext() self.day = self.volunteer_context.window.day self.class_context = ClassContext(conference=self.day.conference) self.another_interest = AvailableInterestFactory(interest="one more") self.show_context = ShowContext(conference=self.day.conference) self.staff_context = StaffAreaContext(conference=self.day.conference) booking, self.vol_opp = self.staff_context.book_volunteer() def assert_visible_input_selected( self, response, conf_slug, input_field, input_index, value, checked=True): if checked: checked = 'checked="checked" ' else: checked = '' template_input = '<input %sid="id_%s-%s_%d" name="%s-%s" ' + \ 'type="checkbox" value="%d" />' assert_string = template_input % ( checked, conf_slug, input_field, input_index, conf_slug, input_field, value) self.assertContains(response, assert_string) def assert_hidden_input_selected( self, response, conf_slug, input_field, input_index, value, exists=True): template_input = '<input id="id_%s-%s_%d" name="%s-%s" ' + \ 'type="hidden" value="%d" />' assert_string = template_input % ( conf_slug, input_field, input_index, conf_slug, input_field, value) if exists: self.assertContains(response, assert_string) else: self.assertNotContains(response, assert_string) def test_no_login_gives_error(self): response = self.client.get(self.url) self.assertEqual(response.status_code, 302) def test_bad_user(self): login_as(ProfileFactory(), self) response = self.client.get(self.url) self.assertEqual(response.status_code, 403) def test_good_user_get_success(self): old_conf_day = ConferenceDayFactory( conference__status="completed", day=self.day.day + timedelta(3)) login_as(self.privileged_profile, self) response = self.client.get(self.url) self.assertEqual(response.status_code, 200) s = '<li role="presentation" class="active">\n' + \ ' <a href = "%s?">%s</a></li>' self.assertContains( response, s % (reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[self.day.conference.conference_slug]), self.day.conference.conference_slug)) s = '<li role="presentation" >\n <a href = "%s?">%s</a></li>' self.assertContains( response, s % (reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[old_conf_day.conference.conference_slug]), old_conf_day.conference.conference_slug)) self.assertContains( response, self.day.day.strftime(DATE_FORMAT)) self.assertNotContains( response, old_conf_day.day.strftime(DATE_FORMAT)) def test_good_user_get_interests(self): old_interest = AvailableInterestFactory( visible=False, interest="old interest") login_as(self.privileged_profile, self) response = self.client.get(self.url) self.assertEqual(response.status_code, 200) self.assertContains( response, self.another_interest.interest) self.assertNotContains( response, old_interest.interest) def test_good_user_get_staff_area(self): other_staff_context = StaffAreaContext() login_as(self.privileged_profile, self) response = self.client.get(self.url) self.assertEqual(response.status_code, 200) self.assertContains( response, self.staff_context.area.title) self.assertNotContains( response, other_staff_context.area.title) def test_good_user_get_create_edit(self): login_as(self.privileged_profile, self) data = { "%s-calendar_type" % self.day.conference.conference_slug: [ 0, 1, 2], "filter": "Filter", } response = self.client.get(self.url, data) self.assertEqual(response.status_code, 200) self.assertContains( response, '<i class="fa fa-pencil" aria-hidden="true">') def test_good_user_get_success_pick_conf(self): old_conf_day = ConferenceDayFactory( conference__status="completed", day=self.day.day + timedelta(3)) login_as(self.privileged_profile, self) url = reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[old_conf_day.conference.conference_slug]) response = self.client.get(url) self.assertEqual(response.status_code, 200) s = '<li role="presentation" class="active">\n' + \ ' <a href = "%s?">%s</a></li>' self.assertContains( response, s % (url, old_conf_day.conference.conference_slug)) s = '<li role="presentation" >\n <a href = "%s?">%s</a></li>' self.assertContains( response, s % (reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[self.day.conference.conference_slug]), self.day.conference.conference_slug)) self.assertContains( response, old_conf_day.day.strftime(DATE_FORMAT)) self.assertNotContains( response, self.day.day.strftime(DATE_FORMAT)) def test_good_user_get_no_create_edit(self): old_conf_day = ConferenceDayFactory( conference__status="completed", day=self.day.day + timedelta(3)) context = ClassContext(conference=old_conf_day.conference) data = { "%s-calendar_type" % old_conf_day.conference.conference_slug: [ 0, 1, 2], "filter": "Filter", } login_as(self.privileged_profile, self) url = reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[old_conf_day.conference.conference_slug]) response = self.client.get(url, data) self.assertContains( response, '<i class="fa fa-trash-o" aria-hidden="true">') self.assertNotContains( response, '<i class="fa fa-pencil" aria-hidden="true">') self.assertNotContains( response, '<i class="fa fa-plus" aria-hidden="true">') def test_good_user_get_conference_cal(self): login_as(self.privileged_profile, self) data = { "%s-calendar_type" % self.day.conference.conference_slug: 1, "filter": "Filter", } response = self.client.get(self.url, data=data) self.assertEqual(response.status_code, 200) self.assertContains(response, self.class_context.bid.e_title) self.assert_visible_input_selected( response, self.day.conference.conference_slug, "calendar_type", 1, 1) self.assert_visible_input_selected( response, self.day.conference.conference_slug, "calendar_type", 0, 0, checked=False) def test_good_user_get_conference_bad_filter(self): login_as(self.privileged_profile, self) data = { "%s-calendar_type" % self.day.conference.conference_slug: "bad", "filter": "Filter", } response = self.client.get(self.url, data=data) self.assertEqual(response.status_code, 200) self.assertContains( response, "Select a valid choice. bad is not one of the available choices.") def test_good_user_get_all_cals(self): login_as(self.privileged_profile, self) data = { "%s-calendar_type" % self.day.conference.conference_slug: [ 0, 1, 2], "filter": "Filter", } response = self.client.get(self.url, data=data) self.assertEqual(response.status_code, 200) self.assertContains(response, self.class_context.bid.e_title) self.assertContains(response, self.show_context.show.e_title) self.assertContains(response, self.vol_opp.event.eventitem.e_title) self.assertContains(response, '<td class="bid-table">Volunteer</td>') for value in range(0, 2): self.assert_visible_input_selected( response, self.day.conference.conference_slug, "calendar_type", 1, 1) def test_good_user_get_day(self): login_as(self.privileged_profile, self) data = { "%s-day" % self.day.conference.conference_slug: self.day.pk, "filter": "Filter", } response = self.client.get(self.url, data=data) self.assertEqual(response.status_code, 200) self.assertContains(response, self.show_context.show.e_title) self.assertContains(response, self.class_context.bid.e_title) counter = 0 for day in self.day.conference.conferenceday_set.all().order_by('day'): self.assert_visible_input_selected( response, self.day.conference.conference_slug, "day", counter, day.pk, checked=(day == self.day)) counter += 1 for value in range(0, 2): self.assert_visible_input_selected( response, self.day.conference.conference_slug, "calendar_type", 1, 1, checked=False) def test_good_user_get_empty_day(self): new_day = ConferenceDayFactory(conference=self.day.conference, day=self.day.day+timedelta(14)) login_as(self.privileged_profile, self) data = { "%s-day" % self.day.conference.conference_slug: new_day.pk, "filter": "Filter", } response = self.client.get(self.url, data=data) self.assertEqual(response.status_code, 200) self.assertNotContains(response, self.show_context.show.e_title) self.assertNotContains(response, self.class_context.bid.e_title) counter = 0 for day in self.day.conference.conferenceday_set.all().order_by('day'): self.assert_visible_input_selected( response, self.day.conference.conference_slug, "day", counter, day.pk, checked=(day == new_day)) counter += 1 def test_good_user_get_volunteer_type(self): login_as(self.privileged_profile, self) data = { "%s-volunteer_type" % self.day.conference.conference_slug: self.volunteer_context.interest.interest.pk, "filter": "Filter", } url = reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[self.volunteer_context.conference.conference_slug]) response = self.client.get(url, data=data) self.assertEqual(response.status_code, 200) self.assertContains(response, self.volunteer_context.opportunity.e_title) self.assertNotContains(response, self.show_context.show.e_title) self.assertNotContains(response, self.class_context.bid.e_title) self.assert_visible_input_selected( response, self.day.conference.conference_slug, "volunteer_type", 2, self.volunteer_context.interest.interest.pk) def test_good_user_get_bad_volunteer_type(self): login_as(self.privileged_profile, self) data = { "%s-volunteer_type" % self.day.conference.conference_slug: "bad", "filter": "Filter", } response = self.client.get(self.url, data=data) self.assertEqual(response.status_code, 200) self.assertContains( response, '"bad" is not a valid value for a primary key') def test_good_user_filter_staff_area(self): other_staff_area = StaffAreaContext( conference=self.day.conference ) login_as(self.privileged_profile, self) data = { "%s-staff_area" % self.day.conference.conference_slug: ( self.staff_context.area.pk), "filter": "Filter", } response = self.client.get(self.url, data=data) self.assertEqual(response.status_code, 200) self.assertContains(response, self.vol_opp.event.eventitem.e_title) index = 0 for area in StaffArea.objects.filter( conference=self.day.conference).order_by('title'): self.assert_visible_input_selected( response, self.day.conference.conference_slug, "staff_area", index, area.pk, checked=(area == self.staff_context.area)) index += 1 def test_switch_conf_keep_filter(self): old_conf_day = ConferenceDayFactory( conference__status="completed", day=self.day.day + timedelta(3)) url = reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[old_conf_day.conference.conference_slug]) login_as(self.privileged_profile, self) data = { "%s-day" % self.day.conference.conference_slug: self.day.pk, "%s-calendar_type" % self.day.conference.conference_slug: 1, "%s-day" % old_conf_day.conference.conference_slug: ( old_conf_day.pk), "%s-calendar_type" % old_conf_day.conference.conference_slug: 0, "%s-staff_area" % self.day.conference.conference_slug: ( self.staff_context.area.pk), "filter": "Filter", } response = self.client.get(url, data=data) self.assertEqual(response.status_code, 200) self.assertNotContains(response, self.show_context.show.e_title) self.assertNotContains(response, self.class_context.bid.e_title) for day in self.day.conference.conferenceday_set.all().order_by('day'): self.assert_hidden_input_selected( response, self.day.conference.conference_slug, "day", 0, day.pk, exists=(day == self.day)) self.assert_hidden_input_selected( response, self.day.conference.conference_slug, "calendar_type", 0, 1) self.assert_hidden_input_selected( response, self.day.conference.conference_slug, "calendar_type", 0, 0, False) self.assert_hidden_input_selected( response, self.day.conference.conference_slug, "staff_area", 0, self.staff_context.area.pk)
class TestManageWorker(TestCase): view_name = "manage_workers" def setUp(self): self.client = Client() self.user = ProfileFactory.create().user_object self.privileged_profile = ProfileFactory() self.privileged_user = self.privileged_profile.user_object grant_privilege(self.privileged_user, 'Volunteer Coordinator') grant_privilege(self.privileged_user, 'Scheduling Mavens') self.context = StaffAreaContext() self.volunteer_opp = self.context.add_volunteer_opp() self.volunteer, self.alloc = self.context.book_volunteer( self.volunteer_opp) self.url = reverse( self.view_name, args=[self.context.conference.conference_slug, self.volunteer_opp.pk], urlconf="gbe.scheduling.urls") def get_edit_data(self): data = self.get_either_data() data['alloc_id'] = self.alloc.pk return data def get_create_data(self): data = self.get_either_data() data['alloc_id'] = -1 return data def get_either_data(self): data = {'worker': self.volunteer.pk, 'role': 'Volunteer', 'label': 'Do these notes work?'} return data def assert_post_contents(self, response, volunteer_opp, volunteer, alloc, notes, role="Volunteer", allocations=2): if volunteer == -1: self.assertContains( response, '<option value="" selected="selected">---------</option>') else: self.assertContains( response, '<option value="' + str(volunteer.pk) + '" selected="selected">' + str(volunteer) + '</option>') self.assertContains( response, '<option value="' + role + '" selected="selected">' + role + '</option>') self.assertContains( response, '<input id="id_alloc_id" name="alloc_id" type="hidden" value="' + str(alloc.pk) + '" />') self.assertContains( response, '<input id="id_label" maxlength="100" name="label" type="text" ' + 'value="' + notes + '" />') self.assertContains( response, '<form method="POST" action="%s' % (reverse( 'manage_workers', urlconf='gbe.scheduling.urls', args=[volunteer_opp.eventitem.e_conference.conference_slug, volunteer_opp.pk]))) def assert_good_post(self, response, volunteer_opp, volunteer, alloc, notes, role="Volunteer", allocations=2): self.assertRedirects( response, "%s?worker_open=True&changed_id=%d" % ( reverse( 'edit_volunteer', urlconf='gbe.scheduling.urls', args=[volunteer_opp.eventitem.e_conference.conference_slug, volunteer_opp.pk]), alloc.pk)) self.assert_post_contents(response, volunteer_opp, volunteer, alloc, notes, role, allocations,) self.assertNotContains(response, '<ul class="errorlist">') def test_no_login_gives_error(self): response = self.client.get(self.url, follow=True) redirect_url = reverse( 'login', urlconf='gbe.urls') + "/?next=" + self.url self.assertRedirects(response, redirect_url) self.assertTrue(is_login_page(response)) def test_bad_user(self): login_as(ProfileFactory(), self) response = self.client.post(self.url, data=self.get_create_data()) self.assertEqual(response.status_code, 403) def test_post_form_valid_make_new_allocation(self): context = StaffAreaContext() volunteer_opp = context.add_volunteer_opp() allocations = volunteer_opp.resources_allocated.all() volunteer = ProfileFactory() url = reverse(self.view_name, args=[context.conference.conference_slug, volunteer_opp.pk], urlconf="gbe.scheduling.urls") data = self.get_create_data() data['worker'] = volunteer.pk, login_as(self.privileged_profile, self) response = self.client.post(url, data=data, follow=True) alloc = volunteer_opp.resources_allocated.all().order_by( 'pk').reverse().first() self.assertIsNotNone(alloc) self.assert_good_post( response, volunteer_opp, volunteer, alloc, 'Do these notes work?', allocations=3) assert len(volunteer.volunteering.all().filter( b_conference=volunteer_opp.eventitem.get_conference())) == 1 def test_post_form_valid_make_new_allocation_volunteer_exists(self): context = StaffAreaContext() volunteer_opp = context.add_volunteer_opp() volunteer = VolunteerFactory( submitted=False, accepted=2, b_conference=context.conference) VolunteerInterestFactory( volunteer=volunteer, interest=volunteer_opp.as_subtype.volunteer_type) url = reverse(self.view_name, args=[context.conference.conference_slug, volunteer_opp.pk], urlconf="gbe.scheduling.urls") data = self.get_create_data() data['worker'] = volunteer.profile.pk, login_as(self.privileged_profile, self) response = self.client.post(url, data=data, follow=True) alloc = volunteer_opp.resources_allocated.all().order_by( 'pk').reverse().first() self.assertIsNotNone(alloc) self.assert_good_post( response, volunteer_opp, volunteer.profile, alloc, 'Do these notes work?', allocations=3) assert len(volunteer.profile.volunteering.all().filter( b_conference=volunteer_opp.eventitem.get_conference())) == 1 updated = get_object_or_404(Volunteer, pk=volunteer.pk) assert updated.submitted assert updated.accepted == 3 def test_post_form_edit_exiting_allocation(self): new_volunteer = ProfileFactory() data = self.get_edit_data() data['worker'] = new_volunteer.pk, data['role'] = 'Producer', login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assert_good_post( response, self.volunteer_opp, new_volunteer, self.alloc, 'Do these notes work?', "Producer") def test_post_form_edit_bad_label(self): big_label = 'Do these notes work?Do these notes work?' + \ 'Do these notes work?Do these notes work?' + \ 'Do these notes work?Do these notes work?' + \ 'Do these notes work?Do these notes work?' data = self.get_edit_data() data['label'] = big_label login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assertEqual(response.status_code, 200) self.assert_post_contents( response, self.volunteer_opp, self.volunteer, self.alloc, big_label) self.assertContains( response, '<li>Ensure this value has at most 100 characters ' + '(it has ' + str(len(big_label)) + ').</li>') def test_post_form_edit_bad_role(self): data = self.get_edit_data() data['role'] = '' login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assertEqual(response.status_code, 200) self.assert_post_contents( response, self.volunteer_opp, self.volunteer, self.alloc, 'Do these notes work?') self.assertContains( response, '<li>This field is required.</li>') def test_post_form_edit_bad_role_and_booking(self): data = self.get_edit_data() data['role'] = '' data['alloc_id'] = self.alloc.pk + 100 login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) assert_alert_exists( response, 'danger', 'Error', 'BOOKING_NOT_FOUND Booking id %s for occurrence %d not found' % ( self.alloc.pk + 100, self.volunteer_opp.pk)) def test_post_form_create_bad_role(self): data = self.get_create_data() data['role'] = '', login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assertEqual(response.status_code, 200) self.assert_post_contents( response, self.volunteer_opp, self.volunteer, self.alloc, 'Do these notes work?') self.assertContains( response, '<li>This field is required.</li>') self.assertContains( response, '<a href="#" data-toggle="tooltip" title="Delete">', count=1) self.assertContains( response, '<a href="#" data-toggle="tooltip" title="Edit">', count=1) self.assertContains( response, '<a href="#" data-toggle="tooltip" title="Create New">', count=1) def test_post_form_valid_delete_allocation(self): data = self.get_edit_data() data['delete'] = 1 login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assertRedirects( response, "%s?worker_open=True&changed_id=%d" % ( reverse('edit_volunteer', urlconf='gbe.scheduling.urls', args=[self.context.conference.conference_slug, self.volunteer_opp.pk]), self.alloc.pk)) self.assertNotContains( response, '<option value="' + str(self.volunteer.pk) + '" selected="selected">' + str(self.volunteer) + '</option>') self.assertNotContains( response, '<input id="id_alloc_id" name="alloc_id" type="hidden" value="' + str(self.alloc.pk) + '" />') self.assertContains( response, '<form method="POST" action="%s' % (reverse( self.view_name, urlconf='gbe.scheduling.urls', args=[self.context.conference.conference_slug, self.volunteer_opp.pk]))) def test_post_form_valid_delete_allocation_sends_notification(self): data = self.get_edit_data() data['delete'] = 1 login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assertRedirects( response, "%s?worker_open=True&changed_id=%d" % ( reverse('edit_volunteer', urlconf='gbe.scheduling.urls', args=[self.context.conference.conference_slug, self.volunteer_opp.pk]), self.alloc.pk)) msg = assert_email_template_used( "A change has been made to your Volunteer Schedule!") assert("http://%s%s" % ( Site.objects.get_current().domain, reverse('home', urlconf='gbe.urls')) in msg.body) def test_post_form_valid_notification_template_fail(self): EmailTemplateSenderFactory( from_email="*****@*****.**", template__name='volunteer schedule update', template__subject="test template", template__content="stuff {% url 'gbehome' %} more stuff" ) data = self.get_edit_data() data['delete'] = 1 login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assertRedirects( response, "%s?worker_open=True&changed_id=%d" % ( reverse('edit_volunteer', urlconf='gbe.scheduling.urls', args=[self.context.conference.conference_slug, self.volunteer_opp.pk]), self.alloc.pk)) self.assertContains(response, volunteer_allocate_email_fail_msg) def test_post_form_valid_delete_allocation_w_bad_data(self): data = self.get_edit_data() data['role'] = '' data['delete'] = 1 login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assertContains( response, 'This field is required.') def test_post_form_valid_delete_allocation_w_no_alloc(self): data = self.get_edit_data() data['alloc_id'] = '' data['delete'] = 1 login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) assert_alert_exists( response, 'danger', 'Error', 'NO_BOOKING No booking id for occurrence id %d.' % ( self.volunteer_opp.pk)) def test_post_form_valid_delete_allocation_w_bad_alloc(self): data = self.get_edit_data() data['alloc_id'] = self.alloc.pk + 100 data['delete'] = 1 login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) assert_alert_exists( response, 'danger', 'Error', 'BOOKING_NOT_FOUND Could not find booking id ' + '%d for occurrence id %d.' % (self.alloc.pk + 100, self.volunteer_opp.pk)) def test_post_form_edit_exiting_allocation(self): new_volunteer = ProfileFactory() data = self.get_edit_data() data['worker'] = new_volunteer.pk, data['role'] = 'Producer', login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) assert_email_template_used( "A change has been made to your Volunteer Schedule!") def test_post_form_edit_notification_template_fail(self): EmailTemplateSenderFactory( from_email="*****@*****.**", template__name='volunteer schedule update', template__subject="test template", template__content="stuff {% url 'gbehome' %} more stuff" ) new_volunteer = ProfileFactory() data = self.get_edit_data() data['worker'] = new_volunteer.pk, data['role'] = 'Producer', login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assertContains(response, volunteer_allocate_email_fail_msg) def test_post_form_valid_make_new_allocation_w_confict(self): data = self.get_create_data() login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) assert_alert_exists( response, 'warning', 'Warning', 'SCHEDULE_CONFLICT <br>- Affected user: %s<br>- ' % ( self.volunteer.display_name) + 'Conflicting booking: %s, Start Time: %s' % ( self.volunteer_opp.eventitem.e_title, 'Fri, Feb 5 12:00 PM') ) def test_post_form_valid_make_new_allocation_w_overfull(self): data = self.get_create_data() login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) self.assertContains(response, "Over booked by 1 volunteers") def test_post_form_edit_w_conflict(self): overbook_opp = self.context.add_volunteer_opp() self.context.book_volunteer( volunteer_sched_event=overbook_opp, volunteer=self.volunteer) data = self.get_edit_data() login_as(self.privileged_profile, self) response = self.client.post(self.url, data=data, follow=True) assert_alert_exists( response, 'warning', 'Warning', 'SCHEDULE_CONFLICT <br>- Affected user: %s<br>- ' % ( self.volunteer.display_name) + 'Conflicting booking: %s, Start Time: %s' % ( self.volunteer_opp.eventitem.e_title, 'Fri, Feb 5 12:00 PM') )
class TestManageEventList(TestCase): view_name = 'manage_event_list' conf_tab = ( '<li role="presentation"><a href="%s?" class="gbe-tab%s">%s</a></li>') def setUp(self): self.client = Client() self.user = ProfileFactory.create().user_object self.privileged_profile = ProfileFactory() self.privileged_user = self.privileged_profile.user_object grant_privilege(self.privileged_user, 'Scheduling Mavens') self.url = reverse(self.view_name, urlconf="gbe.scheduling.urls") self.volunteer_context = VolunteerContext() self.day = self.volunteer_context.conf_day self.class_context = ClassContext(conference=self.day.conference) self.show_context = ShowContext(conference=self.day.conference) self.staff_context = StaffAreaContext(conference=self.day.conference) booking, self.vol_opp = self.staff_context.book_volunteer() def assert_visible_input_selected( self, response, conf_slug, input_field, input_index, value, checked=True): if checked: checked = 'checked ' else: checked = '' template_input = '<input type="checkbox" name="%s-%s" value="%d" ' + \ 'class="form-check-input" id="id_%s-%s_%d" %s/>' assert_string = template_input % ( conf_slug, input_field, value, conf_slug, input_field, input_index, checked) self.assertContains(response, assert_string, html=True) def assert_hidden_input_selected( self, response, conf_slug, input_field, input_index, value, exists=True): template_input = '<input type="hidden" name="%s-%s" value="%d"' + \ ' id="id_%s-%s_%d" />' assert_string = template_input % ( conf_slug, input_field, value, conf_slug, input_field, input_index) if exists: self.assertContains(response, assert_string, html=True) else: self.assertNotContains(response, assert_string, html=True) def test_no_login_gives_error(self): response = self.client.get(self.url) self.assertEqual(response.status_code, 302) def test_bad_user(self): login_as(ProfileFactory(), self) response = self.client.get(self.url) self.assertEqual(response.status_code, 403) def test_good_user_get_success(self): old_conf_day = ConferenceDayFactory( conference__status="completed", day=self.day.day + timedelta(3)) login_as(self.privileged_profile, self) response = self.client.get(self.url) self.assertEqual(response.status_code, 200) self.assertContains( response, self.conf_tab % ( reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[self.day.conference.conference_slug]), '-active', self.day.conference.conference_slug), html=True) self.assertContains( response, self.conf_tab % ( reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[old_conf_day.conference.conference_slug]), '', old_conf_day.conference.conference_slug), html=True) self.assertContains( response, self.day.day.strftime(GBE_DATE_FORMAT)) self.assertNotContains( response, old_conf_day.day.strftime(GBE_DATE_FORMAT)) def test_good_user_get_staff_area(self): other_staff_context = StaffAreaContext() login_as(self.privileged_profile, self) response = self.client.get(self.url) self.assertEqual(response.status_code, 200) self.assertContains( response, self.staff_context.area.title) self.assertNotContains( response, other_staff_context.area.title) def test_good_user_get_create_edit(self): login_as(self.privileged_profile, self) data = { "%s-calendar_type" % self.day.conference.conference_slug: [ 0, 1, 2], "filter": "Filter", } response = self.client.get(self.url, data) self.assertEqual(response.status_code, 200) self.assertContains( response, '<i class="fa fa-pencil" aria-hidden="true">') def test_good_user_get_success_pick_conf(self): old_conf_day = ConferenceDayFactory( conference__status="completed", day=self.day.day + timedelta(3)) login_as(self.privileged_profile, self) url = reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[old_conf_day.conference.conference_slug]) response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertContains( response, self.conf_tab % ( url, '-active', old_conf_day.conference.conference_slug), html=True) self.assertContains( response, self.conf_tab % ( reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[self.day.conference.conference_slug]), '', self.day.conference.conference_slug), html=True) self.assertContains( response, old_conf_day.day.strftime(GBE_DATE_FORMAT)) self.assertNotContains( response, self.day.day.strftime(GBE_DATE_FORMAT)) def test_good_user_get_no_create_edit(self): old_conf_day = ConferenceDayFactory( conference__status="completed", day=self.day.day + timedelta(3)) context = ClassContext(conference=old_conf_day.conference) vol_context = VolunteerContext(conference=old_conf_day.conference) staff_context = StaffAreaContext(conference=old_conf_day.conference) booking, self.vol_opp = staff_context.book_volunteer() data = { "%s-calendar_type" % old_conf_day.conference.conference_slug: [ 0, 1, 2], "filter": "Filter", } login_as(self.privileged_profile, self) url = reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[old_conf_day.conference.conference_slug]) response = self.client.get(url, data) self.assertContains( response, '<i class="fa fa-trash-o" aria-hidden="true">') self.assertNotContains( response, '<i class="fa fa-pencil" aria-hidden="true">') self.assertNotContains( response, '<i class="fa fa-plus" aria-hidden="true">') self.assertContains(response, vol_context.opportunity.e_title) self.assertContains(response, reverse( 'detail_view', urlconf='gbe.scheduling.urls', args=[vol_context.event.eventitem_id])) self.assertContains(response, vol_context.event.e_title) self.assertNotContains(response, reverse( "edit_staff", urlconf="gbe.scheduling.urls", args=[staff_context.area.pk])) def test_good_user_get_conference_cal(self): login_as(self.privileged_profile, self) data = { "%s-calendar_type" % self.day.conference.conference_slug: 1, "filter": "Filter", } response = self.client.get(self.url, data=data) self.assertEqual(response.status_code, 200) self.assertContains(response, self.class_context.bid.e_title) self.assert_visible_input_selected( response, self.day.conference.conference_slug, "calendar_type", 1, 1) self.assert_visible_input_selected( response, self.day.conference.conference_slug, "calendar_type", 0, 0, checked=False) # conference class bids do not yet have copy feature. self.assertNotContains( response, 'href="%s" data-toggle="tooltip" title="Copy"' % ( reverse("copy_event_schedule", urlconf="gbe.scheduling.urls", args=[self.class_context.sched_event.pk]))) def test_good_user_get_conference_bad_filter(self): login_as(self.privileged_profile, self) data = { "%s-calendar_type" % self.day.conference.conference_slug: "bad", "filter": "Filter", } response = self.client.get(self.url, data=data) self.assertEqual(response.status_code, 200) self.assertContains( response, "Select a valid choice. bad is not one of the available choices.") def test_good_user_get_all_cals(self): login_as(self.privileged_profile, self) data = { "%s-calendar_type" % self.day.conference.conference_slug: [ 0, 1, 2], "filter": "Filter", } response = self.client.get(self.url, data=data) self.assertEqual(response.status_code, 200) self.assertContains(response, self.class_context.bid.e_title) self.assertContains(response, self.show_context.show.e_title) self.assertContains(response, self.vol_opp.event.eventitem.e_title) self.assertContains(response, '<td>Volunteer</td>') self.assertContains(response, self.volunteer_context.opportunity.e_title) self.assertContains( response, ('<a href="%s" class="gbe-table-link" data-toggle="tooltip" ' + 'title="Edit">%s</a>') % ( reverse('edit_event', urlconf='gbe.scheduling.urls', args=[self.day.conference.conference_slug, self.volunteer_context.sched_event.pk]), self.volunteer_context.event.e_title), html=True) for value in range(0, 2): self.assert_visible_input_selected( response, self.day.conference.conference_slug, "calendar_type", 1, 1) def test_good_user_get_day(self): login_as(self.privileged_profile, self) data = { "%s-day" % self.day.conference.conference_slug: self.day.pk, "filter": "Filter", } response = self.client.get(self.url, data=data) self.assertEqual(response.status_code, 200) self.assertContains(response, self.show_context.show.e_title) self.assertContains(response, self.class_context.bid.e_title) counter = 0 for day in self.day.conference.conferenceday_set.all().order_by('day'): self.assert_visible_input_selected( response, self.day.conference.conference_slug, "day", counter, day.pk, checked=(day == self.day)) counter += 1 for value in range(0, 2): self.assert_visible_input_selected( response, self.day.conference.conference_slug, "calendar_type", 1, 1, checked=False) def test_good_user_get_empty_day(self): new_day = ConferenceDayFactory(conference=self.day.conference, day=self.day.day+timedelta(14)) login_as(self.privileged_profile, self) data = { "%s-day" % self.day.conference.conference_slug: new_day.pk, "filter": "Filter", } response = self.client.get(self.url, data=data) self.assertEqual(response.status_code, 200) self.assertNotContains(response, self.show_context.show.e_title) self.assertNotContains(response, self.class_context.bid.e_title) counter = 0 for day in self.day.conference.conferenceday_set.all().order_by('day'): self.assert_visible_input_selected( response, self.day.conference.conference_slug, "day", counter, day.pk, checked=(day == new_day)) counter += 1 def test_good_user_filter_staff_area(self): other_staff_area = StaffAreaContext( conference=self.day.conference ) login_as(self.privileged_profile, self) data = { "%s-staff_area" % self.day.conference.conference_slug: ( self.staff_context.area.pk), "filter": "Filter", } response = self.client.get(self.url, data=data) self.assertEqual(response.status_code, 200) self.assertContains(response, self.vol_opp.event.eventitem.e_title) self.assertContains( response, ('<a href="%s" class="gbe-table-link" data-toggle="tooltip" ' + 'title="Edit">%s</a>') % ( reverse("edit_staff", urlconf="gbe.scheduling.urls", args=[self.staff_context.area.pk]), self.staff_context.area.slug), html=True) index = 0 for area in StaffArea.objects.filter( conference=self.day.conference).order_by('title'): self.assert_visible_input_selected( response, self.day.conference.conference_slug, "staff_area", index, area.pk, checked=(area == self.staff_context.area)) index += 1 def test_switch_conf_keep_filter(self): old_conf_day = ConferenceDayFactory( conference__status="completed", day=self.day.day + timedelta(3)) url = reverse(self.view_name, urlconf="gbe.scheduling.urls", args=[old_conf_day.conference.conference_slug]) login_as(self.privileged_profile, self) data = { "%s-day" % self.day.conference.conference_slug: self.day.pk, "%s-calendar_type" % self.day.conference.conference_slug: 1, "%s-day" % old_conf_day.conference.conference_slug: ( old_conf_day.pk), "%s-calendar_type" % old_conf_day.conference.conference_slug: 0, "%s-staff_area" % self.day.conference.conference_slug: ( self.staff_context.area.pk), "filter": "Filter", } response = self.client.get(url, data=data) self.assertEqual(response.status_code, 200) self.assertNotContains(response, self.show_context.show.e_title) self.assertNotContains(response, self.class_context.bid.e_title) for day in self.day.conference.conferenceday_set.all().order_by('day'): self.assert_hidden_input_selected( response, self.day.conference.conference_slug, "day", 0, day.pk, exists=(day == self.day)) self.assert_hidden_input_selected( response, self.day.conference.conference_slug, "calendar_type", 0, 1) self.assert_hidden_input_selected( response, self.day.conference.conference_slug, "calendar_type", 0, 0, False) self.assert_hidden_input_selected( response, self.day.conference.conference_slug, "staff_area", 0, self.staff_context.area.pk)
class TestSetVolunteer(TestCase): view_name = "set_volunteer" def setUp(self): self.client = Client() self.profile = ProfileFactory() self.context = StaffAreaContext() self.volunteeropp = self.context.add_volunteer_opp() self.url = reverse(self.view_name, args=[self.volunteeropp.pk, "on"], urlconf="gbe.scheduling.urls") self.unsub_link = Site.objects.get_current().domain + reverse( 'email_update', urlconf='gbe.urls' ) + "?email_disable=send_schedule_change_notifications" def test_no_login_gives_error(self): response = self.client.get(self.url, follow=True) redirect_url = reverse('register', urlconf='gbe.urls') + "?next=" + self.url self.assertRedirects(response, redirect_url) self.assertContains(response, "Create an Account") assert_alert_exists( response, 'warning', 'Warning', full_login_msg % (no_login_msg, reverse('login', urlconf='gbe.urls') + "?next=" + self.url)) def test_unfinished_user(self): unfinished = UserFactory() login_as(unfinished, self) response = self.client.get(self.url, follow=True) redirect_url = reverse('register', urlconf='gbe.urls') + "?next=" + self.url self.assertRedirects(response, redirect_url) self.assertContains(response, "Create an Account") assert_alert_exists(response, 'warning', 'Warning', no_profile_msg) def test_volunteer(self): login_as(self.profile, self) response = self.client.get(self.url, follow=True) redirect_url = reverse('home', urlconf="gbe.urls") self.assertRedirects(response, redirect_url) self.assertContains(response, self.volunteeropp.eventitem.e_title) assert_alert_exists(response, 'success', 'Success', set_volunteer_msg) msg = assert_email_template_used( "A change has been made to your Volunteer Schedule!", outbox_size=2) assert ("http://%s%s" % (Site.objects.get_current().domain, reverse('home', urlconf='gbe.urls')) in msg.body) assert_email_recipient([self.profile.user_object.email], outbox_size=2) staff_msg = assert_email_template_used("Volunteer Schedule Change", outbox_size=2, message_index=1) assert (self.volunteeropp.eventitem.e_title in staff_msg.body) assert_email_recipient( [self.context.staff_lead.profile.user_object.email], outbox_size=2, message_index=1) def test_remove_volunteer(self): self.url = reverse(self.view_name, args=[self.volunteeropp.pk, "off"], urlconf="gbe.scheduling.urls") self.context.book_volunteer(volunteer_sched_event=self.volunteeropp, volunteer=self.profile) redirect_url = reverse('volunteer_signup', urlconf="gbe.scheduling.urls") login_as(self.profile, self) response = self.client.get("%s?next=%s" % (self.url, redirect_url), follow=True) self.assertRedirects(response, redirect_url) self.assertContains(response, self.volunteeropp.eventitem.e_title) assert_alert_exists(response, 'success', 'Success', unset_volunteer_msg) msg = assert_email_template_used( "A change has been made to your Volunteer Schedule!", outbox_size=2) assert ("http://%s%s" % (Site.objects.get_current().domain, reverse('home', urlconf='gbe.urls')) in msg.body) assert_email_recipient([self.profile.user_object.email], outbox_size=2) staff_msg = assert_email_template_used("Volunteer Schedule Change", outbox_size=2, message_index=1) assert (self.volunteeropp.eventitem.e_title in staff_msg.body) assert_email_recipient( [self.context.staff_lead.profile.user_object.email], outbox_size=2, message_index=1) def test_volunteer_duplicate(self): self.context.book_volunteer(volunteer_sched_event=self.volunteeropp, volunteer=self.profile) login_as(self.profile, self) response = self.client.get(self.url, follow=True) self.assertContains(response, self.volunteeropp.eventitem.e_title) self.assertNotContains(response, set_volunteer_msg) def test_remove_interest_duplicate(self): self.url = reverse(self.view_name, args=[self.volunteeropp.pk, "off"], urlconf="gbe.scheduling.urls") login_as(self.profile, self) response = self.client.get(self.url, follow=True) self.assertNotContains(response, self.volunteeropp.eventitem.e_title) self.assertNotContains(response, unset_volunteer_msg) def test_show_interest_bad_event(self): self.url = reverse(self.view_name, args=[self.volunteeropp.pk + 100, "on"], urlconf="gbe.scheduling.urls") login_as(self.profile, self) response = self.client.get(self.url, follow=True) self.assertContains( response, "Occurrence id %d not found" % (self.volunteeropp.pk + 100)) def test_volunteer_needs_approval(self): self.volunteeropp.approval_needed = True self.volunteeropp.save() login_as(self.profile, self) response = self.client.get(self.url, follow=True) redirect_url = reverse('home', urlconf="gbe.urls") self.assertRedirects(response, redirect_url) # absent because pending events not on schedule to begin with self.assertNotContains(response, self.volunteeropp.eventitem.e_title) assert_alert_exists(response, 'success', 'Success', set_pending_msg) def test_remove_pending_volunteer(self): self.volunteeropp.approval_needed = True self.volunteeropp.save() self.url = reverse(self.view_name, args=[self.volunteeropp.pk, "off"], urlconf="gbe.scheduling.urls") self.context.book_volunteer(volunteer_sched_event=self.volunteeropp, volunteer=self.profile, role="Pending Volunteer") redirect_url = reverse('volunteer_signup', urlconf="gbe.scheduling.urls") login_as(self.profile, self) response = self.client.get("%s?next=%s" % (self.url, redirect_url), follow=True) self.assertRedirects(response, redirect_url) self.assertContains(response, self.volunteeropp.eventitem.e_title) assert_alert_exists(response, 'success', 'Success', unset_pending_msg) def test_volunteer_conflict(self): self.privileged_profile = ProfileFactory() self.privileged_user = self.privileged_profile.user_object grant_privilege(self.privileged_user, 'Volunteer Coordinator') class_context = ClassContext( conference=self.context.conference, teacher=PersonaFactory(performer_profile=self.profile), starttime=self.volunteeropp.starttime) login_as(self.profile, self) response = self.client.get(self.url, follow=True) redirect_url = reverse('home', urlconf="gbe.urls") msg = assert_email_template_used( "A change has been made to your Volunteer Schedule!", outbox_size=2) assert ("http://%s%s" % (Site.objects.get_current().domain, reverse('home', urlconf='gbe.urls')) in msg.body) assert_email_recipient([self.profile.user_object.email], outbox_size=2) staff_msg = assert_email_template_used("Volunteer Schedule Change", outbox_size=2, message_index=1) assert (self.volunteeropp.eventitem.e_title in staff_msg.body) conflict_msg = 'Conflicting booking: %s, Start Time: %s' % ( class_context.bid.e_title, class_context.sched_event.starttime.strftime(GBE_DATETIME_FORMAT)) assert (class_context.bid.e_title in staff_msg.body) assert_email_recipient([ self.privileged_user.email, self.context.staff_lead.profile.user_object.email ], outbox_size=2, message_index=1) self.assertContains(response, conflict_msg) assert (conflict_msg in staff_msg.body) def test_parent_event(self): vol_context = VolunteerContext(conference=self.context.conference) lead = vol_context.set_staff_lead() class_context = ClassContext( conference=self.context.conference, teacher=PersonaFactory(performer_profile=self.profile), starttime=vol_context.opp_event.starttime) url = reverse(self.view_name, args=[vol_context.opp_event.pk, "on"], urlconf="gbe.scheduling.urls") login_as(self.profile, self) response = self.client.get(url, follow=True) staff_msg = assert_email_template_used("Volunteer Schedule Change", outbox_size=2, message_index=1) assert (vol_context.opportunity.e_title in staff_msg.body) conflict_msg = 'Conflicting booking: %s, Start Time: %s' % ( class_context.bid.e_title, class_context.sched_event.starttime.strftime(GBE_DATETIME_FORMAT)) assert (class_context.bid.e_title in staff_msg.body) assert_email_recipient([lead.user_object.email], outbox_size=2, message_index=1) self.assertContains(response, conflict_msg) assert (conflict_msg in staff_msg.body) def test_email_fail(self): self.context.area.staff_lead = self.profile self.context.area.save() template = EmailTemplateFactory( name='volunteer changed schedule', content="{% include 'gbe/email/bad.tmpl' %}") login_as(self.profile, self) response = self.client.get(self.url, follow=True) redirect_url = reverse('home', urlconf="gbe.urls") self.assertRedirects(response, redirect_url) self.assertContains(response, volunteer_allocate_email_fail_msg)