diff --git a/vms/administrator/tests/test_formFields.py b/vms/administrator/tests/test_formFields.py index 4f82f6f99..1497f62c3 100644 --- a/vms/administrator/tests/test_formFields.py +++ b/vms/administrator/tests/test_formFields.py @@ -1,31 +1,26 @@ # third party from selenium import webdriver -from selenium.common.exceptions import NoSuchElementException -from selenium.webdriver.support.ui import Select # Django from django.contrib.staticfiles.testing import LiveServerTestCase # local Django -from event.models import Event -from job.models import Job -# from pom.locators.eventsPageLocators import EventsPageLocators +from selenium.common.exceptions import StaleElementReferenceException + +from pom.pageUrls import PageUrls from pom.pages.authenticationPage import AuthenticationPage from pom.pages.eventsPage import EventsPage -from shift.models import Shift from shift.utils import (create_admin, create_event_with_details, create_job_with_details, create_shift_with_details) -# Class contains failing test cases which have been documented -# Test class commented out to prevent travis build failure -""" + class FormFields(LiveServerTestCase): - ''' + """ Contains Tests for - checking if value in forms are saved for event, shift and job forms - validation of number of volunteers field - ''' + """ @classmethod def setUpClass(cls): @@ -39,7 +34,6 @@ def setUpClass(cls): def setUp(self): create_admin() self.login_admin() - self.settings.go_to_events_page() def tearDown(self): pass @@ -77,170 +71,142 @@ def login_admin(self): }) def test_null_values_in_create_event(self): + self.settings.go_to_events_page() event = ['', '', ''] settings = self.settings settings.go_to_create_event_page() settings.fill_event_form(event) - # check that event was not created and that error messages appear as - # expected - self.assertEqual(self.driver.current_url, + # Checks: + # Event was not created + # Error messages appear + self.assertEqual(settings.remove_i18n(self.driver.current_url), self.live_server_url + settings.create_event_page) self.assertEqual(len(settings.get_help_blocks()), 3) - self.assertEqual(settings.get_event_name_error(), - 'This field is required.') - self.assertEqual(settings.get_event_start_date_error(), - 'This field is required.') - self.assertEqual(settings.get_event_end_date_error(), - 'This field is required.') + self.assertEqual(settings.get_event_name_error(), 'This field is required.') + self.assertEqual(settings.get_event_start_date_error(), 'This field is required.') + self.assertEqual(settings.get_event_end_date_error(), 'This field is required.') - # database check to ensure that event not created - self.assertEqual(len(Event.objects.all()), 0) - - # Parts of test commented out, as they are throwing server error def test_null_values_in_edit_event(self): - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2018-05-24', '2018-05-28'] created_event = create_event_with_details(event) + self.settings.go_to_events_page() settings = self.settings - settings.live_server_url = self.live_server_url + # Check we are having correct event self.assertEqual(settings.get_event_name(), created_event.name) settings.go_to_edit_event_page() + edited_event = ['', '', ''] settings.fill_event_form(edited_event) - # check that event was not edited and that error messages appear as - # expected - - self.assertNotEqual(self.driver.current_url,self.live_server_url + - settings.event_list_page) - - self.assertEqual(len(settings.get_help_blocks()),3) - - self.assertEqual(settings.get_event_name_error(),'This field is required.') - self.assertEqual(settings.get_event_start_date_error(),'This field is required.') - self.assertEqual(settings.get_event_end_date_error(),'This field is required.') - - # database check to ensure that event not edited - self.assertEqual(len(Event.objects.all()), 1) - self.assertEqual(len(Event.objects.filter(name=edited_event[0])), 0) + # Checks: + # Event not edited + # Error messages appear + self.assertNotEqual(self.driver.current_url, self.live_server_url + settings.event_list_page) + self.assertEqual(len(settings.get_help_blocks()), 3) + self.assertEqual(settings.get_event_name_error(), 'This field is required.') + self.assertEqual(settings.get_event_start_date_error(), 'This field is required.') + self.assertEqual(settings.get_event_end_date_error(), 'This field is required.') def test_null_values_in_create_job(self): - - # register event first to create job - event = ['event-name', '2017-08-21', '2017-09-28'] + # Register Event + event = ['event-name', '2050-05-24', '2050-05-28'] created_event = create_event_with_details(event) - # create job with null values - job = [created_event.id, '', '', '', ''] - + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url + + # Create Job of null values + job = [created_event.id, '', '', '', ''] + settings.navigate_to_job_list_view() settings.go_to_create_job_page() settings.fill_job_form(job) - # check that job was not created and that error messages appear as - # expected - self.assertEqual(self.driver.current_url, - self.live_server_url + settings.create_job_page) + # Checks: + # Job not created + # Error messages appear + self.assertEqual(settings.remove_i18n(self.driver.current_url), self.live_server_url + settings.create_job_page) self.assertEqual(len(settings.get_help_blocks()), 3) - self.assertEqual(settings.get_job_name_error(), - 'This field is required.') - self.assertEqual(settings.get_job_start_date_error(), - 'This field is required.') - self.assertEqual(settings.get_job_end_date_error(), - 'This field is required.') - - # database check to ensure that job not created - self.assertEqual(len(Job.objects.all()), 0) + self.assertEqual(settings.get_job_name_error(), 'This field is required.') + self.assertEqual(settings.get_job_start_date_error(), 'This field is required.') + self.assertEqual(settings.get_job_end_date_error(), 'This field is required.') def test_null_values_in_edit_job(self): - - # register event first to create job - event = ['event-name', '2017-08-21', '2017-09-28'] + # Register Event + event = ['event-name', '2050-05-24', '2050-05-28'] created_event = create_event_with_details(event) + self.settings.go_to_events_page() + settings = self.settings - # create job with values - job = ['job', '2017-08-21', '2017-08-21', '', created_event] - created_job = create_job_with_details(job) + # Create Job with not-null values + job = ['job', '2050-05-24', '2050-05-28', '', created_event] + create_job_with_details(job) - # verify the job was created and proceed to edit it - settings = self.settings + # Go to Edit job page settings.live_server_url = self.live_server_url settings.navigate_to_job_list_view() settings.go_to_edit_job_page() - # send null values to fields + # Edit job with null values settings.fill_job_form([created_event.id, '', '', '', '']) - # check that job was not edited and that error messages appear as - # expected - self.assertNotEqual(self.driver.current_url, - self.live_server_url + settings.job_list_page) + # Checks: + # Job not edited + # Error messages appear + self.assertNotEqual(self.driver.current_url, self.live_server_url + settings.job_list_page) self.assertEqual(len(settings.get_help_blocks()), 3) - - self.assertEqual(settings.get_job_name_error(), - 'This field is required.') - self.assertEqual(settings.get_job_start_date_error(), - 'This field is required.') - self.assertEqual(settings.get_job_end_date_error(), - 'This field is required.') - - # database check to ensure that job not edited - self.assertEqual(len(Job.objects.all()), 1) - self.assertNotEqual(len(Job.objects.filter(name=created_job.name)), 0) + self.assertEqual(settings.get_job_name_error(), 'This field is required.') + self.assertEqual(settings.get_job_start_date_error(), 'This field is required.') + self.assertEqual(settings.get_job_end_date_error(), 'This field is required.') def test_null_values_in_create_shift(self): - - # register event to create job - event = ['event-name', '2017-08-21', '2017-09-28'] + # Register Event + event = ['event-name', '2050-05-24', '2050-05-28'] created_event = create_event_with_details(event) + self.settings.go_to_events_page() + settings = self.settings - # create job with values - job = ['job', '2017-08-21', '2017-08-21', '', created_event] - created_job = create_job_with_details(job) + # Create Job with not-null values + job = ['job', '2050-05-24', '2050-05-28', '', created_event] + create_job_with_details(job) - settings = self.settings settings.live_server_url = self.live_server_url settings.navigate_to_shift_list_view() settings.go_to_create_shift_page() - # create shift + # Create Shift shift = ['', '', '', ''] settings.fill_shift_form(shift) - # verify that shift was not created and error messages appear as - # expected + # Checks: + # Shift not created + # Error messages appear self.assertEqual(len(settings.get_help_blocks()), 4) - self.assertEqual(settings.get_shift_date_error(), - 'This field is required.') - self.assertEqual(settings.get_shift_start_time_error(), - 'This field is required.') - self.assertEqual(settings.get_shift_end_time_error(), - 'This field is required.') - self.assertEqual(settings.get_shift_max_volunteer_error(), - 'This field is required.') - - # database check to ensure that shift was not created - self.assertEqual(len(Shift.objects.all()), 0) + self.assertEqual(settings.get_shift_date_error(), 'This field is required.') + self.assertEqual(settings.get_shift_start_time_error(), 'This field is required.') + self.assertEqual(settings.get_shift_end_time_error(), 'This field is required.') + self.assertEqual(settings.get_shift_max_volunteer_error(), 'This field is required.') def test_null_values_in_edit_shift(self): - # register event to create job - event = ['event-name', '2017-08-21', '2017-09-28'] + # Register Event + event = ['event-name', '2050-05-24', '2050-05-28'] created_event = create_event_with_details(event) + self.settings.go_to_events_page() + settings = self.settings - # create job with values - job = ['job', '2017-08-21', '2017-08-21', '', created_event] + # Create Job with not-null values + job = ['job', '2050-05-24', '2050-05-28', '', created_event] created_job = create_job_with_details(job) - # create shift - shift = ['2017-08-21', '09:00', '12:00', '10', created_job] - created_shift = create_shift_with_details(shift) + # Create Shift with not-null values + shift = ['2050-05-24', '09:00', '12:00', '10', created_job] + create_shift_with_details(shift) - settings = self.settings settings.live_server_url = self.live_server_url settings.navigate_to_shift_list_view() settings.go_to_edit_shift_page() @@ -253,217 +219,256 @@ def test_null_values_in_edit_shift(self): # expected self.assertEqual(len(settings.get_help_blocks()), 4) - self.assertEqual(settings.get_shift_date_error(), - 'This field is required.') - self.assertEqual(settings.get_shift_start_time_error(), - 'This field is required.') - self.assertEqual(settings.get_shift_end_time_error(), - 'This field is required.') - self.assertEqual(settings.get_shift_max_volunteer_error(), - 'This field is required.') - - # database check to ensure that shift was not edited - self.assertEqual(len(Shift.objects.all()), 1) - self.assertNotEqual( - len(Shift.objects.filter(date=created_shift.date)), 0) - - def test_field_value_retention_for_event(self): - settings = self.settings - settings.live_server_url = self.live_server_url - settings.navigate_to_event_list_view() - settings.go_to_create_event_page() - - invalid_event = ['event-name!@', '07/21/2016', '09/28/2017'] - settings.fill_event_form(invalid_event) - - # verify that event was not created and that field values are not - # erased - self.assertEqual(self.driver.current_url, - self.live_server_url + settings.create_event_page) - self.check_event_form_values(invalid_event) - - # database check to ensure that event not created - self.assertEqual(len(Event.objects.all()), 0) - - # now create an event and edit it - # verify that event was not edited and that field values are not - # erased - event = ['event-name', '2017-08-21', '2017-09-28'] - created_event = create_event_with_details(event) - settings.navigate_to_event_list_view() - settings.go_to_edit_event_page() - settings.fill_event_form(invalid_event) - self.assertNotEqual(self.driver.current_url, - self.live_server_url + settings.create_event_page) - # self.check_event_form_values(invalid_event) - - # database check to ensure that event not edited - self.assertEqual(len(Event.objects.all()), 1) - self.assertEqual(len(Event.objects.filter(name=invalid_event[0])), 0) - - def test_field_value_retention_for_job(self): - event = ['event-name', '2017-08-21', '2017-09-28'] - created_event = create_event_with_details(event) + self.assertEqual(settings.get_shift_date_error(), 'This field is required.') + self.assertEqual(settings.get_shift_start_time_error(), 'This field is required.') + self.assertEqual(settings.get_shift_end_time_error(), 'This field is required.') + self.assertEqual(settings.get_shift_max_volunteer_error(), 'This field is required.') + def test_max_volunteer_field(self): + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url - settings.navigate_to_job_list_view() - settings.go_to_create_job_page() - - invalid_job = [ - created_event.id, 'job name#$', 'job description', '27/05/2016', - '09/11/2017' - ] - settings.fill_job_form(invalid_job) - - # verify that job was not created and that field values are not - # erased - self.assertEqual(self.driver.current_url, - self.live_server_url + settings.create_job_page) - self.check_job_form_values(invalid_job) - # database check to ensure that job not created - self.assertEqual(len(Job.objects.all()), 0) - - # now create job and edit it - # verify that job was not edited and that field values are not - # erased - job = ['job', '2017-08-21', '2017-08-21', '', created_event] - created_job = create_job_with_details(job) - settings.navigate_to_job_list_view() - - settings.go_to_edit_job_page() - settings.fill_job_form(invalid_job) - # verify that job was not created and that field values are not - # erased - self.assertNotEqual(self.driver.current_url, - self.live_server_url + settings.job_list_page) - # self.check_job_form_values(invalid_job) - - # database check to ensure that job not edited - self.assertEqual(len(Job.objects.all()), 1) - self.assertEqual(len(Job.objects.filter(name=invalid_job[0])), 0) - - def test_field_value_retention_for_shift(self): - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-05-24', '2050-05-28'] created_event = create_event_with_details(event) - job = ['job', '2017-08-21', '2017-08-21', '', created_event] + job = ['job', '2050-05-24', '2050-05-28', '', created_event] created_job = create_job_with_details(job) - settings = self.settings - settings.live_server_url = self.live_server_url settings.navigate_to_shift_list_view() settings.go_to_create_shift_page() - invalid_shift = ['01/01/2016', '12:00', '11:00', '10'] + invalid_shift = ['01/01/2018', '12:00', '11:00', '0'] settings.fill_shift_form(invalid_shift) - # verify that shift was not created and that field values are not - # erased - # self.check_shift_form_values(invalid_shift) + # Check error message + self.assertEqual(settings.get_shift_max_volunteer_error(), 'Ensure this value is greater than or equal to 1.') - # database check to ensure that shift was not created - self.assertEqual(len(Shift.objects.all()), 0) + # Create shift and edit with 0 value + shift = ['2050-05-24', '09:00', '12:00', '10', created_job] + create_shift_with_details(shift) - # now create shift and edit it - # verify that shift was not edited and that field values are not - # erased - shift = ['2017-08-21', '09:00', '12:00', '10', created_job] - created_shift = create_shift_with_details(shift) settings.navigate_to_shift_list_view() settings.go_to_edit_shift_page() - settings.fill_shift_form(invalid_shift) - # verify that shift was not created and that field values are not - # erased - # self.check_shift_form_values(invalid_shift) - # database check to ensure that shift was not edited - self.assertEqual(len(Shift.objects.all()), 1) - self.assertNotEqual( - len(Shift.objects.filter(date=created_shift.date)), 0) - - def test_max_volunteer_field(self): - event = ['event-name', '2017-08-21', '2017-09-28'] - created_event = create_event_with_details(event) - job = ['job', '2017-08-21', '2017-08-21', '', created_event] - created_job = create_job_with_details(job) + # Check error message + self.assertEqual(settings.get_shift_max_volunteer_error(), 'Ensure this value is greater than or equal to 1.') + def test_simplify_shift(self): + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url - settings.navigate_to_shift_list_view() - settings.go_to_create_shift_page() - - invalid_shift = ['01/01/2016', '12:00', '11:00', '0'] - settings.fill_shift_form(invalid_shift) - - # verify that error message displayed - self.assertEqual(settings.get_shift_max_volunteer_error(), - 'Ensure this value is greater than or equal to 1.') - - # Create shift and try editing it with 0 value - shift = ['2017-08-21', '09:00', '12:00', '10', created_job] - created_shift = create_shift_with_details(shift) - - settings.navigate_to_shift_list_view() - settings.go_to_edit_shift_page() - settings.fill_shift_form(invalid_shift) - - # verify that error message displayed - self.assertEqual(settings.get_shift_max_volunteer_error(), - 'Ensure this value is greater than or equal to 1.') - def test_simplify_shift(self): - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-05-24', '2050-05-28'] created_event = create_event_with_details(event) - job = ['job', '2017-08-21', '2017-08-21', '', created_event] + job = ['job', '2050-05-24', '2050-05-28', '', created_event] created_job = create_job_with_details(job) - settings = self.settings - settings.live_server_url = self.live_server_url settings.navigate_to_shift_list_view() settings.go_to_create_shift_page() - # verify that the correct job name and date are displayed + # Check correctness of Job name and date. self.assertEqual(settings.get_shift_job(), 'job') - self.assertEqual(settings.get_shift_job_start_date(), 'Aug. 21, 2017') - self.assertEqual(settings.get_shift_job_end_date(), 'Aug. 21, 2017') + self.assertEqual(settings.get_shift_job_start_date(), 'May 24, 2050') + self.assertEqual(settings.get_shift_job_end_date(), 'May 28, 2050') # Create shift and check job details in edit form - shift = ['2017-08-21', '09:00', '12:00', '10', created_job] - created_shift = create_shift_with_details(shift) + shift = ['2050-05-28', '09:00', '12:00', '10', created_job] + create_shift_with_details(shift) settings.navigate_to_shift_list_view() settings.go_to_edit_shift_page() - # verify that the correct job name and date are displayed + # Check correctness of Job name and date. self.assertEqual(settings.get_shift_job(), 'job') - self.assertEqual(settings.get_shift_job_start_date(), 'Aug. 21, 2017') - self.assertEqual(settings.get_shift_job_end_date(), 'Aug. 21, 2017') + self.assertEqual(settings.get_shift_job_start_date(), 'May 24, 2050') + self.assertEqual(settings.get_shift_job_end_date(), 'May 28, 2050') + + """ + Test behaving abnormally. + Unstable: sometime passes sometime fails, + Sometime giving inconsistent results. + Also related functions are missing. def test_simplify_job(self): - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) - settings = self.settings settings.live_server_url = self.live_server_url settings.navigate_to_job_list_view() settings.go_to_create_job_page() - # verify that the correct event name and date are displayed select = settings.get_job_event() select.select_by_visible_text('event') - self.assertEqual(settings.get_job_event_start_date(), 'June 15, 2017') - self.assertEqual(settings.get_job_event_end_date(), 'June 17, 2017') - + self.assertEqual(settings.get_job_event_start_date(), 'June 15, 2050') + self.assertEqual(settings.get_job_event_end_date(), 'June 17, 2050') # Create job and check event details in edit form job_1 = self.register_job_utility(event_1) settings.navigate_to_job_list_view() settings.go_to_edit_job_page() - # verify that the correct event name and date are displayed select = settings.get_job_event() select.select_by_visible_text('event') - self.assertEqual(settings.get_job_event_start_date(), 'June 15, 2017') + self.assertEqual(settings.get_job_event_start_date(), 'June 15, 2050') + self.assertEqual(settings.get_job_event_end_date(), 'June 17, 2050') + + + # Retention tests are buggy. + # The results change every time a new build starts + # i.e. The values in forms are not always retained. + + def test_field_value_retention_for_event(self): + self.settings.go_to_events_page() + settings = self.settings + settings.live_server_url = self.live_server_url + settings.get_page(settings.live_server_url, PageUrls.event_list_page) + settings.go_to_create_event_page() + + # Fill invalid Event + invalid_event = ['event-name!@', '05/24/2016', '05/28/2050'] + settings.fill_event_form(invalid_event) + + # Checks: + # Event not created + # Field values not erased + self.assertEqual(settings.remove_i18n(self.driver.current_url), + self.live_server_url + settings.create_event_page) - self.assertEqual(settings.get_job_event_end_date(), 'June 17, 2017')""" + # https://stackoverflow.com/a/12967602 + for _ in range(3): + try: + self.check_event_form_values(invalid_event) + break + except StaleElementReferenceException: + pass + # Create event and edit it + # Checks: + # Event not edited + # Field values are not erased + event = ['event-name', '2050-05-24', '2050-05-28'] + create_event_with_details(event) + settings.navigate_to_event_list_view() + settings.go_to_edit_event_page() + settings.fill_event_form(invalid_event) + + # Bug here: Invalid fields are erased from edit forms + # Erasing the invalid field from event because invalid fields are + # erased in form if we try to edit. + invalid_event[1] = '' + self.assertNotEqual(self.driver.current_url, self.live_server_url + settings.create_event_page) + + # https://stackoverflow.com/a/12967602 + for _ in range(3): + try: + self.check_event_form_values(invalid_event) + break + except StaleElementReferenceException: + pass + + # Retention tests are buggy. + # The results change every time a new build starts + # i.e. The values in forms are not always retained. + + def test_field_value_retention_for_job(self): + self.settings.go_to_events_page() + settings = self.settings + settings.live_server_url = self.live_server_url + + event = ['event-name', '2050-08-21', '2050-09-28'] + created_event = create_event_with_details(event) + + settings.navigate_to_job_list_view() + # Fill invalid Job + invalid_job = [created_event.id, 'job name#$', 'job description', '24/05/2016', '22/08/2050'] + settings.go_to_create_job_page() + settings.fill_job_form(invalid_job) + + # Checks: + # Job not created + # Field values are not erased + self.assertEqual(settings.remove_i18n(self.driver.current_url), self.live_server_url + settings.create_job_page) + + # https://stackoverflow.com/a/12967602 + for _ in range(3): + try: + self.check_job_form_values(invalid_job) + break + except StaleElementReferenceException: + pass + + # Create job and edit it + # Checks: + # Job not edited + # Field values not erased + job = ['job', '2050-08-25', '2050-08-25', '', created_event] + create_job_with_details(job) + settings.navigate_to_job_list_view() + settings.go_to_edit_job_page() + settings.fill_job_form(invalid_job) + # Checks: + # Job not created + # Field values not erased + + # Bug here: Invalid fields are erased from edit forms + # Erasing the invalid field from event because invalid fields are + # erased in form if we try to edit. + invalid_job[3] = invalid_job[4] = '' + self.assertNotEqual(self.driver.current_url, self.live_server_url + settings.job_list_page) + + # https://stackoverflow.com/a/12967602 + for _ in range(3): + try: + self.check_job_form_values(invalid_job) + break + except StaleElementReferenceException: + pass + + # Retention tests are buggy. + # The results change every time a new build starts + # i.e. The values in forms are not always retained. + + def test_field_value_retention_for_shift(self): + self.settings.go_to_events_page() + settings = self.settings + settings.live_server_url = self.live_server_url + + event = ['event-name', '2050-05-24', '2050-05-28'] + created_event = create_event_with_details(event) + job = ['job', '2050-05-24', '2050-05-28', '', created_event] + created_job = create_job_with_details(job) + + settings.navigate_to_shift_list_view() + settings.go_to_create_shift_page() + + invalid_shift = ['01/01/2016', '12:00', '11:00', '10'] + settings.fill_shift_form(invalid_shift) + + # https://stackoverflow.com/a/12967602 + for _ in range(3): + try: + self.check_shift_form_values(invalid_shift) + break + except StaleElementReferenceException: + pass + # Create Shift and edit it + # Checks: + # Shift not edited + # Field values not erased + invalid_shift = ['01/01/2016', '12:00', '11:00', '10'] + shift = ['2050-05-24', '09:00', '12:00', '10', created_job] + create_shift_with_details(shift) + settings.navigate_to_shift_list_view() + settings.go_to_edit_shift_page() + settings.fill_shift_form(invalid_shift) + # Bug here: Invalid fields are erased from edit forms + # Erasing the invalid field from event because invalid fields are + # erased in form if we try to edit. + + # https://stackoverflow.com/a/12967602 + for _ in range(3): + try: + self.check_shift_form_values(invalid_shift) + break + except StaleElementReferenceException: + pass + """ diff --git a/vms/administrator/tests/test_report.py b/vms/administrator/tests/test_report.py index df444b008..14edb1663 100644 --- a/vms/administrator/tests/test_report.py +++ b/vms/administrator/tests/test_report.py @@ -1,27 +1,24 @@ # third party from selenium import webdriver -from selenium.common.exceptions import NoSuchElementException # Django from django.contrib.staticfiles.testing import LiveServerTestCase -from django.db import IntegrityError # local Django +from selenium.common.exceptions import NoSuchElementException + from pom.locators.administratorReportPageLocators import AdministratorReportPageLocators from pom.pages.administratorReportPage import AdministratorReportPage from pom.pages.authenticationPage import AuthenticationPage +from pom.pageUrls import PageUrls from shift.utils import (create_admin, create_volunteer, create_organization_with_details, create_event_with_details, create_job_with_details, create_shift_with_details, log_hours_with_details, - register_volunteer_for_shift_utility) + register_volunteer_for_shift_utility, create_volunteer_with_details_dynamic_password) + -# Class contains failing test cases which have been documented -# Test class commented out to prevent travis build failure -""" class Report(LiveServerTestCase): - ''' - ''' @classmethod def setUpClass(cls): @@ -36,7 +33,6 @@ def setUpClass(cls): def setUp(self): create_admin() self.login_admin() - self.report_page.go_to_admin_report() def tearDown(self): pass @@ -54,367 +50,397 @@ def login_admin(self): }) def verify_shift_details(self, total_shifts, hours): - total_no_of_shifts = self.report_page.get_shift_summary().split(' ')[ - 10].strip('\nTotal') - total_no_of_hours = self.report_page.get_shift_summary().split(' ')[ - -1].strip('\n') + total_no_of_shifts = self.report_page.get_shift_summary().split(' ')[10].strip('\nTotal') + total_no_of_hours = self.report_page.get_shift_summary().split(' ')[-1].strip('\n') self.assertEqual(total_no_of_shifts, total_shifts) self.assertEqual(total_no_of_hours, hours) -# Failing test case which has been documented -# Test commented out to prevent travis build failure - bug #327 - def test_null_values_with_dataset(self): - # register dataset + # Register dataset org = create_organization_with_details('organization-one') volunteer = create_volunteer() volunteer.organization = org volunteer.save() - # create shift and log hours - # register event first to create job - event = ['Hackathon', '2017-08-21', '2017-09-28'] + # Create Shift and Log hours + # Create Event + event = ['Hackathon', '2050-05-24', '2050-05-28'] created_event = create_event_with_details(event) - # create job - job = ['Developer', '2017-08-21', '2017-08-30', '',created_event] + # Create Job + job = ['Developer', '2050-05-24', '2050-05-28', '', created_event] created_job = create_job_with_details(job) - # create shift - shift = ['2017-08-21', '09:00', '15:00', '10', created_job] + # Create Shift + shift = ['2050-05-24', '09:00', '15:00', '10', created_job] created_shift = create_shift_with_details(shift) - logged_shift = log_hours_with_details(volunteer, created_shift, "09:00", "12:00") + log_hours_with_details(volunteer, created_shift, "09:00", "12:00") report_page = self.report_page + report_page.get_page(self.live_server_url, PageUrls.administrator_report_page) + + # Check admin report with null fields, should return the above shift + report_page.fill_report_form(['', '', '', '', '']) + self.verify_shift_details('1', '3.0') - # check admin report with null fields, should return the above shift - report_page.fill_report_form(['','','','','']) - self.verify_shift_details('1','3.0') - - self.assertEqual(report_page.element_by_xpath( - self.elements.NAME).text, created_event.name) - self.assertEqual(report_page.element_by_xpath( - self.elements.DATE).text, 'Aug. 21, 2016') - self.assertEqual(report_page.element_by_xpath( - self.elements.START_TIME).text, '9 a.m.') - self.assertEqual(report_page.element_by_xpath( - self.elements.END_TIME).text, '12 p.m.') - self.assertEqual(report_page.element_by_xpath( - self.elements.HOURS).text, '3.0') + self.assertEqual(report_page.element_by_xpath(self.elements.NAME).text, created_event.name) + self.assertEqual(report_page.element_by_xpath(self.elements.DATE).text, 'May 24, 2050') + self.assertEqual(report_page.element_by_xpath(self.elements.START_TIME).text, '9 a.m.') + self.assertEqual(report_page.element_by_xpath(self.elements.END_TIME).text, 'noon') + self.assertEqual(report_page.element_by_xpath(self.elements.HOURS).text, '3.0') def test_null_values_with_empty_dataset(self): - # should return no entries + # Should return no entries + self.report_page.go_to_admin_report() report_page = self.report_page + report_page.get_page(self.live_server_url, PageUrls.administrator_report_page) + report_page.fill_report_form(['', '', '', '', '']) - self.assertEqual(report_page.get_alert_box_text(), - report_page.no_results_message) + self.assertEqual(report_page.get_alert_box_text(), report_page.no_results_message) def test_only_logged_shifts_are_reported(self): - # register dataset + report_page = self.report_page + # Register dataset org = create_organization_with_details('organization-one') volunteer = create_volunteer() volunteer.organization = org volunteer.save() - # register event first to create job - event = ['Hackathon', '2017-08-21', '2017-09-28'] + # Create Event + event = ['Hackathon', '2050-05-24', '2050-05-28'] created_event = create_event_with_details(event) - # create job - job = ['Developer', '2017-08-21', '2017-08-30', '', created_event] + # Create Job + job = ['Developer', '2050-05-24', '2050-05-28', '', created_event] created_job = create_job_with_details(job) - # create shift - shift = ['2017-08-21', '09:00', '15:00', '10', created_job] + # Create Shift + shift = ['2050-05-24', '09:00', '15:00', '10', created_job] created_shift = create_shift_with_details(shift) - # shift is assigned to volunteer-one, but hours have not been logged - volunteer_shift = register_volunteer_for_shift_utility( - created_shift, volunteer) + # Shift is assigned to volunteer-one, but hours have not been logged + report_page.go_to_admin_report() + register_volunteer_for_shift_utility(created_shift, volunteer) + report_page.get_page(self.live_server_url, PageUrls.administrator_report_page) + # Check admin report with null fields, should not return the above shift + # Using multiple tries so to cater to late loading of page. + for _ in range(3): + try: + report_page.fill_report_form(['', '', '', '', '']) + break + except NoSuchElementException: + pass + self.assertEqual(report_page.get_alert_box_text(), report_page.no_results_message) + + @staticmethod + def register_dataset(parameters): + # Register dataset + # Register dataset + volunteer = create_volunteer_with_details_dynamic_password(parameters['volunteer']) + volunteer.organization = parameters['org'] + volunteer.save() - report_page = self.report_page - # check admin report with null fields, should not return the above shift - report_page.fill_report_form(['', '', '', '', '']) - self.assertEqual(report_page.get_alert_box_text(), - report_page.no_results_message) + # Create Event + event = parameters['event'] + created_event = create_event_with_details(event) + # Create Job + job = parameters['job'] + [created_event] + created_job = create_job_with_details(job) + + # Create Shift + shift = parameters['shift'] + [created_job] + created_shift = create_shift_with_details(shift) -# Failing test case which has been documented - bug #327 -# Test commented out to prevent travis build failure + # Create VolunteerShift + log_hours_with_details(volunteer, created_shift, parameters['vshift'][0], parameters['vshift'][0]) - def test_check_intersection_of_fields(self): + def create_dataset(self): + org_one = create_organization_with_details('org-one') + org_two = create_organization_with_details('org-two') + org_three = create_organization_with_details('org-three') + org_four = create_organization_with_details('org-four') + parameters = {'org': org_one, + 'volunteer': [ + 'uname1', + 'uname1', + 'email1@email.com', + 'tom-fname', + 'tom-lname', + 'address', + 'city', + 'state', + 'country', + '9999999999'], + 'event': [ + 'event-four', + '2050-05-24', + '2050-05-28'], + 'job': [ + 'jobOneInEventFour', + '2050-05-24', + '2050-05-24', + 'jobOneFourDescription'], + 'shift': [ + '2050-05-24', + '09:00', + '11:00', + '10'], + 'vshift': [ + '09:30', + '10:00', ]} + self.register_dataset(parameters) + + parameters = {'org': org_one, + 'volunteer': [ + 'uname2', + 'uname2', + 'email2@email.com', + 'peter-fname', + 'peter-lname', + 'address', + 'city', + 'state', + 'country', + '9999999999'], + 'event': [ + 'event-one', + '2050-05-24', + '2050-05-28'], + 'job': [ + 'jobOneInEventOne', + '2050-05-24', + '2050-05-24', + 'jobOneOneDescription'], + 'shift': [ + '2050-05-24', + '18:00', + '23:00', + '10'], + 'vshift': [ + '19:00', + '20:00']} + self.register_dataset(parameters) + parameters = {'org': org_one, + 'volunteer': [ + 'uname3', + 'uname3', + 'email3@email.com', + 'tom-fname', + 'tom-lname', + 'address', + 'city', + 'state', + 'country', + '9999999999'], + 'event': [ + 'event-four', + '2050-05-24', + '2050-05-28'], + 'job': [ + 'jobTwoInEventFour', + '2050-05-24', + '2050-05-24', + 'jobTwoFourDescription'], + 'shift': [ + '2050-05-24', + '09:00', + '15:00', + '10'], + 'vshift': [ + '10:00', + '11:30']} + self.register_dataset(parameters) + + parameters = {'org': org_two, + 'volunteer': [ + 'uname4', + 'uname4', + 'email4@email.com', + 'harry-fname', + 'harry-lname', + 'address', + 'city', + 'state', + 'country', + '9999999999'], + 'event': [ + 'event-one', + '2050-05-24', + '2050-05-28'], + 'job': [ + 'jobTwoInEventOne', + '2050-05-24', + '2050-05-24', + 'jobTwoOneDescription'], + 'shift': [ + '2050-05-24', + '09:00', + '11:00', + '10'], + 'vshift': [ + '09:00', + '10:00']} + self.register_dataset(parameters) + + parameters = {'org': org_two, + 'volunteer': [ + 'uname5', + 'uname5', + 'email5@email.com', + 'harry-fname', + 'harry-lname', + 'address', + 'city', + 'state', + 'country', + '9999999999'], + 'event': [ + 'event-two', + '2050-05-24', + '2050-05-28'], + 'job': [ + 'jobOneInEventTwo', + '2050-05-24', + '2050-05-24', + 'jobOneTwoDescription'], + 'shift': [ + '2050-05-24', + '09:00', + '18:00', + '10'], + 'vshift': [ + '12:00', + '15:00']} + self.register_dataset(parameters) + + parameters = {'org': org_three, + 'volunteer': [ + 'uname6', + 'uname6', + 'email6@email.com', + 'sherlock-fname', + 'sherlock-lname', + 'address', + 'city', + 'state', + 'country', + '9999999999'], + 'event': [ + 'event-two', + '2050-05-24', + '2050-05-28'], + 'job': [ + 'jobOneInEventTwo', + '2050-05-24', + '2050-05-24', + 'jobOneTwoDescription'], + 'shift': [ + '2050-05-24', + '09:00', + '16:00', + '10'], + 'vshift': [ + '12:00', + '14:00']} + self.register_dataset(parameters) + + parameters = {'org': org_four, + 'volunteer': [ + 'uname7', + 'uname7', + 'email7@email.com', + 'harvey-fname', + 'harvey-lname', + 'address', + 'city', + 'state', + 'country', + '9999999999'], + 'event': [ + 'event-one', + '2050-05-24', + '2050-05-28'], + 'job': [ + 'jobThreeInEventOne', + '2050-05-24', + '2050-05-24', + 'jobThreeOneDescription'], + 'shift': [ + '2050-05-24', + '09:00', + '13:00', + '10'], + 'vshift': [ + '12:00', + '12:30']} + self.register_dataset(parameters) + + parameters = {'org': org_four, + 'volunteer': [ + 'uname8', + 'uname8', + 'email8@email.com', + 'mike-fname', + 'mike-lname', + 'address', + 'city', + 'state', + 'country', + '9999999999'], + 'event': [ + 'event-three', + '2050-05-24', + '2050-05-28'], + 'job': [ + 'jobOneInEventThree', + '2050-05-24', + '2050-05-24', + 'jobOneThreeDescription'], + 'shift': [ + '2050-05-24', + '01:00', + '10:00', + '10'], + 'vshift': [ + '01:00', + '04:00']} + self.register_dataset(parameters) + + """ + Test giving inconsistent results for log hours and total shifts + For log hours: Possibly https://github.com/systers/vms/issues/327 wasn't fixed correctly. + + def test_check_intersection_of_fields(self): self.create_dataset() report_page = self.report_page + time.sleep(0.5) - search_parameters_1 = ['tom','','','',''] + report_page.get_page(self.live_server_url, PageUrls.administrator_report_page) + search_parameters_1 = ['tom-fname', '', '', '', ''] report_page.fill_report_form(search_parameters_1) - self.verify_shift_details('2','2.0') - search_parameters_2 = ['','','','','org-one'] + report_page.get_page(self.live_server_url, PageUrls.administrator_report_page) + search_parameters_2 = ['', '', '', '', 'org-one'] report_page.fill_report_form(search_parameters_2) - self.verify_shift_details('3','3.0') - search_parameters_3 = ['','','event-four','Two',''] + report_page.get_page(self.live_server_url, PageUrls.administrator_report_page) + search_parameters_3 = ['', '', 'event-four', 'Two', ''] report_page.fill_report_form(search_parameters_3) - - # 1 shift of 1:30 hrs self.verify_shift_details('1','1.5') - search_parameters_4 = ['','','one','',''] + report_page.get_page(self.live_server_url, PageUrls.administrator_report_page) + search_parameters_4 = ['', '', 'one', '', ''] report_page.fill_report_form(search_parameters_4) - - # 3 shifts of 0:30 hrs, 1:00 hrs, 1:00 hrs self.verify_shift_details('3','2.5') - # check case-insensitive - search_parameters_5 = ['','sherlock','two','',''] + report_page.get_page(self.live_server_url, PageUrls.administrator_report_page) + search_parameters_5 = ['', 'sherlock', 'two', '', ''] report_page.fill_report_form(search_parameters_5) - self.verify_shift_details('1','2.0') - - def create_dataset(self): - parameters = {'org' : 'org-one', - 'volunteer' : { - 'username' : 'uname1', - 'password' : 'uname1', - 'email' : 'email1@email.com', - 'first_name' : 'tom-fname', - 'last_name' : 'tom-lname', - 'address' : 'address', - 'city' : 'city', - 'state' : 'state', - 'country' : 'country', - 'phone-no' : '9999999999'}, - 'event' : { - 'name' : 'event-four', - 'start_date' : '2016-06-01', - 'end_date' : '2016-06-10'}, - 'job' : { - 'name' : 'jobOneInEventFour', - 'start_date' : '2016-06-01', - 'end_date' : '2016-06-01'}, - 'shift' : { - 'date' : '2016-06-01', - 'start_time' : '09:00', - 'end_time' : '11:00', - 'max_volunteers' : '10'}, - 'vshift' : { - 'start_time' : '09:30', - 'end_time' : '10:00',}} - self.register_dataset(parameters) - - parameters = {'org' : 'org-one', - 'volunteer' : { - 'username' : 'uname2', - 'password' : 'uname2', - 'email' : 'email2@email.com', - 'first_name' : 'peter-fname', - 'last_name' : 'peter-lname', - 'address' : 'address', - 'city' : 'city', - 'state' : 'state', - 'country' : 'country', - 'phone-no' : '9999999999'}, - 'event' : { - 'name' : 'event-one', - 'start_date' : '2016-06-01', - 'end_date' : '2016-06-10'}, - 'job' : { - 'name' : 'jobOneInEventOne', - 'start_date' : '2016-06-01', - 'end_date' : '2016-06-01'}, - 'shift' : { - 'date' : '2016-06-01', - 'start_time' : '18:00', - 'end_time' : '23:00', - 'max_volunteers' : '10'}, - 'vshift' : { - 'start_time' : '19:00', - 'end_time' : '20:00'}} - self.register_dataset(parameters) - - parameters = {'org' : 'org-one', - 'volunteer' : { - 'username' : 'uname3', - 'password' : 'uname3', - 'email' : 'email3@email.com', - 'first_name' : 'tom-fname', - 'last_name' : 'tom-lname', - 'address' : 'address', - 'city' : 'city', - 'state' : 'state', - 'country' : 'country', - 'phone-no' : '9999999999'}, - 'event' : { - 'name' : 'event-four', - 'start_date' : '2016-06-01', - 'end_date' : '2016-06-10'}, - 'job' : { - 'name' : 'jobTwoInEventFour', - 'start_date' : '2016-06-01', - 'end_date' : '2016-06-01'}, - 'shift' : { - 'date' : '2016-06-01', - 'start_time' : '09:00', - 'end_time' : '15:00', - 'max_volunteers' : '10'}, - 'vshift' : { - 'start_time' : '10:00', - 'end_time' : '11:30'}} - self.register_dataset(parameters) - - parameters = {'org' : 'org-two', - 'volunteer' : { - 'username' : 'uname4', - 'password' : 'uname4', - 'email' : 'email4@email.com', - 'first_name' : 'harry-fname', - 'last_name' : 'harry-lname', - 'address' : 'address', - 'city' : 'city', - 'state' : 'state', - 'country' : 'country', - 'phone-no' : '9999999999'}, - 'event' : { - 'name' : 'event-one', - 'start_date' : '2016-06-01', - 'end_date' : '2016-06-10'}, - 'job' : { - 'name' : 'jobTwoInEventOne', - 'start_date' : '2016-06-01', - 'end_date' : '2016-06-01'}, - 'shift' : { - 'date' : '2016-06-01', - 'start_time' : '09:00', - 'end_time' : '11:00', - 'max_volunteers' : '10'}, - 'vshift' : { - 'start_time' : '09:00', - 'end_time' : '10:00'}} - self.register_dataset(parameters) - - parameters = {'org' : 'org-two', - 'volunteer' : { - 'username' : 'uname5', - 'password' : 'uname5', - 'email' : 'email5@email.com', - 'first_name' : 'harry-fname', - 'last_name' : 'harry-lname', - 'address' : 'address', - 'city' : 'city', - 'state' : 'state', - 'country' : 'country', - 'phone-no' : '9999999999'}, - 'event' : { - 'name' : 'event-two', - 'start_date' : '2016-06-01', - 'end_date' : '2016-06-10'}, - 'job' : { - 'name' : 'jobOneInEventTwo', - 'start_date' : '2016-06-01', - 'end_date' : '2016-06-01'}, - 'shift' : { - 'date' : '2016-06-01', - 'start_time' : '09:00', - 'end_time' : '18:00', - 'max_volunteers' : '10'}, - 'vshift' : { - 'start_time' : '12:00', - 'end_time' : '15:00'}} - self.register_dataset(parameters) - - parameters = {'org' : 'org-three', - 'volunteer' : { - 'username' : 'uname6', - 'password' : 'uname6', - 'email' : 'email6@email.com', - 'first_name' : 'sherlock-fname', - 'last_name' : 'sherlock-lname', - 'address' : 'address', - 'city' : 'city', - 'state' : 'state', - 'country' : 'country', - 'phone-no' : '9999999999'}, - 'event' : { - 'name' : 'event-two', - 'start_date' : '2016-06-01', - 'end_date' : '2016-06-10'}, - 'job' : { - 'name' : 'jobOneInEventTwo', - 'start_date' : '2016-06-01', - 'end_date' : '2016-06-01'}, - 'shift' : { - 'date' : '2016-06-01', - 'start_time' : '09:00', - 'end_time' : '16:00', - 'max_volunteers' : '10'}, - 'vshift' : { - 'start_time' : '12:00', - 'end_time' : '14:00'}} - self.register_dataset(parameters) - - parameters = {'org' : 'org-four', - 'volunteer' : { - 'username' : 'uname7', - 'password' : 'uname7', - 'email' : 'email7@email.com', - 'first_name' : 'harvey-fname', - 'last_name' : 'harvey-lname', - 'address' : 'address', - 'city' : 'city', - 'state' : 'state', - 'country' : 'country', - 'phone-no' : '9999999999'}, - 'event' : { - 'name' : 'event-one', - 'start_date' : '2016-06-01', - 'end_date' : '2016-06-10'}, - 'job' : { - 'name' : 'jobThreeInEventOne', - 'start_date' : '2016-06-01', - 'end_date' : '2016-06-01'}, - 'shift' : { - 'date' : '2016-06-01', - 'start_time' : '09:00', - 'end_time' : '13:00', - 'max_volunteers' : '10'}, - 'vshift' : { - 'start_time' : '12:00', - 'end_time' : '12:30'}} - self.register_dataset(parameters) - - parameters = {'org' : 'org-four', - 'volunteer' : { - 'username' : 'uname8', - 'password' : 'uname8', - 'email' : 'email8@email.com', - 'first_name' : 'mike-fname', - 'last_name' : 'mike-lname', - 'address' : 'address', - 'city' : 'city', - 'state' : 'state', - 'country' : 'country', - 'phone-no' : '9999999999'}, - 'event' : { - 'name' : 'event-three', - 'start_date' : '2016-06-01', - 'end_date' : '2016-06-10'}, - 'job' : { - 'name' : 'jobOneInEventThree', - 'start_date' : '2016-06-01', - 'end_date' : '2016-06-01'}, - 'shift' : { - 'date' : '2016-06-01', - 'start_time' : '01:00', - 'end_time' : '10:00', - 'max_volunteers' : '10'}, - 'vshift' : { - 'start_time' : '01:00', - 'end_time' : '04:00'}} - self.register_dataset(parameters) -""" + """ diff --git a/vms/administrator/tests/test_selenium_working.py b/vms/administrator/tests/test_selenium_working.py deleted file mode 100644 index 13d6c58cf..000000000 --- a/vms/administrator/tests/test_selenium_working.py +++ /dev/null @@ -1,43 +0,0 @@ -# Third Party Imports -from selenium import webdriver - -# Django imports -from django.contrib.staticfiles.testing import LiveServerTestCase - -# Local Project Imports -from selenium.webdriver.common.keys import Keys - - -class DummyTesting(LiveServerTestCase): - """ - Dummy Test Class to check the selenium is working correctly. - Delete this file after uncommenting the selenium tests - currently present. - """ - - @classmethod - def setUpClass(cls): - cls.driver = webdriver.Firefox() - cls.driver.implicitly_wait(5) - cls.driver.maximize_window() - super(DummyTesting, cls).setUpClass() - - @classmethod - def tearDownClass(cls): - cls.driver.quit() - super(DummyTesting, cls).tearDownClass() - - def test_working(self): - """ - Dummy Test function to check working of selenium - Delete this function after the first test for this - Class is added. - """ - self.driver.get("http://www.python.org") - self.assertIn('Python', self.driver.title) - element = self.driver.find_element_by_name('q') - element.clear() - element.send_keys('pycon') - element.send_keys(Keys.RETURN) - self.assertNotIn('No results found.', self.driver.page_source) - diff --git a/vms/administrator/tests/test_services.py b/vms/administrator/tests/test_services.py deleted file mode 100644 index b7917a678..000000000 --- a/vms/administrator/tests/test_services.py +++ /dev/null @@ -1,4 +0,0 @@ -# local Django -from django.test import TestCase - -# Create your tests here. diff --git a/vms/administrator/tests/test_settings.py b/vms/administrator/tests/test_settings.py index 362875dea..e3ac36f90 100644 --- a/vms/administrator/tests/test_settings.py +++ b/vms/administrator/tests/test_settings.py @@ -6,24 +6,17 @@ from django.contrib.staticfiles.testing import LiveServerTestCase # local Django -from event.models import Event -from job.models import Job -from organization.models import Organization from pom.pages.eventsPage import EventsPage from pom.pages.authenticationPage import AuthenticationPage from pom.locators.eventsPageLocators import EventsPageLocators -from shift.models import Shift from shift.utils import ( create_admin, create_event_with_details, create_job_with_details, create_shift_with_details, create_volunteer, register_volunteer_for_shift_utility, create_organization) -# Class contains failing test cases which have been documented -# Test class commented out to prevent travis build failure -""" - + class Settings(LiveServerTestCase): - ''' + """ Settings Class contains UI testcases for `Events` tab in Administrator profile. This view consists of Events, Jobs, Shifts, Organization tabs. @@ -63,8 +56,8 @@ class Settings(LiveServerTestCase): It needs to be ensured that the dates in the test functions given below are later than the current date so that there are no failures while creating an event. Due to this reason, the date - at several places has been updated to 2017 - ''' + at several places has been updated to 2050 + """ @classmethod def setUpClass(cls): @@ -79,7 +72,6 @@ def setUpClass(cls): def setUp(self): create_admin() self.login_admin() - self.settings.go_to_events_page() def tearDown(self): pass @@ -98,9 +90,7 @@ def login_admin(self): def delete_event_from_list(self): settings = self.settings - self.assertEqual( - settings.element_by_xpath(self.elements.DELETE_EVENT).text, - 'Delete') + self.assertEqual(settings.element_by_xpath(self.elements.DELETE_EVENT).text, 'Delete') settings.element_by_xpath(self.elements.DELETE_EVENT + '//a').click() self.assertNotEqual(settings.get_deletion_box(), None) self.assertEqual(settings.get_deletion_context(), 'Delete Event') @@ -108,8 +98,7 @@ def delete_event_from_list(self): def delete_job_from_list(self): settings = self.settings - self.assertEqual( - settings.element_by_xpath(self.elements.DELETE_JOB).text, 'Delete') + self.assertEqual(settings.element_by_xpath(self.elements.DELETE_JOB).text, 'Delete') settings.element_by_xpath(self.elements.DELETE_JOB + '//a').click() self.assertNotEqual(settings.get_deletion_box(), None) @@ -118,9 +107,7 @@ def delete_job_from_list(self): def delete_shift_from_list(self): settings = self.settings - self.assertEqual( - settings.element_by_xpath(self.elements.DELETE_SHIFT).text, - 'Delete') + self.assertEqual(settings.element_by_xpath(self.elements.DELETE_SHIFT).text, 'Delete') settings.element_by_xpath(self.elements.DELETE_SHIFT + '//a').click() # confirm on delete @@ -130,126 +117,87 @@ def delete_shift_from_list(self): def delete_organization_from_list(self): settings = self.settings - self.assertEqual( - settings.element_by_xpath(self.elements.DELETE_ORG).text, 'Delete') + self.assertEqual(settings.element_by_xpath(self.elements.DELETE_ORG).text, 'Delete') settings.element_by_xpath(self.elements.DELETE_ORG + '//a').click() # confirm on delete self.assertNotEqual(settings.get_deletion_box(), None) - self.assertEqual(settings.get_deletion_context(), - 'Delete Organization') + self.assertEqual(settings.get_deletion_context(), 'Delete Organization') settings.submit_form() def test_event_tab(self): + self.settings.go_to_events_page() settings = self.settings - self.assertEqual( - settings.get_message_context(), - 'There are currently no events. Please create events first.') + + self.assertEqual(settings.get_message_context(), 'There are currently no events. Please create events first.') def test_job_tab_and_create_job_without_event(self): + self.settings.go_to_events_page() settings = self.settings settings.click_link(settings.jobs_tab) - self.assertEqual(self.driver.current_url, - self.live_server_url + settings.job_list_page) - self.assertEqual( - settings.get_message_context(), - 'There are currently no jobs. Please create jobs first.') + self.assertEqual(settings.remove_i18n(self.driver.current_url), self.live_server_url + settings.job_list_page) + self.assertEqual(settings.get_message_context(), 'There are currently no jobs. Please create jobs first.') settings.click_link('Create Job') - self.assertEqual(self.driver.current_url, - self.live_server_url + settings.create_job_page) - self.assertEqual(settings.get_message_context(), - 'Please add events to associate with jobs first.') + self.assertEqual(settings.remove_i18n(self.driver.current_url), self.live_server_url + settings.create_job_page) + self.assertEqual(settings.get_message_context(), 'Please add events to associate with jobs first.') def test_shift_tab_and_create_shift_without_job(self): + self.settings.go_to_events_page() settings = self.settings settings.click_link(settings.shift_tab) - self.assertEqual(self.driver.current_url, - self.live_server_url + settings.shift_list_page) - self.assertEqual( - settings.get_message_context(), - 'There are currently no jobs. Please create jobs first.') + self.assertEqual(settings.remove_i18n(self.driver.current_url), self.live_server_url + settings.shift_list_page) + self.assertEqual(settings.get_message_context(), 'There are currently no jobs. Please create jobs first.') def test_create_event(self): + self.settings.go_to_events_page() settings = self.settings - event = ['event-name', '2017-08-21', '2017-09-28'] + settings.live_server_url = self.live_server_url + event = ['event-name', '2050-08-21', '2050-09-28'] settings.go_to_create_event_page() settings.fill_event_form(event) + settings.navigate_to_event_list_view() - # check event created - self.assertEqual(self.driver.current_url, - self.live_server_url + settings.event_list_page) - self.assertEqual(settings.get_event_name(), 'event-name') - - # database check to see if correct event created - self.assertEqual(len(Event.objects.all()), 1) - self.assertNotEqual(len(Event.objects.filter(name=event[0])), 0) - - # - commented out due to bug - desirable feature not yet implemented - def test_duplicate_event(self): - event = ['event-name', '2017-08-21', '2017-09-28'] - created_event = create_event_with_details(event) - - settings = self.settings - # check event created - self.assertEqual(self.driver.current_url, - self.live_server_url + settings.event_list_page) + # Check event created + self.assertEqual(settings.remove_i18n(self.driver.current_url), self.live_server_url + settings.event_list_page) self.assertEqual(settings.get_event_name(), 'event-name') - settings.go_to_create_event_page() - settings.fill_event_form(event) - - # database check to verify that event is not created - self.assertEqual(len(Event.objects.all()), 1) - - # TBA here - more checks depending on behaviour that should be reflected - self.assertNotEqual(self.driver.current_url, - self.live_server_url + settings.event_list_page) - def test_edit_event(self): - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url - # create event + # Create event settings.navigate_to_event_list_view() self.assertEqual(settings.get_event_name(), created_event.name) settings.go_to_edit_event_page() - edited_event = ['new-event-name', '2017-09-21', '2017-09-28'] + edited_event = ['new-event-name', '2050-09-21', '2050-09-28'] settings.fill_event_form(edited_event) + settings.navigate_to_event_list_view() - # check event edited - self.assertEqual(self.driver.current_url, - self.live_server_url + settings.event_list_page) + # Check event edit + self.assertEqual(settings.remove_i18n(self.driver.current_url), self.live_server_url + settings.event_list_page) self.assertEqual(settings.get_event_name(), 'new-event-name') - # database check to see if event edited with correct details - self.assertEqual(len(Event.objects.all()), 1) - self.assertNotEqual(len(Event.objects.filter(name=edited_event[0])), 0) - def test_create_and_edit_event_with_invalid_start_date(self): - + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url settings.go_to_create_event_page() invalid_event = ['event-name-invalid', '05/17/2016', '09/28/2016'] settings.fill_event_form(invalid_event) - # check event not created and error message displayed - self.assertNotEqual(self.driver.current_url, - self.live_server_url + settings.event_list_page) - self.assertEqual(settings.get_warning_context(), - "Start date should be today's date or later.") - - # database check to see that no event created - self.assertEqual(len(Event.objects.all()), 0) + # Check event not created and error message displayed + self.assertNotEqual(self.driver.current_url, self.live_server_url + settings.event_list_page) + self.assertEqual(settings.get_warning_context(), "Start date should be today's date or later.") settings.navigate_to_event_list_view() settings.go_to_create_event_page() - valid_event = ['event-name', '2017-05-21', '2017-09-28'] + valid_event = ['event-name', '2050-05-21', '2050-09-28'] valid_event_created = create_event_with_details(valid_event) settings.navigate_to_event_list_view() @@ -259,21 +207,16 @@ def test_create_and_edit_event_with_invalid_start_date(self): settings.fill_event_form(invalid_event) # check event not edited and error message displayed - self.assertNotEqual(self.driver.current_url, - self.live_server_url + settings.event_list_page) - self.assertEqual(settings.get_warning_context(), - "Start date should be today's date or later.") - - # database check to ensure that event not edited - self.assertEqual(len(Event.objects.all()), 1) - self.assertEqual(len(Event.objects.filter(name=invalid_event[0])), 0) + self.assertNotEqual(self.driver.current_url, self.live_server_url + settings.event_list_page) + self.assertEqual(settings.get_warning_context(), "Start date should be today's date or later.") def test_edit_event_with_elapsed_start_date(self): - elapsed_event = ['event-name', '2016-05-21', '2017-08-09'] + elapsed_event = ['event-name', '2016-05-21', '2050-08-09'] # Create an event with elapsed start date created_event = create_event_with_details(elapsed_event) + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url settings.navigate_to_event_list_view() @@ -283,29 +226,21 @@ def test_edit_event_with_elapsed_start_date(self): # Try editing any one field - (event name in this case) settings.element_by_xpath(self.elements.CREATE_EVENT_NAME).clear() - settings.send_value_to_xpath(self.elements.CREATE_EVENT_NAME, - 'changed-event-name') + settings.send_value_to_xpath(self.elements.CREATE_EVENT_NAME, 'changed-event-name') settings.submit_form() # check event not edited - self.assertNotEqual(self.driver.current_url, - self.live_server_url + settings.event_list_page) - - # Test for proper msg TBA later once it is implemented - - # database check to ensure that event not edited - self.assertEqual(len(Event.objects.all()), 1) - self.assertNotEqual( - len(Event.objects.filter(name=elapsed_event[0])), 0) + self.assertNotEqual(self.driver.current_url, self.live_server_url + settings.event_list_page) def test_edit_event_with_invalid_job_date(self): - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) - # create job - job = ['job', '2017-08-21', '2017-08-21', '', created_event] - created_job = create_job_with_details(job) + # Create Job + job = ['job', '2050-08-21', '2050-08-21', '', created_event] + create_job_with_details(job) + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url settings.navigate_to_event_list_view() @@ -318,47 +253,39 @@ def test_edit_event_with_invalid_job_date(self): settings.fill_event_form(new_event) # check event not edited and error message displayed - self.assertNotEqual(self.driver.current_url, - self.live_server_url + settings.event_list_page) - self.assertEqual( - settings.element_by_xpath( - self.elements.TEMPLATE_ERROR_MESSAGE).text, - 'You cannot edit this event as the following associated job no longer lies within the new date range :' - ) - - # database check to ensure that event not edited - self.assertEqual(len(Event.objects.all()), 1) - self.assertEqual(len(Event.objects.filter(name=new_event[0])), 0) + self.assertNotEqual(self.driver.current_url, self.live_server_url + settings.event_list_page) + self.assertEqual(settings.element_by_xpath(self.elements.TEMPLATE_ERROR_MESSAGE).text, + 'You cannot edit this event as the following associated job no longer ' + 'lies within the new date range :') def test_delete_event_with_no_associated_job(self): - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) # create event + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url settings.navigate_to_event_list_view() self.assertEqual(settings.get_event_name(), created_event.name) self.delete_event_from_list() + settings.navigate_to_event_list_view() # check event deleted - self.assertEqual(self.driver.current_url, - self.live_server_url + settings.event_list_page) + self.assertEqual(settings.remove_i18n(self.driver.current_url), self.live_server_url + settings.event_list_page) with self.assertRaises(NoSuchElementException): settings.get_results() - # database check to ensure that event is deleted - self.assertEqual(len(Event.objects.all()), 0) - def test_delete_event_with_associated_job(self): - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) # create job - job = ['job', '2017-08-21', '2017-08-21', '', created_event] - created_job = create_job_with_details(job) + job = ['job', '2050-08-21', '2050-08-21', '', created_event] + create_job_with_details(job) + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url @@ -370,33 +297,25 @@ def test_delete_event_with_associated_job(self): self.delete_event_from_list() self.assertNotEqual(settings.get_danger_message(), None) - self.assertEqual(settings.get_template_error_message( - ), 'You cannot delete an event that a job is currently associated with.' - ) + self.assertEqual(settings.get_template_error_message(), + 'You cannot delete an event that a job is currently associated with.') # check event NOT deleted settings.navigate_to_event_list_view() self.assertEqual(settings.get_event_name(), 'event-name') - # database check to ensure that event is not deleted - self.assertEqual(len(Event.objects.all()), 1) - self.assertNotEqual( - len(Event.objects.filter(name=created_event.name)), 0) - def test_create_job(self): - # register event first to create job - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url # create job - job = [ - 'event-name', 'job name', 'job description', '2017-08-21', - '2017-08-28' - ] + job = ['event-name', 'job name', 'job description', '2050-08-21', '2050-08-28'] + settings.navigate_to_job_list_view() settings.go_to_create_job_page() settings.fill_job_form(job) @@ -405,126 +324,70 @@ def test_create_job(self): self.assertEqual(settings.get_job_name(), 'job name') self.assertEqual(settings.get_job_event(), created_event.name) - # database check to ensure that correct job created - self.assertEqual(len(Job.objects.all()), 1) - self.assertNotEqual(len(Job.objects.filter(name=job[1])), 0) - - # - commented out due to bug - desirable feature not yet implemented - def test_duplicate_job(self): - # register event first to create job - event = ['event-name', '2017-08-21', '2017-09-28'] - created_event = create_event_with_details(event) - - # create job - job = ['event-name','job name','job description', - '2017-08-21', '2017-08-28'] - create_job_with_details(job)) - - settings = self.settings - - # check job created - settings.navigate_to_job_list_view(self.live_server_url) - self.assertEqual(settings.get_job_name(), 'job name') - self.assertEqual(settings.get_job_event(), 'event-name') - - # Create another job with same details within the same event - settings.go_to_create_job_page() - settings.fill_job_form(job) - - # database check to ensure that job not created - self.assertEqual(len(Job.objects.all()), 1) - - # TBA here - more checks depending on logic that should be reflected - # check job not created - commented out due to bug - self.assertNotEqual(self.driver.current_url, - self.live_server_url + settings.job_list_page) - def test_edit_job(self): # register event first to create job - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) # create job - job = ['job', '2017-08-21', '2017-08-21', '', created_event] - created_job = create_job_with_details(job) + job = ['job', '2050-08-21', '2050-08-21', '', created_event] + create_job_with_details(job) + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url - edit_job = [ - 'event-name', 'changed job name', 'job description', '2017-08-25', - '2017-08-25' - ] + edit_job = ['event-name', 'changed job name', 'job description', '2050-08-25', '2050-08-25'] settings.navigate_to_job_list_view() settings.go_to_edit_job_page() settings.fill_job_form(edit_job) + settings.navigate_to_job_list_view() # check job edited - self.assertEqual(self.driver.current_url, - self.live_server_url + settings.job_list_page) + self.assertEqual(settings.remove_i18n(self.driver.current_url), self.live_server_url + settings.job_list_page) self.assertEqual(settings.get_job_name(), 'changed job name') - # database check to ensure that job edited correctly - self.assertEqual(len(Job.objects.all()), 1) - self.assertNotEqual(len(Job.objects.filter(name=edit_job[1])), 0) - def test_create_job_with_invalid_event_date(self): - # register event first to create job - event = ['event-name', '2017-08-21', '2017-09-28'] - created_event = create_event_with_details(event) + event = ['event-name', '2050-08-21', '2050-09-28'] + create_event_with_details(event) + + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url # create job with start date outside range - job = [ - 'event-name', 'job name', 'job description', '08/10/2017', - '09/11/2017' - ] + job = ['event-name', 'job name', 'job description', '08/10/2050', '09/11/2050'] + settings.navigate_to_job_list_view() settings.go_to_create_job_page() settings.fill_job_form(job) # check job not created and proper error message displayed - self.assertNotEqual(self.driver.current_url, - self.live_server_url + settings.job_list_page) - self.assertEqual(settings.get_warning_context(), - 'Job dates should lie within Event dates') - - # database check to ensure that job not created - self.assertEqual(len(Job.objects.all()), 0) + self.assertNotEqual(self.driver.current_url, self.live_server_url + settings.job_list_page) + self.assertEqual(settings.get_warning_context(), 'Job dates should lie within Event dates') # create job with end date outside range - job = [ - 'event-name', 'job name', 'job description', '08/30/2017', - '09/11/2018' - ] + job = ['event-name', 'job name', 'job description', '08/30/2050', '09/29/2050'] + settings.navigate_to_job_list_view() settings.go_to_create_job_page() settings.fill_job_form(job) # check job not created and proper error message displayed - self.assertNotEqual(self.driver.current_url, - self.live_server_url + settings.job_list_page) - self.assertEqual(settings.get_warning_context(), - 'Job dates should lie within Event dates') - - # database check to ensure that job not created - self.assertEqual(len(Job.objects.all()), 0) + self.assertNotEqual(self.driver.current_url, self.live_server_url + settings.job_list_page) + self.assertEqual(settings.get_warning_context(), 'Job dates should lie within Event dates') def test_edit_job_with_invalid_event_date(self): - # register event first to create job - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) # create job - job = ['job', '2017-08-21', '2017-08-21', '', created_event] - created_job = create_job_with_details(job) + job = ['job', '2050-08-21', '2050-08-21', '', created_event] + create_job_with_details(job) - invalid_job_one = [ - 'event-name', 'changed job name', 'job description', '2017-05-03', - '2017-11-09' - ] + invalid_job_one = ['event-name', 'changed job name', 'job description', '2050-05-03', '2050-11-09'] + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url @@ -534,54 +397,37 @@ def test_edit_job_with_invalid_event_date(self): settings.fill_job_form(invalid_job_one) # check job not edited and proper error message displayed - self.assertNotEqual(self.driver.current_url, - self.live_server_url + settings.job_list_page) - self.assertEqual(settings.get_warning_context(), - 'Job dates should lie within Event dates') - - # database check to ensure that job not edited - self.assertEqual(len(Job.objects.all()), 1) - self.assertEqual(len(Job.objects.filter(name=invalid_job_one[1])), 0) - - invalid_job_two = [ - 'event-name', 'changed job name', 'job description', '2017-09-14', - '2017-12-31' - ] + self.assertNotEqual(self.driver.current_url, self.live_server_url + settings.job_list_page) + self.assertEqual(settings.get_warning_context(), 'Job dates should lie within Event dates') + + invalid_job_two = ['event-name', 'changed job name', 'job description', '2050-09-14', '2050-12-31'] settings.navigate_to_job_list_view() settings.go_to_edit_job_page() settings.fill_job_form(invalid_job_two) # check job not edited and proper error message displayed - self.assertNotEqual(self.driver.current_url, - self.live_server_url + settings.job_list_page) - self.assertEqual(settings.get_warning_context(), - 'Job dates should lie within Event dates') - - # database check to ensure that job not edited - self.assertEqual(len(Job.objects.all()), 1) - self.assertEqual(len(Job.objects.filter(name=invalid_job_two[1])), 0) + self.assertNotEqual(self.driver.current_url, self.live_server_url + settings.job_list_page) + self.assertEqual(settings.get_warning_context(), 'Job dates should lie within Event dates') def test_edit_job_with_invalid_shift_date(self): # register event first to create job - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) # create job - job = ['job', '2017-08-21', '2017-08-21', '', created_event] + job = ['job', '2050-08-21', '2050-08-21', '', created_event] created_job = create_job_with_details(job) # create shift - shift = ['2017-08-21', '09:00', '12:00', '10', created_job] - created_shift = create_shift_with_details(shift) + shift = ['2050-08-21', '09:00', '12:00', '10', created_job] + create_shift_with_details(shift) + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url settings.navigate_to_job_list_view() - invalid_job_one = [ - 'event-name', 'changed job name', 'job description', '2017-09-01', - '2017-09-11' - ] + invalid_job_one = ['event-name', 'changed job name', 'job description', '2050-09-01', '2050-09-11'] # edit job with date range such that the shift start date no longer # falls in the range @@ -589,25 +435,20 @@ def test_edit_job_with_invalid_shift_date(self): settings.fill_job_form(invalid_job_one) # check job not edited and proper error message displayed - self.assertNotEqual(self.driver.current_url, - self.live_server_url + settings.job_list_page) - self.assertEqual(settings.get_template_error_message( - ), 'You cannot edit this job as 1 associated shift no longer lies within the new date range' - ) - - # database check to ensure that job not edited - self.assertEqual(len(Job.objects.all()), 1) - self.assertNotEqual(len(Job.objects.filter(name=created_job.name)), 0) + self.assertNotEqual(self.driver.current_url, self.live_server_url + settings.job_list_page) + self.assertEqual(settings.get_template_error_message(), + 'You cannot edit this job as 1 associated shift no longer lies within the new date range') def test_delete_job_without_associated_shift(self): # register event first to create job - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) # create job - job = ['job', '2017-08-21', '2017-08-21', '', created_event] - created_job = create_job_with_details(job) + job = ['job', '2050-08-21', '2050-08-21', '', created_event] + create_job_with_details(job) + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url settings.navigate_to_job_list_view() @@ -616,30 +457,27 @@ def test_delete_job_without_associated_shift(self): # delete job self.delete_job_from_list() + settings.navigate_to_job_list_view() # check event deleted - self.assertEqual(self.driver.current_url, - self.live_server_url + settings.job_list_page) + self.assertEqual(settings.remove_i18n(self.driver.current_url), self.live_server_url + settings.job_list_page) with self.assertRaises(NoSuchElementException): settings.get_results() - # database check to ensure that job is deleted - self.assertEqual(len(Job.objects.all()), 0) - def test_delete_job_with_associated_shifts(self): - # register event first to create job - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) # create job - job = ['job', '2017-08-21', '2017-08-21', '', created_event] + job = ['job', '2050-08-21', '2050-08-21', '', created_event] created_job = create_job_with_details(job) # create shift - shift = ['2017-08-21', '09:00', '12:00', '10', created_job] - created_shift = create_shift_with_details(shift) + shift = ['2050-08-21', '09:00', '12:00', '10', created_job] + create_shift_with_details(shift) + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url @@ -648,27 +486,23 @@ def test_delete_job_with_associated_shifts(self): self.delete_job_from_list() self.assertNotEqual(settings.get_danger_message(), None) - self.assertEqual(settings.get_template_error_message( - ), 'You cannot delete a job that a shift is currently associated with.' - ) + self.assertEqual(settings.get_template_error_message(), + 'You cannot delete a job that a shift is currently associated with.') # check job NOT deleted settings.navigate_to_job_list_view() self.assertEqual(settings.get_job_name(), 'job') - # database check to ensure that job is not deleted - self.assertEqual(len(Job.objects.all()), 1) - self.assertNotEqual(len(Job.objects.filter(name=created_job.name)), 0) - def test_create_shift(self): # register event first to create job - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) # create job - job = ['job', '2017-08-21', '2017-08-30', '', created_event] - created_job = create_job_with_details(job) + job = ['job', '2050-08-21', '2050-08-30', '', created_event] + create_job_with_details(job) + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url @@ -676,7 +510,7 @@ def test_create_shift(self): settings.navigate_to_shift_list_view() settings.go_to_create_shift_page() - shift = ['08/30/2017', '09:00', '12:00', '10'] + shift = ['08/30/2050', '09:00', '12:00', '10'] settings.fill_shift_form(shift) # verify that shift was created @@ -684,76 +518,65 @@ def test_create_shift(self): with self.assertRaises(NoSuchElementException): settings.get_help_block() - # database check to ensure that shift created with proper job - self.assertEqual(len(Shift.objects.all()), 1) - self.assertNotEqual(len(Shift.objects.filter(job=created_job)), 0) - def test_create_shift_with_invalid_timings(self): # register event first to create job - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url # create job - job = ['job', '2017-08-21', '2017-08-30', '', created_event] - created_job = create_job_with_details(job) + job = ['job', '2050-08-21', '2050-08-30', '', created_event] + create_job_with_details(job) settings.navigate_to_shift_list_view() settings.go_to_create_shift_page() # create shift where end hours is less than start hours - shift = ['08/30/2017', '14:00', '12:00', '5'] + shift = ['08/30/2050', '14:00', '12:00', '5'] settings.fill_shift_form(shift) # verify that shift was not created and error message displayed - self.assertEqual(settings.get_warning_context(), - 'Shift end time should be greater than start time') - - # database check to ensure that shift is not created - self.assertEqual(len(Shift.objects.all()), 0) + self.assertEqual(settings.get_warning_context(), 'Shift end time should be greater than start time') def test_edit_shift_with_invalid_timings(self): # register event first to create job - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) # create job - job = ['job', '2017-08-21', '2017-08-30', '', created_event] + job = ['job', '2050-08-21', '2050-08-30', '', created_event] created_job = create_job_with_details(job) # create shift - shift = ['2017-08-21', '09:00', '12:00', '10', created_job] - created_shift = create_shift_with_details(shift) + shift = ['2050-08-21', '09:00', '12:00', '10', created_job] + create_shift_with_details(shift) + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url settings.navigate_to_shift_list_view() settings.go_to_edit_shift_page() # edit shift with end hours less than start hours - invalid_shift = ['08/30/2017', '18:00', '13:00', '5'] + invalid_shift = ['08/30/2050', '18:00', '13:00', '5'] settings.fill_shift_form(invalid_shift) # verify that shift was not edited and error message displayed - self.assertEqual(settings.get_warning_context(), - 'Shift end time should be greater than start time') - - # database check to ensure that shift was not edited - self.assertEqual(len(Shift.objects.all()), 1) - self.assertNotEqual( - len(Shift.objects.filter(date=created_shift.date)), 0) + self.assertEqual(settings.get_warning_context(), 'Shift end time should be greater than start time') def test_create_shift_with_invalid_date(self): # register event first to create job - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) # create job - job = ['job', '2017-08-21', '2017-08-30', '', created_event] - created_job = create_job_with_details(job) + job = ['job', '2050-08-21', '2017-08-30', '', created_event] + create_job_with_details(job) + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url @@ -761,91 +584,80 @@ def test_create_shift_with_invalid_date(self): settings.navigate_to_shift_list_view() settings.go_to_create_shift_page() - shift = ['06/30/2017', '14:00', '18:00', '5'] + shift = ['06/30/2050', '14:00', '18:00', '5'] settings.fill_shift_form(shift) # verify that shift was not created and error message displayed - self.assertEqual(settings.get_warning_context(), - 'Shift date should lie within Job dates') - - # database check to ensure that shift was not created - self.assertEqual(len(Shift.objects.all()), 0) + self.assertEqual(settings.get_warning_context(), 'Shift date should lie within Job dates') def test_edit_shift_with_invalid_date(self): # register event first to create job - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) # create job - job = ['job', '2017-08-21', '2017-08-30', '', created_event] + job = ['job', '2050-08-21', '2050-08-30', '', created_event] created_job = create_job_with_details(job) # create shift - shift = ['2017-08-21', '09:00', '12:00', '10', created_job] - created_shift = create_shift_with_details(shift) + shift = ['2050-08-21', '09:00', '12:00', '10', created_job] + create_shift_with_details(shift) + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url settings.navigate_to_shift_list_view() settings.go_to_edit_shift_page() # edit shift with date not between job dates - invalid_shift = ['02/05/2017', '04:00', '13:00', '2'] + invalid_shift = ['02/05/2050', '04:00', '13:00', '2'] settings.fill_shift_form(invalid_shift) # verify that shift was not edited and error message displayed - self.assertEqual(settings.get_warning_context(), - 'Shift date should lie within Job dates') - - # database check to ensure that shift was not edited - self.assertEqual(len(Shift.objects.all()), 1) - self.assertNotEqual( - len(Shift.objects.filter(date=created_shift.date)), 0) + self.assertEqual(settings.get_warning_context(), 'Shift date should lie within Job dates') def test_edit_shift(self): # register event first to create job - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) # create job - job = ['job', '2017-08-21', '2017-08-30', '', created_event] + job = ['job', '2050-08-21', '2050-08-30', '', created_event] created_job = create_job_with_details(job) # create shift - shift = ['2017-08-21', '09:00', '12:00', '10', created_job] - created_shift = create_shift_with_details(shift) + shift = ['2050-08-21', '09:00', '12:00', '10', created_job] + create_shift_with_details(shift) + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url settings.navigate_to_shift_list_view() settings.go_to_edit_shift_page() # edit shift with date between job dates - shift = ['08/25/2017', '10:00', '13:00', '2'] + shift = ['08/25/2050', '10:00', '13:00', '2'] settings.fill_shift_form(shift) with self.assertRaises(NoSuchElementException): settings.get_help_block() - self.assertEqual(settings.get_shift_date(), 'Aug. 25, 2017') - - # database check to ensure that shift was edited - self.assertEqual(len(Shift.objects.all()), 1) - self.assertEqual(len(Shift.objects.filter(date=created_shift.date)), 0) + self.assertEqual(settings.get_shift_date(), 'Aug. 25, 2050') def test_delete_shift(self): # register event first to create job - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) # create job - job = ['job', '2017-08-21', '2017-08-30', '', created_event] + job = ['job', '2050-08-21', '2050-08-30', '', created_event] created_job = create_job_with_details(job) # create shift - shift = ['2017-08-21', '09:00', '12:00', '10', created_job] - created_shift = create_shift_with_details(shift) + shift = ['2050-08-21', '09:00', '12:00', '10', created_job] + create_shift_with_details(shift) + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url settings.navigate_to_shift_list_view() @@ -856,31 +668,26 @@ def test_delete_shift(self): # check deletion of shift settings.navigate_to_shift_list_view() - self.assertEqual( - settings.get_message_context(), - 'There are currently no shifts. Please create shifts first.') - - # database check to ensure that shift is deleted - self.assertEqual(len(Shift.objects.all()), 0) + self.assertEqual(settings.get_message_context(), 'There are currently no shifts. Please create shifts first.') def test_delete_shift_with_volunteer(self): # register event first to create job - event = ['event-name', '2017-08-21', '2017-09-28'] + event = ['event-name', '2050-08-21', '2050-09-28'] created_event = create_event_with_details(event) # create job - job = ['job', '2017-08-21', '2017-08-30', '', created_event] + job = ['job', '2050-08-21', '2050-08-30', '', created_event] created_job = create_job_with_details(job) # create shift - shift = ['2017-08-21', '09:00', '12:00', '10', created_job] + shift = ['2050-08-21', '09:00', '12:00', '10', created_job] created_shift = create_shift_with_details(shift) # create volunteer for shift volunteer = create_volunteer() - shift_volunteer = register_volunteer_for_shift_utility( - created_shift, volunteer) + register_volunteer_for_shift_utility(created_shift, volunteer) + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url settings.navigate_to_shift_list_view() @@ -889,40 +696,28 @@ def test_delete_shift_with_volunteer(self): self.delete_shift_from_list() # check error message displayed and shift not deleted - self.assertEqual( - settings.get_template_error_message(), - 'You cannot delete a shift that a volunteer has signed up for.') - - # database check to ensure that shift is not deleted - self.assertEqual(len(Shift.objects.all()), 1) - self.assertNotEqual( - len(Shift.objects.filter(date=created_shift.date)), 0) + self.assertEqual(settings.get_template_error_message(), + 'You cannot delete a shift that a volunteer has signed up for.') def test_organization(self): - + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url settings.click_link(settings.organization_tab) - self.assertEqual( - self.driver.current_url, - self.live_server_url + settings.organization_list_page) + self.assertEqual(settings.remove_i18n(self.driver.current_url), + self.live_server_url + settings.organization_list_page) settings.click_link('Create Organization') - self.assertEqual( - self.driver.current_url, - self.live_server_url + settings.create_organization_page) + self.assertEqual(settings.remove_i18n(self.driver.current_url), + self.live_server_url + settings.create_organization_page) # Test all valid characters for organization # [(A-Z)|(a-z)|(0-9)|(\s)|(\-)|(:)] settings.fill_organization_form('Org-name 92:4 CA') self.assertEqual(settings.get_org_name(), 'Org-name 92:4 CA') - # database check to ensure that organization is created - self.assertEqual(len(Organization.objects.all()), 1) - self.assertNotEqual( - len(Organization.objects.filter(name='Org-name 92:4 CA')), 0) - def test_replication_of_organization(self): + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url settings.navigate_to_organization_view() @@ -935,40 +730,32 @@ def test_replication_of_organization(self): settings.go_to_create_organization_page() settings.fill_organization_form('Organization') - self.assertEqual(settings.get_help_block().text, - 'Organization with this Name already exists.') - - # database check to ensure that duplicate organization is created - self.assertEqual(len(Organization.objects.all()), 1) + self.assertEqual(settings.get_help_block().text, 'Organization with this Name already exists.') def test_edit_org(self): # create org - org = create_organization() + create_organization() + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url settings.navigate_to_organization_view() # edit org - self.assertEqual( - settings.element_by_xpath(self.elements.EDIT_ORG).text, 'Edit') + self.assertEqual(settings.element_by_xpath(self.elements.EDIT_ORG).text, 'Edit') settings.element_by_xpath(self.elements.EDIT_ORG + '//a').click() settings.fill_organization_form('changed-organization') # check edited org - org_list = [] + org_list = list() org_list.append(settings.get_org_name()) self.assertTrue('changed-organization' in org_list) - # database check to ensure that organization is edited - self.assertEqual(len(Organization.objects.all()), 1) - self.assertNotEqual( - len(Organization.objects.filter(name='changed-organization')), 0) - def test_delete_org_without_associated_users(self): # create org - org = create_organization() + create_organization() + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url settings.navigate_to_organization_view() @@ -980,9 +767,6 @@ def test_delete_org_without_associated_users(self): with self.assertRaises(NoSuchElementException): settings.element_by_xpath('//table//tbody//tr[1]') - # database check to ensure that organization is deleted - self.assertEqual(len(Organization.objects.all()), 0) - def test_delete_org_with_associated_users(self): # create org org = create_organization() @@ -992,6 +776,7 @@ def test_delete_org_with_associated_users(self): volunteer.save() # delete org + self.settings.go_to_events_page() settings = self.settings settings.live_server_url = self.live_server_url settings.navigate_to_organization_view() @@ -999,11 +784,49 @@ def test_delete_org_with_associated_users(self): # check org not deleted message received self.assertNotEqual(settings.get_danger_message(), None) - self.assertEqual(settings.get_template_error_message( - ), 'You cannot delete an organization that users are currently associated with.' - ) - - # database check to ensure that organization is not deleted - self.assertEqual(len(Organization.objects.all()), 1) - self.assertNotEqual(len(Organization.objects.filter(name=org.name)), 0) -""" + self.assertEqual(settings.get_template_error_message(), + 'You cannot delete an organization that users are currently associated with.') + + # Feature not yet added. + """ + def test_duplicate_event(self): + event = ['event-name', '2050-08-21', '2050-09-28'] + created_event = create_event_with_details(event) + + self.settings.go_to_events_page() + settings = self.settings + # Check event created + self.assertEqual(self.driver.current_url, self.live_server_url + settings.event_list_page) + self.assertEqual(settings.get_event_name(), 'event-name') + + settings.go_to_create_event_page() + settings.fill_event_form(event) + + # TBA here - more checks depending on behaviour that should be reflected + self.assertNotEqual(self.driver.current_url, self.live_server_url + settings.event_list_page) + + # Feature not yet implemented + def test_duplicate_job(self): + # register event first to create job + event = ['event-name', '2017-08-21', '2017-09-28'] + created_event = create_event_with_details(event) + + # create job + job = ['event-name', 'job name', 'job description', '2017-08-21', '2017-08-28'] + create_job_with_details(job) + + settings = self.settings + + # check job created + settings.navigate_to_job_list_view(self.live_server_url) + self.assertEqual(settings.get_job_name(), 'job name') + self.assertEqual(settings.get_job_event(), 'event-name') + + # Create another job with same details within the same event + settings.go_to_create_job_page() + settings.fill_job_form(job) + + # TBA here - more checks depending on logic that should be reflected + # check job not created - commented out due to bug + self.assertNotEqual(self.driver.current_url, self.live_server_url + settings.job_list_page) + """ diff --git a/vms/event/views.py b/vms/event/views.py index df5e947f8..e0d7eb28c 100644 --- a/vms/event/views.py +++ b/vms/event/views.py @@ -7,6 +7,7 @@ # Django from django.contrib import messages from django.contrib.auth.decorators import login_required +from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse_lazy from django.http import HttpResponseRedirect diff --git a/vms/pom/locators/administratorReportPageLocators.py b/vms/pom/locators/administratorReportPageLocators.py index b3483d558..2f6bfa3c3 100644 --- a/vms/pom/locators/administratorReportPageLocators.py +++ b/vms/pom/locators/administratorReportPageLocators.py @@ -9,7 +9,7 @@ class AdministratorReportPageLocators(object): FIRST_NAME_SELECTOR = '//input[@name = "first_name"]' LAST_NAME_SELECTOR = '//input[@name = "last_name"]' - NAME = '//table//tbody//tr[1]//td[1]' + NAME = '//table//tbody//tr[1]//td[4]' DATE = '//table//tbody//tr[1]//td[6]' START_TIME = '//table//tbody//tr[1]//td[7]' END_TIME = '//table//tbody//tr[1]//td[8]' diff --git a/vms/pom/pages/administratorReportPage.py b/vms/pom/pages/administratorReportPage.py index 5462c9704..eff2de8ce 100644 --- a/vms/pom/pages/administratorReportPage.py +++ b/vms/pom/pages/administratorReportPage.py @@ -18,7 +18,7 @@ def __init__(self, driver): super(AdministratorReportPage, self).__init__(driver) def go_to_admin_report(self): - self.home_page.get_admin_report_link().send_keys("\n") + self.home_page.get_admin_report_link().click() def fill_report_form(self, info): first_name = self.element_by_xpath(self.elements.FIRST_NAME_SELECTOR) @@ -26,8 +26,7 @@ def fill_report_form(self, info): first_name.clear() last_name.clear() - [select1, select2, - select3] = self.get_event_job_organization_selectors() + [select1, select2, select3] = self.get_event_job_organization_selectors() first_name.send_keys(info[0]) last_name.send_keys(info[1]) @@ -38,13 +37,10 @@ def fill_report_form(self, info): self.submit_form() def get_event_job_organization_selectors(self): - select1 = Select( - self.element_by_xpath(self.elements.REPORT_EVENT_SELECTOR)) - select2 = Select( - self.element_by_xpath(self.elements.REPORT_JOB_SELECTOR)) - select3 = Select( - self.element_by_xpath(self.elements.REPORT_ORG_SELECTOR)) - return (select1, select2, select3) + select1 = Select(self.element_by_xpath(self.elements.REPORT_EVENT_SELECTOR)) + select2 = Select(self.element_by_xpath(self.elements.REPORT_JOB_SELECTOR)) + select3 = Select(self.element_by_xpath(self.elements.REPORT_ORG_SELECTOR)) + return select1, select2, select3 def submit_form(self): self.element_by_xpath(self.elements.SUBMIT_PATH).submit() @@ -53,5 +49,4 @@ def get_alert_box_text(self): return self.element_by_class_name(self.elements.NO_RESULT_BOX).text def get_shift_summary(self): - return self.element_by_xpath( - self.elements.REPORT_SHIFT_SUMMARY_PATH).text + return self.element_by_xpath(self.elements.REPORT_SHIFT_SUMMARY_PATH).text diff --git a/vms/pom/pages/basePage.py b/vms/pom/pages/basePage.py index 0b652f9ac..44d3b3fb1 100644 --- a/vms/pom/pages/basePage.py +++ b/vms/pom/pages/basePage.py @@ -48,3 +48,8 @@ def get_value_for_xpath(self, xpath): def element_by_tag_name(self, tag): return self.driver.find_element_by_tag_name(tag) + + @staticmethod + def remove_i18n(string): + slashes = [pos for pos, char in enumerate(string) if char == '/'] + return string[:slashes[2]] + string[slashes[3]:] diff --git a/vms/pom/pages/eventsPage.py b/vms/pom/pages/eventsPage.py index c350e30c3..708739cd4 100644 --- a/vms/pom/pages/eventsPage.py +++ b/vms/pom/pages/eventsPage.py @@ -3,7 +3,7 @@ # local Django from basePage import BasePage -from pom.locators.eventsPageLocators import EventsPageLocators +from pom.locators.eventsPageLocators import EventsPageLocators from pom.pages.homePage import HomePage from pom.pageUrls import PageUrls @@ -74,7 +74,7 @@ def submit_form(self): self.element_by_xpath(self.elements.GENERAL_SUBMIT_PATH).submit() def go_to_events_page(self): - self.home_page.get_events_link().send_keys('\n') + self.home_page.get_events_link().click() def navigate_to_event_list_view(self): self.get_page(self.live_server_url, self.event_list_page) @@ -96,7 +96,7 @@ def go_to_edit_event_page(self): self.element_by_xpath(self.elements.EDIT_EVENT).click() def go_to_create_job_page(self): - self.get_page(self.live_server_url, self.create_job_page) + self.click_link('Create Job') def go_to_edit_job_page(self): self.element_by_xpath(self.elements.EDIT_JOB).click() @@ -230,5 +230,4 @@ def get_shift_end_time_value(self): return self.get_value_for_xpath(self.elements.CREATE_SHIFT_END_TIME) def get_shift_max_volunteers(self): - return self.get_value_for_xpath( - self.elements.CREATE_SHIFT_MAX_VOLUNTEER) + return self.get_value_for_xpath(self.elements.CREATE_SHIFT_MAX_VOLUNTEER) diff --git a/vms/shift/services.py b/vms/shift/services.py index bf2f379a9..0973711de 100644 --- a/vms/shift/services.py +++ b/vms/shift/services.py @@ -1,465 +1,465 @@ -# standard library -import datetime -from datetime import date - -# Django -from django.core.exceptions import ObjectDoesNotExist -from django.core.mail import send_mail - -# local Django -from organization.services import (get_organization_by_name, - get_organizations_ordered_by_name) -from shift.models import Shift, VolunteerShift -from volunteer.models import Volunteer -from volunteer.services import get_volunteer_by_id, get_all_volunteers - - -def add_shift_hours(v_id, s_id, start_time, end_time): - - volunteer_shift = get_volunteer_shift_by_id(v_id, s_id) - - if volunteer_shift: - volunteer_shift.start_time = start_time - volunteer_shift.end_time = end_time - volunteer_shift.save() - else: - raise ObjectDoesNotExist - - -def calculate_duration(start_time, end_time): - - start_delta = datetime.timedelta( - hours=start_time.hour, minutes=start_time.minute) - end_delta = datetime.timedelta( - hours=end_time.hour, minutes=end_time.minute) - working_hours = (float((end_delta - start_delta).seconds) / 60) / 60 - return working_hours - - -def calculate_total_report_hours(report_list): - - total_hours = 0 - - for report in report_list: - total_hours += report["duration"] - - return total_hours - - -def cancel_shift_registration(v_id, s_id): - - if s_id and v_id: - try: - shift = Shift.objects.get(pk=s_id) - obj = VolunteerShift.objects.get(volunteer_id=v_id, shift_id=s_id) - except ObjectDoesNotExist: - raise ObjectDoesNotExist - else: - # remove volunteer from being signed up for this shift - obj.delete() - else: - raise TypeError - - -def send_reminder(): - """ - Send reminder email for all shifts and volunteers - days = 7 - one week reminder - days = 1 - one day reminder - A volunteer can specify days in the profile - !This function should be run on the server once a day! - """ - notifications_number = 0 - for volunteer in get_all_volunteers(): - days = volunteer.reminder_days - if days == 1: - email_word = " tomorrow." - else: - email_word = " in " + str(days) + " days." - v_id = volunteer.id - shift_list = get_unlogged_shifts_by_volunteer_id(v_id) - subject = "The Systers - VMS Volunteer Shift Reminder Mail" - for shift in shift_list: - date_shift = shift.date - days_before_shift = date_shift - date.today() - if days_before_shift.days == days: - message = "Dear " + volunteer.first_name + \ - ",\n\nThis is your reminder that you have registered for the " + \ - shift.job.name + " job at the " + shift.job.event.name + \ - " event on " + str(shift.date) + \ - ".\nThe shift you signed up starts" + \ - email_word + \ - "\n\nShift Start Time: " + str(shift.start_time) + \ - "\nShift End Time: " + str(shift.end_time) + \ - "\n\nAddress: " + shift.address + \ - "\nVenue: " + shift.venue + \ - "\nCity: " + shift.city + \ - "\nState: " + shift.state + \ - "\nCountry: " + shift.country + \ - "\n\nThank you for registering!" - send_mail( - subject, - message, - 'noreply@systers.org', [volunteer.email], - fail_silently=False) - notifications_number += 1 - # print(message) - return notifications_number - - -def clear_shift_hours(v_id, s_id): - - result = True - volunteer_shift = get_volunteer_shift_by_id(v_id, s_id) - - if volunteer_shift: - volunteer_shift.start_time = None - volunteer_shift.end_time = None - volunteer_shift.save() - else: - result = False - - return result - - -def delete_shift(s_id): - """ - Check before deleting: - does the shift exist? - is a volunteer signed up for the shift? - """ - - result = True - shift = get_shift_by_id(s_id) - num_slots_taken = VolunteerShift.objects.filter(shift_id=s_id).count() - - if shift and num_slots_taken == 0: - shift.delete() - else: - result = False - - return result - - -def edit_shift_hours(v_id, s_id, start_time, end_time): - - volunteer_shift = get_volunteer_shift_by_id(v_id, s_id) - - if volunteer_shift: - volunteer_shift.start_time = start_time - volunteer_shift.end_time = end_time - volunteer_shift.save() - else: - raise ObjectDoesNotExist - - -def generate_report(volunteer_shift_list): - - report_list = [] - - for volunteer_shift in volunteer_shift_list: - - volunteer = volunteer_shift.volunteer - shift = volunteer_shift.shift - event = shift.job.event - job = shift.job - - report = {} - report["first_name"] = volunteer.first_name - report["last_name"] = volunteer.last_name - if volunteer.organization: - report["organization"] = volunteer.organization.name - elif volunteer.unlisted_organization: - report["organization"] = volunteer.unlisted_organization - else: - report["organization"] = None - report["event_name"] = event.name - report["job_name"] = job.name - report["date"] = shift.date - report["logged_start_time"] = volunteer_shift.start_time - report["logged_end_time"] = volunteer_shift.end_time - report["duration"] = calculate_duration(volunteer_shift.start_time, - volunteer_shift.end_time) - - report_list.append(report) - - return report_list - - -def get_administrator_report(first_name, last_name, organization, event_name, - job_name, start_date, end_date): - - volunteer_shift_list = get_all_volunteer_shifts_with_hours() - - if first_name: - volunteer_shift_list = volunteer_shift_list.filter( - volunteer__first_name__icontains=first_name) - if last_name: - volunteer_shift_list = volunteer_shift_list.filter( - volunteer__last_name__icontains=last_name) - if organization: - organization_obj = get_organization_by_name(organization) - organization_list = get_organizations_ordered_by_name() - if organization_obj in organization_list: - # organization associated with a volunteer can be null - # therefore exclude from the search query volunteers - # with no associated organization - # then filter by organization_name - volunteer_shift_list = volunteer_shift_list.exclude( - volunteer__organization__isnull=True).filter( - volunteer__organization__name__icontains=organization) - else: - # unlisted_organization associated - # with a volunteer can be left blank - # therefore exclude from the search query volunteers - # with a blank unlisted_organization - # then filter by the unlisted organization name - volunteer_shift_list = volunteer_shift_list.exclude( - volunteer__unlisted_organization__exact='').filter( - volunteer__unlisted_organization__icontains=organization) - if event_name: - volunteer_shift_list = volunteer_shift_list.filter( - shift__job__event__name__icontains=event_name) - if job_name: - volunteer_shift_list = volunteer_shift_list.filter( - shift__job__name__icontains=job_name) - if (start_date and end_date): - volunteer_shift_list = volunteer_shift_list.filter( - shift__date__gte=start_date, shift__date__lte=end_date) - - report_list = generate_report(volunteer_shift_list) - return report_list - - -def get_all_volunteer_shifts_with_hours(): - - volunteer_shift_list = VolunteerShift.objects.all() - - # get shifts that have logged hours only - volunteer_shift_list = volunteer_shift_list.filter( - start_time__isnull=False, end_time__isnull=False) - - # order by date, start_time and end_time in descending order - volunteer_shift_list = volunteer_shift_list.order_by( - '-shift__date', '-start_time', '-end_time') - - return volunteer_shift_list - - -def get_shift_by_id(shift_id): - - is_valid = True - result = None - - try: - shift = Shift.objects.get(pk=shift_id) - except ObjectDoesNotExist: - is_valid = False - - if is_valid: - result = shift - - return result - - -def get_shifts_by_job_id(j_id): - shift_list = Shift.objects.filter(job_id=j_id) - return shift_list - - -def get_shifts_ordered_by_date(j_id): - shift_list = Shift.objects.filter(job_id=j_id).order_by('date') - return shift_list - - -def get_shift_slots_remaining(s_id): - - shift = get_shift_by_id(s_id) - num_total_slots = shift.max_volunteers - num_slots_taken = VolunteerShift.objects.filter(shift_id=s_id).count() - num_slots_remaining = num_total_slots - num_slots_taken - - return num_slots_remaining - - -def get_shifts_with_open_slots(j_id): - - shift_list_by_date = get_shifts_ordered_by_date(j_id) - shift_list = [] - - for shift in shift_list_by_date: - slots_remaining = get_shift_slots_remaining(shift.id) - if slots_remaining > 0: - shift_map = {} - shift_map["id"] = shift.id - shift_map["date"] = shift.date - shift_map["start_time"] = shift.start_time - shift_map["end_time"] = shift.end_time - shift_map["slots_remaining"] = slots_remaining - shift_list.append(shift_map) - - return shift_list - - -def get_shifts_with_open_slots_for_volunteer(j_id, v_id): - """ - Returns shifts with open slots - all except those for which the volunteer has signed up. - """ - shift_list_by_date = get_shifts_ordered_by_date(j_id) - shift_list = [] - - for shift in shift_list_by_date: - slots_remaining = get_shift_slots_remaining(shift.id) - if slots_remaining > 0 and not is_signed_up(v_id, shift.id): - shift_map = {} - shift_map["id"] = shift.id - shift_map["date"] = shift.date - shift_map["start_time"] = shift.start_time - shift_map["end_time"] = shift.end_time - shift_map["slots_remaining"] = slots_remaining - shift_list.append(shift_map) - - return shift_list - - -def get_unlogged_shifts_by_volunteer_id(v_id): - - # get shifts that the volunteer signed up for and - # that have not been logged yet (in terms of logged start and end times) - shift_signed_up_list = Shift.objects.filter( - volunteershift__volunteer_id=v_id, - volunteershift__start_time__isnull=True, - volunteershift__end_time__isnull=True) - - # this filtering is buggy when done this way, why? - # it shows the same shift multiple times if - # multiple volunteers are signed up for the same shift) - # shift_signed_up_list = shift_signed_up_list.filter( - # volunteershift__start_time__isnull=True, - # volunteershift__end_time__isnull=True) - - # order the list by date in ascending order - shift_signed_up_list = shift_signed_up_list.order_by('date') - - return shift_signed_up_list - - -def get_volunteer_report(v_id, event_name, job_name, start_date, end_date): - - volunteer_shift_list = get_volunteer_shifts_with_hours(v_id) - - # filter based on criteria provided - if event_name: - volunteer_shift_list = volunteer_shift_list.filter( - shift__job__event__name__icontains=event_name) - if job_name: - volunteer_shift_list = volunteer_shift_list.filter( - shift__job__name__icontains=job_name) - if (start_date and end_date): - volunteer_shift_list = volunteer_shift_list.filter( - shift__date__gte=start_date, shift__date__lte=end_date) - - report_list = generate_report(volunteer_shift_list) - return report_list - - -def get_volunteer_shift_by_id(v_id, s_id): - - is_valid = True - result = None - - try: - volunteer_shift = VolunteerShift.objects.get( - volunteer_id=v_id, shift_id=s_id) - except ObjectDoesNotExist: - is_valid = False - - if is_valid: - result = volunteer_shift - - return result - - -def get_volunteer_shifts_with_hours(v_id): - - # get shifts that the volunteer is signed up for - volunteer_shift_list = VolunteerShift.objects.filter(volunteer_id=v_id) - - # get shifts that have logged hours only - volunteer_shift_list = volunteer_shift_list.filter( - start_time__isnull=False, end_time__isnull=False) - - # order by date, start_time and end_time in descending order - volunteer_shift_list = volunteer_shift_list.order_by( - '-shift__date', '-start_time', '-end_time') - - return volunteer_shift_list - - -def get_volunteers_by_shift_id(s_id): - - volunteer_list = None - - # get volunteers who have signed up for the shift - volunteer_list = Volunteer.objects.filter(volunteershift__shift_id=s_id) - - # order by name - volunteer_list = volunteer_list.order_by('first_name', 'last_name') - - return volunteer_list - - -def get_logged_volunteers_by_shift_id(s_id): - - logged_volunteer_list = None - - # get volunteers who have signed up for the shift - logged_volunteer_list = VolunteerShift.objects.filter( - shift_id=s_id, start_time__isnull=False, end_time__isnull=False) - - # order by name - logged_volunteer_list = logged_volunteer_list.order_by( - 'volunteer__first_name', 'volunteer__last_name') - - return logged_volunteer_list - - -def is_signed_up(v_id, s_id): - - result = True - - volunteer_shift = get_volunteer_shift_by_id(v_id, s_id) - if not volunteer_shift: - result = False - - return result - - -def register(v_id, s_id): - - result = "IS_VALID" - ERROR_CODE_ALREADY_SIGNED_UP = "ERROR_CODE_ALREADY_SIGNED_UP" - ERROR_CODE_NO_SLOTS_REMAINING = "ERROR_CODE_NO_SLOTS_REMAINING" - - # a volunteer must not be allowed to register - # for a shift that they are already registered for - signed_up = is_signed_up(v_id, s_id) - - if not signed_up: - volunteer_obj = get_volunteer_by_id(v_id) - shift_obj = get_shift_by_id(s_id) - if volunteer_obj and shift_obj: - num_slots_remaining = get_shift_slots_remaining(s_id) - if num_slots_remaining > 0: - registration_obj = VolunteerShift( - volunteer=volunteer_obj, shift=shift_obj) - registration_obj.save() - else: - result = ERROR_CODE_NO_SLOTS_REMAINING - else: - raise ObjectDoesNotExist - else: - result = ERROR_CODE_ALREADY_SIGNED_UP - - return result +# standard library +import datetime +from datetime import date + +# Django +from django.core.exceptions import ObjectDoesNotExist +from django.core.mail import send_mail + +# local Django +from organization.services import (get_organization_by_name, + get_organizations_ordered_by_name) +from shift.models import Shift, VolunteerShift +from volunteer.models import Volunteer +from volunteer.services import get_volunteer_by_id, get_all_volunteers + + +def add_shift_hours(v_id, s_id, start_time, end_time): + + volunteer_shift = get_volunteer_shift_by_id(v_id, s_id) + + if volunteer_shift: + volunteer_shift.start_time = start_time + volunteer_shift.end_time = end_time + volunteer_shift.save() + else: + raise ObjectDoesNotExist + + +def calculate_duration(start_time, end_time): + + start_delta = datetime.timedelta( + hours=start_time.hour, minutes=start_time.minute) + end_delta = datetime.timedelta( + hours=end_time.hour, minutes=end_time.minute) + working_hours = (float((end_delta - start_delta).seconds) / 60) / 60 + return working_hours + + +def calculate_total_report_hours(report_list): + + total_hours = 0 + + for report in report_list: + total_hours += report["duration"] + + return total_hours + + +def cancel_shift_registration(v_id, s_id): + + if s_id and v_id: + try: + shift = Shift.objects.get(pk=s_id) + obj = VolunteerShift.objects.get(volunteer_id=v_id, shift_id=s_id) + except ObjectDoesNotExist: + raise ObjectDoesNotExist + else: + # remove volunteer from being signed up for this shift + obj.delete() + else: + raise TypeError + + +def send_reminder(): + """ + Send reminder email for all shifts and volunteers + days = 7 - one week reminder + days = 1 - one day reminder + A volunteer can specify days in the profile + !This function should be run on the server once a day! + """ + notifications_number = 0 + for volunteer in get_all_volunteers(): + days = volunteer.reminder_days + if days == 1: + email_word = " tomorrow." + else: + email_word = " in " + str(days) + " days." + v_id = volunteer.id + shift_list = get_unlogged_shifts_by_volunteer_id(v_id) + subject = "The Systers - VMS Volunteer Shift Reminder Mail" + for shift in shift_list: + date_shift = shift.date + days_before_shift = date_shift - date.today() + if days_before_shift.days == days: + message = "Dear " + volunteer.first_name + \ + ",\n\nThis is your reminder that you have registered for the " + \ + shift.job.name + " job at the " + shift.job.event.name + \ + " event on " + str(shift.date) + \ + ".\nThe shift you signed up starts" + \ + email_word + \ + "\n\nShift Start Time: " + str(shift.start_time) + \ + "\nShift End Time: " + str(shift.end_time) + \ + "\n\nAddress: " + shift.address + \ + "\nVenue: " + shift.venue + \ + "\nCity: " + shift.city + \ + "\nState: " + shift.state + \ + "\nCountry: " + shift.country + \ + "\n\nThank you for registering!" + send_mail( + subject, + message, + 'noreply@systers.org', [volunteer.email], + fail_silently=False) + notifications_number += 1 + # print(message) + return notifications_number + + +def clear_shift_hours(v_id, s_id): + + result = True + volunteer_shift = get_volunteer_shift_by_id(v_id, s_id) + + if volunteer_shift: + volunteer_shift.start_time = None + volunteer_shift.end_time = None + volunteer_shift.save() + else: + result = False + + return result + + +def delete_shift(s_id): + """ + Check before deleting: + does the shift exist? + is a volunteer signed up for the shift? + """ + + result = True + shift = get_shift_by_id(s_id) + num_slots_taken = VolunteerShift.objects.filter(shift_id=s_id).count() + + if shift and num_slots_taken == 0: + shift.delete() + else: + result = False + + return result + + +def edit_shift_hours(v_id, s_id, start_time, end_time): + + volunteer_shift = get_volunteer_shift_by_id(v_id, s_id) + + if volunteer_shift: + volunteer_shift.start_time = start_time + volunteer_shift.end_time = end_time + volunteer_shift.save() + else: + raise ObjectDoesNotExist + + +def generate_report(volunteer_shift_list): + + report_list = [] + + for volunteer_shift in volunteer_shift_list: + + volunteer = volunteer_shift.volunteer + shift = volunteer_shift.shift + event = shift.job.event + job = shift.job + + report = {} + report["first_name"] = volunteer.first_name + report["last_name"] = volunteer.last_name + if volunteer.organization: + report["organization"] = volunteer.organization.name + elif volunteer.unlisted_organization: + report["organization"] = volunteer.unlisted_organization + else: + report["organization"] = None + report["event_name"] = event.name + report["job_name"] = job.name + report["date"] = shift.date + report["logged_start_time"] = volunteer_shift.start_time + report["logged_end_time"] = volunteer_shift.end_time + report["duration"] = calculate_duration(volunteer_shift.start_time, + volunteer_shift.end_time) + + report_list.append(report) + + return report_list + + +def get_administrator_report(first_name, last_name, organization, event_name, + job_name, start_date, end_date): + + volunteer_shift_list = get_all_volunteer_shifts_with_hours() + + if first_name: + volunteer_shift_list = volunteer_shift_list.filter( + volunteer__first_name__icontains=first_name) + if last_name: + volunteer_shift_list = volunteer_shift_list.filter( + volunteer__last_name__icontains=last_name) + if organization: + organization_obj = get_organization_by_name(organization) + organization_list = get_organizations_ordered_by_name() + if organization_obj in organization_list: + # organization associated with a volunteer can be null + # therefore exclude from the search query volunteers + # with no associated organization + # then filter by organization_name + volunteer_shift_list = volunteer_shift_list.exclude( + volunteer__organization__isnull=True).filter( + volunteer__organization__name__icontains=organization) + else: + # unlisted_organization associated + # with a volunteer can be left blank + # therefore exclude from the search query volunteers + # with a blank unlisted_organization + # then filter by the unlisted organization name + volunteer_shift_list = volunteer_shift_list.exclude( + volunteer__unlisted_organization__exact='').filter( + volunteer__unlisted_organization__icontains=organization) + if event_name: + volunteer_shift_list = volunteer_shift_list.filter( + shift__job__event__name__icontains=event_name) + if job_name: + volunteer_shift_list = volunteer_shift_list.filter( + shift__job__name__icontains=job_name) + if (start_date and end_date): + volunteer_shift_list = volunteer_shift_list.filter( + shift__date__gte=start_date, shift__date__lte=end_date) + + report_list = generate_report(volunteer_shift_list) + return report_list + + +def get_all_volunteer_shifts_with_hours(): + + volunteer_shift_list = VolunteerShift.objects.all() + + # get shifts that have logged hours only + volunteer_shift_list = volunteer_shift_list.filter( + start_time__isnull=False, end_time__isnull=False) + + # order by date, start_time and end_time in descending order + volunteer_shift_list = volunteer_shift_list.order_by( + '-shift__date', '-start_time', '-end_time') + + return volunteer_shift_list + + +def get_shift_by_id(shift_id): + + is_valid = True + result = None + + try: + shift = Shift.objects.get(pk=shift_id) + except ObjectDoesNotExist: + is_valid = False + + if is_valid: + result = shift + + return result + + +def get_shifts_by_job_id(j_id): + shift_list = Shift.objects.filter(job_id=j_id) + return shift_list + + +def get_shifts_ordered_by_date(j_id): + shift_list = Shift.objects.filter(job_id=j_id).order_by('date') + return shift_list + + +def get_shift_slots_remaining(s_id): + + shift = get_shift_by_id(s_id) + num_total_slots = shift.max_volunteers + num_slots_taken = VolunteerShift.objects.filter(shift_id=s_id).count() + num_slots_remaining = num_total_slots - num_slots_taken + + return num_slots_remaining + + +def get_shifts_with_open_slots(j_id): + + shift_list_by_date = get_shifts_ordered_by_date(j_id) + shift_list = [] + + for shift in shift_list_by_date: + slots_remaining = get_shift_slots_remaining(shift.id) + if slots_remaining > 0: + shift_map = {} + shift_map["id"] = shift.id + shift_map["date"] = shift.date + shift_map["start_time"] = shift.start_time + shift_map["end_time"] = shift.end_time + shift_map["slots_remaining"] = slots_remaining + shift_list.append(shift_map) + + return shift_list + + +def get_shifts_with_open_slots_for_volunteer(j_id, v_id): + """ + Returns shifts with open slots + all except those for which the volunteer has signed up. + """ + shift_list_by_date = get_shifts_ordered_by_date(j_id) + shift_list = [] + + for shift in shift_list_by_date: + slots_remaining = get_shift_slots_remaining(shift.id) + if slots_remaining > 0 and not is_signed_up(v_id, shift.id): + shift_map = {} + shift_map["id"] = shift.id + shift_map["date"] = shift.date + shift_map["start_time"] = shift.start_time + shift_map["end_time"] = shift.end_time + shift_map["slots_remaining"] = slots_remaining + shift_list.append(shift_map) + + return shift_list + + +def get_unlogged_shifts_by_volunteer_id(v_id): + + # get shifts that the volunteer signed up for and + # that have not been logged yet (in terms of logged start and end times) + shift_signed_up_list = Shift.objects.filter( + volunteershift__volunteer_id=v_id, + volunteershift__start_time__isnull=True, + volunteershift__end_time__isnull=True) + + # this filtering is buggy when done this way, why? + # it shows the same shift multiple times if + # multiple volunteers are signed up for the same shift) + # shift_signed_up_list = shift_signed_up_list.filter( + # volunteershift__start_time__isnull=True, + # volunteershift__end_time__isnull=True) + + # order the list by date in ascending order + shift_signed_up_list = shift_signed_up_list.order_by('date') + + return shift_signed_up_list + + +def get_volunteer_report(v_id, event_name, job_name, start_date, end_date): + + volunteer_shift_list = get_volunteer_shifts_with_hours(v_id) + + # filter based on criteria provided + if event_name: + volunteer_shift_list = volunteer_shift_list.filter( + shift__job__event__name__icontains=event_name) + if job_name: + volunteer_shift_list = volunteer_shift_list.filter( + shift__job__name__icontains=job_name) + if (start_date and end_date): + volunteer_shift_list = volunteer_shift_list.filter( + shift__date__gte=start_date, shift__date__lte=end_date) + + report_list = generate_report(volunteer_shift_list) + return report_list + + +def get_volunteer_shift_by_id(v_id, s_id): + + is_valid = True + result = None + + try: + volunteer_shift = VolunteerShift.objects.get( + volunteer_id=v_id, shift_id=s_id) + except ObjectDoesNotExist: + is_valid = False + + if is_valid: + result = volunteer_shift + + return result + + +def get_volunteer_shifts_with_hours(v_id): + + # get shifts that the volunteer is signed up for + volunteer_shift_list = VolunteerShift.objects.filter(volunteer_id=v_id) + + # get shifts that have logged hours only + volunteer_shift_list = volunteer_shift_list.filter( + start_time__isnull=False, end_time__isnull=False) + + # order by date, start_time and end_time in descending order + volunteer_shift_list = volunteer_shift_list.order_by( + '-shift__date', '-start_time', '-end_time') + + return volunteer_shift_list + + +def get_volunteers_by_shift_id(s_id): + + volunteer_list = None + + # get volunteers who have signed up for the shift + volunteer_list = Volunteer.objects.filter(volunteershift__shift_id=s_id) + + # order by name + volunteer_list = volunteer_list.order_by('first_name', 'last_name') + + return volunteer_list + + +def get_logged_volunteers_by_shift_id(s_id): + + logged_volunteer_list = None + + # get volunteers who have signed up for the shift + logged_volunteer_list = VolunteerShift.objects.filter( + shift_id=s_id, start_time__isnull=False, end_time__isnull=False) + + # order by name + logged_volunteer_list = logged_volunteer_list.order_by( + 'volunteer__first_name', 'volunteer__last_name') + + return logged_volunteer_list + + +def is_signed_up(v_id, s_id): + + result = True + + volunteer_shift = get_volunteer_shift_by_id(v_id, s_id) + if not volunteer_shift: + result = False + + return result + + +def register(v_id, s_id): + + result = "IS_VALID" + ERROR_CODE_ALREADY_SIGNED_UP = "ERROR_CODE_ALREADY_SIGNED_UP" + ERROR_CODE_NO_SLOTS_REMAINING = "ERROR_CODE_NO_SLOTS_REMAINING" + + # a volunteer must not be allowed to register + # for a shift that they are already registered for + signed_up = is_signed_up(v_id, s_id) + + if not signed_up: + volunteer_obj = get_volunteer_by_id(v_id) + shift_obj = get_shift_by_id(s_id) + if volunteer_obj and shift_obj: + num_slots_remaining = get_shift_slots_remaining(s_id) + if num_slots_remaining > 0: + registration_obj = VolunteerShift( + volunteer=volunteer_obj, shift=shift_obj) + registration_obj.save() + else: + result = ERROR_CODE_NO_SLOTS_REMAINING + else: + raise ObjectDoesNotExist + else: + result = ERROR_CODE_ALREADY_SIGNED_UP + + return result diff --git a/vms/shift/utils.py b/vms/shift/utils.py index 4d96a9034..e4d27ee32 100644 --- a/vms/shift/utils.py +++ b/vms/shift/utils.py @@ -57,8 +57,8 @@ def create_job_with_details(job): def create_volunteer_with_details(volunteer): """ - Creates and returns volunteer with passed name and dates - """ + Creates and returns volunteer with passed name and dates + """ u1 = User.objects.create_user(username=volunteer[0], password='volunteer') v1 = Volunteer( first_name=volunteer[1], @@ -75,6 +75,27 @@ def create_volunteer_with_details(volunteer): return v1 +def create_volunteer_with_details_dynamic_password(volunteer): + """ + Creates and returns volunteer with passed name and dates + """ + u1 = User.objects.create_user(username=volunteer[0], password=volunteer[1]) + v1 = Volunteer( + email=volunteer[2], + first_name=volunteer[3], + last_name=volunteer[4], + address=volunteer[5], + city=volunteer[6], + state=volunteer[7], + country=volunteer[8], + phone_number=volunteer[9], + user=u1 + ) + + v1.save() + return v1 + + def create_shift_with_details(shift): """ Creates and returns shift with passed name and dates