diff --git a/aut_docs/Design_Document.md b/aut_docs/Design_Document.md new file mode 100644 index 0000000..76f7347 --- /dev/null +++ b/aut_docs/Design_Document.md @@ -0,0 +1,58 @@ +# Automated Testing for VMS + +The QA process is divided as follows: + +- Continuous Intergation: Used travis to setup CI for VMS Project +- Functional Testing: Used Selnium to write UI tests from an end-users perspective.(black-box tests) +- Unit Testing: Valeria is writing unit-tests for the codebase.(white-box tests) + +## Few important points regarding CI: + +- `.travis.yml` is the config file to run the travis build +- Build can be viewed at `http://travis.org/jayesh92/vms` +- Status would be reflected in the badge in `README.md` + +## Few important points regarding Functional Testing: + +- Selenium, a browser automation tool is used to simulate the functionality. + python APIs for selnium are used in the tests. + +- Django provides a class `LiveServerTestCase`. What this does is that, It + setups a Virtual Django Sever in the background which can be used by + selenium to run tests. + +- So, each testcase Class inherits `LiveServerTestCase`, Contains a `setUp` + and `tearDown` method to instantiate and end live-server respectively. + Each testcase in the class begins with `test`. + +- Each Test Class covers a view. Class name represents the name of the view + in nav-bar. Test suite for a view is contained in `tests` folder of the app + containing the view. For Ex: `Volunteer Search` tab in the nav-bar of an + admin user redirects to `http://127.0.0.1:8000/volunteer/search/`, so + the corresponding tests for this view would be in `VolunteerSearch` class + in `tests` folder of `volunteer` app. + +- Each app contains a `tests` folder containing the unit-tests and functional + tests and an `__init__.py` to let django consider it as a package. + +- Currently, only functional tests for admin views have been written. + +## Steps to run tests: + +- Currently, used `python 2.7` +- Clone project: `git clone https://github.com/systers/vms.git` +- In the root folder of the project, startup a new virtual environment + `virtualenv -p /usr/bin/python2.7 venv` +- Activate virtualenv, `source venv/bin/activate` +- Install dependencies: `pip install -r requirements.txt` +- `cd vms` +- To run, `python manage.py runserver`. Browse + `http://127.0.0.1:8000` +- To execute tests `python manage.py test`. This will run all unit-tests and + all functional-tests across all apps. To execute tests of only a particular + app, run `python manage.py test ` +- If all tests pass, `OK` will be received at the end. +- For functional tests, a firefox window for each test will open up + automatically and close after simulation of tests. + +Note: The current setup uses one of the latest versions of Selenium. You will run into errors if the this version is incompatible with your firefox version and does not support it. In that case, follow [this](https://support.mozilla.org/en-US/kb/find-what-version-firefox-you-are-using) guide to find out your browser version and accordingly install a Selenium version compatible with it. \ No newline at end of file diff --git a/docs/Installation Guide.md b/docs/Installation Guide.md index 9998ec3..bdbc3b9 100644 --- a/docs/Installation Guide.md +++ b/docs/Installation Guide.md @@ -294,9 +294,9 @@ Start the development server by running the command (this runs the development s You can now try out the project by going to [http://localhost:8001/home](http://localhost:8001/home) on a browser on your local machine. -## Run Unit Tests +## Run Unit and Functional Tests -You can also run unit tests by running the command: +You can also run unit and functional tests by running the command: python manage.py test name_of_app_here @@ -314,6 +314,18 @@ python manage.py test shift python manage.py test organization ``` +If you want to run only unit tests for an app, refer to its test_services file using the dot notation. + +For example, if you want to run unit tests for the event app: +``` +python manage.py test event.tests.test_services +``` + +Smilarly, for job app it would be: +``` +python manage.py test job.tests.test_services +``` + If you want to run all unit tests, run this command: python manage.py test diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..0bd9fe6 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,8 @@ +coverage==3.7.1 +coveralls==0.5 +Django==1.7.4 +docopt==0.6.2 +psycopg2==2.5.4 +PyYAML==3.11 +requests==2.7.0 +selenium==2.53.1 diff --git a/vms/administrator/tests/__init__.py b/vms/administrator/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vms/administrator/tests/test_report.py b/vms/administrator/tests/test_report.py new file mode 100644 index 0000000..0bdb792 --- /dev/null +++ b/vms/administrator/tests/test_report.py @@ -0,0 +1,623 @@ + +from django.test import TestCase +from django.contrib.staticfiles.testing import LiveServerTestCase + +from django.contrib.auth.models import User +from django.db import IntegrityError + +from administrator.models import Administrator +from volunteer.models import Volunteer +from event.models import Event +from job.models import Job +from shift.models import Shift, VolunteerShift +from organization.models import Organization #hack to pass travis,Bug in Code + +from selenium import webdriver +from selenium.common.exceptions import NoSuchElementException + + +class Report(LiveServerTestCase): + ''' + ''' + def setUp(self): + admin_user = User.objects.create_user( + username = 'admin', + password = 'admin', + email = 'admin@admin.com') + + Administrator.objects.create( + user = admin_user, + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + unlisted_organization = 'organization') + + # create an org prior to registration. Bug in Code + # added to pass CI + Organization.objects.create( + name = 'DummyOrg') + + self.homepage = '/' + self.authentication_page = '/authentication/login/' + self.report_page = '/administrator/report/' + + self.driver = webdriver.Firefox() + self.driver.implicitly_wait(5) + self.driver.maximize_window() + super(Report, self).setUp() + + def tearDown(self): + self.driver.quit() + super(Report, self).tearDown() + + def login(self, username, password): + self.driver.get(self.live_server_url + self.authentication_page) + self.driver.find_element_by_id('id_login').send_keys(username) + self.driver.find_element_by_id('id_password').send_keys(password) + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertEqual(self.driver.current_url, + self.live_server_url + self.homepage) + + def logout(self): + self.driver.find_element_by_link_text('Log Out').click() + + def test_null_values_with_empty_dataset(self): + # should return no entries + self.login('admin', 'admin') + self.driver.find_element_by_link_text('Report').click() + self.driver.find_element_by_xpath('//form[1]').submit() + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-danger').text, 'Your criteria did not return any results.') + + def test_null_values_with_dataset(self): + # register dataset + org = Organization.objects.create(name = 'organization-one') + + volunteer_user = User.objects.create_user( + username = 'volunteer-one', + password = 'volunteer-one', + email = 'vol@vol.com') + + volunteer = Volunteer.objects.create( + user = volunteer_user, + first_name = 'first-name-one', + last_name = 'last-name-one', + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + unlisted_organization = Organization.objects.get( + name = 'organization-one')) + + # create shift and log hours + event = Event.objects.create( + name = 'Hackathon', + start_date = '2016-06-01', + end_date = '2016-06-01') + + job = Job.objects.create( + name = 'Developer', + start_date = '2016-06-01', + end_date = '2016-06-01', + event = event) + + shift = Shift.objects.create( + date = '2016-06-01', + start_time = '08:00', + end_time = '20:00', + max_volunteers = '2', + job = job) + + VolunteerShift.objects.create( + shift = shift, + volunteer = volunteer, + start_time = '09:00', + end_time = '15:00') + + # check logged hours in volunteer-one's profile + self.login('volunteer-one', 'volunteer-one') + self.driver.get(self.live_server_url + + '/shift/view_hours/' + str(Volunteer.objects.get( + user__username = 'volunteer-one').pk)) + + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'Developer') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[2]').text, 'June 1, 2016') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[3]').text, '9 a.m.') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, '3 p.m.') + self.logout() + + # check admin report with null fields, should return the above shift + self.login('admin', 'admin') + self.driver.get(self.live_server_url + self.report_page) + self.driver.find_element_by_xpath('//form[1]').submit() + total_no_of_shifts = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[10].strip('\nTotal') + + total_no_of_hours = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[-1].strip('\n') + + self.assertEqual(total_no_of_shifts, '1') + self.assertEqual(total_no_of_hours, '6.0') + + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'first-name-one') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[6]').text, 'June 1, 2016') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[7]').text, '9 a.m.') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[8]').text, '3 p.m.') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[9]').text, '6.0') + + def test_only_logged_shifts_are_reported(self): + # register dataset + org = Organization.objects.create(name = 'organization-one') + + volunteer_user = User.objects.create_user( + username = 'volunteer-one', + password = 'volunteer-one') + + volunteer = Volunteer.objects.create( + user = volunteer_user, + first_name = 'first-name-one', + last_name = 'last-name-one', + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + email = 'vol@vol.com', + organization = Organization.objects.get( + name = 'organization-one')) + + # create shift and log hours + event = Event.objects.create( + name = 'Hackathon', + start_date = '2016-06-01', + end_date = '2016-06-01') + + job = Job.objects.create( + name = 'Developer', + start_date = '2016-06-01', + end_date = '2016-06-01', + event = event) + + shift = Shift.objects.create( + date = '2016-06-01', + start_time = '09:00', + end_time = '15:00', + max_volunteers = '2', + job = job) + + # shift is assigned to volunteer-one, but hours have not been logged + VolunteerShift.objects.create( + shift = shift, + volunteer = volunteer) + + # check shift assigned to volunteer-one + # view being accessed `/shift/view_volunteer_shift` + self.login('volunteer-one', 'volunteer-one') + self.driver.get(self.live_server_url + + '/shift/view_volunteer_shifts/' + str(Volunteer.objects.get( + user__username = 'volunteer-one').pk)) + + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'Developer') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[2]').text, 'June 1, 2016') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[3]').text, '9 a.m.') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, '3 p.m.') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[5]//a').text, 'Log Hours') + self.logout() + + # check admin report with null fields, should return the above shift + self.login('admin', 'admin') + self.driver.get(self.live_server_url + self.report_page) + self.driver.find_element_by_xpath('//form[1]').submit() + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-danger').text, 'Your criteria did not return any results.') + + def register_dataset(self, parameters): + try: + org = Organization.objects.create(name = parameters['org']) + except IntegrityError: + org = Organization.objects.get(name = parameters['org']) + + + volunteer_user = User.objects.create_user( + username = parameters['volunteer']['username'], + password = parameters['volunteer']['password']) + + volunteer = Volunteer.objects.create( + user = volunteer_user, + first_name = parameters['volunteer']['first_name'], + last_name = parameters['volunteer']['last_name'], + address = parameters['volunteer']['address'], + city = parameters['volunteer']['city'], + state = parameters['volunteer']['state'], + country = parameters['volunteer']['country'], + phone_number = parameters['volunteer']['phone-no'], + email = parameters['volunteer']['email'], + organization = Organization.objects.get( + name = parameters['org'])) + + # create shift and log hours + event = Event.objects.create( + name = parameters['event']['name'], + start_date = parameters['event']['start_date'], + end_date = parameters['event']['end_date']) + + job = Job.objects.create( + name = parameters['job']['name'], + start_date = parameters['job']['start_date'], + end_date = parameters['job']['end_date'], + event = event) + + shift = Shift.objects.create( + date = parameters['shift']['date'], + start_time = parameters['shift']['start_time'], + end_time = parameters['shift']['end_time'], + max_volunteers = parameters['shift']['max_volunteers'], + job = job) + + # shift is assigned to volunteer-one, but hours have not been logged + VolunteerShift.objects.create( + shift = shift, + volunteer = volunteer, + start_time = parameters['vshift']['start_time'], + end_time = parameters['vshift']['end_time']) + + def test_check_intersection_of_fields(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) + + self.login('admin', 'admin') + self.driver.get(self.live_server_url + self.report_page) + + self.driver.find_element_by_xpath( + '//input[@name = "first_name"]').send_keys('tom') + self.driver.find_element_by_xpath('//form[1]').submit() + + total_no_of_shifts = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[10].strip('\nTotal') + + total_no_of_hours = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[-1].strip('\n') + + # 2 shifts of 0.5 hrs and 1.5 hrs + self.assertEqual(total_no_of_shifts, '2') + self.assertEqual(total_no_of_hours, '2.0') + + self.driver.find_element_by_xpath( + '//input[@name = "first_name"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "organization"]').send_keys('org-one') + self.driver.find_element_by_xpath('//form[1]').submit() + + total_no_of_shifts = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[10].strip('\nTotal') + + total_no_of_hours = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[-1].strip('\n') + + # 3 shifts of 0.5 hrs, 1 hrs and 1.5 hrs + self.assertEqual(total_no_of_shifts, '3') + self.assertEqual(total_no_of_hours, '3.0') + + self.driver.find_element_by_xpath( + '//input[@name = "first_name"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "organization"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "event_name"]').send_keys('event-four') + # searching for jobTwoInEventFour + self.driver.find_element_by_xpath( + '//input[@name = "job_name"]').send_keys('Two') + self.driver.find_element_by_xpath('//form[1]').submit() + + total_no_of_shifts = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[10].strip('\nTotal') + + total_no_of_hours = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[-1].strip('\n') + + # 1 shift of 1:30 hrs + self.assertEqual(total_no_of_shifts, '1') + self.assertEqual(total_no_of_hours, '1.5') + + self.driver.find_element_by_xpath( + '//input[@name = "first_name"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "organization"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "event_name"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "job_name"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "event_name"]').send_keys('one') + self.driver.find_element_by_xpath('//form[1]').submit() + + total_no_of_shifts = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[10].strip('\nTotal') + + total_no_of_hours = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[-1].strip('\n') + + # 3 shifts of 0:30 hrs, 1:00 hrs, 1:00 hrs + self.assertEqual(total_no_of_shifts, '3') + self.assertEqual(total_no_of_hours, '2.5') + + self.driver.find_element_by_xpath( + '//input[@name = "first_name"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "organization"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "event_name"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "job_name"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "last_name"]').send_keys('sherlock') + # check case-insensitive + self.driver.find_element_by_xpath( + '//input[@name = "event_name"]').send_keys('two') + self.driver.find_element_by_xpath('//form[1]').submit() + + total_no_of_shifts = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[10].strip('\nTotal') + + total_no_of_hours = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[-1].strip('\n') + + # 1 shift of 2:00 hrs + self.assertEqual(total_no_of_shifts, '1') + self.assertEqual(total_no_of_hours, '2.0') + diff --git a/vms/administrator/tests.py b/vms/administrator/tests/test_services.py similarity index 100% rename from vms/administrator/tests.py rename to vms/administrator/tests/test_services.py diff --git a/vms/administrator/tests/test_settings.py b/vms/administrator/tests/test_settings.py new file mode 100644 index 0000000..4940741 --- /dev/null +++ b/vms/administrator/tests/test_settings.py @@ -0,0 +1,809 @@ +from django.test import TestCase +from django.contrib.staticfiles.testing import LiveServerTestCase + +from django.contrib.auth.models import User +from administrator.models import Administrator +from volunteer.models import Volunteer +from organization.models import Organization #hack to pass travis,Bug in Code + +from selenium import webdriver +from selenium.common.exceptions import NoSuchElementException + + +class Settings(LiveServerTestCase): + ''' + Settings Class contains UI testcases for `Events` tab in + Administrator profile. This view consists of Events, Jobs, Shifts, + Organization tabs. + + Event: + - Create Event + - Edit Event + - Delete Event with No Associated Job + - Delete event with Associated Job + + Job: + - Create Job without any event + - Edit Job + - Delete Job without Associated Shift + - Delete Job with Shifts + + Shift: + - Create Shift without any Job + - Edit Shift + - Delete shift + + Organization: + - Create Organization + - Edit Organization + - Replication of Organization + - Delete Org's with registered volunteers + - Delete Org without registered volunteers + ''' + def setUp(self): + admin_user = User.objects.create_user( + username = 'admin', + password = 'admin', + email = 'admin@admin.com') + + Administrator.objects.create( + user = admin_user, + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + unlisted_organization = 'organization') + + # create an org prior to registration. Bug in Code + # added to pass CI + Organization.objects.create( + name = 'DummyOrg') + + self.homepage = '/' + self.authentication_page = '/authentication/login/' + self.settings_page = '/event/list/' + self.driver = webdriver.Firefox() + self.driver.implicitly_wait(5) + self.driver.maximize_window() + super(Settings, self).setUp() + + def tearDown(self): + self.driver.quit() + super(Settings, self).tearDown() + + def login_admin(self): + self.driver.get(self.live_server_url + self.authentication_page) + self.driver.find_element_by_id('id_login').send_keys('admin') + self.driver.find_element_by_id('id_password').send_keys('admin') + self.driver.find_element_by_xpath('//form[1]').submit() + self.driver.find_element_by_link_text('Events').send_keys("\n") + self.assertEqual(self.driver.current_url, + self.live_server_url + self.settings_page) + + def test_event_tab(self): + self.login_admin() + self.assertNotEqual(self.driver.find_element_by_link_text('Events'), None) + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-success').text, + 'There are currently no events. Please create events first.') + + def test_job_tab_and_create_job_without_event(self): + self.login_admin() + self.driver.find_element_by_link_text('Jobs').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + '/job/list/') + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-success').text, + 'There are currently no jobs. Please create jobs first.') + + self.driver.find_element_by_link_text('Create Job').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + '/job/create/') + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-success').text, + 'Please add events to associate with jobs first.') + + def test_shift_tab_and_create_shift_without_job(self): + self.login_admin() + self.driver.find_element_by_link_text('Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + '/shift/list_jobs/') + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-success').text, + 'There are currently no jobs. Please create jobs first.') + + def register_event_utility(self, event): + self.driver.find_element_by_link_text('Create Event').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + '/event/create/') + + self.driver.find_element_by_xpath( + '//input[@placeholder = "Event Name"]').send_keys( + event[0]) + self.driver.find_element_by_xpath( + '//input[@name = "start_date"]').send_keys( + event[1]) + self.driver.find_element_by_xpath( + '//input[@name = "end_date"]').send_keys( + event[2]) + self.driver.find_element_by_xpath('//form[1]').submit() + + def register_job_utility(self, job): + self.driver.find_element_by_link_text('Jobs').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + '/job/list/') + + self.driver.find_element_by_link_text('Create Job').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + '/job/create/') + + self.driver.find_element_by_xpath( + '//select[@name = "event_id"]').send_keys( + job[0]) + self.driver.find_element_by_xpath( + '//input[@placeholder = "Job Name"]').send_keys( + job[1]) + self.driver.find_element_by_xpath( + '//textarea[@name = "description"]').send_keys( + job[2]) + self.driver.find_element_by_xpath( + '//input[@name = "start_date"]').send_keys( + job[3]) + self.driver.find_element_by_xpath( + '//input[@name = "end_date"]').send_keys( + job[4]) + self.driver.find_element_by_xpath('//form[1]').submit() + + def test_create_event(self): + self.login_admin() + event = ['event-name', '08/21/2016', '09/28/2016'] + self.register_event_utility(event) + + # check event created + self.assertEqual(self.driver.current_url, + self.live_server_url + self.settings_page) + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'event-name') + + def test_edit_event(self): + self.login_admin() + event = ['event-name', '08/21/2016', '09/28/2016'] + self.register_event_utility(event) + + # create event + self.assertEqual(self.driver.current_url, + self.live_server_url + self.settings_page) + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'event-name') + + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[5]').text, 'Edit') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[5]//a').click() + + self.driver.find_element_by_xpath( + '//input[@placeholder = "Event Name"]').clear() + self.driver.find_element_by_xpath( + '//input[@placeholder = "Event Name"]').send_keys( + 'changed-event-name') + + self.driver.find_element_by_xpath( + '//input[@name = "start_date"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "start_date"]').send_keys( + '08/29/2016') + + self.driver.find_element_by_xpath( + '//input[@name = "end_date"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "end_date"]').send_keys( + '12/21/2016') + + self.driver.find_element_by_xpath('//form[1]').submit() + + # check event edited + self.assertEqual(self.driver.current_url, + self.live_server_url + self.settings_page) + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'changed-event-name') + + def test_delete_event_with_no_associated_job(self): + self.login_admin() + event = ['event-name', '08/21/2016', '09/28/2016'] + self.register_event_utility(event) + + # create event + self.assertEqual(self.driver.current_url, + self.live_server_url + self.settings_page) + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'event-name') + + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[6]').text, 'Delete') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[6]//a').click() + + self.assertNotEqual(self.driver.find_element_by_class_name( + 'panel-danger'), None) + self.assertEqual(self.driver.find_element_by_class_name( + 'panel-heading').text, 'Delete Event') + self.driver.find_element_by_xpath('//form').submit() + + # check event deleted + self.assertEqual(self.driver.current_url, + self.live_server_url + self.settings_page) + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_xpath('//table//tbody') + + def test_delete_event_with_associated_job(self): + self.login_admin() + + # create event + event = ['event-name', '08/21/2016', '09/28/2016'] + self.register_event_utility(event) + + # create job + job = ['event-name', 'job name', 'job description', '08/29/2016', '09/11/2016'] + self.assertEqual(self.driver.current_url, + self.live_server_url + self.settings_page) + self.register_job_utility(job) + + # check event created + self.driver.get(self.live_server_url + self.settings_page) + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'event-name') + + # delete event + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[6]').text, 'Delete') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[6]//a').click() + + # confirm to delete + self.assertNotEqual(self.driver.find_element_by_class_name( + 'panel-danger'), None) + self.assertEqual(self.driver.find_element_by_class_name( + 'panel-heading').text, 'Delete Event') + self.driver.find_element_by_xpath('//form').submit() + + self.assertNotEqual(self.driver.find_element_by_class_name( + 'alert-danger'), None) + self.assertEqual(self.driver.find_element_by_xpath( + '//div[2]/div[3]/p').text, + 'You cannot delete an event that a job is currently associated with.') + + # check event NOT deleted + self.driver.get(self.live_server_url + self.settings_page) + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'event-name') + + def test_create_job(self): + self.login_admin() + + # register event first to create job + event = ['event-name', '08/21/2016', '09/28/2016'] + self.register_event_utility(event) + + # create job + job = ['event-name', 'job name', 'job description', '08/29/2016', '09/11/2016'] + self.assertEqual(self.driver.current_url, + self.live_server_url + self.settings_page) + self.register_job_utility(job) + + # check job created + self.assertEqual(self.driver.current_url, + self.live_server_url + '/job/list/') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'job name') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[2]').text, 'event-name') + + def test_edit_job(self): + self.login_admin() + + # register event first to create job + event = ['event-name', '08/21/2016', '09/28/2016'] + self.register_event_utility(event) + + # create job + job = ['event-name', 'job name', 'job description', '08/29/2016', '09/11/2016'] + self.assertEqual(self.driver.current_url, + self.live_server_url + self.settings_page) + self.register_job_utility(job) + + # check job created + self.assertEqual(self.driver.current_url, + self.live_server_url + '/job/list/') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'job name') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[2]').text, 'event-name') + + # edit job + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[6]').text, 'Edit') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[6]//a').click() + + self.driver.find_element_by_xpath( + '//input[@name = "name"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "name"]').send_keys( + 'changed job name') + + self.driver.find_element_by_xpath( + '//textarea[@name = "description"]').clear() + self.driver.find_element_by_xpath( + '//textarea[@name = "description"]').send_keys( + 'changed-job-description') + + self.driver.find_element_by_xpath( + '//input[@name = "start_date"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "start_date"]').send_keys( + '08/30/2016') + + self.driver.find_element_by_xpath( + '//input[@name = "end_date"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "end_date"]').send_keys( + '09/21/2016') + + self.driver.find_element_by_xpath('//form[1]').submit() + + # check event edited + self.assertEqual(self.driver.current_url, + self.live_server_url + '/job/list/') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'changed job name') + + def test_delete_job_without_associated_shift(self): + self.login_admin() + + # register event first to create job + event = ['event-name', '08/21/2016', '09/28/2016'] + self.register_event_utility(event) + + # create job + job = ['event-name', 'job name', 'job description', '08/29/2016', '09/11/2016'] + self.assertEqual(self.driver.current_url, + self.live_server_url + self.settings_page) + self.register_job_utility(job) + + # check job created + self.assertEqual(self.driver.current_url, + self.live_server_url + '/job/list/') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'job name') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[2]').text, 'event-name') + + # delete job + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[7]').text, 'Delete') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[7]//a').click() + + self.assertNotEqual(self.driver.find_element_by_class_name( + 'panel-danger'), None) + self.assertEqual(self.driver.find_element_by_class_name( + 'panel-heading').text, 'Delete Job') + self.driver.find_element_by_xpath('//form').submit() + + # check event deleted + self.assertEqual(self.driver.current_url, + self.live_server_url + '/job/list/') + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_xpath('//table//tbody') + + def test_delete_job_with_associated_shifts(self): + self.login_admin() + + # register event first to create job + event = ['event-name', '08/21/2016', '09/28/2016'] + self.register_event_utility(event) + + # create job + job = ['event-name', 'job name', 'job description', '08/29/2016', '09/11/2016'] + self.register_job_utility(job) + + # create shift + self.driver.find_element_by_link_text('Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + '/shift/list_jobs/') + + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]/td[5]//a').click() + + self.driver.find_element_by_link_text('Create Shift').click() + + self.driver.find_element_by_xpath( + '//input[@name = "date"]').send_keys( + '08/31/2016') + self.driver.find_element_by_xpath( + '//input[@name = "start_time"]').send_keys( + '09:00') + self.driver.find_element_by_xpath( + '//input[@name = "end_time"]').send_keys( + '12:00') + self.driver.find_element_by_xpath( + '//input[@name = "max_volunteers"]').send_keys( + '10') + self.driver.find_element_by_xpath('//form[1]').submit() + + # delete job + self.driver.get(self.live_server_url + '/job/list/') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[7]').text, 'Delete') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[7]//a').click() + + self.assertNotEqual(self.driver.find_element_by_class_name( + 'panel-danger'), None) + self.assertEqual(self.driver.find_element_by_class_name( + 'panel-heading').text, 'Delete Job') + self.driver.find_element_by_xpath('//form').submit() + + self.assertNotEqual(self.driver.find_element_by_class_name( + 'alert-danger'), None) + self.assertEqual(self.driver.find_element_by_xpath( + '//div[2]/div[3]/p').text, + 'You cannot delete a job that a shift is currently associated with.') + + # check job NOT deleted + self.driver.get(self.live_server_url + '/job/list/') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'job name') + + def test_create_shift(self): + self.login_admin() + + # register event to create job + event = ['event-name', '08/21/2016', '09/28/2016'] + self.register_event_utility(event) + + # create job + job = ['event-name', 'job name', 'job description', '08/29/2016', '09/11/2016'] + self.register_job_utility(job) + + # create shift + self.driver.find_element_by_link_text('Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + '/shift/list_jobs/') + + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]/td[5]//a').click() + + self.driver.find_element_by_link_text('Create Shift').click() + + self.driver.find_element_by_xpath( + '//input[@name = "date"]').send_keys( + '09/01/2016') + self.driver.find_element_by_xpath( + '//input[@name = "start_time"]').send_keys( + '09:00') + self.driver.find_element_by_xpath( + '//input[@name = "end_time"]').send_keys( + '12:00') + self.driver.find_element_by_xpath( + '//input[@name = "max_volunteers"]').send_keys( + '10') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_xpath( + '//table//tbody'), None) + + def test_edit_shift(self): + self.login_admin() + + # register event to create job + event = ['event-name', '08/21/2016', '09/28/2016'] + self.register_event_utility(event) + + # create job + job = ['event-name', 'job name', 'job description', '08/29/2016', '09/11/2016'] + self.register_job_utility(job) + + # create shift + self.driver.find_element_by_link_text('Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + '/shift/list_jobs/') + + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]/td[5]//a').click() + + self.driver.find_element_by_link_text('Create Shift').click() + + self.driver.find_element_by_xpath( + '//input[@name = "date"]').send_keys( + '09/01/2016') + self.driver.find_element_by_xpath( + '//input[@name = "start_time"]').send_keys( + '09:00') + self.driver.find_element_by_xpath( + '//input[@name = "end_time"]').send_keys( + '12:00') + self.driver.find_element_by_xpath( + '//input[@name = "max_volunteers"]').send_keys( + '10') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_xpath( + '//table//tbody'), None) + + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[5]').text, 'Edit') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[5]//a').click() + + self.driver.find_element_by_xpath('//input[@name = "date"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "date"]').send_keys( + '09/05/2016') + + self.driver.find_element_by_xpath( + '//input[@name = "start_time"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "start_time"]').send_keys( + '10:00') + + self.driver.find_element_by_xpath( + '//input[@name = "end_time"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "end_time"]').send_keys( + '13:00') + + self.driver.find_element_by_xpath( + '//input[@name = "max_volunteers"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "max_volunteers"]').send_keys( + '5') + + self.driver.find_element_by_xpath('//form[1]').submit() + + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_class_name('help-block') + + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'Sept. 5, 2016') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[2]').text, '10 a.m.') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[3]').text, '1 p.m.') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, '5') + + def test_delete_shift(self): + self.login_admin() + + # register event to create job + event = ['event-name', '08/21/2016', '09/28/2016'] + self.register_event_utility(event) + + # create job + job = ['event-name', 'job name', 'job description', '08/29/2016', '09/11/2016'] + self.register_job_utility(job) + + # create shift + self.driver.find_element_by_link_text('Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + '/shift/list_jobs/') + + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]/td[5]//a').click() + + self.driver.find_element_by_link_text('Create Shift').click() + + self.driver.find_element_by_xpath( + '//input[@name = "date"]').send_keys( + '09/05/2016') + self.driver.find_element_by_xpath( + '//input[@name = "start_time"]').send_keys( + '09:00') + self.driver.find_element_by_xpath( + '//input[@name = "end_time"]').send_keys( + '12:00') + self.driver.find_element_by_xpath( + '//input[@name = "max_volunteers"]').send_keys( + '10') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_xpath( + '//table//tbody'), None) + + # delete shift + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[6]').text, 'Delete') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[6]//a').click() + + # confirm on delete + self.assertNotEqual(self.driver.find_element_by_class_name( + 'panel-danger'), None) + self.assertEqual(self.driver.find_element_by_class_name( + 'panel-heading').text, 'Delete Shift') + self.driver.find_element_by_xpath('//form').submit() + + # check deletion of shift + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'job name') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[5]').text, 'Shifts') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[5]//a').click() + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-success').text, + 'There are currently no shifts. Please create shifts first.') + + def test_organization(self): + self.login_admin() + + self.driver.find_element_by_link_text('Organizations').click() + self.assertEqual(self.driver.current_url, self.live_server_url + + '/organization/list/') + + self.driver.find_element_by_link_text('Create Organization').click() + self.assertEqual(self.driver.current_url, self.live_server_url + + '/organization/create/') + + # Test all valid characters for organization + # [(A-Z)|(a-z)|(0-9)|(\s)|(\-)|(:)] + self.driver.find_element_by_xpath('//input[@name = "name"]').send_keys( + 'Org-name 92:4 CA') + self.driver.find_element_by_xpath('//form[1]').submit() + # tr[2] since one dummy org already created in Setup, due to code-bug + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[2]//td[1]').text, 'Org-name 92:4 CA') + + def test_replication_of_organization(self): + self.login_admin() + + self.driver.find_element_by_link_text('Organizations').click() + self.assertEqual(self.driver.current_url, self.live_server_url + + '/organization/list/') + + self.driver.find_element_by_link_text('Create Organization').click() + self.assertEqual(self.driver.current_url, self.live_server_url + + '/organization/create/') + + self.driver.find_element_by_xpath('//input[@name = "name"]').send_keys( + 'Organization') + self.driver.find_element_by_xpath('//form[1]').submit() + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[2]//td[1]').text, 'Organization') + + # Create same orgnization again + self.driver.find_element_by_link_text('Create Organization').click() + self.assertEqual(self.driver.current_url, self.live_server_url + + '/organization/create/') + + self.driver.find_element_by_xpath('//input[@name = "name"]').send_keys( + 'Organization') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertEqual(self.driver.find_element_by_xpath( + '//p[@class = "help-block"]').text, + 'Organization with this Name already exists.') + + def test_edit_org(self): + # create org + self.login_admin() + + self.driver.find_element_by_link_text('Organizations').click() + self.assertEqual(self.driver.current_url, self.live_server_url + + '/organization/list/') + + self.driver.find_element_by_link_text('Create Organization').click() + self.assertEqual(self.driver.current_url, self.live_server_url + + '/organization/create/') + + self.driver.find_element_by_xpath('//input[@name = "name"]').send_keys( + 'organization') + self.driver.find_element_by_xpath('//form[1]').submit() + + # edit org + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[2]//td[2]').text, 'Edit') + self.driver.find_element_by_xpath( + '//table//tbody//tr[2]//td[2]//a').click() + + self.driver.find_element_by_xpath( + '//input[@name = "name"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "name"]').send_keys('changed-organization') + self.driver.find_element_by_xpath('//form[1]').submit() + + # check edited org + org_list = [] + org_list.append(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text) + org_list.append(self.driver.find_element_by_xpath( + '//table//tbody//tr[2]//td[1]').text) + + self.assertTrue('changed-organization' in org_list) + + def test_delete_org_without_associated_users(self): + # create org + self.login_admin() + + self.driver.find_element_by_link_text('Organizations').click() + self.assertEqual(self.driver.current_url, self.live_server_url + + '/organization/list/') + + self.driver.find_element_by_link_text('Create Organization').click() + self.assertEqual(self.driver.current_url, self.live_server_url + + '/organization/create/') + + self.driver.find_element_by_xpath('//input[@name = "name"]').send_keys( + 'organization') + self.driver.find_element_by_xpath('//form[1]').submit() + + # delete org + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[2]//td[3]').text, 'Delete') + self.driver.find_element_by_xpath( + '//table//tbody//tr[2]//td[3]//a').click() + + # confirm on delete + self.assertNotEqual(self.driver.find_element_by_class_name( + 'panel-danger'), None) + self.assertEqual(self.driver.find_element_by_class_name( + 'panel-heading').text, 'Delete Organization') + self.driver.find_element_by_xpath('//form').submit() + + # check org deleted + # There should only be one org entry in the table shown. + # One, because of dummy-org inserted in setUp and not zero + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_xpath('//table//tbody//tr[2]') + + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'DummyOrg') + + def test_delete_org_with_associated_users(self): + # create org + self.login_admin() + + self.driver.find_element_by_link_text('Organizations').click() + self.driver.find_element_by_link_text('Create Organization').click() + self.driver.find_element_by_xpath('//input[@name = "name"]').send_keys( + 'organization') + self.driver.find_element_by_xpath('//form[1]').submit() + + # create Volunteer with Org as "organzization" + volunteer_user = User.objects.create_user( + username = 'volunteer', + password = 'volunteer', + email = 'volunteer@volunteer.com') + + Volunteer.objects.create( + user = volunteer_user, + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + organization = Organization.objects.get( + name = 'organization')) + + # delete org + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[2]//td[3]').text, 'Delete') + self.driver.find_element_by_xpath( + '//table//tbody//tr[2]//td[3]//a').click() + + # confirm on delete + self.assertNotEqual(self.driver.find_element_by_class_name( + 'panel-danger'), None) + self.assertEqual(self.driver.find_element_by_class_name( + 'panel-heading').text, 'Delete Organization') + self.driver.find_element_by_xpath('//form').submit() + + # check org not deleted message received + self.assertNotEqual(self.driver.find_element_by_class_name( + 'alert-danger'), None) + self.assertEqual(self.driver.find_element_by_xpath( + '//div[2]/div[3]/p').text, + 'You cannot delete an organization that users are currently associated with.') + diff --git a/vms/authentication/tests.py b/vms/administrator/tests/test_unit.py similarity index 100% rename from vms/authentication/tests.py rename to vms/administrator/tests/test_unit.py diff --git a/vms/authentication/tests/__init__.py b/vms/authentication/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vms/home/tests.py b/vms/authentication/tests/test_services.py similarity index 100% rename from vms/home/tests.py rename to vms/authentication/tests/test_services.py diff --git a/vms/event/tests/__init__.py b/vms/event/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vms/event/tests.py b/vms/event/tests/test_services.py similarity index 100% rename from vms/event/tests.py rename to vms/event/tests/test_services.py diff --git a/vms/event/tests/test_shiftSignUp.py b/vms/event/tests/test_shiftSignUp.py new file mode 100644 index 0000000..e7da5d6 --- /dev/null +++ b/vms/event/tests/test_shiftSignUp.py @@ -0,0 +1,217 @@ +from django.test import TestCase +from django.contrib.staticfiles.testing import LiveServerTestCase + +from django.contrib.auth.models import User +from volunteer.models import Volunteer +from event.models import Event +from job.models import Job +from shift.models import Shift, VolunteerShift + +from selenium import webdriver +from selenium.common.exceptions import NoSuchElementException + +from organization.models import Organization #hack to pass travis,Bug in Code + + +class ShiftSignUp(LiveServerTestCase): + ''' + ''' + def setUp(self): + volunteer_user = User.objects.create_user( + username = 'volunteer', + password = 'volunteer', + email = 'volunteer@volunteer.com') + + Volunteer.objects.create( + user = volunteer_user, + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + unlisted_organization = 'organization') + + # create an org prior to registration. Bug in Code + # added to pass CI + Organization.objects.create( + name = 'DummyOrg') + + self.homepage = '/' + self.authentication_page = '/authentication/login/' + self.driver = webdriver.Firefox() + self.driver.implicitly_wait(5) + self.driver.maximize_window() + super(ShiftSignUp, self).setUp() + + def tearDown(self): + self.driver.quit() + super(ShiftSignUp, self).tearDown() + + def login(self): + self.driver.get(self.live_server_url + self.authentication_page) + self.driver.find_element_by_id('id_login').send_keys('volunteer') + self.driver.find_element_by_id('id_password').send_keys('volunteer') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertEqual(self.driver.current_url, + self.live_server_url + self.homepage) + + def register_event_utility(self): + Event.objects.create( + name = 'event', + start_date = '2016-06-15', + end_date = '2016-06-16') + + def register_job_utility(self): + Job.objects.create( + name = 'job', + start_date = '2016-06-15', + end_date = '2016-06-15', + event = Event.objects.get(name = 'event')) + + def register_shift_utility(self): + Shift.objects.create( + date = '2016-06-15', + start_time = '09:00', + end_time = '15:00', + max_volunteers ='6', + job = Job.objects.get(name = 'job')) + + def test_events_page_with_no_events(self): + self.login() + + # open Shift Sign Up + self.driver.find_element_by_link_text('Shift Sign Up').click() + + self.assertEqual(self.driver.find_element_by_class_name('alert-info').text, + 'There are no events.') + + + def test_signup_shifts_with_registered_shifts(self): + # login + self.login() + + self.register_event_utility() + self.register_job_utility() + self.register_shift_utility() + + # open Shift Sign Up + self.driver.find_element_by_link_text('Shift Sign Up').click() + + # on event page + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, 'View Jobs') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + + # on jobs page + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, 'View Shifts') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + + # on shifts page + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, 'Sign Up') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + + # confirm shift assignment + self.driver.find_element_by_xpath('//form[1]').submit() + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_class_name('alert-danger') + + # check shift signed up + self.assertEqual(self.driver.find_element_by_xpath( + 'html/body/div[2]/h3').text, + 'Upcoming Shifts') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, + 'job') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[2]').text, + 'June 15, 2016') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[3]').text, + '9 a.m.') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + '3 p.m.') + + def test_signup_for_same_shift_again(self): + # login + self.login() + + self.register_event_utility() + self.register_job_utility() + self.register_shift_utility() + + # open Shift Sign Up + self.driver.find_element_by_link_text('Shift Sign Up').click() + + # events shown in table + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_class_name('alert-info') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + 'View Jobs') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + + # on jobs page + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + 'View Shifts') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + + # on shifts page, Sign up this shift ! + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + 'Sign Up') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + + # confirm on shift sign up + self.driver.find_element_by_xpath('//form[1]').submit() + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_class_name('alert-danger') + + # sign up same shift again + # open Shift Sign Up + self.driver.find_element_by_link_text('Shift Sign Up').click() + + # events page + self.assertEqual(self.driver.find_element_by_class_name('alert-info').text, + 'There are no events.') + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_tag_name('table') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, 'View Jobs') + + + def test_empty_events(self): + self.login() + + self.register_event_utility() + + # open Shift Sign Up + self.driver.find_element_by_link_text('Shift Sign Up').click() + + # on event page + self.assertEqual(self.driver.find_element_by_class_name('alert-info').text, + 'There are no events.') + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_tag_name('table') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, 'View Jobs') + + self.register_job_utility() + + self.assertEqual(self.driver.find_element_by_class_name('alert-info').text, + 'There are no events.') + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_tag_name('table') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, 'View Jobs') + diff --git a/vms/registration/tests.py b/vms/event/tests/test_unit.py similarity index 100% rename from vms/registration/tests.py rename to vms/event/tests/test_unit.py diff --git a/vms/home/tests/__init__.py b/vms/home/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vms/home/tests/test_functional.py b/vms/home/tests/test_functional.py new file mode 100644 index 0000000..b6d96d4 --- /dev/null +++ b/vms/home/tests/test_functional.py @@ -0,0 +1,568 @@ +from django.test import TestCase +from django.contrib.staticfiles.testing import LiveServerTestCase + +from django.contrib.auth.models import User + +from selenium import webdriver +from selenium.common.exceptions import NoSuchElementException + +from volunteer.models import Volunteer +from administrator.models import Administrator +from organization.models import Organization #hack to pass travis,Bug in Code + +import re + + +class TestAccessControl(LiveServerTestCase): + ''' + TestAccessControl class contains the functional tests to check Admin and + Volunteer can access '/home' view of VMS. Following tests are included: + Administrator: + - Login admin with correct credentials + - Login admin with incorrect credentials + Volunteer: + - Login volunteer with correct credentials + - Login volunteer with incorrect credentials + ''' + def setUp(self): + admin_user = User.objects.create_user( + username = 'admin', + password = 'admin', + email = 'admin@admin.com') + + volunteer_user = User.objects.create_user( + username = 'volunteer', + password = 'volunteer', + email = 'volunteer@volunteer.com') + + Administrator.objects.create( + user = admin_user, + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + unlisted_organization = 'organization') + + Volunteer.objects.create( + user = volunteer_user, + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + unlisted_organization = 'organization') + + # create an org prior to registration. Bug in Code + # added to pass CI + Organization.objects.create( + name = 'DummyOrg') + + self.homepage = '/' + self.authentication_page = '/authentication/login/' + self.driver = webdriver.Firefox() + self.driver.maximize_window() + super(TestAccessControl, self).setUp() + + def tearDown(self): + self.driver.quit() + super(TestAccessControl, self).tearDown() + + + def test_correct_admin_credentials(self): + ''' + Method to simulate logging in of a valid admin user and check if they + redirected to '/home' and no errors are generated. + ''' + self.driver.get(self.live_server_url + self.homepage) + self.driver.find_element_by_link_text('Log In').click() + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.authentication_page) + + self.driver.find_element_by_id('id_login').send_keys('admin') + self.driver.find_element_by_id('id_password').send_keys('admin') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.homepage) + + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_class_name('alert-danger') + + def test_incorrect_admin_credentials(self): + ''' + Method to simulate logging in of an Invalid admin user and check if + they are displayed an error and redirected to login page again. + ''' + self.driver.get(self.live_server_url + self.homepage) + self.driver.find_element_by_link_text('Log In').click() + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.authentication_page) + + self.driver.find_element_by_id('id_login').send_keys('admin') + self.driver.find_element_by_id('id_password').send_keys('wrong_password') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.current_url, self.live_server_url + + self.homepage) + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.authentication_page) + + self.assertNotEqual(self.driver.find_element_by_class_name( + 'alert-danger'), None) + + def test_correct_volunteer_credentials(self): + ''' + Method to simulate logging in of a valid volunteer user and check if + they are redirected to '/home' + ''' + self.driver.get(self.live_server_url + self.homepage) + self.driver.find_element_by_link_text('Log In').click() + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.authentication_page) + + self.driver.find_element_by_id('id_login').send_keys('volunteer') + self.driver.find_element_by_id('id_password').send_keys('volunteer') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.homepage) + + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_class_name('alert-danger') + + def test_incorrect_volunteer_credentials(self): + ''' + Method to simulate logging in of a Invalid volunteer user and check if + they are displayed an error and redirected to login page again. + ''' + self.driver.get(self.live_server_url + self.homepage) + self.driver.find_element_by_link_text('Log In').click() + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.authentication_page) + + self.driver.find_element_by_id('id_login').send_keys('volunteer') + self.driver.find_element_by_id('id_password').send_keys('wrong_password') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.current_url, self.live_server_url + + self.homepage) + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.authentication_page) + + self.assertNotEqual(self.driver.find_element_by_class_name( + 'alert-danger'), None) + + + +class CheckURLAccess(LiveServerTestCase): + ''' + CheckURLAccess contains methods to browse(via URL) a volunteer page view + after logging in from an admin account and vice-versa. Tests included: + - Admin cannot access volunteer URL's + - Volunteer cannot access admin URL's + ''' + def setUp(self): + admin_user = User.objects.create_user( + username = 'admin', + password = 'admin', + email = 'admin@admin.com') + + volunteer_user = User.objects.create_user( + username = 'volunteer', + password = 'volunteer', + email = 'volunteer@volunteer.com') + + Administrator.objects.create( + user = admin_user, + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + unlisted_organization = 'organization') + + Volunteer.objects.create( + user = volunteer_user, + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + unlisted_organization = 'organization') + + self.authentication_page = '/authentication/login/' + self.driver = webdriver.Firefox() + self.driver.maximize_window() + super(CheckURLAccess, self).setUp() + + def tearDown(self): + self.driver.quit() + super(CheckURLAccess, self).tearDown() + + def test_admin_cannot_access_volunteer_urls(self): + ''' + Method logins an admin user and tries to surf volunteer pages through + url. The volunteer views should return a 403 error to deny access. + ''' + self.driver.get(self.live_server_url + self.authentication_page) + + self.driver.find_element_by_id('id_login').send_keys('admin') + self.driver.find_element_by_id('id_password').send_keys('admin') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.driver.get(self.live_server_url + '/shift/view_volunteer_shifts/1') + page_source = self.driver.page_source + error = re.search('403', page_source) + self.assertNotEqual(error, None) + + self.driver.get(self.live_server_url + '/shift/view_hours/1') + page_source = self.driver.page_source + error = re.search('403', page_source) + self.assertNotEqual(error, None) + + + self.driver.get(self.live_server_url + '/event/list_sign_up/1') + page_source = self.driver.page_source + error = re.search('403', page_source) + self.assertNotEqual(error, None) + + self.driver.get(self.live_server_url + '/volunteer/report/1') + page_source = self.driver.page_source + error = re.search('403', page_source) + self.assertNotEqual(error, None) + + self.driver.get(self.live_server_url + '/volunteer/profile/1') + page_source = self.driver.page_source + error = re.search('403', page_source) + self.assertNotEqual(error, None) + + def test_volunteer_cannot_access_admin_urls(self): + ''' + Method logins a volunteer and tries to surf admin page views through url. + The admin views should return a no admin rights page. + ''' + self.driver.get(self.live_server_url + self.authentication_page) + + self.driver.find_element_by_id('id_login').send_keys('volunteer') + self.driver.find_element_by_id('id_password').send_keys('volunteer') + self.driver.find_element_by_xpath('//form[1]').submit() + + + self.driver.get(self.live_server_url + '/shift/volunteer_search/') + self.assertNotEqual(self.driver.find_elements_by_class_name('panel-heading'), + None) + self.assertNotEqual(self.driver.find_elements_by_class_name('panel-body'), + None) + self.assertEqual(self.driver.find_element_by_class_name('panel-heading').text, + 'No Access') + self.assertEqual(self.driver.find_element_by_class_name('panel-body').text, + "You don't have administrator rights") + + + self.driver.get(self.live_server_url + '/administrator/report/') + self.assertNotEqual(self.driver.find_element_by_class_name('panel-heading'), + None) + self.assertNotEqual(self.driver.find_element_by_class_name('panel-body'), + None) + self.assertEqual(self.driver.find_element_by_class_name('panel-heading').text, + 'No Access') + self.assertEqual(self.driver.find_element_by_class_name('panel-body').text, + "You don't have administrator rights") + + + self.driver.get(self.live_server_url + '/volunteer/search/') + self.assertNotEqual(self.driver.find_elements_by_class_name('panel-heading'), + None) + self.assertNotEqual(self.driver.find_elements_by_class_name('panel-body'), + None) + self.assertEqual(self.driver.find_element_by_class_name('panel-heading').text, + 'No Access') + self.assertEqual(self.driver.find_element_by_class_name('panel-body').text, + "You don't have administrator rights") + + + self.driver.get(self.live_server_url + '/administrator/settings/') + self.assertNotEqual(self.driver.find_elements_by_class_name('panel-heading'), + None) + self.assertNotEqual(self.driver.find_elements_by_class_name('panel-body'), + None) + self.assertEqual(self.driver.find_element_by_class_name('panel-heading').text, + 'No Access') + self.assertEqual(self.driver.find_element_by_class_name('panel-body').text, + "You don't have administrator rights") + + + self.driver.get(self.live_server_url + '/registration/signup_administrator/') + self.assertNotEqual(self.driver.find_elements_by_class_name('panel-heading'), + None) + self.assertNotEqual(self.driver.find_elements_by_class_name('panel-body'), + None) + self.assertEqual(self.driver.find_element_by_class_name('panel-heading').text, + 'No Access') + self.assertEqual(self.driver.find_element_by_class_name('panel-body').text, + "You don't have administrator rights") + + +class CheckPageContent(LiveServerTestCase): + ''' + This Class contains methods to check if an administrator or a volunteer + are provided their respective views links on their dashboard. + - Check admin page content + - check volunteer page content + ''' + def setUp(self): + admin_user = User.objects.create_user( + username = 'admin', + password = 'admin', + email = 'admin@admin.com') + + volunteer_user = User.objects.create_user( + username = 'volunteer', + password = 'volunteer', + email = 'volunteer@volunteer.com') + + Administrator.objects.create( + user = admin_user, + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + unlisted_organization = 'organization') + + Volunteer.objects.create( + user = volunteer_user, + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + unlisted_organization = 'organization') + + self.authentication_page = '/authentication/login/' + self.driver = webdriver.Firefox() + self.driver.maximize_window() + super(CheckPageContent, self).setUp() + + def tearDown(self): + self.driver.quit() + super(CheckPageContent, self).tearDown() + + def test_check_admin_page_content(self): + ''' + Check if an admin user has following functionalities on its home page. + - Volunteer Search + - Manage Volunteer Shift + - Report + - Settings + - Create Admin Account + ''' + self.driver.get(self.live_server_url + self.authentication_page) + + self.driver.find_element_by_id('id_login').send_keys('admin') + self.driver.find_element_by_id('id_password').send_keys('admin') + self.driver.find_element_by_xpath('//form[1]').submit() + + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_link_text('Log In') + + self.assertNotEqual(self.driver.find_element_by_link_text( + 'Volunteer Search'), None) + self.assertNotEqual(self.driver.find_element_by_link_text( + 'Manage Volunteer Shifts'), None) + self.assertNotEqual(self.driver.find_element_by_link_text( + 'Report'), None) + self.assertNotEqual(self.driver.find_element_by_link_text( + 'Events'), None) + self.assertNotEqual(self.driver.find_element_by_link_text( + 'Create Admin Account'), None) + self.assertNotEqual(self.driver.find_element_by_link_text( + 'Log Out'), None) + + def test_check_volunteer_page_content(self): + ''' + Check if a volunteer user has following functionalities on its home + page. + - UpComing Shift + - Shift Hours + - Shift Sign Up + - Report + - Profile + ''' + self.driver.get(self.live_server_url + self.authentication_page) + + self.driver.find_element_by_id('id_login').send_keys('volunteer') + self.driver.find_element_by_id('id_password').send_keys('volunteer') + self.driver.find_element_by_xpath('//form[1]').submit() + + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_link_text('Log In') + + self.assertNotEqual(self.driver.find_element_by_link_text( + 'Upcoming Shifts'), None) + self.assertNotEqual(self.driver.find_element_by_link_text( + 'Completed Shifts'), None) + self.assertNotEqual(self.driver.find_element_by_link_text( + 'Shift Sign Up'), None) + self.assertNotEqual(self.driver.find_element_by_link_text( + 'Report'), None) + self.assertNotEqual(self.driver.find_element_by_link_text( + 'Profile'), None) + self.assertNotEqual(self.driver.find_element_by_link_text( + 'Log Out'), None) + +class CheckRedirection(LiveServerTestCase): + ''' + CheckRedirection class contains test cases to check if all links + in the nav-bar for admin and volunteer page redirect to desired + views. + Admin views nav-bar consists of: + - Volunteer Search + - Manage Volunteer Shifts + - Report + - Settings + - Create Admin Account + - Logout + + Volunteer views nav-bar consists of: + - Upcoming Shifts + - Shift Hours + - Sihft SignUp + - Report + - Profile + - Logout + ''' + def setUp(self): + admin_user = User.objects.create_user( + username = 'admin', + password = 'admin', + email = 'admin@admin.com') + + volunteer_user = User.objects.create_user( + username = 'volunteer', + password = 'volunteer', + email = 'volunteer@volunteer.com') + + Administrator.objects.create( + user = admin_user, + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + unlisted_organization = 'organization') + + Volunteer.objects.create( + user = volunteer_user, + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + unlisted_organization = 'organization') + + self.volunteer_id = str(Volunteer.objects.get(user__username = + 'volunteer').pk) + + self.authentication_page = '/authentication/login/' + self.homepage = '/' + self.driver = webdriver.Firefox() + self.driver.maximize_window() + super(CheckRedirection, self).setUp() + + def tearDown(self): + self.driver.quit() + super(CheckRedirection, self).tearDown() + + def test_admin_page_redirection(self): + self.driver.get(self.live_server_url + self.authentication_page) + + self.driver.find_element_by_id('id_login').send_keys('admin') + self.driver.find_element_by_id('id_password').send_keys('admin') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.homepage) + + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_link_text('Log In') + + volunteer_search_link = self.driver.find_element_by_link_text( + 'Volunteer Search').get_attribute('href') + self.assertEqual(volunteer_search_link, self.live_server_url + + '/volunteer/search/') + + manage_volunteer_shift_link = self.driver.find_element_by_link_text( + 'Manage Volunteer Shifts').get_attribute('href') + self.assertEqual(manage_volunteer_shift_link, self.live_server_url + + '/shift/volunteer_search/') + + report_link = self.driver.find_element_by_link_text( + 'Report').get_attribute('href') + self.assertEqual(report_link, self.live_server_url + + '/administrator/report/') + + settings_link = self.driver.find_element_by_link_text( + 'Events').get_attribute('href') + self.assertEqual(settings_link, self.live_server_url + + '/administrator/settings/') + + creat_account_link = self.driver.find_element_by_link_text( + 'Create Admin Account').get_attribute('href') + self.assertEqual(creat_account_link, self.live_server_url + + '/registration/signup_administrator/') + + logout_link = self.driver.find_element_by_link_text( + 'Log Out').get_attribute('href') + self.assertEqual(logout_link, self.live_server_url + + '/authentication/logout/') + + def test_volunteer_page_redirection(self): + self.driver.get(self.live_server_url + self.authentication_page) + + self.driver.find_element_by_id('id_login').send_keys('volunteer') + self.driver.find_element_by_id('id_password').send_keys('volunteer') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.homepage) + + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_link_text('Log In') + + upcoming_shift_link = self.driver.find_element_by_link_text( + 'Upcoming Shifts').get_attribute('href') + self.assertEqual(upcoming_shift_link, self.live_server_url + + '/shift/view_volunteer_shifts/' + self.volunteer_id) + + shift_hours_link = self.driver.find_element_by_link_text( + 'Completed Shifts').get_attribute('href') + self.assertEqual(shift_hours_link, self.live_server_url + + '/shift/view_hours/' + self.volunteer_id) + + shift_signup_link = self.driver.find_element_by_link_text( + 'Shift Sign Up').get_attribute('href') + self.assertEqual(shift_signup_link, self.live_server_url + + '/event/list_sign_up/' + self.volunteer_id) + + report_link = self.driver.find_element_by_link_text( + 'Report').get_attribute('href') + self.assertEqual(report_link, self.live_server_url + + '/volunteer/report/' + self.volunteer_id) + + profile_link = self.driver.find_element_by_link_text( + 'Profile').get_attribute('href') + self.assertEqual(profile_link, self.live_server_url + + '/volunteer/profile/' + self.volunteer_id) + + logout_link = self.driver.find_element_by_link_text( + 'Log Out').get_attribute('href') + self.assertEqual(logout_link, self.live_server_url + + '/authentication/logout/') diff --git a/vms/home/tests/test_services.py b/vms/home/tests/test_services.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/vms/home/tests/test_services.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/vms/home/tests/test_unit.py b/vms/home/tests/test_unit.py new file mode 100644 index 0000000..2e9cb5f --- /dev/null +++ b/vms/home/tests/test_unit.py @@ -0,0 +1 @@ +from django.test import TestCase diff --git a/vms/job/tests/__init__.py b/vms/job/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vms/job/tests.py b/vms/job/tests/test_services.py similarity index 100% rename from vms/job/tests.py rename to vms/job/tests/test_services.py diff --git a/vms/organization/tests/__init__.py b/vms/organization/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vms/organization/tests.py b/vms/organization/tests/test_services.py similarity index 100% rename from vms/organization/tests.py rename to vms/organization/tests/test_services.py diff --git a/vms/registration/tests/__init__.py b/vms/registration/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vms/registration/tests/test_functional_admin.py b/vms/registration/tests/test_functional_admin.py new file mode 100644 index 0000000..5357589 --- /dev/null +++ b/vms/registration/tests/test_functional_admin.py @@ -0,0 +1,326 @@ +from django.test import TestCase +from django.contrib.staticfiles.testing import LiveServerTestCase + +from django.contrib.auth.models import User + +import re + +from selenium import webdriver +from selenium.common.exceptions import NoSuchElementException + +from organization.models import Organization #hack to pass travis,Bug in Code + + +class SignUpAdmin(LiveServerTestCase): + ''' + SignUpAdmin Class contains tests to register a admin User + Tests included. + + Name Fields: + - Test Null values + - Test legit characters in first_name, last_name fields + - Register admin with already registered username + - Test length of name fields ( 30 char, limit) + + Address Field: + - Test Null Values + - Test legit characters as per Models defined + + City Field: + - Test Null Values + - Test legit characters as per Models defined + ''' + def setUp(self): + # create an org prior to registration. Bug in Code + # added to pass CI + Organization.objects.create( + name = 'DummyOrg') + + self.homepage = '/' + self.admin_registration_page = '/registration/signup_administrator/' + self.authentication_page = '/authentication/login/' + self.driver = webdriver.Firefox() + self.driver.maximize_window() + super(SignUpAdmin, self).setUp() + + def tearDown(self): + self.driver.quit() + super(SignUpAdmin, self).tearDown() + + def test_null_values(self): + self.driver.get(self.live_server_url + self.admin_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('') + self.driver.find_element_by_id('id_password').send_keys('') + self.driver.find_element_by_id('id_first_name').send_keys('') + self.driver.find_element_by_id('id_last_name').send_keys('') + self.driver.find_element_by_id('id_email').send_keys('') + self.driver.find_element_by_id('id_address').send_keys('') + self.driver.find_element_by_id('id_city').send_keys('') + self.driver.find_element_by_id('id_state').send_keys('') + self.driver.find_element_by_id('id_country').send_keys('') + self.driver.find_element_by_id('id_phone_number').send_keys('') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('help-block'), + None) + + def test_name_fields(self): + # register valid admin user + self.driver.get(self.live_server_url + self.admin_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('admin-username') + self.driver.find_element_by_id('id_password').send_keys('admin-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('admin-first-name') + self.driver.find_element_by_id('id_last_name').send_keys('admin-last-name') + self.driver.find_element_by_id('id_email').send_keys('email@systers.org') + self.driver.find_element_by_id('id_address').send_keys('admin-address') + self.driver.find_element_by_id('id_city').send_keys('admin-city') + self.driver.find_element_by_id('id_state').send_keys('admin-state') + self.driver.find_element_by_id('id_country').send_keys('admin-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('admin-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('messages'), + None) + self.assertEqual(self.driver.find_element_by_class_name('messages').text, + 'You have successfully registered!') + + # register a user again with username same as already registered user + self.assertEqual(self.driver.current_url, self.live_server_url + + self.homepage) + + self.driver.get(self.live_server_url + self.admin_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('admin-username') + self.driver.find_element_by_id('id_password').send_keys('admin-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('admin-first-name') + self.driver.find_element_by_id('id_last_name').send_keys('admin-last-name') + self.driver.find_element_by_id('id_email').send_keys('email1@systers.org') + self.driver.find_element_by_id('id_address').send_keys('admin-address') + self.driver.find_element_by_id('id_city').send_keys('admin-city') + self.driver.find_element_by_id('id_state').send_keys('admin-state') + self.driver.find_element_by_id('id_country').send_keys('admin-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('admin-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('help-block'), + None) + self.assertEqual(self.driver.find_element_by_xpath("id('div_id_username')/div/p/strong").text, + 'User with this Username already exists.') + + # test numeric characters in first-name, last-name + self.driver.get(self.live_server_url + self.admin_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('admin-username-1') + self.driver.find_element_by_id('id_password').send_keys('admin-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('admin-first-name-1') + self.driver.find_element_by_id('id_last_name').send_keys('admin-last-name-1') + self.driver.find_element_by_id('id_email').send_keys('email1@systers.org') + self.driver.find_element_by_id('id_address').send_keys('admin-address') + self.driver.find_element_by_id('id_city').send_keys('admin-city') + self.driver.find_element_by_id('id_state').send_keys('admin-state') + self.driver.find_element_by_id('id_country').send_keys('admin-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('admin-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('help-block'), + None) + self.assertEqual(self.driver.find_element_by_xpath("id('div_id_first_name')/div/p/strong").text, + 'Enter a valid value.') + self.assertEqual(self.driver.find_element_by_xpath("id('div_id_last_name')/div/p/strong").text, + 'Enter a valid value.') + + # test special characters in first-name, last-name + self.driver.get(self.live_server_url + self.admin_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('admin-username-1') + self.driver.find_element_by_id('id_password').send_keys('admin-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('name-!@#$%^&*()_') + self.driver.find_element_by_id('id_last_name').send_keys('name-!@#$%^&*()_') + self.driver.find_element_by_id('id_email').send_keys('email1@systers.org') + self.driver.find_element_by_id('id_address').send_keys('admin-address') + self.driver.find_element_by_id('id_city').send_keys('admin-city') + self.driver.find_element_by_id('id_state').send_keys('admin-state') + self.driver.find_element_by_id('id_country').send_keys('admin-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('admin-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('help-block'), + None) + self.assertEqual(self.driver.find_element_by_xpath("id('div_id_first_name')/div/p/strong").text, + 'Enter a valid value.') + self.assertEqual(self.driver.find_element_by_xpath("id('div_id_last_name')/div/p/strong").text, + 'Enter a valid value.') + + # test length of first-name, last-name not exceed 30 + self.driver.get(self.live_server_url + self.admin_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('admin-username-1') + self.driver.find_element_by_id('id_password').send_keys('admin-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('admin-first-name-!@#$%^&*()_') + self.driver.find_element_by_id('id_last_name').send_keys('admin-last-name-!@#$%^&*()_') + self.driver.find_element_by_id('id_email').send_keys('email1@systers.org') + self.driver.find_element_by_id('id_address').send_keys('admin-address') + self.driver.find_element_by_id('id_city').send_keys('admin-city') + self.driver.find_element_by_id('id_state').send_keys('admin-state') + self.driver.find_element_by_id('id_country').send_keys('admin-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('admin-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('help-block'), + None) + error_message = self.driver.find_element_by_xpath("id('div_id_first_name')/div/p/strong").text + self.assertTrue(bool(re.search(r'Ensure this value has at most 20 characters', str(error_message)))) + + error_message = self.driver.find_element_by_xpath("id('div_id_last_name')/div/p/strong").text, + self.assertTrue(bool(re.search(r'Ensure this value has at most 20 characters', str(error_message)))) + + def test_address_field(self): + # register valid admin user + self.driver.get(self.live_server_url + self.admin_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('admin-username') + self.driver.find_element_by_id('id_password').send_keys('admin-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('admin-first-name') + self.driver.find_element_by_id('id_last_name').send_keys('admin-last-name') + self.driver.find_element_by_id('id_email').send_keys('email@systers.org') + self.driver.find_element_by_id('id_address').send_keys('admin-address') + self.driver.find_element_by_id('id_city').send_keys('admin-city') + self.driver.find_element_by_id('id_state').send_keys('admin-state') + self.driver.find_element_by_id('id_country').send_keys('admin-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('admin-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('messages'), + None) + self.assertEqual(self.driver.find_element_by_class_name('messages').text, + 'You have successfully registered!') + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.homepage) + + # test numeric characters in address + self.driver.get(self.live_server_url + self.admin_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('admin-username-1') + self.driver.find_element_by_id('id_password').send_keys('admin-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('admin-first-name') + self.driver.find_element_by_id('id_last_name').send_keys('admin-last-name') + self.driver.find_element_by_id('id_email').send_keys('email1@systers.org') + self.driver.find_element_by_id('id_address').send_keys('123 New-City address') + self.driver.find_element_by_id('id_city').send_keys('admin-city') + self.driver.find_element_by_id('id_state').send_keys('admin-state') + self.driver.find_element_by_id('id_country').send_keys('admin-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('admin-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('messages'), + None) + self.assertEqual(self.driver.find_element_by_class_name('messages').text, + 'You have successfully registered!') + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.homepage) + + # test special characters in address + self.driver.get(self.live_server_url + self.admin_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('admin-username-2') + self.driver.find_element_by_id('id_password').send_keys('admin-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('first-name') + self.driver.find_element_by_id('id_last_name').send_keys('last-name') + self.driver.find_element_by_id('id_email').send_keys('email2@systers.org') + self.driver.find_element_by_id('id_address').send_keys('admin-address!@#$()') + self.driver.find_element_by_id('id_city').send_keys('admin-city') + self.driver.find_element_by_id('id_state').send_keys('admin-state') + self.driver.find_element_by_id('id_country').send_keys('admin-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('admin-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('help-block'), + None) + self.assertEqual(self.driver.current_url, self.live_server_url + + self.admin_registration_page) + self.assertEqual(self.driver.find_element_by_xpath("id('div_id_address')/div/p/strong").text, + 'Enter a valid value.') + + def test_city_field(self): + # register valid admin user + self.driver.get(self.live_server_url + self.admin_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('admin-username') + self.driver.find_element_by_id('id_password').send_keys('admin-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('admin-first-name') + self.driver.find_element_by_id('id_last_name').send_keys('admin-last-name') + self.driver.find_element_by_id('id_email').send_keys('email@systers.org') + self.driver.find_element_by_id('id_address').send_keys('admin-address') + self.driver.find_element_by_id('id_city').send_keys('admin-city') + self.driver.find_element_by_id('id_state').send_keys('admin-state') + self.driver.find_element_by_id('id_country').send_keys('admin-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('admin-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('messages'), + None) + self.assertEqual(self.driver.find_element_by_class_name('messages').text, + 'You have successfully registered!') + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.homepage) + + # test numeric characters in city + self.driver.get(self.live_server_url + self.admin_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('admin-username-1') + self.driver.find_element_by_id('id_password').send_keys('admin-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('admin-first-name') + self.driver.find_element_by_id('id_last_name').send_keys('admin-last-name') + self.driver.find_element_by_id('id_email').send_keys('email1@systers.org') + self.driver.find_element_by_id('id_address').send_keys('admin-address') + self.driver.find_element_by_id('id_city').send_keys('13th admin-city') + self.driver.find_element_by_id('id_state').send_keys('admin-state') + self.driver.find_element_by_id('id_country').send_keys('admin-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('admin-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('help-block'), + None) + self.assertEqual(self.driver.current_url, self.live_server_url + + self.admin_registration_page) + self.assertEqual(self.driver.find_element_by_xpath("id('div_id_city')/div/p/strong").text, + 'Enter a valid value.') + + # test special characters in city + self.driver.get(self.live_server_url + self.admin_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('admin-username-1') + self.driver.find_element_by_id('id_password').send_keys('admin-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('first-name') + self.driver.find_element_by_id('id_last_name').send_keys('last-name') + self.driver.find_element_by_id('id_email').send_keys('email1@systers.org') + self.driver.find_element_by_id('id_address').send_keys('admin-address') + self.driver.find_element_by_id('id_city').send_keys('!@#$%^&*()_+city') + self.driver.find_element_by_id('id_state').send_keys('admin-state') + self.driver.find_element_by_id('id_country').send_keys('admin-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('admin-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('help-block'), + None) + self.assertEqual(self.driver.current_url, self.live_server_url + + self.admin_registration_page) + self.assertEqual(self.driver.find_element_by_xpath("id('div_id_city')/div/p/strong").text, + 'Enter a valid value.') diff --git a/vms/registration/tests/test_functional_volunteer.py b/vms/registration/tests/test_functional_volunteer.py new file mode 100644 index 0000000..fe42405 --- /dev/null +++ b/vms/registration/tests/test_functional_volunteer.py @@ -0,0 +1,327 @@ +from django.test import TestCase +from django.contrib.staticfiles.testing import LiveServerTestCase + +import re + +from selenium import webdriver +from selenium.common.exceptions import NoSuchElementException + +from organization.models import Organization #hack to pass travis,Bug in Code + + +class SignUpVolunteer(LiveServerTestCase): + ''' + SignUpVolunteer Class contains tests to register volunteer User + Tests included. + + Name Fields: + - Test Null values + - Test legit characters in first_name, last_name fields + - Register volunteer with already registered username + - Test length of name fields ( 30 char, limit) + + Address Field: + - Test Null Values + - Test legit characters as per Models defined + + City Field: + - Test Null Values + - Test legit characters as per Models defined + ''' + def setUp(self): + # create an org prior to registration. Bug in Code + # added to pass CI + Organization.objects.create( + name = 'DummyOrg') + + self.homepage = '/' + self.volunteer_registration_page = '/registration/signup_volunteer/' + self.authentication_page = '/authentication/login/' + self.driver = webdriver.Firefox() + self.driver.maximize_window() + super(SignUpVolunteer, self).setUp() + + def tearDown(self): + self.driver.quit() + super(SignUpVolunteer, self).tearDown() + + def test_null_values(self): + self.driver.get(self.live_server_url + + self.volunteer_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('') + self.driver.find_element_by_id('id_password').send_keys('') + self.driver.find_element_by_id('id_first_name').send_keys('') + self.driver.find_element_by_id('id_last_name').send_keys('') + self.driver.find_element_by_id('id_email').send_keys('') + self.driver.find_element_by_id('id_address').send_keys('') + self.driver.find_element_by_id('id_city').send_keys('') + self.driver.find_element_by_id('id_state').send_keys('') + self.driver.find_element_by_id('id_country').send_keys('') + self.driver.find_element_by_id('id_phone_number').send_keys('') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('help-block'), + None) + + def test_name_fields(self): + # register valid volunteer user + self.driver.get(self.live_server_url + self.volunteer_registration_page) + + + self.driver.find_element_by_id('id_username').send_keys('volunteer-username') + self.driver.find_element_by_id('id_password').send_keys('volunteer-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('volunteer-first-name') + self.driver.find_element_by_id('id_last_name').send_keys('volunteer-last-name') + self.driver.find_element_by_id('id_email').send_keys('volunteer-email@systers.org') + self.driver.find_element_by_id('id_address').send_keys('volunteer-address') + self.driver.find_element_by_id('id_city').send_keys('volunteer-city') + self.driver.find_element_by_id('id_state').send_keys('volunteer-state') + self.driver.find_element_by_id('id_country').send_keys('volunteer-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('volunteer-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('messages'), + None) + self.assertEqual(self.driver.find_element_by_class_name('messages').text, + 'You have successfully registered!') + + # register a user again with username same as already registered user + self.assertEqual(self.driver.current_url, self.live_server_url + + self.homepage) + + self.driver.get(self.live_server_url + self.volunteer_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('volunteer-username') + self.driver.find_element_by_id('id_password').send_keys('volunteer-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('volunteer-first-name') + self.driver.find_element_by_id('id_last_name').send_keys('volunteer-last-name') + self.driver.find_element_by_id('id_email').send_keys('volunteer-email1@systers.org') + self.driver.find_element_by_id('id_address').send_keys('volunteer-address') + self.driver.find_element_by_id('id_city').send_keys('volunteer-city') + self.driver.find_element_by_id('id_state').send_keys('volunteer-state') + self.driver.find_element_by_id('id_country').send_keys('volunteer-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('volunteer-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('help-block'), + None) + self.assertEqual(self.driver.find_element_by_xpath("id('div_id_username')/div/p/strong").text, + 'User with this Username already exists.') + + # test numeric characters in first-name, last-name + self.driver.get(self.live_server_url + self.volunteer_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('volunteer-username-1') + self.driver.find_element_by_id('id_password').send_keys('volunteer-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('volunteer-first-name-1') + self.driver.find_element_by_id('id_last_name').send_keys('volunteer-last-name-1') + self.driver.find_element_by_id('id_email').send_keys('volunteer-email1@systers.org') + self.driver.find_element_by_id('id_address').send_keys( + 'volunteer-address') + self.driver.find_element_by_id('id_city').send_keys('volunteer-city') + self.driver.find_element_by_id('id_state').send_keys('volunteer-state') + self.driver.find_element_by_id('id_country').send_keys('volunteer-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('volunteer-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('help-block'), + None) + self.assertEqual(self.driver.find_element_by_xpath("id('div_id_first_name')/div/p/strong").text, + 'Enter a valid value.') + self.assertEqual(self.driver.find_element_by_xpath("id('div_id_last_name')/div/p/strong").text, + 'Enter a valid value.') + + # test special characters in first-name, last-name + self.driver.get(self.live_server_url + self.volunteer_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('volunteer-username-1') + self.driver.find_element_by_id('id_password').send_keys('volunteer-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('first-name-!@#$%^&*()_') + self.driver.find_element_by_id('id_last_name').send_keys('last-name-!@#$%^&*()_') + self.driver.find_element_by_id('id_email').send_keys('volunteer-email1@systers.org') + self.driver.find_element_by_id('id_address').send_keys('volunteer-address') + self.driver.find_element_by_id('id_city').send_keys('volunteer-city') + self.driver.find_element_by_id('id_state').send_keys('volunteer-state') + self.driver.find_element_by_id('id_country').send_keys('volunteer-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('volunteer-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('help-block'), + None) + self.assertEqual(self.driver.find_element_by_xpath("id('div_id_first_name')/div/p/strong").text, + 'Enter a valid value.') + self.assertEqual(self.driver.find_element_by_xpath("id('div_id_last_name')/div/p/strong").text, + 'Enter a valid value.') + + # test length of first-name, last-name not exceed 30 + self.driver.get(self.live_server_url + self.volunteer_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('volunteer-username-1') + self.driver.find_element_by_id('id_password').send_keys('volunteer-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('volunteer-first-name-!@#$%^&*()_') + self.driver.find_element_by_id('id_last_name').send_keys('volunteer-last-name-!@#$%^&*()_') + self.driver.find_element_by_id('id_email').send_keys('volunteer-email1@systers.org') + self.driver.find_element_by_id('id_address').send_keys('volunteer-address') + self.driver.find_element_by_id('id_city').send_keys('volunteer-city') + self.driver.find_element_by_id('id_state').send_keys('volunteer-state') + self.driver.find_element_by_id('id_country').send_keys('volunteer-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('volunteer-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('help-block'), + None) + error_message = self.driver.find_element_by_xpath("id('div_id_first_name')/div/p/strong").text + self.assertTrue(bool(re.search(r'Ensure this value has at most 30 characters', str(error_message)))) + + error_message = self.driver.find_element_by_xpath("id('div_id_last_name')/div/p/strong").text, + self.assertTrue(bool(re.search(r'Ensure this value has at most 30 characters', str(error_message)))) + + def test_address_field(self): + # register valid volunteer user + self.driver.get(self.live_server_url + self.volunteer_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('volunteer-username') + self.driver.find_element_by_id('id_password').send_keys('volunteer-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('volunteer-first-name') + self.driver.find_element_by_id('id_last_name').send_keys('volunteer-last-name') + self.driver.find_element_by_id('id_email').send_keys('volunteer-email@systers.org') + self.driver.find_element_by_id('id_address').send_keys('volunteer-address') + self.driver.find_element_by_id('id_city').send_keys('volunteer-city') + self.driver.find_element_by_id('id_state').send_keys('volunteer-state') + self.driver.find_element_by_id('id_country').send_keys('volunteer-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('volunteer-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('messages'), + None) + self.assertEqual(self.driver.find_element_by_class_name('messages').text, + 'You have successfully registered!') + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.homepage) + + # test numeric characters in address + self.driver.get(self.live_server_url + self.volunteer_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('volunteer-username-1') + self.driver.find_element_by_id('id_password').send_keys('volunteer-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('volunteer-first-name') + self.driver.find_element_by_id('id_last_name').send_keys('volunteer-last-name') + self.driver.find_element_by_id('id_email').send_keys('volunteer-email1@systers.org') + self.driver.find_element_by_id('id_address').send_keys('123 New-City address') + self.driver.find_element_by_id('id_city').send_keys('volunteer-city') + self.driver.find_element_by_id('id_state').send_keys('volunteer-state') + self.driver.find_element_by_id('id_country').send_keys('volunteer-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('volunteer-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('messages'), + None) + self.assertEqual(self.driver.find_element_by_class_name('messages').text, + 'You have successfully registered!') + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.homepage) + + # test special characters in address + self.driver.get(self.live_server_url + self.volunteer_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('volunteer-username-2') + self.driver.find_element_by_id('id_password').send_keys('volunteer-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('first-name') + self.driver.find_element_by_id('id_last_name').send_keys('last-name') + self.driver.find_element_by_id('id_email').send_keys('volunteer-email2@systers.org') + self.driver.find_element_by_id('id_address').send_keys('volunteer-address!@#$()') + self.driver.find_element_by_id('id_city').send_keys('volunteer-city') + self.driver.find_element_by_id('id_state').send_keys('volunteer-state') + self.driver.find_element_by_id('id_country').send_keys('volunteer-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('volunteer-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('help-block'), + None) + self.assertEqual(self.driver.current_url, self.live_server_url + + self.volunteer_registration_page) + self.assertEqual(self.driver.find_element_by_xpath("id('div_id_address')/div/p/strong").text, + 'Enter a valid value.') + + def test_city_field(self): + # register valid volunteer user + self.driver.get(self.live_server_url + self.volunteer_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('volunteer-username') + self.driver.find_element_by_id('id_password').send_keys('volunteer-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('volunteer-first-name') + self.driver.find_element_by_id('id_last_name').send_keys('volunteer-last-name') + self.driver.find_element_by_id('id_email').send_keys('volunteer-email@systers.org') + self.driver.find_element_by_id('id_address').send_keys('volunteer-address') + self.driver.find_element_by_id('id_city').send_keys('volunteer-city') + self.driver.find_element_by_id('id_state').send_keys('volunteer-state') + self.driver.find_element_by_id('id_country').send_keys('volunteer-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('volunteer-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('messages'), + None) + self.assertEqual(self.driver.find_element_by_class_name('messages').text, + 'You have successfully registered!') + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.homepage) + + # test numeric characters in city + self.driver.get(self.live_server_url + self.volunteer_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('volunteer-username-1') + self.driver.find_element_by_id('id_password').send_keys('volunteer-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('volunteer-first-name') + self.driver.find_element_by_id('id_last_name').send_keys('volunteer-last-name') + self.driver.find_element_by_id('id_email').send_keys('volunteer-email1@systers.org') + self.driver.find_element_by_id('id_address').send_keys('volunteer-address') + self.driver.find_element_by_id('id_city').send_keys('13th volunteer-city') + self.driver.find_element_by_id('id_state').send_keys('volunteer-state') + self.driver.find_element_by_id('id_country').send_keys('volunteer-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('volunteer-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('help-block'), + None) + self.assertEqual(self.driver.current_url, self.live_server_url + + self.volunteer_registration_page) + self.assertEqual(self.driver.find_element_by_xpath("id('div_id_city')/div/p/strong").text, + 'Enter a valid value.') + + # test special characters in city + self.driver.get(self.live_server_url + self.volunteer_registration_page) + + self.driver.find_element_by_id('id_username').send_keys('volunteer-username-1') + self.driver.find_element_by_id('id_password').send_keys('volunteer-password!@#$%^&*()_') + self.driver.find_element_by_id('id_first_name').send_keys('first-name') + self.driver.find_element_by_id('id_last_name').send_keys('last-name') + self.driver.find_element_by_id('id_email').send_keys('volunteer-email1@systers.org') + self.driver.find_element_by_id('id_address').send_keys('volunteer-address') + self.driver.find_element_by_id('id_city').send_keys('!@#$%^&*()_+city') + self.driver.find_element_by_id('id_state').send_keys('volunteer-state') + self.driver.find_element_by_id('id_country').send_keys('volunteer-country') + self.driver.find_element_by_id('id_phone_number').send_keys('9999999999') + self.driver.find_element_by_id('id_unlisted_organization').send_keys('volunteer-org') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_class_name('help-block'), + None) + self.assertEqual(self.driver.current_url, self.live_server_url + + self.volunteer_registration_page) + self.assertEqual(self.driver.find_element_by_xpath("id('div_id_city')/div/p/strong").text, + 'Enter a valid value.') diff --git a/vms/registration/tests/test_services.py b/vms/registration/tests/test_services.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/vms/registration/tests/test_services.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/vms/registration/tests/test_unit.py b/vms/registration/tests/test_unit.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/vms/registration/tests/test_unit.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/vms/shift/tests/__init__.py b/vms/shift/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vms/shift/tests/test_manageVolunteerShift.py b/vms/shift/tests/test_manageVolunteerShift.py new file mode 100644 index 0000000..377d420 --- /dev/null +++ b/vms/shift/tests/test_manageVolunteerShift.py @@ -0,0 +1,676 @@ +from django.test import TestCase +from django.contrib.staticfiles.testing import LiveServerTestCase + +from django.contrib.auth.models import User +from administrator.models import Administrator + +from selenium import webdriver +from selenium.common.exceptions import NoSuchElementException + +from organization.models import Organization #hack to pass travis,Bug in Code + + +class ManageVolunteerShift(LiveServerTestCase): + ''' + Admin users have ManageVolunteerShift View which has the following + functionalities: + - Filter Volunteers according to certain criteriras + - Click on `Manage Shift` to check assigned shifts to a volunteer + - Click on `Assign Shift` lists registered events + - Click on `View Jobs` to list jobs in selected event + - Click on `View Shift` to list shifts in the selected job + - Click on `Assign Shift` and confirm to assign shift. + - Cancel assigned shift by clicking on `Cancel Shift Assignment` + + ManageVolunteerShift Class contains UI tests for ManageVolunteerShift + View of Admin Profile. Tests Included. + + - Test View with/without any registered volunteers + - Test Redirection to events view on clicking `Manage Shifts` + - Test Jobs page without jobs + - Test assign shifts without any registered shifts + - Test assign shifts with registered shifts + - Test if shift can be assigned to more number of volunteers than slots + in a shift + - Test no of slots remaining increases by one when an admin cancels an + assigned shift + - Test if a shift can be assigned to a volunteer who has already been + assigned the same shift + ''' + def setUp(self): + admin_user = User.objects.create_user( + username = 'admin', + password = 'admin', + email = 'admin@admin.com') + + Administrator.objects.create( + user = admin_user, + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + unlisted_organization = 'organization') + + # create an org prior to registration. Bug in Code + # added to pass CI + Organization.objects.create( + name = 'DummyOrg') + + self.homepage = '/' + self.authentication_page = '/authentication/login/' + self.shift_page = '/shift/volunteer_search/' + self.volunteer_registration_page = '/registration/signup_volunteer/' + self.settings_page = '/event/list/' + self.driver = webdriver.Firefox() + self.driver.implicitly_wait(5) + self.driver.maximize_window() + super(ManageVolunteerShift, self).setUp() + + def tearDown(self): + self.driver.quit() + super(ManageVolunteerShift, self).tearDown() + + def login_admin(self): + self.driver.get(self.live_server_url + self.authentication_page) + self.driver.find_element_by_id('id_login').send_keys('admin') + self.driver.find_element_by_id('id_password').send_keys('admin') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertEqual(self.driver.current_url, + self.live_server_url + self.homepage) + + def register_volunteer(self, credentials): + self.driver.get(self.live_server_url + + self.volunteer_registration_page) + + self.driver.find_element_by_id('id_username').send_keys(credentials[0]) + self.driver.find_element_by_id('id_password').send_keys(credentials[1]) + self.driver.find_element_by_id('id_first_name').send_keys(credentials[2]) + self.driver.find_element_by_id('id_last_name').send_keys(credentials[3]) + self.driver.find_element_by_id('id_email').send_keys(credentials[4]) + self.driver.find_element_by_id('id_address').send_keys(credentials[5]) + self.driver.find_element_by_id('id_city').send_keys(credentials[6]) + self.driver.find_element_by_id('id_state').send_keys(credentials[7]) + self.driver.find_element_by_id('id_country').send_keys(credentials[8]) + self.driver.find_element_by_id('id_phone_number').send_keys(credentials[9]) + self.driver.find_element_by_id('id_unlisted_organization').send_keys(credentials[10]) + self.driver.find_element_by_xpath('//form[1]').submit() + + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_class_name('help-block'), + + self.assertEqual(self.driver.current_url, + self.live_server_url + self.homepage) + + def register_test_dataset(self): + credentials = ['volunteer-one', 'volunteer-password', + 'volunteer-one', 'volunteer-one', 'volunteer-email@systers.org', + 'volunteer-one', 'volunteer-one', 'volunteer-one', + 'volunteer-one', '9999999999', 'volunteer-one'] + + self.register_volunteer(credentials) + + credentials = ['volunteer-two', 'volunteer-password', + 'volunteer-two', 'volunteer-two', 'volunteer-email2@systers.org', + 'volunteer-two', 'volunteer-two', 'volunteer-two', + 'volunteer-two', '9999999999', 'volunteer-two'] + + self.register_volunteer(credentials) + + def register_event_utility(self, event): + self.driver.find_element_by_link_text('Events').send_keys("\n") + self.assertEqual(self.driver.current_url, + self.live_server_url + self.settings_page) + + self.driver.find_element_by_link_text('Create Event').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + '/event/create/') + + self.driver.find_element_by_xpath( + '//input[@placeholder = "Event Name"]').send_keys( + event[0]) + self.driver.find_element_by_xpath( + '//input[@name = "start_date"]').send_keys( + event[1]) + self.driver.find_element_by_xpath( + '//input[@name = "end_date"]').send_keys( + event[2]) + self.driver.find_element_by_xpath('//form[1]').submit() + + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_class_name('help-block'), + + def register_job_utility(self, job): + self.assertEqual(self.driver.current_url, + self.live_server_url + self.settings_page) + self.driver.find_element_by_link_text('Jobs').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + '/job/list/') + + self.driver.find_element_by_link_text('Create Job').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + '/job/create/') + + self.driver.find_element_by_xpath( + '//select[@name = "event_id"]').send_keys( + job[0]) + self.driver.find_element_by_xpath( + '//input[@placeholder = "Job Name"]').send_keys( + job[1]) + self.driver.find_element_by_xpath( + '//textarea[@name = "description"]').send_keys( + job[2]) + self.driver.find_element_by_xpath( + '//input[@name = "start_date"]').send_keys( + job[3]) + self.driver.find_element_by_xpath( + '//input[@name = "end_date"]').send_keys( + job[4]) + self.driver.find_element_by_xpath('//form[1]').submit() + + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_class_name('help-block'), + + def register_shift_utility(self, shift): + self.login_admin() + + # register event to create job + event = ['event-name', '05/20/2017', '05/20/2017'] + self.register_event_utility(event) + + # create job to create shift + job = ['event-name', 'job name', 'job description', '05/20/2017', + '05/20/2017'] + self.register_job_utility(job) + + # create shift + self.driver.find_element_by_link_text('Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + '/shift/list_jobs/') + + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]/td[5]//a').click() + + self.driver.find_element_by_link_text('Create Shift').click() + + self.driver.find_element_by_xpath( + '//input[@name = "date"]').send_keys( + shift[0]) + self.driver.find_element_by_xpath( + '//input[@name = "start_time"]').send_keys( + shift[1]) + self.driver.find_element_by_xpath( + '//input[@name = "end_time"]').send_keys( + shift[2]) + self.driver.find_element_by_xpath( + '//input[@name = "max_volunteers"]').send_keys( + shift[3]) + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertNotEqual(self.driver.find_elements_by_xpath( + '//table//tbody'), None) + + def test_landing_page_without_any_registered_volunteers(self): + self.login_admin() + self.driver.find_element_by_link_text('Manage Volunteer Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + self.shift_page) + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_tag_name('tr') + + def test_landing_page_with_registered_volunteers(self): + # register volunteers + self.register_test_dataset() + + # login admin user + self.login_admin() + + # open manage volunteer shift + self.driver.find_element_by_link_text('Manage Volunteer Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + self.shift_page) + + self.assertNotEqual(self.driver.find_element_by_tag_name('tr'), None) + + self.driver.find_element_by_xpath('//table//tbody//tr[1]//td[10]//a').click() + self.assertEqual(self.driver.find_element_by_class_name('alert-info').text, + 'This volunteer does not have any upcoming shifts.') + + self.driver.back() + self.assertEqual(self.driver.current_url, + self.live_server_url + '/shift/volunteer_search/') + + self.driver.find_element_by_xpath('//table//tbody//tr[2]//td[10]//a').click() + self.assertEqual(self.driver.find_element_by_class_name('alert-info').text, + 'This volunteer does not have any upcoming shifts.') + + def test_events_page_with_no_events(self): + # register volunteers + self.register_test_dataset() + + # login admin user + self.login_admin() + + # open manage volunteer shift + self.driver.find_element_by_link_text('Manage Volunteer Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + self.shift_page) + + self.driver.find_element_by_xpath('//table//tbody//tr[1]//td[10]//a').click() + + self.driver.find_element_by_link_text('Assign Shift').click() + + self.assertEqual(self.driver.find_element_by_class_name('alert-info').text, + 'There are no events.') + + def test_jobs_page_with_no_jobs(self): + # register volunteers + self.register_test_dataset() + + # login admin + self.login_admin() + + # create events + event = ['event-name', '05/20/2017', '05/20/2017'] + self.register_event_utility(event) + + # open manage volunteer shift + self.driver.find_element_by_link_text( + 'Manage Volunteer Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + self.shift_page) + + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[10]//a').click() + + self.driver.find_element_by_link_text('Assign Shift').click() + + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-info').text,'There are no events.') + + def test_assign_shifts_with_no_shifts(self): + # register volunteers + self.register_test_dataset() + + # login admin + self.login_admin() + + # create events + event = ['event-name', '05/20/2017', '05/20/2017'] + self.register_event_utility(event) + + # create jobs + job = ['event-name', 'job name', 'job description', '05/20/2017', + '05/20/2017'] + self.register_job_utility(job) + + # open manage volunteer shift + self.driver.find_element_by_link_text( + 'Manage Volunteer Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + self.shift_page) + + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[10]//a').click() + + self.driver.find_element_by_link_text('Assign Shift').click() + + # no events shown in table + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-info').text,'There are no events.') + + def test_assign_shifts_with_registered_shifts(self): + # register volunteers + self.register_test_dataset() + + # create shift to assign + shift = ['05/20/2017', '09:00', '15:00', '1'] + self.register_shift_utility(shift) + + # open manage volunteer shift + self.driver.find_element_by_link_text( + 'Manage Volunteer Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + self.shift_page) + + # volunteer-one does not have any registered shifts + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[10]').text, + 'Manage Shifts') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[10]//a').click() + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-info').text, + 'This volunteer does not have any upcoming shifts.') + + self.driver.find_element_by_link_text('Assign Shift').click() + + # events shown in table + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_class_name('alert-info') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + 'View Jobs') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + + # arrived on page2 with jobs + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + 'View Shifts') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + + # arrived on page3 with shifts, assign shift to volunteer one + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + 'Assign Shift') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + + # confirm on shift assignment to volunteer-one + self.driver.find_element_by_xpath('//form[1]').submit() + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_class_name('alert-danger') + + # check shift assignment to volunteer-one + self.driver.find_element_by_link_text( + 'Manage Volunteer Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + self.shift_page) + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[10]').text, + 'Manage Shifts') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[10]//a').click() + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, + 'job name') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[2]').text, + 'May 20, 2017') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[3]').text, + '9 a.m.') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + '3 p.m.') + + def test_slots_remaining_in_shift(self): + # register volunteers + self.register_test_dataset() + + # create shift to assign, with only 1 volunteer required + shift = ['05/20/2017', '09:00', '15:00', '1'] + self.register_shift_utility(shift) + + # open manage volunteer shift + self.driver.find_element_by_link_text( + 'Manage Volunteer Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + self.shift_page) + + # volunteer-one does not have any registered shifts + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[10]').text, + 'Manage Shifts') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[10]//a').click() + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-info').text, + 'This volunteer does not have any upcoming shifts.') + + self.driver.find_element_by_link_text('Assign Shift').click() + + # events shown in table + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_class_name('alert-info') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + 'View Jobs') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + + # arrived on page2 with jobs + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + 'View Shifts') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + + # arrived on page3 with shifts, assign shift to volunteer one + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + 'Assign Shift') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + + # confirm on shift assignment to volunteer-one + self.driver.find_element_by_xpath('//form[1]').submit() + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_class_name('alert-danger') + + # check shift assignment to volunteer-one + self.driver.find_element_by_link_text( + 'Manage Volunteer Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + self.shift_page) + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[10]').text, + 'Manage Shifts') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[10]//a').click() + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, + 'job name') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[2]').text, + 'May 20, 2017') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[3]').text, + '9 a.m.') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + '3 p.m.') + + # open manage volunteer shift again to assign shift to volunteer two + self.driver.find_element_by_link_text( + 'Manage Volunteer Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + self.shift_page) + + # volunteer-two does not have any registered shifts + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[2]//td[10]').text, + 'Manage Shifts') + self.driver.find_element_by_xpath( + '//table//tbody//tr[2]//td[10]//a').click() + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-info').text, + 'This volunteer does not have any upcoming shifts.') + + self.driver.find_element_by_link_text('Assign Shift').click() + + #no events shown in table + self.assertEqual(self.driver.find_element_by_class_name('alert-info').text, + 'There are no events.') + + def test_cancel_assigned_shift(self): + # register volunteers + self.register_test_dataset() + + # create shift to assign + shift = ['05/20/2017', '09:00', '15:00', '1'] + self.register_shift_utility(shift) + + # open manage volunteer shift + self.driver.find_element_by_link_text( + 'Manage Volunteer Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + self.shift_page) + + # volunteer-one does not have any registered shifts + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[10]').text, + 'Manage Shifts') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[10]//a').click() + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-info').text, + 'This volunteer does not have any upcoming shifts.') + + self.driver.find_element_by_link_text('Assign Shift').click() + + # events shown in table + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_class_name('alert-info') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + 'View Jobs') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + + # arrived on jobs page + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + 'View Shifts') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + + # arrived on shifts page, assign shift to volunteer one + slots_remaining_before_assignment = self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[5]').text + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + 'Assign Shift') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + + # confirm on shift assignment to volunteer-one + self.driver.find_element_by_xpath('//form[1]').submit() + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_class_name('alert-danger') + + # check shift assignment to volunteer-one + self.driver.find_element_by_link_text( + 'Manage Volunteer Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + self.shift_page) + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[10]').text, + 'Manage Shifts') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[10]//a').click() + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, + 'job name') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[2]').text, + 'May 20, 2017') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[3]').text, + '9 a.m.') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + '3 p.m.') + + # cancel assigned shift + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[5]').text, + 'Cancel Shift Registration') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[5]//a').click() + self.assertNotEqual(self.driver.find_element_by_class_name( + 'panel-danger'), None) + self.assertEqual(self.driver.find_element_by_class_name( + 'btn-danger').text, 'Yes, Cancel this Shift') + self.driver.find_element_by_xpath('//form[1]').submit() + + # check cancelled shift reflects in volunteer shift details + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-info').text, + 'This volunteer does not have any upcoming shifts.') + + # check slots remaining increases by one, after cancellation of + # assigned shift + self.driver.find_element_by_link_text('Assign Shift').click() + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + 'View Jobs') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + 'View Shifts') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + slots_after_cancellation = self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[5]').text + self.assertEqual(slots_remaining_before_assignment, + slots_after_cancellation) + + def test_assign_same_shift_to_volunteer_twice(self): + # register volunteers + self.register_test_dataset() + + # create shift to assign, with slots = 2 + shift = ['05/20/2017', '09:00', '15:00', '2'] + self.register_shift_utility(shift) + + # open manage volunteer shift + self.driver.find_element_by_link_text( + 'Manage Volunteer Shifts').click() + self.assertEqual(self.driver.current_url, + self.live_server_url + self.shift_page) + + # volunteer-one does not have any registered shifts + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[10]').text, + 'Manage Shifts') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[10]//a').click() + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-info').text, + 'This volunteer does not have any upcoming shifts.') + + self.driver.find_element_by_link_text('Assign Shift').click() + + # events shown in table + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_class_name('alert-info') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + 'View Jobs') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + + # arrived on jobs page + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + 'View Shifts') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + + # arrived on shifts page, assign shift to volunteer one + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, + 'Assign Shift') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]//a').click() + + # confirm on shift assignment to volunteer-one + self.driver.find_element_by_xpath('//form[1]').submit() + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_class_name('alert-danger') + + # assign same shift to voluteer-one again + # Check volunteer-one has one registered shift now + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'job name') + self.driver.find_element_by_link_text('Assign Shift').click() + + # events page + self.assertEqual(self.driver.find_element_by_class_name('alert-info').text, 'There are no events.') + + diff --git a/vms/shift/tests.py b/vms/shift/tests/test_services.py similarity index 100% rename from vms/shift/tests.py rename to vms/shift/tests/test_services.py diff --git a/vms/shift/tests/test_shiftHours.py b/vms/shift/tests/test_shiftHours.py new file mode 100644 index 0000000..cd51ee7 --- /dev/null +++ b/vms/shift/tests/test_shiftHours.py @@ -0,0 +1,218 @@ +from django.test import TestCase +from django.contrib.staticfiles.testing import LiveServerTestCase + +from django.contrib.auth.models import User +from volunteer.models import Volunteer +from event.models import Event +from job.models import Job +from shift.models import Shift, VolunteerShift + +from selenium import webdriver +from selenium.common.exceptions import NoSuchElementException + +from organization.models import Organization #hack to pass travis,Bug in Code + + +class ShiftHours(LiveServerTestCase): + ''' + ''' + def setUp(self): + volunteer_user = User.objects.create_user( + username = 'volunteer', + password = 'volunteer') + + volunteer = Volunteer.objects.create( + user = volunteer_user, + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + email = 'volunteer@volunteer.com', + unlisted_organization = 'organization') + + # create an org prior to registration. Bug in Code + # added to pass CI + Organization.objects.create( + name = 'DummyOrg') + + self.homepage = '/' + self.authentication_page = '/authentication/login/' + self.driver = webdriver.Firefox() + self.driver.implicitly_wait(5) + self.driver.maximize_window() + super(ShiftHours, self).setUp() + + def tearDown(self): + self.driver.quit() + super(ShiftHours, self).tearDown() + + def login(self, credentials): + self.driver.get(self.live_server_url + self.authentication_page) + self.driver.find_element_by_id('id_login').send_keys(credentials['username']) + self.driver.find_element_by_id('id_password').send_keys(credentials['password']) + self.driver.find_element_by_xpath('//form[1]').submit() + + def test_view_with_unlogged_shift(self): + self.login({'username' : 'volunteer', 'password' : 'volunteer'}) + self.driver.find_element_by_link_text('Completed Shifts').click() + + volunteer_id = Volunteer.objects.get(user__username = 'volunteer').pk + self.assertEqual(self.driver.current_url, self.live_server_url + + '/shift/view_hours/' + str(volunteer_id)) + + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-info').text, 'You have not logged any hours.') + + def register_dataset(self, ): + volunteer = Volunteer.objects.get(user__username = 'volunteer') + + # create shift and log hours + event = Event.objects.create( + name = 'event', + start_date = '2017-06-15', + end_date = '2017-06-17') + + job = Job.objects.create( + name = 'job', + start_date = '2017-06-15', + end_date = '2017-06-15', + event = event) + + shift = Shift.objects.create( + date = '2017-06-15', + start_time = '09:00', + end_time = '15:00', + max_volunteers ='6', + job = job) + + # logged hours from 12:00 to 13:00 + VolunteerShift.objects.create( + shift = shift, + volunteer = volunteer, + start_time = '12:00', + end_time = '13:00') + + def test_view_with_logged_shift(self): + self.register_dataset() + self.login({'username' : 'volunteer', 'password' : 'volunteer'}) + self.driver.find_element_by_link_text('Completed Shifts').click() + + volunteer_id = Volunteer.objects.get(user__username = 'volunteer').pk + self.assertEqual(self.driver.current_url, self.live_server_url + + '/shift/view_hours/' + str(volunteer_id)) + + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'job') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[2]').text, 'June 15, 2017') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[3]').text, 'noon') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, '1 p.m.') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[5]').text, 'Edit Hours') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[6]').text, 'Clear Hours') + + def test_edit_hours(self): + self.register_dataset() + self.login({'username' : 'volunteer', 'password' : 'volunteer'}) + self.driver.find_element_by_link_text('Completed Shifts').click() + + volunteer_id = Volunteer.objects.get(user__username = 'volunteer').pk + self.assertEqual(self.driver.current_url, self.live_server_url + + '/shift/view_hours/' + str(volunteer_id)) + + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[3]').text, 'noon') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, '1 p.m.') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[5]').text, 'Edit Hours') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[5]//a').click() + + self.assertEqual(self.driver.find_element_by_xpath( + 'html/body/div[2]/div[2]/form/fieldset/legend').text, + 'Edit Shift Hours') + self.driver.find_element_by_xpath( + '//input[@name = "start_time"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "start_time"]').send_keys( + '10:00') + + self.driver.find_element_by_xpath( + '//input[@name = "end_time"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "end_time"]').send_keys( + '13:00') + self.driver.find_element_by_xpath('//form[1]').submit() + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[3]').text, '10 a.m.') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, '1 p.m.') + + def test_end_hours_less_than_start_hours(self): + self.register_dataset() + self.login({'username' : 'volunteer', 'password' : 'volunteer'}) + self.driver.find_element_by_link_text('Completed Shifts').click() + + volunteer_id = Volunteer.objects.get(user__username = 'volunteer').pk + self.assertEqual(self.driver.current_url, self.live_server_url + + '/shift/view_hours/' + str(volunteer_id)) + + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[3]').text, 'noon') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, '1 p.m.') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[5]').text, 'Edit Hours') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[5]//a').click() + + self.assertEqual(self.driver.find_element_by_xpath( + 'html/body/div[2]/div[2]/form/fieldset/legend').text, + 'Edit Shift Hours') + self.driver.find_element_by_xpath( + '//input[@name = "start_time"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "start_time"]').send_keys( + '14:00') + + self.driver.find_element_by_xpath( + '//input[@name = "end_time"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "end_time"]').send_keys( + '12:00') + self.driver.find_element_by_xpath('//form[1]').submit() + + try: + self.driver.find_element_by_class_name('alert-danger') + except NoSuchElementException: + raise Exception("End hours greater than start hours") + + def test_cancel_hours(self): + self.register_dataset() + self.login({'username' : 'volunteer', 'password' : 'volunteer'}) + self.driver.find_element_by_link_text('Completed Shifts').click() + + volunteer_id = Volunteer.objects.get(user__username = 'volunteer').pk + self.assertEqual(self.driver.current_url, self.live_server_url + + '/shift/view_hours/' + str(volunteer_id)) + + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'job') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[6]').text, 'Clear Hours') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[6]//a').click() + + self.assertEqual(self.driver.find_element_by_xpath( + 'html/body/div[2]/form/div/div[1]/h3').text, + 'Clear Shift Hours') + self.driver.find_element_by_xpath('//form[1]').submit() + + with self.assertRaises(NoSuchElementException): + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'job') diff --git a/vms/shift/tests/test_unit.py b/vms/shift/tests/test_unit.py new file mode 100644 index 0000000..e1314a5 --- /dev/null +++ b/vms/shift/tests/test_unit.py @@ -0,0 +1,1024 @@ +from datetime import datetime +from django.contrib.auth.models import User +from django.core.exceptions import ObjectDoesNotExist +from django.test import TestCase +from event.models import Event +from job.models import Job +from organization.models import Organization +from shift.models import Shift, VolunteerShift +from shift.services import * +from volunteer.models import Volunteer +from volunteer.services import * + +class ShiftMethodTests(TestCase): + + def test_add_shift_hours(self): + + u1 = User.objects.create_user('Yoshi') + + v1 = Volunteer(first_name = "Yoshi", + last_name = "Turtle", + address = "Mario Land", + city = "Nintendo Land", + state = "Nintendo State", + country = "Nintendo Nation", + phone_number = "2374983247", + email = "yoshi@nintendo.com", + user = u1) + + v1.save() + + e1 = Event(name = "Open Source Event", + start_date = "2012-10-22", + end_date = "2012-10-23") + + e1.save() + + j1 = Job(name = "Software Developer", + start_date = "2012-10-22", + end_date = "2012-10-23", + description = "A software job", + event = e1) + + j2 = Job(name = "Systems Administrator", + start_date = "2012-9-1", + end_date = "2012-10-26", + description = "A systems administrator job", + event = e1) + + j1.save() + j2.save() + + s1 = Shift(date = "2012-10-23", + start_time = "9:00", + end_time = "3:00", + max_volunteers = 1, + job = j1) + + s2 = Shift(date = "2012-10-23", + start_time = "10:00", + end_time = "4:00", + max_volunteers = 2, + job = j1) + + s3 = Shift(date = "2012-10-23", + start_time = "12:00", + end_time = "6:00", + max_volunteers = 4, + job = j2) + + s1.save() + s2.save() + s3.save() + + #register will return an exception on error (such as when invalid parameters are passed) + #if an exception does get raised, this test will automatically fail + register(v1.id, s1.id) + self.assertIsNotNone(VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s1.id)) + + register(v1.id, s2.id) + self.assertIsNotNone(VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s2.id)) + + register(v1.id, s3.id) + self.assertIsNotNone(VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s3.id)) + + start_time = datetime.time(hour=9, minute=0) + end_time = datetime.time(hour=10, minute=0) + add_shift_hours(v1.id, s1.id, start_time, end_time) + volunteer_shift = VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s1.id); + self.assertEqual(volunteer_shift.start_time, start_time) + self.assertEqual(volunteer_shift.end_time, end_time) + + start_time = datetime.time(hour=10, minute=0) + end_time = datetime.time(hour=12, minute=0) + add_shift_hours(v1.id, s2.id, start_time, end_time) + volunteer_shift = VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s2.id); + self.assertEqual(volunteer_shift.start_time, start_time) + self.assertEqual(volunteer_shift.end_time, end_time) + + start_time = datetime.time(hour=5, minute=0) + end_time = datetime.time(hour=6, minute=0) + add_shift_hours(v1.id, s3.id, start_time, end_time) + volunteer_shift = VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s3.id); + self.assertEqual(volunteer_shift.start_time, start_time) + self.assertEqual(volunteer_shift.end_time, end_time) + + def test_calculate_total_report_hours(self): + + duration_list = [1, 1, 1, 1] + report_list = [] + total_hours = 0 + + for duration in duration_list: + total_hours += duration + report = {} + report["duration"] = duration + report_list.append(report) + + self.assertEqual(calculate_total_report_hours(report_list), total_hours) + + duration_list = [1.5, 1.34, 2.3, 9, 4.7] + report_list = [] + total_hours = 0 + + for duration in duration_list: + total_hours += duration + report = {} + report["duration"] = duration + report_list.append(report) + + self.assertEqual(calculate_total_report_hours(report_list), total_hours) + + duration_list = [0.03, 0.023, 0.53, 0.863, 0.23, 0.57] + report_list = [] + total_hours = 0 + + for duration in duration_list: + total_hours += duration + report = {} + report["duration"] = duration + report_list.append(report) + + self.assertEqual(calculate_total_report_hours(report_list), total_hours) + + duration_list = [12, 24, 23.5, 15.67, 22.453, 3.42] + report_list = [] + total_hours = 0 + + for duration in duration_list: + total_hours += duration + report = {} + report["duration"] = duration + report_list.append(report) + + self.assertEqual(calculate_total_report_hours(report_list), total_hours) + + duration_list = [5] + report_list = [] + total_hours = 0 + + for duration in duration_list: + total_hours += duration + report = {} + report["duration"] = duration + report_list.append(report) + + self.assertEqual(calculate_total_report_hours(report_list), total_hours) + + duration_list = [0, 0, 0, 0] + report_list = [] + total_hours = 0 + + for duration in duration_list: + total_hours += duration + report = {} + report["duration"] = duration + report_list.append(report) + + self.assertEqual(calculate_total_report_hours(report_list), total_hours) + + duration_list = [0] + report_list = [] + total_hours = 0 + + for duration in duration_list: + total_hours += duration + report = {} + report["duration"] = duration + report_list.append(report) + + self.assertEqual(calculate_total_report_hours(report_list), total_hours) + + def test_cancel_shift_registration(self): + + u1 = User.objects.create_user('Yoshi') + u2 = User.objects.create_user('John') + + v1 = Volunteer(first_name = "Yoshi", + last_name = "Turtle", + address = "Mario Land", + city = "Nintendo Land", + state = "Nintendo State", + country = "Nintendo Nation", + phone_number = "2374983247", + email = "yoshi@nintendo.com", + user = u1) + + v2 = Volunteer(first_name = "John", + last_name = "Doe", + address = "7 Alpine Street", + city = "Maplegrove", + state = "Wyoming", + country = "USA", + phone_number = "23454545", + email = "john@test.com", + user = u2) + + v1.save() + v2.save() + + e1 = Event(name = "Open Source Event", + start_date = "2012-10-22", + end_date = "2012-10-23") + + e1.save() + + j1 = Job(name = "Software Developer", + start_date = "2012-10-22", + end_date = "2012-10-23", + description = "A software job", + event = e1) + + j2 = Job(name = "Systems Administrator", + start_date = "2012-9-1", + end_date = "2012-10-26", + description = "A systems administrator job", + event = e1) + + j1.save() + j2.save() + + s1 = Shift(date = "2012-10-23", + start_time = "9:00", + end_time = "3:00", + max_volunteers = 1, + job = j1) + + s2 = Shift(date = "2012-10-23", + start_time = "10:00", + end_time = "4:00", + max_volunteers = 2, + job = j1) + + s3 = Shift(date = "2012-10-23", + start_time = "12:00", + end_time = "6:00", + max_volunteers = 4, + job = j2) + + s1.save() + s2.save() + s3.save() + + #test cases when try to cancel when they aren't signed up for a shift + with self.assertRaises(ObjectDoesNotExist): + cancel_shift_registration(v1.id, s1.id) + + with self.assertRaises(ObjectDoesNotExist): + cancel_shift_registration(v1.id, s1.id) + + with self.assertRaises(ObjectDoesNotExist): + cancel_shift_registration(v1.id, s2.id) + + with self.assertRaises(ObjectDoesNotExist): + cancel_shift_registration(v1.id, s3.id) + + with self.assertRaises(ObjectDoesNotExist): + cancel_shift_registration(v2.id, s1.id) + + with self.assertRaises(ObjectDoesNotExist): + cancel_shift_registration(v2.id, s2.id) + + with self.assertRaises(ObjectDoesNotExist): + cancel_shift_registration(v2.id, s3.id) + + #register volunteers to shifts + register(v1.id, s1.id) + register(v1.id, s2.id) + register(v1.id, s3.id) + register(v2.id, s1.id) + register(v2.id, s2.id) + register(v2.id, s3.id) + + #test typical cases + cancel_shift_registration(v1.id, s1.id) + cancel_shift_registration(v1.id, s2.id) + cancel_shift_registration(v1.id, s3.id) + #cancel_shift_registration(v2.id, s1.id) #why is this throwing ObjectDoesNotExist? + cancel_shift_registration(v2.id, s2.id) + cancel_shift_registration(v2.id, s3.id) + + def test_calculate_duration(self): + + start_time = datetime.time(hour=1, minute=0) + end_time = datetime.time(hour=2, minute=0) + delta_time_hours = 1 + self.assertEqual(calculate_duration(start_time, end_time), delta_time_hours) + + start_time = datetime.time(hour=1, minute=45) + end_time = datetime.time(hour=2, minute=0) + delta_time_hours = 0.25 + self.assertEqual(calculate_duration(start_time, end_time), delta_time_hours) + + start_time = datetime.time(hour=1, minute=0) + end_time = datetime.time(hour=2, minute=30) + delta_time_hours = 1.5 + self.assertEqual(calculate_duration(start_time, end_time), delta_time_hours) + + start_time = datetime.time(hour=1, minute=0) + end_time = datetime.time(hour=1, minute=45) + delta_time_hours = 0.75 + self.assertEqual(calculate_duration(start_time, end_time), delta_time_hours) + + start_time = datetime.time(hour=1, minute=0) + end_time = datetime.time(hour=13, minute=0) + delta_time_hours = 12 + self.assertEqual(calculate_duration(start_time, end_time), delta_time_hours) + + start_time = datetime.time(hour=1, minute=0) + end_time = datetime.time(hour=5, minute=45) + delta_time_hours = 4.75 + self.assertEqual(calculate_duration(start_time, end_time), delta_time_hours) + + start_time = datetime.time(hour=1, minute=0) + end_time = datetime.time(hour=1, minute=0) + delta_time_hours = 0 + self.assertEqual(calculate_duration(start_time, end_time), delta_time_hours) + + start_time = datetime.time(hour=1, minute=0) + end_time = datetime.time(hour=23, minute=0) + delta_time_hours = 22 + self.assertEqual(calculate_duration(start_time, end_time), delta_time_hours) + + start_time = datetime.time(hour=22, minute=0) + end_time = datetime.time(hour=1, minute=0) + delta_time_hours = 3 + self.assertEqual(calculate_duration(start_time, end_time), delta_time_hours) + + start_time = datetime.time(hour=13, minute=0) + end_time = datetime.time(hour=1, minute=0) + delta_time_hours = 12 + self.assertEqual(calculate_duration(start_time, end_time), delta_time_hours) + + start_time = datetime.time(hour=0, minute=0) + end_time = datetime.time(hour=23, minute=0) + delta_time_hours = 23 + self.assertEqual(calculate_duration(start_time, end_time), delta_time_hours) + + start_time = datetime.time(hour=23, minute=0) + end_time = datetime.time(hour=0, minute=0) + delta_time_hours = 1 + self.assertEqual(calculate_duration(start_time, end_time), delta_time_hours) + + def test_clear_shift_hours(self): + + u1 = User.objects.create_user('Yoshi') + + v1 = Volunteer(first_name = "Yoshi", + last_name = "Turtle", + address = "Mario Land", + city = "Nintendo Land", + state = "Nintendo State", + country = "Nintendo Nation", + phone_number = "2374983247", + email = "yoshi@nintendo.com", + user = u1) + + v1.save() + + e1 = Event(name = "Open Source Event", + start_date = "2012-10-22", + end_date = "2012-10-23") + + e1.save() + + j1 = Job(name = "Software Developer", + start_date = "2012-10-22", + end_date = "2012-10-23", + description = "A software job", + event = e1) + + j2 = Job(name = "Systems Administrator", + start_date = "2012-9-1", + end_date = "2012-10-26", + description = "A systems administrator job", + event = e1) + + j1.save() + j2.save() + + s1 = Shift(date = "2012-10-23", + start_time = "9:00", + end_time = "3:00", + max_volunteers = 1, + job = j1) + + s2 = Shift(date = "2012-10-23", + start_time = "10:00", + end_time = "4:00", + max_volunteers = 2, + job = j1) + + s3 = Shift(date = "2012-10-23", + start_time = "12:00", + end_time = "6:00", + max_volunteers = 4, + job = j2) + + s1.save() + s2.save() + s3.save() + + register(v1.id, s1.id) + self.assertIsNotNone(VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s1.id)) + + register(v1.id, s2.id) + self.assertIsNotNone(VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s2.id)) + + register(v1.id, s3.id) + self.assertIsNotNone(VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s3.id)) + + start_time = datetime.time(hour=9, minute=0) + end_time = datetime.time(hour=10, minute=0) + add_shift_hours(v1.id, s1.id, start_time, end_time) + + start_time = datetime.time(hour=10, minute=0) + end_time = datetime.time(hour=12, minute=0) + add_shift_hours(v1.id, s2.id, start_time, end_time) + + start_time = datetime.time(hour=5, minute=0) + end_time = datetime.time(hour=6, minute=0) + add_shift_hours(v1.id, s3.id, start_time, end_time) + + clear_shift_hours(v1.id, s1.id) + volunteer_shift = VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s1.id) + self.assertIsNone(volunteer_shift.start_time) + self.assertIsNone(volunteer_shift.end_time) + + clear_shift_hours(v1.id, s2.id) + volunteer_shift = VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s2.id) + self.assertIsNone(volunteer_shift.start_time) + self.assertIsNone(volunteer_shift.end_time) + + clear_shift_hours(v1.id, s3.id) + volunteer_shift = VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s3.id) + self.assertIsNone(volunteer_shift.start_time) + self.assertIsNone(volunteer_shift.end_time) + + def test_edit_shift_hours(self): + + u1 = User.objects.create_user('Yoshi') + + v1 = Volunteer(first_name = "Yoshi", + last_name = "Turtle", + address = "Mario Land", + city = "Nintendo Land", + state = "Nintendo State", + country = "Nintendo Nation", + phone_number = "2374983247", + email = "yoshi@nintendo.com", + user = u1) + + v1.save() + + e1 = Event(name = "Open Source Event", + start_date = "2012-10-22", + end_date = "2012-10-23") + + e1.save() + + j1 = Job(name = "Software Developer", + start_date = "2012-10-22", + end_date = "2012-10-23", + description = "A software job", + event = e1) + + j1.save() + + s1 = Shift(date = "2012-10-23", + start_time = "1:00", + end_time = "12:00", + max_volunteers = 1, + job = j1) + + s1.save() + + register(v1.id, s1.id) + self.assertIsNotNone(VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s1.id)) + + start_time = datetime.time(hour=9, minute=0) + end_time = datetime.time(hour=10, minute=0) + add_shift_hours(v1.id, s1.id, start_time, end_time) + + start_time = datetime.time(hour=10, minute=0) + end_time = datetime.time(hour=11, minute=0) + edit_shift_hours(v1.id, s1.id, start_time, end_time) + volunteer_shift = VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s1.id) + self.assertIsNotNone(volunteer_shift.start_time) + self.assertIsNotNone(volunteer_shift.end_time) + self.assertEqual(volunteer_shift.start_time, start_time) + self.assertEqual(volunteer_shift.end_time, end_time) + + start_time = datetime.time(hour=1, minute=0) + end_time = datetime.time(hour=4, minute=0) + edit_shift_hours(v1.id, s1.id, start_time, end_time) + volunteer_shift = VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s1.id) + self.assertIsNotNone(volunteer_shift.start_time) + self.assertIsNotNone(volunteer_shift.end_time) + self.assertEqual(volunteer_shift.start_time, start_time) + self.assertEqual(volunteer_shift.end_time, end_time) + + start_time = datetime.time(hour=4, minute=15) + end_time = datetime.time(hour=12, minute=35) + edit_shift_hours(v1.id, s1.id, start_time, end_time) + volunteer_shift = VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s1.id) + self.assertIsNotNone(volunteer_shift.start_time) + self.assertIsNotNone(volunteer_shift.end_time) + self.assertEqual(volunteer_shift.start_time, start_time) + self.assertEqual(volunteer_shift.end_time, end_time) + + start_time = datetime.time(hour=2, minute=5) + end_time = datetime.time(hour=4, minute=15) + edit_shift_hours(v1.id, s1.id, start_time, end_time) + volunteer_shift = VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s1.id) + self.assertIsNotNone(volunteer_shift.start_time) + self.assertIsNotNone(volunteer_shift.end_time) + self.assertEqual(volunteer_shift.start_time, start_time) + self.assertEqual(volunteer_shift.end_time, end_time) + + start_time = datetime.time(hour=5, minute=0) + end_time = datetime.time(hour=5, minute=30) + edit_shift_hours(v1.id, s1.id, start_time, end_time) + volunteer_shift = VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s1.id) + self.assertIsNotNone(volunteer_shift.start_time) + self.assertIsNotNone(volunteer_shift.end_time) + self.assertEqual(volunteer_shift.start_time, start_time) + self.assertEqual(volunteer_shift.end_time, end_time) + + def test_get_shift_by_id(self): + + e1 = Event(name = "Open Source Event", + start_date = "2012-10-22", + end_date = "2012-10-23") + + e1.save() + + j1 = Job(name = "Software Developer", + start_date = "2012-10-22", + end_date = "2012-10-23", + description = "A software job", + event = e1) + + j1.save() + + s1 = Shift(date = "2012-10-23", + start_time = "9:00", + end_time = "3:00", + max_volunteers = 1, + job = j1) + + s2 = Shift(date = "2012-10-23", + start_time = "10:00", + end_time = "4:00", + max_volunteers = 2, + job = j1) + + s3 = Shift(date = "2012-10-23", + start_time = "12:00", + end_time = "6:00", + max_volunteers = 4, + job = j1) + + s1.save() + s2.save() + s3.save() + + #test typical cases + self.assertIsNotNone(get_shift_by_id(s1.id)) + self.assertIsNotNone(get_shift_by_id(s2.id)) + self.assertIsNotNone(get_shift_by_id(s3.id)) + + self.assertEqual(get_shift_by_id(s1.id), s1) + self.assertEqual(get_shift_by_id(s2.id), s2) + self.assertEqual(get_shift_by_id(s3.id), s3) + + #test non-existant cases + self.assertIsNone(get_shift_by_id(100)) + self.assertIsNone(get_shift_by_id(200)) + self.assertIsNone(get_shift_by_id(300)) + self.assertIsNone(get_shift_by_id(400)) + + self.assertNotEqual(get_shift_by_id(100), s1) + self.assertNotEqual(get_shift_by_id(100), s2) + self.assertNotEqual(get_shift_by_id(100), s3) + self.assertNotEqual(get_shift_by_id(200), s1) + self.assertNotEqual(get_shift_by_id(200), s2) + self.assertNotEqual(get_shift_by_id(200), s3) + self.assertNotEqual(get_shift_by_id(300), s1) + self.assertNotEqual(get_shift_by_id(300), s2) + self.assertNotEqual(get_shift_by_id(300), s3) + + def get_shifts_ordered_by_date(self): + + e1 = Event(name = "Open Source Event", + start_date = "2012-10-22", + end_date = "2012-10-23") + + e1.save() + + j1 = Job(name = "Software Developer", + start_date = "2012-10-22", + end_date = "2012-10-23", + description = "A software job", + event = e1) + + j1.save() + + s1 = Shift(date = "2012-1-10", + start_time = "9:00", + end_time = "3:00", + max_volunteers = 1, + job = j1) + + s2 = Shift(date = "2012-6-25", + start_time = "10:00", + end_time = "4:00", + max_volunteers = 2, + job = j1) + + s3 = Shift(date = "2012-12-9", + start_time = "12:00", + end_time = "6:00", + max_volunteers = 4, + job = j1) + + s1.save() + s2.save() + s3.save() + + #test typical case + shift_list = get_shifts_ordered_by_date(j1.id) + self.assertIsNotNone(shift_list) + self.assertNotEqual(shift_list, False) + self.assertEqual(len(shift_list), 3) + self.assertIn(s1, shift_list) + self.assertIn(s2, shift_list) + self.assertIn(s3, shift_list) + + #test order + self.assertEqual(shift_list[0].date, s1.date) + self.assertEqual(shift_list[1].date, s2.date) + self.assertEqual(shift_list[2].date, s3.date) + + def test_get_unlogged_shifts_by_volunteer_id(self): + + u1 = User.objects.create_user('Yoshi') + + v1 = Volunteer(first_name = "Yoshi", + last_name = "Turtle", + address = "Mario Land", + city = "Nintendo Land", + state = "Nintendo State", + country = "Nintendo Nation", + phone_number = "2374983247", + email = "yoshi@nintendo.com", + user = u1) + + v1.save() + + e1 = Event(name = "Open Source Event", + start_date = "2012-10-22", + end_date = "2012-10-23") + + e1.save() + + j1 = Job(name = "Software Developer", + start_date = "2012-10-22", + end_date = "2012-10-23", + description = "A software job", + event = e1) + + j2 = Job(name = "Systems Administrator", + start_date = "2012-9-1", + end_date = "2012-10-26", + description = "A systems administrator job", + event = e1) + + j1.save() + j2.save() + + s1 = Shift(date = "2012-10-23", + start_time = "9:00", + end_time = "3:00", + max_volunteers = 1, + job = j1) + + s2 = Shift(date = "2012-10-23", + start_time = "10:00", + end_time = "4:00", + max_volunteers = 2, + job = j1) + + s3 = Shift(date = "2012-10-23", + start_time = "12:00", + end_time = "6:00", + max_volunteers = 4, + job = j2) + + s1.save() + s2.save() + s3.save() + + #sign up + register(v1.id, s1.id) + register(v1.id, s2.id) + register(v1.id, s3.id) + + #test typical case + shift_list = get_unlogged_shifts_by_volunteer_id(v1.id) + self.assertIsNotNone(shift_list) + self.assertNotEqual(shift_list, False) + self.assertEqual(len(shift_list), 3) + self.assertIn(s1, shift_list) + self.assertIn(s2, shift_list) + self.assertIn(s3, shift_list) + + def test_get_volunteer_shift_by_id(self): + + u1 = User.objects.create_user('Yoshi') + u2 = User.objects.create_user('John') + + v1 = Volunteer(first_name = "Yoshi", + last_name = "Turtle", + address = "Mario Land", + city = "Nintendo Land", + state = "Nintendo State", + country = "Nintendo Nation", + phone_number = "2374983247", + email = "yoshi@nintendo.com", + user = u1) + + v2 = Volunteer(first_name = "John", + last_name = "Doe", + address = "7 Alpine Street", + city = "Maplegrove", + state = "Wyoming", + country = "USA", + phone_number = "23454545", + email = "john@test.com", + user = u2) + + v1.save() + v2.save() + + e1 = Event(name = "Open Source Event", + start_date = "2012-10-22", + end_date = "2012-10-23") + + e1.save() + + j1 = Job(name = "Software Developer", + start_date = "2012-10-22", + end_date = "2012-10-23", + description = "A software job", + event = e1) + + j2 = Job(name = "Systems Administrator", + start_date = "2012-9-1", + end_date = "2012-10-26", + description = "A systems administrator job", + event = e1) + + j1.save() + j2.save() + + s1 = Shift(date = "2012-10-23", + start_time = "9:00", + end_time = "3:00", + max_volunteers = 1, + job = j1) + + s2 = Shift(date = "2012-10-23", + start_time = "10:00", + end_time = "4:00", + max_volunteers = 2, + job = j1) + + s3 = Shift(date = "2012-10-23", + start_time = "12:00", + end_time = "6:00", + max_volunteers = 4, + job = j2) + + s1.save() + s2.save() + s3.save() + + #test cases where signed up + register(v1.id, s1.id) + register(v1.id, s2.id) + register(v1.id, s3.id) + + register(v2.id, s1.id) + register(v2.id, s2.id) + register(v2.id, s3.id) + + self.assertEqual(get_volunteer_shift_by_id(v1.id, s1.id), VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s1.id)) + self.assertEqual(get_volunteer_shift_by_id(v1.id, s2.id), VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s2.id)) + self.assertEqual(get_volunteer_shift_by_id(v1.id, s3.id), VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s3.id)) + + #self.assertEqual(get_volunteer_shift_by_id(v2.id, s1.id), VolunteerShift.objects.get(volunteer_id=v2.id, shift_id=s1.id)) #why does this throw DoesNotExist? + self.assertEqual(get_volunteer_shift_by_id(v2.id, s2.id), VolunteerShift.objects.get(volunteer_id=v2.id, shift_id=s2.id)) + self.assertEqual(get_volunteer_shift_by_id(v2.id, s3.id), VolunteerShift.objects.get(volunteer_id=v2.id, shift_id=s3.id)) + + + def test_is_signed_up(self): + + u1 = User.objects.create_user('Yoshi') + u2 = User.objects.create_user('John') + + v1 = Volunteer(first_name = "Yoshi", + last_name = "Turtle", + address = "Mario Land", + city = "Nintendo Land", + state = "Nintendo State", + country = "Nintendo Nation", + phone_number = "2374983247", + email = "yoshi@nintendo.com", + user = u1) + + v2 = Volunteer(first_name = "John", + last_name = "Doe", + address = "7 Alpine Street", + city = "Maplegrove", + state = "Wyoming", + country = "USA", + phone_number = "23454545", + email = "john@test.com", + user = u2) + + v1.save() + v2.save() + + e1 = Event(name = "Open Source Event", + start_date = "2012-10-22", + end_date = "2012-10-23") + + e1.save() + + j1 = Job(name = "Software Developer", + start_date = "2012-10-22", + end_date = "2012-10-23", + description = "A software job", + event = e1) + + j2 = Job(name = "Systems Administrator", + start_date = "2012-9-1", + end_date = "2012-10-26", + description = "A systems administrator job", + event = e1) + + j1.save() + j2.save() + + s1 = Shift(date = "2012-10-23", + start_time = "9:00", + end_time = "3:00", + max_volunteers = 1, + job = j1) + + s2 = Shift(date = "2012-10-23", + start_time = "10:00", + end_time = "4:00", + max_volunteers = 2, + job = j1) + + s3 = Shift(date = "2012-10-23", + start_time = "12:00", + end_time = "6:00", + max_volunteers = 4, + job = j2) + + s1.save() + s2.save() + s3.save() + + #test cases where not signed up yet + self.assertFalse(is_signed_up(v1.id, s1.id)) + self.assertFalse(is_signed_up(v1.id, s2.id)) + self.assertFalse(is_signed_up(v1.id, s3.id)) + + #test cases where signed up + register(v1.id, s1.id) + register(v1.id, s2.id) + register(v1.id, s3.id) + + self.assertTrue(is_signed_up(v1.id, s1.id)) + self.assertTrue(is_signed_up(v1.id, s2.id)) + self.assertTrue(is_signed_up(v1.id, s3.id)) + + #test case where more than one volunteer signs up for the same shift + self.assertFalse(is_signed_up(v2.id, s1.id)) + self.assertFalse(is_signed_up(v2.id, s2.id)) + self.assertFalse(is_signed_up(v2.id, s3.id)) + + register(v2.id, s2.id) + register(v2.id, s3.id) + + self.assertFalse(is_signed_up(v2.id, s1.id)) + self.assertTrue(is_signed_up(v2.id, s2.id)) + self.assertTrue(is_signed_up(v2.id, s3.id)) + + def test_register(self): + + RESULT_IS_VALID = "IS_VALID" + ERROR_CODE_ALREADY_SIGNED_UP = "ERROR_CODE_ALREADY_SIGNED_UP" + ERROR_CODE_NO_SLOTS_REMAINING = "ERROR_CODE_NO_SLOTS_REMAINING" + + u1 = User.objects.create_user('Yoshi') + u2 = User.objects.create_user('John') + + v1 = Volunteer(first_name = "Yoshi", + last_name = "Turtle", + address = "Mario Land", + city = "Nintendo Land", + state = "Nintendo State", + country = "Nintendo Nation", + phone_number = "2374983247", + email = "yoshi@nintendo.com", + user = u1) + + v2 = Volunteer(first_name = "John", + last_name = "Doe", + address = "7 Alpine Street", + city = "Maplegrove", + state = "Wyoming", + country = "USA", + phone_number = "23454545", + email = "john@test.com", + user = u2) + + v1.save() + v2.save() + + e1 = Event(name = "Open Source Event", + start_date = "2012-10-22", + end_date = "2012-10-23") + + e1.save() + + j1 = Job(name = "Software Developer", + start_date = "2012-10-22", + end_date = "2012-10-23", + description = "A software job", + event = e1) + + j2 = Job(name = "Systems Administrator", + start_date = "2012-9-1", + end_date = "2012-10-26", + description = "A systems administrator job", + event = e1) + + j1.save() + j2.save() + + s1 = Shift(date = "2012-10-23", + start_time = "9:00", + end_time = "3:00", + max_volunteers = 1, + job = j1) + + s2 = Shift(date = "2012-10-23", + start_time = "10:00", + end_time = "4:00", + max_volunteers = 2, + job = j1) + + s3 = Shift(date = "2012-10-23", + start_time = "12:00", + end_time = "6:00", + max_volunteers = 4, + job = j2) + + s1.save() + s2.save() + s3.save() + + #test typical cases + register(v1.id, s1.id) + self.assertIsNotNone(VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s1.id)) + + register(v1.id, s2.id) + self.assertIsNotNone(VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s2.id)) + + register(v1.id, s3.id) + self.assertIsNotNone(VolunteerShift.objects.get(volunteer_id=v1.id, shift_id=s3.id)) + + #test cases where volunteer tries to sign up for a shift they are already signed up for + self.assertEqual(register(v1.id, s1.id), ERROR_CODE_ALREADY_SIGNED_UP) + self.assertEqual(register(v1.id, s2.id), ERROR_CODE_ALREADY_SIGNED_UP) + self.assertEqual(register(v1.id, s3.id), ERROR_CODE_ALREADY_SIGNED_UP) + + #test case where more than one volunteer signs up for the same shift + #v2 can't sign up for s1 because there are no slots remaining + self.assertEqual(register(v2.id, s1.id), ERROR_CODE_NO_SLOTS_REMAINING) + + register(v2.id, s2.id) + self.assertIsNotNone(VolunteerShift.objects.get(volunteer_id=v2.id, shift_id=s2.id)) + + register(v2.id, s3.id) + self.assertIsNotNone(VolunteerShift.objects.get(volunteer_id=v2.id, shift_id=s3.id)) + + #test cases where a volunteer tries to sign up for a shift they are already signed up for + self.assertEqual(register(v2.id, s2.id), ERROR_CODE_ALREADY_SIGNED_UP) + self.assertEqual(register(v2.id, s3.id), ERROR_CODE_ALREADY_SIGNED_UP) diff --git a/vms/shift/tests/test_viewVolunteerShift.py b/vms/shift/tests/test_viewVolunteerShift.py new file mode 100644 index 0000000..603cb61 --- /dev/null +++ b/vms/shift/tests/test_viewVolunteerShift.py @@ -0,0 +1,235 @@ +from django.test import TestCase +from django.contrib.staticfiles.testing import LiveServerTestCase + +from django.contrib.auth.models import User +from volunteer.models import Volunteer +from event.models import Event +from job.models import Job +from shift.models import Shift, VolunteerShift + +from selenium import webdriver +from selenium.common.exceptions import NoSuchElementException + +from organization.models import Organization #hack to pass travis,Bug in Code +import re + + +class ViewVolunteerShift(LiveServerTestCase): + ''' + ''' + def setUp(self): + volunteer_user = User.objects.create_user( + username = 'volunteer', + password = 'volunteer') + + volunteer = Volunteer.objects.create( + user = volunteer_user, + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + email = 'volunteer@volunteer.com', + unlisted_organization = 'organization') + + # create an org prior to registration. Bug in Code + # added to pass CI + volunteer_id = Volunteer.objects.get(user__username = 'volunteer').pk + Organization.objects.create( + name = 'DummyOrg') + + self.homepage = '/' + self.authentication_page = '/authentication/login/' + self.driver = webdriver.Firefox() + self.driver.implicitly_wait(5) + self.driver.maximize_window() + super(ViewVolunteerShift, self).setUp() + + def tearDown(self): + self.driver.quit() + super(ViewVolunteerShift, self).tearDown() + + def login(self, credentials): + self.driver.get(self.live_server_url + self.authentication_page) + self.driver.find_element_by_id('id_login').send_keys(credentials['username']) + self.driver.find_element_by_id('id_password').send_keys(credentials['password']) + self.driver.find_element_by_xpath('//form[1]').submit() + + def test_access_another_existing_volunteer_view(self): + ''' + test_volunteer_user = User.objects.create_user( + username = 'test_volunteer', + password = 'volunteer') + + test_volunteer = Volunteer.objects.create( + user = test_volunteer_user, + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + email = 'test_volunteer@volunteer.com', + unlisted_organization = 'organization') + + test_volunteer_id = Volunteer.objects.get(user__username = 'test_volunteer').pk + + credentials = {'username' : 'volunteer', 'password' : 'volunteer'} + self.login(credentials) + self.driver.get(self.live_server_url + '/shift/view_volunteer_shifts/' + str(test_volunteer_id)) + ''' + pass + + def test_access_another_nonexisting_volunteer_view(self): + credentials = {'username' : 'volunteer', 'password' : 'volunteer'} + self.login(credentials) + self.driver.get(self.live_server_url + '/shift/view_volunteer_shifts/' + '65459') + found = re.search('Not Found', self.driver.page_source) + self.assertNotEqual(found, None) + + def test_view_without_any_assigned_shift(self): + credentials = {'username' : 'volunteer', 'password' : 'volunteer'} + self.login(credentials) + self.driver.find_element_by_link_text('Upcoming Shifts').send_keys("\n") + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-info').text, 'You do not have any upcoming shifts.') + + def register_dataset(self, parameters): + try: + org = Organization.objects.create(name = parameters['org']) + except IntegrityError: + org = Organization.objects.get(name = parameters['org']) + + + volunteer = Volunteer.objects.get(user__username = 'volunteer') + + # create shift and log hours + event = Event.objects.create( + name = parameters['event']['name'], + start_date = parameters['event']['start_date'], + end_date = parameters['event']['end_date']) + + job = Job.objects.create( + name = parameters['job']['name'], + start_date = parameters['job']['start_date'], + end_date = parameters['job']['end_date'], + event = event) + + shift = Shift.objects.create( + date = parameters['shift']['date'], + start_time = parameters['shift']['start_time'], + end_time = parameters['shift']['end_time'], + max_volunteers = parameters['shift']['max_volunteers'], + job = job) + + # shift is assigned to volunteer + VolunteerShift.objects.create( + shift = shift, + volunteer = volunteer) + + def test_view_with_assigned_and_unlogged_shift(self): + parameters = {'org' : 'org-one', + 'event' : { + 'name' : 'event-four', + 'start_date' : '2017-06-01', + 'end_date' : '2017-06-10'}, + 'job' : { + 'name' : 'jobOneInEventFour', + 'start_date' : '2017-06-01', + 'end_date' : '2017-06-01'}, + 'shift' : { + 'date' : '2017-06-01', + 'start_time' : '09:00', + 'end_time' : '15:00', + 'max_volunteers' : '10'}} + + self.register_dataset(parameters) + credentials = {'username' : 'volunteer', 'password' : 'volunteer'} + self.login(credentials) + self.driver.find_element_by_link_text('Upcoming Shifts').send_keys("\n") + + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[1]').text, 'jobOneInEventFour') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[2]').text, 'June 1, 2017') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[3]').text, '9 a.m.') + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[4]').text, '3 p.m.') + + def test_log_hours_and_logged_shift_does_not_appear_in_upcoming_shifts(self): + parameters = {'org' : 'org-one', + 'event' : { + 'name' : 'event-four', + 'start_date' : '2017-06-01', + 'end_date' : '2017-06-10'}, + 'job' : { + 'name' : 'jobOneInEventFour', + 'start_date' : '2017-06-01', + 'end_date' : '2017-06-01'}, + 'shift' : { + 'date' : '2017-06-01', + 'start_time' : '09:00', + 'end_time' : '15:00', + 'max_volunteers' : '10'}} + + self.register_dataset(parameters) + credentials = {'username' : 'volunteer', 'password' : 'volunteer'} + self.login(credentials) + self.driver.find_element_by_link_text('Upcoming Shifts').send_keys("\n") + + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[5]').text, 'Log Hours') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[5]/a').click() + + self.driver.find_element_by_xpath( + '//input[@name = "start_time"]').send_keys('09:00') + self.driver.find_element_by_xpath( + '//input[@name = "end_time"]').send_keys('12:00') + self.driver.find_element_by_xpath('//form').submit() + + # check logged shift does not appear in Upcoming Shifts + self.driver.find_element_by_link_text('Upcoming Shifts').click() + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-info').text, 'You do not have any upcoming shifts.') + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_xpath('//table') + + def test_cancel_shift_registration(self): + parameters = {'org' : 'org-one', + 'event' : { + 'name' : 'event-four', + 'start_date' : '2017-06-01', + 'end_date' : '2017-06-10'}, + 'job' : { + 'name' : 'jobOneInEventFour', + 'start_date' : '2017-06-01', + 'end_date' : '2017-06-01'}, + 'shift' : { + 'date' : '2017-06-01', + 'start_time' : '09:00', + 'end_time' : '14:00', + 'max_volunteers' : '10'}} + + self.register_dataset(parameters) + credentials = {'username' : 'volunteer', 'password' : 'volunteer'} + self.login(credentials) + self.driver.find_element_by_link_text('Upcoming Shifts').send_keys("\n") + + self.assertEqual(self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[6]').text, 'Cancel Shift Registration') + self.driver.find_element_by_xpath( + '//table//tbody//tr[1]//td[6]/a').click() + + self.assertEqual(self.driver.find_element_by_class_name( + 'panel-title').text, 'Cancel Shift Confirmation') + self.assertEqual(self.driver.find_element_by_class_name('btn-danger').text, + 'Yes, Cancel this Shift') + self.driver.find_element_by_xpath('//form').submit() + + # check shift removed from upcoming shifts + self.driver.find_element_by_link_text('Upcoming Shifts').click() + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-info').text, 'You do not have any upcoming shifts.') + with self.assertRaises(NoSuchElementException): + self.driver.find_element_by_xpath('//table') diff --git a/vms/vms/settings.py b/vms/vms/settings.py index 819bfe2..6f96075 100644 --- a/vms/vms/settings.py +++ b/vms/vms/settings.py @@ -114,3 +114,5 @@ # If user fails to authenticate, then they are redirected to the view # specified in the reverse_lazy call LOGIN_URL = reverse_lazy('auth:user_login') + +STATIC_ROOT = './static/' diff --git a/vms/volunteer/tests/__init__.py b/vms/volunteer/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vms/volunteer/tests/test_searchVolunteer.py b/vms/volunteer/tests/test_searchVolunteer.py new file mode 100644 index 0000000..b05e7e9 --- /dev/null +++ b/vms/volunteer/tests/test_searchVolunteer.py @@ -0,0 +1,705 @@ +from django.test import TestCase +from django.contrib.staticfiles.testing import LiveServerTestCase + +from django.contrib.auth.models import User + +from selenium import webdriver +from selenium.common.exceptions import NoSuchElementException + +from administrator.models import Administrator +from organization.models import Organization #hack to pass travis,Bug in Code + + +class SearchVolunteer(LiveServerTestCase): + ''' + SearchVolunteer class contains tests to check '/voluneer/search/' view. + Choices of parameters contains + - First Name + - Last Name + - City + - State + - Country + - Organization + Class contains 7 tests to check each parameter separately and also to check + if a combination of parameters entered, then intersection of all results is + obtained. + ''' + def setUp(self): + admin_user = User.objects.create_user( + username = 'admin', + password = 'admin', + email = 'admin@admin.com') + + Administrator.objects.create( + user = admin_user, + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + unlisted_organization = 'organization') + + # create an org prior to registration. Bug in Code + # added to pass CI + Organization.objects.create( + name = 'DummyOrg') + + self.homepage = '/' + self.registration_page = '/registration/signup_volunteer/' + self.authentication_page = '/authentication/login/' + self.driver = webdriver.Firefox() + self.driver.implicitly_wait(5) + self.driver.maximize_window() + super(SearchVolunteer, self).setUp() + + def tearDown(self): + self.driver.quit() + super(SearchVolunteer, self).tearDown() + + def register_volunteer(self,credentials): + ''' + Utility function to register a volunteer with supplied credentials. + Credentials is a list of parameters to register a volunteer. Parameters + are in following order. + - username + - password + - first_name + - last_name + - email + - address + - city + - state + - country + - phone_number + - organization + ''' + self.driver.get(self.live_server_url + '/registration/signup_volunteer/') + + self.driver.find_element_by_id('id_username').send_keys(credentials[0]) + self.driver.find_element_by_id('id_password').send_keys(credentials[1]) + self.driver.find_element_by_id('id_first_name').send_keys(credentials[2]) + self.driver.find_element_by_id('id_last_name').send_keys(credentials[3]) + self.driver.find_element_by_id('id_email').send_keys(credentials[4]) + self.driver.find_element_by_id('id_address').send_keys(credentials[5]) + self.driver.find_element_by_id('id_city').send_keys(credentials[6]) + self.driver.find_element_by_id('id_state').send_keys(credentials[7]) + self.driver.find_element_by_id('id_country').send_keys(credentials[8]) + self.driver.find_element_by_id('id_phone_number').send_keys(credentials[9]) + self.driver.find_element_by_id('id_unlisted_organization').send_keys(credentials[10]) + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.homepage) + + def login_admin(self): + ''' + Utility function to login an admin user to perform all tests. + ''' + self.driver.get(self.live_server_url + self.authentication_page) + self.driver.find_element_by_id('id_login').send_keys('admin') + self.driver.find_element_by_id('id_password').send_keys('admin') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.homepage) + + def test_volunteer_first_name_field(self): + credentials = ['volunteer-username', 'volunteer-password', + 'VOLUNTEER-FIRST-NAME', 'volunteer-last-name', + 'volunteer-email@systers.org', 'volunteer-address', + 'volunteer-city', 'volunteer-state', 'volunteer-country', + '9999999999', 'volunteer-organization'] + + self.register_volunteer(credentials) + + credentials = ['volunteer-usernameq', 'volunteer-passwordq', + 'volunteer-first-name', 'volunteer-last-nameq', + 'volunteer-email2@systers.orgq', 'volunteer-addressq', + 'volunteer-cityq', 'volunteer-stateq', 'volunteer-countryq', + '9999999999', 'volunteer-organizationq'] + + self.register_volunteer(credentials) + self.login_admin() + + #self.driver.find_element_by_link_text('Volunteer Search').click() + self.driver.get(self.live_server_url + '/volunteer/search/') + self.assertEqual(self.driver.current_url, self.live_server_url + + '/volunteer/search/') + + self.driver.find_element_by_css_selector(".form-control[name='first_name']").send_keys('volunteer') + self.driver.find_element_by_class_name('btn').click() + + search_results = self.driver.find_element_by_xpath('//table//tbody') + + result = [] + for tr in search_results.find_elements_by_tag_name('tr'): + row = tr.text.split() + result.append(row) + + self.assertEqual(len(result), 2) + + expected_result = ['volunteer-first-name', 'volunteer-last-nameq', + 'volunteer-addressq', 'volunteer-cityq', 'volunteer-stateq', + 'volunteer-countryq', 'volunteer-organizationq', '9999999999', + 'volunteer-email2@systers.orgq'] + + self.assertTrue(expected_result in result) + + expected_result = ['VOLUNTEER-FIRST-NAME', 'volunteer-last-name', + 'volunteer-address', 'volunteer-city', 'volunteer-state', + 'volunteer-country', 'volunteer-organization', '9999999999', + 'volunteer-email@systers.org'] + + self.assertTrue(expected_result in result) + + self.driver.find_element_by_css_selector(".form-control[name='first_name']").clear() + self.driver.find_element_by_css_selector(".form-control[name='first_name']").send_keys('e') + self.driver.find_element_by_class_name('btn').click() + + self.assertEqual(len(result), 2) + + expected_result = ['volunteer-first-name', 'volunteer-last-nameq', + 'volunteer-addressq', 'volunteer-cityq', 'volunteer-stateq', + 'volunteer-countryq', 'volunteer-organizationq', '9999999999', + 'volunteer-email2@systers.orgq'] + + self.assertTrue(expected_result in result) + + expected_result = ['VOLUNTEER-FIRST-NAME', 'volunteer-last-name', + 'volunteer-address', 'volunteer-city', 'volunteer-state', + 'volunteer-country', 'volunteer-organization', '9999999999', + 'volunteer-email@systers.org'] + + self.assertTrue(expected_result in result) + + self.driver.find_element_by_css_selector(".form-control[name='first_name']").clear() + self.driver.find_element_by_css_selector(".form-control[name='first_name']").send_keys('vol-') + self.driver.find_element_by_class_name('btn').click() + + with self.assertRaises(NoSuchElementException): + search_results = self.driver.find_element_by_xpath('//table//tbody') + + self.driver.find_element_by_css_selector(".form-control[name='first_name']").clear() + self.driver.find_element_by_css_selector(".form-control[name='first_name']").send_keys('volunteer-fail-test') + self.driver.find_element_by_class_name('btn').click() + + with self.assertRaises(NoSuchElementException): + search_results = self.driver.find_element_by_xpath('//table//tbody') + + self.driver.find_element_by_css_selector(".form-control[name='first_name']").clear() + self.driver.find_element_by_css_selector(".form-control[name='first_name']").send_keys('!@#$%^&*()_') + self.driver.find_element_by_class_name('btn').click() + self.assertNotEqual(self.driver.find_element_by_class_name('help-block'), + None) + + def test_volunteer_last_name_field(self): + credentials = ['volunteer-username', 'volunteer-password', + 'volunteer-first-name', 'VOLUNTEER-LAST-NAME', + 'volunteer-email@systers.org', 'volunteer-address', + 'volunteer-city', 'volunteer-state', 'volunteer-country', + '9999999999', 'volunteer-organization'] + + self.register_volunteer(credentials) + + credentials = ['volunteer-usernameq', 'volunteer-passwordq', + 'volunteer-first-nameq', 'volunteer-last-name', + 'volunteer-email2@systers.orgq', 'volunteer-addressq', + 'volunteer-cityq', 'volunteer-stateq', 'volunteer-countryq', + '9999999999', 'volunteer-organizationq'] + + self.register_volunteer(credentials) + + self.login_admin() + self.driver.get(self.live_server_url + '/volunteer/search/') + self.assertEqual(self.driver.current_url, self.live_server_url + + '/volunteer/search/') + + self.driver.find_element_by_css_selector(".form-control[name='last_name']").clear() + self.driver.find_element_by_css_selector(".form-control[name='last_name']").send_keys('volunteer') + self.driver.find_element_by_class_name('btn').click() + + search_results = self.driver.find_element_by_xpath('//table//tbody') + + result = [] + for tr in search_results.find_elements_by_tag_name('tr'): + row = tr.text.split() + result.append(row) + + expected_result = ['volunteer-first-nameq', 'volunteer-last-name', + 'volunteer-addressq', 'volunteer-cityq', 'volunteer-stateq', + 'volunteer-countryq', 'volunteer-organizationq', '9999999999', + 'volunteer-email2@systers.orgq'] + + self.assertTrue(expected_result in result) + + expected_result = ['volunteer-first-name', 'VOLUNTEER-LAST-NAME', + 'volunteer-address', 'volunteer-city', 'volunteer-state', + 'volunteer-country', 'volunteer-organization', '9999999999', + 'volunteer-email@systers.org'] + + self.assertTrue(expected_result in result) + + self.driver.find_element_by_css_selector(".form-control[name='last_name']").clear() + self.driver.find_element_by_css_selector(".form-control[name='last_name']").send_keys('v') + self.driver.find_element_by_class_name('btn').click() + + self.assertEqual(len(result), 2) + + expected_result = ['volunteer-first-nameq', 'volunteer-last-name', + 'volunteer-addressq', 'volunteer-cityq', 'volunteer-stateq', + 'volunteer-countryq', 'volunteer-organizationq', '9999999999', + 'volunteer-email2@systers.orgq'] + + self.assertTrue(expected_result in result) + + expected_result = ['volunteer-first-name', 'VOLUNTEER-LAST-NAME', + 'volunteer-address', 'volunteer-city', 'volunteer-state', + 'volunteer-country', 'volunteer-organization', '9999999999', + 'volunteer-email@systers.org'] + + self.assertTrue(expected_result in result) + + self.driver.find_element_by_css_selector(".form-control[name='last_name']").clear() + self.driver.find_element_by_css_selector(".form-control[name='last_name']").send_keys('vol-') + self.driver.find_element_by_class_name('btn').click() + + with self.assertRaises(NoSuchElementException): + search_results = self.driver.find_element_by_xpath('//table//tbody') + + self.driver.find_element_by_css_selector(".form-control[name='last_name']").clear() + self.driver.find_element_by_css_selector(".form-control[name='last_name']").send_keys('volunteer-fail-test') + self.driver.find_element_by_class_name('btn').click() + + with self.assertRaises(NoSuchElementException): + search_results = self.driver.find_element_by_xpath('//table//tbody') + + self.driver.find_element_by_css_selector(".form-control[name='last_name']").clear() + self.driver.find_element_by_css_selector(".form-control[name='last_name']").send_keys('!@#$%^&*()_') + self.driver.find_element_by_class_name('btn').click() + self.assertNotEqual(self.driver.find_element_by_class_name('help-block'), + None) + + def test_volunteer_city_field(self): + credentials = ['volunteer-username', 'volunteer-password', + 'volunteer-first-name', 'volunteer-last-name', + 'volunteer-email@systers.org', 'volunteer-address', + 'VOLUNTEER-CITY', 'volunteer-state', 'volunteer-country', + '9999999999', 'volunteer-organization'] + + self.register_volunteer(credentials) + + credentials = ['volunteer-usernameq', 'volunteer-passwordq', + 'volunteer-first-nameq', 'volunteer-last-nameq', + 'volunteer-email2@systers.orgq', 'volunteer-addressq', + 'volunteer-city', 'volunteer-stateq', 'volunteer-countryq', + '9999999999', 'volunteer-organizationq'] + + self.register_volunteer(credentials) + + self.login_admin() + self.driver.get(self.live_server_url + '/volunteer/search/') + self.assertEqual(self.driver.current_url, self.live_server_url + + '/volunteer/search/') + + self.driver.find_element_by_css_selector(".form-control[name='city']").clear() + self.driver.find_element_by_css_selector(".form-control[name='city']").send_keys('volunteer') + self.driver.find_element_by_class_name('btn').click() + + search_results = self.driver.find_element_by_xpath('//table//tbody') + + result = [] + for tr in search_results.find_elements_by_tag_name('tr'): + row = tr.text.split() + result.append(row) + + expected_result = ['volunteer-first-nameq', 'volunteer-last-nameq', + 'volunteer-addressq', 'volunteer-city', 'volunteer-stateq', + 'volunteer-countryq', 'volunteer-organizationq', '9999999999', + 'volunteer-email2@systers.orgq'] + + self.assertTrue(expected_result in result) + + expected_result = ['volunteer-first-name', 'volunteer-last-name', + 'volunteer-address', 'VOLUNTEER-CITY', 'volunteer-state', + 'volunteer-country', 'volunteer-organization', '9999999999', + 'volunteer-email@systers.org'] + + self.assertTrue(expected_result in result) + + self.driver.find_element_by_css_selector(".form-control[name='city']").clear() + self.driver.find_element_by_css_selector(".form-control[name='city']").send_keys('v') + self.driver.find_element_by_class_name('btn').click() + + self.assertEqual(len(result), 2) + + expected_result = ['volunteer-first-nameq', 'volunteer-last-nameq', + 'volunteer-addressq', 'volunteer-city', 'volunteer-stateq', + 'volunteer-countryq', 'volunteer-organizationq', '9999999999', + 'volunteer-email2@systers.orgq'] + + self.assertTrue(expected_result in result) + + expected_result = ['volunteer-first-name', 'volunteer-last-name', + 'volunteer-address', 'VOLUNTEER-CITY', 'volunteer-state', + 'volunteer-country', 'volunteer-organization', '9999999999', + 'volunteer-email@systers.org'] + + self.assertTrue(expected_result in result) + + self.driver.find_element_by_css_selector(".form-control[name='city']").clear() + self.driver.find_element_by_css_selector(".form-control[name='city']").send_keys('vol-') + self.driver.find_element_by_class_name('btn').click() + + with self.assertRaises(NoSuchElementException): + search_results = self.driver.find_element_by_xpath('//table//tbody') + + self.driver.find_element_by_css_selector(".form-control[name='city']").clear() + self.driver.find_element_by_css_selector(".form-control[name='city']").send_keys('volunteer-fail-test') + self.driver.find_element_by_class_name('btn').click() + + with self.assertRaises(NoSuchElementException): + search_results = self.driver.find_element_by_xpath('//table//tbody') + + self.driver.find_element_by_css_selector(".form-control[name='city']").clear() + self.driver.find_element_by_css_selector(".form-control[name='city']").send_keys('!@#$%^&*()_') + self.driver.find_element_by_class_name('btn').click() + self.assertNotEqual(self.driver.find_element_by_class_name('help-block'), + None) + + def test_volunteer_state_field(self): + credentials = ['volunteer-username', 'volunteer-password', + 'volunteer-first-name', 'volunteer-last-name', + 'volunteer-email@systers.org', 'volunteer-address', + 'volunteer-city', 'VOLUNTEER-STATE', 'volunteer-country', + '9999999999', 'volunteer-organization'] + + self.register_volunteer(credentials) + + credentials = ['volunteer-usernameq', 'volunteer-passwordq', + 'volunteer-first-nameq', 'volunteer-last-nameq', + 'volunteer-email2@systers.orgq', 'volunteer-addressq', + 'volunteer-cityq', 'volunteer-state', 'volunteer-countryq', + '9999999999', 'volunteer-organizationq'] + + self.register_volunteer(credentials) + + self.login_admin() + self.driver.get(self.live_server_url + '/volunteer/search/') + self.assertEqual(self.driver.current_url, self.live_server_url + + '/volunteer/search/') + + self.driver.find_element_by_css_selector(".form-control[name='state']").clear() + self.driver.find_element_by_css_selector(".form-control[name='state']").send_keys('volunteer') + self.driver.find_element_by_class_name('btn').click() + + search_results = self.driver.find_element_by_xpath('//table//tbody') + + result = [] + for tr in search_results.find_elements_by_tag_name('tr'): + row = tr.text.split() + result.append(row) + + expected_result = ['volunteer-first-nameq', 'volunteer-last-nameq', + 'volunteer-addressq', 'volunteer-cityq', 'volunteer-state', + 'volunteer-countryq', 'volunteer-organizationq', '9999999999', + 'volunteer-email2@systers.orgq'] + + self.assertTrue(expected_result in result) + + expected_result = ['volunteer-first-name', 'volunteer-last-name', + 'volunteer-address', 'volunteer-city', 'VOLUNTEER-STATE', + 'volunteer-country', 'volunteer-organization', '9999999999', + 'volunteer-email@systers.org'] + + self.assertTrue(expected_result in result) + + self.driver.find_element_by_css_selector(".form-control[name='state']").clear() + self.driver.find_element_by_css_selector(".form-control[name='state']").send_keys('v') + self.driver.find_element_by_class_name('btn').click() + + self.assertEqual(len(result), 2) + + expected_result = ['volunteer-first-nameq', 'volunteer-last-nameq', + 'volunteer-addressq', 'volunteer-cityq', 'volunteer-state', + 'volunteer-countryq', 'volunteer-organizationq', '9999999999', + 'volunteer-email2@systers.orgq'] + + self.assertTrue(expected_result in result) + + expected_result = ['volunteer-first-name', 'volunteer-last-name', + 'volunteer-address', 'volunteer-city', 'VOLUNTEER-STATE', + 'volunteer-country', 'volunteer-organization', '9999999999', + 'volunteer-email@systers.org'] + + self.assertTrue(expected_result in result) + + self.driver.find_element_by_css_selector(".form-control[name='state']").clear() + self.driver.find_element_by_css_selector(".form-control[name='state']").send_keys('vol-') + self.driver.find_element_by_class_name('btn').click() + + with self.assertRaises(NoSuchElementException): + search_results = self.driver.find_element_by_xpath('//table//tbody') + + self.driver.find_element_by_css_selector(".form-control[name='state']").clear() + self.driver.find_element_by_css_selector(".form-control[name='state']").send_keys('volunteer-fail-test') + self.driver.find_element_by_class_name('btn').click() + + with self.assertRaises(NoSuchElementException): + search_results = self.driver.find_element_by_xpath('//table//tbody') + + self.driver.find_element_by_css_selector(".form-control[name='state']").clear() + self.driver.find_element_by_css_selector(".form-control[name='state']").send_keys('!@#$%^&*()_') + self.driver.find_element_by_class_name('btn').click() + self.assertNotEqual(self.driver.find_element_by_class_name('help-block'), + None) + + def test_volunteer_country_field(self): + credentials = ['volunteer-username', 'volunteer-password', + 'volunteer-first-name', 'volunteer-last-name', + 'volunteer-email@systers.org', 'volunteer-address', + 'volunteer-city', 'volunteer-state', 'VOLUNTEER-COUNTRY', + '9999999999', 'volunteer-organization'] + + self.register_volunteer(credentials) + + credentials = ['volunteer-usernameq', 'volunteer-passwordq', + 'volunteer-first-nameq', 'volunteer-last-nameq', + 'volunteer-email2@systers.orgq', 'volunteer-addressq', + 'volunteer-cityq', 'volunteer-stateq', 'volunteer-country', + '9999999999', 'volunteer-organizationq'] + + self.register_volunteer(credentials) + + self.login_admin() + self.driver.get(self.live_server_url + '/volunteer/search/') + self.assertEqual(self.driver.current_url, self.live_server_url + + '/volunteer/search/') + + self.driver.find_element_by_css_selector(".form-control[name='country']").clear() + self.driver.find_element_by_css_selector(".form-control[name='country']").send_keys('volunteer') + self.driver.find_element_by_class_name('btn').click() + + search_results = self.driver.find_element_by_xpath('//table//tbody') + + result = [] + for tr in search_results.find_elements_by_tag_name('tr'): + row = tr.text.split() + result.append(row) + + expected_result = ['volunteer-first-nameq', 'volunteer-last-nameq', + 'volunteer-addressq', 'volunteer-cityq', 'volunteer-stateq', + 'volunteer-country', 'volunteer-organizationq', '9999999999', + 'volunteer-email2@systers.orgq'] + + self.assertTrue(expected_result in result) + + expected_result = ['volunteer-first-name', 'volunteer-last-name', + 'volunteer-address', 'volunteer-city', 'volunteer-state', + 'VOLUNTEER-COUNTRY', 'volunteer-organization', '9999999999', + 'volunteer-email@systers.org'] + + self.assertTrue(expected_result in result) + + self.driver.find_element_by_css_selector(".form-control[name='country']").clear() + self.driver.find_element_by_css_selector(".form-control[name='country']").send_keys('v') + self.driver.find_element_by_class_name('btn').click() + + self.assertEqual(len(result), 2) + + expected_result = ['volunteer-first-nameq', 'volunteer-last-nameq', + 'volunteer-addressq', 'volunteer-cityq', 'volunteer-stateq', + 'volunteer-country', 'volunteer-organizationq', '9999999999', + 'volunteer-email2@systers.orgq'] + + self.assertTrue(expected_result in result) + + expected_result = ['volunteer-first-name', 'volunteer-last-name', + 'volunteer-address', 'volunteer-city', 'volunteer-state', + 'VOLUNTEER-COUNTRY', 'volunteer-organization', '9999999999', + 'volunteer-email@systers.org'] + + self.assertTrue(expected_result in result) + + self.driver.find_element_by_css_selector(".form-control[name='country']").clear() + self.driver.find_element_by_css_selector(".form-control[name='country']").send_keys('vol-') + self.driver.find_element_by_class_name('btn').click() + + with self.assertRaises(NoSuchElementException): + search_results = self.driver.find_element_by_xpath('//table//tbody') + + self.driver.find_element_by_css_selector(".form-control[name='country']").clear() + self.driver.find_element_by_css_selector(".form-control[name='country']").send_keys('volunteer-fail-test') + self.driver.find_element_by_class_name('btn').click() + + with self.assertRaises(NoSuchElementException): + search_results = self.driver.find_element_by_xpath('//table//tbody') + + self.driver.find_element_by_css_selector(".form-control[name='country']").clear() + self.driver.find_element_by_css_selector(".form-control[name='country']").send_keys('!@#$%^&*()_') + self.driver.find_element_by_class_name('btn').click() + self.assertNotEqual(self.driver.find_element_by_class_name('help-block'), + None) + + def test_volunteer_organization_field(self): + credentials = ['volunteer-username', 'volunteer-password', + 'volunteer-first-name', 'volunteer-last-name', + 'volunteer-email@systers.org', 'volunteer-address', + 'volunteer-city', 'volunteer-state', 'volunteer-country', + '9999999999', 'VOLUNTEER-ORGANIZATION'] + + self.register_volunteer(credentials) + + credentials = ['volunteer-usernameq', 'volunteer-passwordq', + 'volunteer-first-nameq', 'volunteer-last-nameq', + 'volunteer-email2@systers.orgq', 'volunteer-addressq', + 'volunteer-cityq', 'volunteer-stateq', 'volunteer-countryq', + '9999999999', 'volunteer-organization'] + + self.register_volunteer(credentials) + + self.login_admin() + self.driver.get(self.live_server_url + '/volunteer/search/') + self.assertEqual(self.driver.current_url, self.live_server_url + + '/volunteer/search/') + + self.driver.find_element_by_css_selector(".form-control[name='organization']").clear() + self.driver.find_element_by_css_selector(".form-control[name='organization']").send_keys('volunteer') + self.driver.find_element_by_class_name('btn').click() + + search_results = self.driver.find_element_by_xpath('//table//tbody') + + result = [] + for tr in search_results.find_elements_by_tag_name('tr'): + row = tr.text.split() + result.append(row) + + expected_result = ['volunteer-first-nameq', 'volunteer-last-nameq', + 'volunteer-addressq', 'volunteer-cityq', 'volunteer-stateq', + 'volunteer-countryq', 'volunteer-organization', '9999999999', + 'volunteer-email2@systers.orgq'] + + self.assertTrue(expected_result in result) + + expected_result = ['volunteer-first-name', 'volunteer-last-name', + 'volunteer-address', 'volunteer-city', 'volunteer-state', + 'volunteer-country', 'VOLUNTEER-ORGANIZATION', '9999999999', + 'volunteer-email@systers.org'] + + self.assertTrue(expected_result in result) + + self.driver.find_element_by_css_selector(".form-control[name='organization']").clear() + self.driver.find_element_by_css_selector(".form-control[name='organization']").send_keys('v') + self.driver.find_element_by_class_name('btn').click() + + self.assertEqual(len(result), 2) + + expected_result = ['volunteer-first-nameq', 'volunteer-last-nameq', + 'volunteer-addressq', 'volunteer-cityq', 'volunteer-stateq', + 'volunteer-countryq', 'volunteer-organization', '9999999999', + 'volunteer-email2@systers.orgq'] + + self.assertTrue(expected_result in result) + + expected_result = ['volunteer-first-name', 'volunteer-last-name', + 'volunteer-address', 'volunteer-city', 'volunteer-state', + 'volunteer-country', 'VOLUNTEER-ORGANIZATION', '9999999999', + 'volunteer-email@systers.org'] + + self.assertTrue(expected_result in result) + + self.driver.find_element_by_css_selector(".form-control[name='organization']").clear() + self.driver.find_element_by_css_selector(".form-control[name='organization']").send_keys('vol-') + self.driver.find_element_by_class_name('btn').click() + + with self.assertRaises(NoSuchElementException): + search_results = self.driver.find_element_by_xpath('//table//tbody') + + self.driver.find_element_by_css_selector(".form-control[name='organization']").clear() + self.driver.find_element_by_css_selector(".form-control[name='organization']").send_keys('volunteer-fail-test') + self.driver.find_element_by_class_name('btn').click() + + with self.assertRaises(NoSuchElementException): + search_results = self.driver.find_element_by_xpath('//table//tbody') + + self.driver.find_element_by_css_selector(".form-control[name='organization']").clear() + self.driver.find_element_by_css_selector(".form-control[name='organization']").send_keys('!@#$%^&*()_') + self.driver.find_element_by_class_name('btn').click() + self.assertNotEqual(self.driver.find_element_by_class_name('help-block'), + None) + + def test_intersection_of_all_fields(self): + credentials = ['volunteer-username', 'volunteer-password', + 'volunteer-first-name', 'volunteer-last-name', + 'volunteer-email@systers.org', 'volunteer-address', + 'volunteer-city', 'volunteer-state', 'volunteer-country', + '9999999999', 'VOLUNTEER-ORGANIZATION'] + + self.register_volunteer(credentials) + + credentials = ['volunteer-usernameq', 'volunteer-passwordq', + 'volunteer-first-nameq', 'volunteer-last-nameq', + 'volunteer-email2@systers.orgq', 'volunteer-addressq', + 'volunteer-cityq', 'volunteer-stateq', 'volunteer-countryq', + '9999999999', 'volunteer-organization'] + + self.register_volunteer(credentials) + + self.login_admin() + self.driver.get(self.live_server_url + '/volunteer/search/') + self.assertEqual(self.driver.current_url, self.live_server_url + + '/volunteer/search/') + + self.driver.find_element_by_css_selector(".form-control[name='first_name']").clear() + self.driver.find_element_by_css_selector(".form-control[name='first_name']").send_keys('volunteer') + self.driver.find_element_by_css_selector(".form-control[name='last_name']").clear() + self.driver.find_element_by_css_selector(".form-control[name='last_name']").send_keys('volunteer') + self.driver.find_element_by_css_selector(".form-control[name='city']").clear() + self.driver.find_element_by_css_selector(".form-control[name='city']").send_keys('volunteer') + self.driver.find_element_by_css_selector(".form-control[name='state']").clear() + self.driver.find_element_by_css_selector(".form-control[name='state']").send_keys('volunteer') + self.driver.find_element_by_css_selector(".form-control[name='country']").clear() + self.driver.find_element_by_css_selector(".form-control[name='country']").send_keys('volunteer') + self.driver.find_element_by_css_selector(".form-control[name='organization']").clear() + self.driver.find_element_by_css_selector(".form-control[name='organization']").send_keys('volunteer') + self.driver.find_element_by_class_name('btn').click() + + search_results = self.driver.find_element_by_xpath('//table//tbody') + + result = [] + for tr in search_results.find_elements_by_tag_name('tr'): + row = tr.text.split() + result.append(row) + + expected_result = ['volunteer-first-nameq', 'volunteer-last-nameq', + 'volunteer-addressq', 'volunteer-cityq', 'volunteer-stateq', + 'volunteer-countryq', 'volunteer-organization', '9999999999', + 'volunteer-email2@systers.orgq'] + + self.assertTrue(expected_result in result) + + expected_result = ['volunteer-first-name', 'volunteer-last-name', + 'volunteer-address', 'volunteer-city', 'volunteer-state', + 'volunteer-country', 'VOLUNTEER-ORGANIZATION', '9999999999', + 'volunteer-email@systers.org'] + + self.assertTrue(expected_result in result) + + self.driver.find_element_by_css_selector(".form-control[name='first_name']").clear() + self.driver.find_element_by_css_selector(".form-control[name='first_name']").send_keys('volunteer') + self.driver.find_element_by_css_selector(".form-control[name='country']").clear() + self.driver.find_element_by_css_selector(".form-control[name='country']").send_keys('wrong-country') + self.driver.find_element_by_css_selector(".form-control[name='organization']").clear() + self.driver.find_element_by_css_selector(".form-control[name='organization']").send_keys('org') + self.driver.find_element_by_class_name('btn').click() + + with self.assertRaises(NoSuchElementException): + search_results = self.driver.find_element_by_xpath('//table//tbody') + + self.driver.find_element_by_css_selector(".form-control[name='last_name']").clear() + self.driver.find_element_by_css_selector(".form-control[name='last_name']").send_keys('volunteer') + self.driver.find_element_by_css_selector(".form-control[name='city']").clear() + self.driver.find_element_by_css_selector(".form-control[name='city']").send_keys('wrong-city') + self.driver.find_element_by_class_name('btn').click() + + with self.assertRaises(NoSuchElementException): + search_results = self.driver.find_element_by_xpath('//table//tbody') diff --git a/vms/volunteer/tests.py b/vms/volunteer/tests/test_services.py similarity index 100% rename from vms/volunteer/tests.py rename to vms/volunteer/tests/test_services.py diff --git a/vms/volunteer/tests/test_unit.py b/vms/volunteer/tests/test_unit.py new file mode 100644 index 0000000..f2b4585 --- /dev/null +++ b/vms/volunteer/tests/test_unit.py @@ -0,0 +1,348 @@ +import datetime +from django.contrib.auth.models import User +from django.test import TestCase +from organization.models import Organization +from volunteer.models import Volunteer +from volunteer.services import * + +class VolunteerMethodTests(TestCase): + + def test_get_volunteer_by_id(self): + + u1 = User.objects.create_user('John') + u2 = User.objects.create_user('James') + u3 = User.objects.create_user('George') + + v1 = Volunteer(first_name = "John", + last_name = "Doe", + address = "7 Alpine Street", + city = "Maplegrove", + state = "Wyoming", + country = "USA", + phone_number = "23454545", + email = "john@test.com", + user = u1) + + v2 = Volunteer(first_name = "James", + last_name = "Doe", + address = "7 Oak Street", + city = "Elmgrove", + state = "California", + country = "USA", + phone_number = "23454545", + email = "james@test.com", + user = u2) + + v3 = Volunteer(id = 999, + first_name = "George", + last_name = "Doe", + address = "7 Elm Street", + city = "Oakgrove", + state = "California", + country = "USA", + phone_number = "23454545", + email = "george@test.com", + user = u3) + + v1.save() + v2.save() + v3.save() + + #test typical cases + self.assertIsNotNone(get_volunteer_by_id(v1.id)) + self.assertIsNotNone(get_volunteer_by_id(v2.id)) + self.assertIsNotNone(get_volunteer_by_id(v3.id)) + + self.assertEqual(get_volunteer_by_id(v1.id), v1) + self.assertEqual(get_volunteer_by_id(v2.id), v2) + self.assertEqual(get_volunteer_by_id(v3.id), v3) + + #why doesn't testing for equality work? + #self.assertIs(get_volunteer_by_id(v1.id), v1) + #self.assertIs(get_volunteer_by_id(v2.id), v2) + #self.assertIs(get_volunteer_by_id(v3.id), v3) + + #test non-existant cases + self.assertIsNone(get_volunteer_by_id(100)) + self.assertIsNone(get_volunteer_by_id(200)) + self.assertIsNone(get_volunteer_by_id(300)) + self.assertIsNone(get_volunteer_by_id(400)) + + self.assertNotEqual(get_volunteer_by_id(100), v1) + self.assertNotEqual(get_volunteer_by_id(200), v1) + self.assertNotEqual(get_volunteer_by_id(300), v2) + self.assertNotEqual(get_volunteer_by_id(400), v2) + + def test_has_resume_file(self): + + u1 = User.objects.create_user('John') + u2 = User.objects.create_user('James') + u3 = User.objects.create_user('Jane') + + v1 = Volunteer(first_name = "John", + last_name = "Doe", + address = "7 Alpine Street", + city = "Maplegrove", + state = "Wyoming", + country = "USA", + phone_number = "23454545", + email = "john@test.com", + resume_file = "MyResume.pdf", + user = u1) + + v2 = Volunteer(first_name = "James", + last_name = "Doe", + address = "7 Alpine Street", + city = "Maplegrove", + state = "Wyoming", + country = "USA", + phone_number = "23454545", + email = "james@test.com", + user = u2) + + v3 = Volunteer(first_name = "Jane", + last_name = "Doe", + address = "7 Alpine Street", + city = "Maplegrove", + state = "Wyoming", + country = "USA", + phone_number = "23454545", + email = "jane@test.com", + resume_file = "", + user = u3) + + v1.save() + v2.save() + v3.save() + + #test typical cases + self.assertTrue(has_resume_file(v1.id)) + + #test non-existant cases + self.assertFalse(has_resume_file(v2.id)) + self.assertFalse(has_resume_file(v3.id)) + + def test_get_volunteer_resume_file_url(self): + + u1 = User.objects.create_user('John') + + v1 = Volunteer(first_name = "John", + last_name = "Doe", + address = "7 Alpine Street", + city = "Maplegrove", + state = "Wyoming", + country = "USA", + phone_number = "23454545", + email = "john@test.com", + resume_file = "MyResume.pdf", + user = u1) + + v1.save() + + #test typicl cases + self.assertIsNotNone(get_volunteer_resume_file_url(v1.id)) + self.assertEqual(get_volunteer_resume_file_url(v1.id), v1.resume_file.url) + + #test non-existant cases + self.assertNotEqual(get_volunteer_resume_file_url(v1.id), "resumes/DifferentResume.pdf") + self.assertNotEqual(get_volunteer_resume_file_url(v1.id), "resumes/AnotherResume.pdf") + + def test_get_volunteers_ordered_by_first_name(self): + + u1 = User.objects.create_user('Yoshi') + u2 = User.objects.create_user('Ashley') + u3 = User.objects.create_user('Zelda') + + v1 = Volunteer(first_name = "Yoshi", + last_name = "Doe", + address = "7 Oak Street", + city = "Elmgrove", + state = "California", + country = "USA", + phone_number = "23454545", + email = "yoshi@test.com", + user = u1) + + v2 = Volunteer(first_name = "Ashley", + last_name = "Doe", + address = "7 Alpine Street", + city = "Maplegrove", + state = "Wyoming", + country = "USA", + phone_number = "23454545", + email = "ashley@test.com", + user = u2) + + v3 = Volunteer(id = 999, + first_name = "Zelda", + last_name = "Doe", + address = "7 Elm Street", + city = "Oakgrove", + state = "California", + country = "USA", + phone_number = "23454545", + email = "zelda@test.com", + user = u3) + + v1.save() + v2.save() + v3.save() + + #test typical cases + volunteer_list = get_volunteers_ordered_by_first_name() + self.assertIsNotNone(volunteer_list) + self.assertIn(v1, volunteer_list) + self.assertIn(v2, volunteer_list) + self.assertIn(v3, volunteer_list) + self.assertEqual(len(volunteer_list), 3) + + #test if in correct order + self.assertEqual(volunteer_list[0], v2) + self.assertEqual(volunteer_list[1], v1) + self.assertEqual(volunteer_list[2], v3) + + def test_delete_volunteer(self): + + u1 = User.objects.create_user('Yoshi') + u2 = User.objects.create_user('Ashley') + u3 = User.objects.create_user('Zelda') + + v1 = Volunteer(first_name = "Yoshi", + last_name = "Doe", + address = "7 Oak Street", + city = "Elmgrove", + state = "California", + country = "USA", + phone_number = "23454545", + email = "yoshi@test.com", + user = u1) + + v2 = Volunteer(first_name = "Ashley", + last_name = "Doe", + address = "7 Alpine Street", + city = "Maplegrove", + state = "Wyoming", + country = "USA", + phone_number = "23454545", + email = "ashley@test.com", + user = u2) + + v3 = Volunteer(id = 999, + first_name = "Zelda", + last_name = "Doe", + address = "7 Elm Street", + city = "Oakgrove", + state = "California", + country = "USA", + phone_number = "23454545", + email = "zelda@test.com", + user = u3) + + v1.save() + v2.save() + v3.save() + + delete_volunteer(v1.id) + delete_volunteer(v2.id) + delete_volunteer(v3.id) + + #why is active not set to false? + #self.assertFalse(u1.is_active) + #self.assertFalse(u2.is_active) + #self.assertFalse(u3.is_active) + + def test_search_volunteers(self): + + u1 = User.objects.create_user('Yoshi') + u2 = User.objects.create_user('Ashley') + u3 = User.objects.create_user('Zelda') + + o1 = Organization(name = "Apple") + o2 = Organization(name = "Google") + + o1.save() + o2.save() + + v1 = Volunteer(first_name = "Yoshi", + last_name = "Doe", + address = "7 Oak Street", + city = "Elmgrove", + state = "California", + country = "USA", + phone_number = "23454545", + organization = o1, + email = "yoshi@test.com", + user = u1) + + v2 = Volunteer(first_name = "Ashley", + last_name = "Doe", + address = "7 Alpine Street", + city = "Maplegrove", + state = "Wyoming", + country = "USA", + phone_number = "23454545", + organization = o2, + email = "ashley@test.com", + user = u2) + + v3 = Volunteer(id = 999, + first_name = "Zelda", + last_name = "Doe", + address = "7 Elm Street", + city = "Oakgrove", + state = "California", + country = "USA", + phone_number = "23454545", + unlisted_organization = "Government of Canada", + email = "zelda@test.com", + user = u3) + + v1.save() + v2.save() + v3.save() + + #if no search parameters are given, it returns all volunteers + search_list = search_volunteers("", "", "", "", "", "") + self.assertNotEqual(search_list, False) + self.assertEqual(len(search_list), 3) + self.assertIn(v1, search_list) + self.assertIn(v2, search_list) + self.assertIn(v3, search_list) + + search_list = search_volunteers(None, None, None, None, None, None) + self.assertNotEqual(search_list, False) + self.assertEqual(len(search_list), 3) + self.assertIn(v1, search_list) + self.assertIn(v2, search_list) + self.assertIn(v3, search_list) + + #test exact search + search_list = search_volunteers("Yoshi", "Doe", "Elmgrove", "California", "USA", "Apple") + self.assertNotEqual(search_list, False) + self.assertEqual(len(search_list), 1) + self.assertIn(v1, search_list) + self.assertNotIn(v2, search_list) + self.assertNotIn(v3, search_list) + + #test partial search + search_list = search_volunteers("Yoshi", None, None, None, None, None) + self.assertNotEqual(search_list, False) + self.assertEqual(len(search_list), 1) + self.assertIn(v1, search_list) + self.assertNotIn(v2, search_list) + self.assertNotIn(v3, search_list) + + search_list = search_volunteers(None, "Doe", None, None, None, None) + self.assertNotEqual(search_list, False) + self.assertEqual(len(search_list), 3) + self.assertIn(v1, search_list) + self.assertIn(v2, search_list) + self.assertIn(v3, search_list) + + #test no search matches + search_list = search_volunteers("Billy", "Doe", "Montreal", "Quebec", "Canada", "Ubisoft") + self.assertEqual(len(search_list), 0) + self.assertNotIn(v1, search_list) + self.assertNotIn(v2, search_list) + self.assertNotIn(v3, search_list) + diff --git a/vms/volunteer/tests/test_volunteerProfile.py b/vms/volunteer/tests/test_volunteerProfile.py new file mode 100644 index 0000000..9fea519 --- /dev/null +++ b/vms/volunteer/tests/test_volunteerProfile.py @@ -0,0 +1,199 @@ +from django.test import TestCase +from django.contrib.staticfiles.testing import LiveServerTestCase + +from django.contrib.auth.models import User + +from selenium import webdriver +from selenium.common.exceptions import NoSuchElementException + +from volunteer.models import Volunteer +from organization.models import Organization #hack to pass travis,Bug in Code + +import re + + +class VolunteerProfile(LiveServerTestCase): + ''' + ''' + def setUp(self): + volunteer_user = User.objects.create_user( + username = 'Sherlock', + password = 'Holmes', + email = 'idonthave@gmail.com') + + Volunteer.objects.create( + first_name = 'Sherlock', + last_name = 'Holmes', + user = volunteer_user, + email = 'idonthave@gmail.com', + address = '221-B Baker Street', + city = 'London', + state = 'London-State', + country = 'UK', + phone_number = '9999999999', + unlisted_organization = 'Detective') + + # create an org prior to registration. Bug in Code + # added to pass CI + Organization.objects.create( + name = 'DummyOrg') + + self.homepage = '/' + self.authentication_page = '/authentication/login/' + self.driver = webdriver.Firefox() + self.driver.maximize_window() + super(VolunteerProfile, self).setUp() + + def tearDown(self): + self.driver.quit() + super(VolunteerProfile, self).tearDown() + + def login(self): + self.driver.get(self.live_server_url + self.authentication_page) + self.driver.find_element_by_id('id_login').send_keys('Sherlock') + self.driver.find_element_by_id('id_password').send_keys('Holmes') + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertEqual(self.driver.current_url, self.live_server_url + + self.homepage) + + def test_details_tab(self): + self.login() + self.driver.find_element_by_link_text('Profile').click() + page_source = self.driver.page_source + + found_email = re.search('idonthave@gmail.com', page_source) + self.assertNotEqual(found_email, None) + + found_city = re.search('London', page_source) + self.assertNotEqual(found_city, None) + + found_state = re.search('London-State', page_source) + self.assertNotEqual(found_state, None) + + found_country = re.search('UK', page_source) + self.assertNotEqual(found_country, None) + + found_org = re.search('Detective', page_source) + self.assertNotEqual(found_org, None) + + def test_edit_profile(self): + self.login() + self.driver.find_element_by_link_text('Profile').click() + self.driver.find_element_by_link_text('Edit Profile').click() + + self.driver.find_element_by_xpath( + '//input[@name = "first_name"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "first_name"]').send_keys('Harvey') + + self.driver.find_element_by_xpath( + '//input[@name = "last_name"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "last_name"]').send_keys('Specter') + + self.driver.find_element_by_xpath( + '//input[@name = "email"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "email"]').send_keys('hspecter@ps.com') + + self.driver.find_element_by_xpath( + '//input[@name = "address"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "address"]').send_keys('Empire State Building') + + self.driver.find_element_by_xpath( + '//input[@name = "city"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "city"]').send_keys('NYC') + + self.driver.find_element_by_xpath( + '//input[@name = "state"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "state"]').send_keys('New York') + + self.driver.find_element_by_xpath( + '//input[@name = "country"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "country"]').send_keys('USA') + + self.driver.find_element_by_xpath( + '//input[@name = "phone_number"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "phone_number"]').send_keys('9999999998') + + self.driver.find_element_by_xpath( + '//select[@name = "organization_name"]').send_keys('None') + + self.driver.find_element_by_xpath( + '//input[@name = "unlisted_organization"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "unlisted_organization"]').send_keys('Lawyer') + self.driver.find_element_by_xpath('//form').submit() + + page_source = self.driver.page_source + + found_email = re.search('idonthave@gmail.com', page_source) + self.assertEqual(found_email, None) + + found_city = re.search('London', page_source) + self.assertEqual(found_city, None) + + found_state = re.search('London-State', page_source) + self.assertEqual(found_state, None) + + found_country = re.search('UK', page_source) + self.assertEqual(found_country, None) + + found_org = re.search('Detective', page_source) + self.assertEqual(found_org, None) + + found_email = re.search('hspecter@ps.com', page_source) + self.assertNotEqual(found_email, None) + + found_city = re.search('NYC', page_source) + self.assertNotEqual(found_city, None) + + found_state = re.search('New York', page_source) + self.assertNotEqual(found_state, None) + + found_country = re.search('USA', page_source) + self.assertNotEqual(found_country, None) + + found_org = re.search('Lawyer', page_source) + self.assertNotEqual(found_org, None) + + def test_upload_resume(self): + pass + ''' + #Tested locally + self.login() + self.driver.find_element_by_link_text('Profile').click() + self.driver.find_element_by_link_text('Edit Profile').click() + + self.driver.find_element_by_xpath( + '//input[@name = "resume_file"]').send_keys('/home/jlahori/Downloads/water.pdf') + + self.driver.find_element_by_xpath('//form').submit() + self.assertEqual(self.driver.find_element_by_xpath( + './/*[@id="collapseResumeFile"]/div/form/button').text, + 'Download Resume') + ''' + + def test_invalid_resume_format(self): + pass + ''' + #Tested locally + self.login() + self.driver.find_element_by_link_text('Profile').click() + self.driver.find_element_by_link_text('Edit Profile').click() + + self.driver.find_element_by_xpath( + '//input[@name = "resume_file"]').send_keys('/home/jlahori/Downloads/ca.crt') + + self.driver.find_element_by_xpath('//form').submit() + self.assertEqual(self.driver.find_element_by_xpath( + 'html/body/div[2]/div[2]/form/fieldset/div[13]/div/p/strong').text, + 'Uploaded file is invalid.') + ''' + diff --git a/vms/volunteer/tests/test_volunteerReport.py b/vms/volunteer/tests/test_volunteerReport.py new file mode 100644 index 0000000..f831b26 --- /dev/null +++ b/vms/volunteer/tests/test_volunteerReport.py @@ -0,0 +1,252 @@ +from django.test import TestCase +from django.contrib.staticfiles.testing import LiveServerTestCase + +from django.contrib.auth.models import User + +from selenium import webdriver +from selenium.common.exceptions import NoSuchElementException +from selenium.webdriver.support.ui import Select + +from volunteer.models import Volunteer +from organization.models import Organization #hack to pass travis,Bug in Code +from event.models import Event +from job.models import Job +from shift.models import Shift, VolunteerShift + + +class VolunteerReport(LiveServerTestCase): + ''' + ''' + def setUp(self): + volunteer_user = User.objects.create_user( + username = 'volunteer', + password = 'volunteer', + email = 'volunteer@volunteer.com') + + Volunteer.objects.create( + user = volunteer_user, + address = 'address', + city = 'city', + state = 'state', + country = 'country', + phone_number = '9999999999', + unlisted_organization = 'organization') + + # create an org prior to registration. Bug in Code + # added to pass CI + Organization.objects.create( + name = 'DummyOrg') + + self.homepage = '/' + self.registration_page = '/registration/signup_volunteer/' + self.authentication_page = '/authentication/login/' + self.driver = webdriver.Firefox() + self.driver.implicitly_wait(5) + self.driver.maximize_window() + super(VolunteerReport, self).setUp() + + def tearDown(self): + self.driver.quit() + super(VolunteerReport, self).tearDown() + + def login(self, credentials): + self.driver.get(self.live_server_url + self.authentication_page) + self.driver.find_element_by_id('id_login').send_keys(credentials['username']) + self.driver.find_element_by_id('id_password').send_keys(credentials['password']) + self.driver.find_element_by_xpath('//form[1]').submit() + + self.assertEqual(self.driver.current_url, + self.live_server_url + self.homepage) + + def register_event_utility(self): + Event.objects.create( + name = 'event', + start_date = '2015-06-11', + end_date = '2015-06-25') + + def register_job_utility(self): + Job.objects.create( + name = 'job', + start_date = '2015-06-15', + end_date = '2015-06-18', + event = Event.objects.get(name = 'event')) + + def register_shift_utility(self): + Shift.objects.create( + date = '2015-06-15', + start_time = '09:00', + end_time = '15:00', + max_volunteers ='6', + job = Job.objects.get(name = 'job')) + + def log_hours_utility(self): + VolunteerShift.objects.create( + shift = Shift.objects.get(job__name = 'job'), + volunteer = Volunteer.objects.get(user__username = 'volunteer'), + start_time = '09:00', + end_time = '12:00') + + def test_report_without_any_created_shifts(self): + self.login({ 'username' : 'volunteer', 'password' : 'volunteer'}) + self.driver.find_element_by_link_text('Report').send_keys("\n") + self.driver.find_element_by_xpath('//form').submit() + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-danger').text, 'Your criteria did not return any results.') + + def test_report_with_empty_fields(self): + self.register_event_utility() + self.register_job_utility() + self.register_shift_utility() + self.log_hours_utility() + + self.login({ 'username' : 'volunteer', 'password' : 'volunteer'}) + self.driver.find_element_by_link_text('Report').send_keys("\n") + self.driver.find_element_by_xpath('//form').submit() + + total_no_of_shifts = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[10].strip('\nTotal') + + total_no_of_hours = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[-1].strip('\n') + + self.assertEqual(total_no_of_shifts, '1') + self.assertEqual(total_no_of_hours, '3.0') + + def test_only_logged_shifts_appear_in_report(self): + self.register_event_utility() + self.register_job_utility() + self.register_shift_utility() + + self.login({ 'username' : 'volunteer', 'password' : 'volunteer'}) + self.driver.find_element_by_link_text('Report').send_keys("\n") + self.driver.find_element_by_xpath('//form').submit() + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-danger').text, 'Your criteria did not return any results.') + + def test_date_field(self): + self.register_event_utility() + self.register_job_utility() + self.register_shift_utility() + self.log_hours_utility() + + self.login({ 'username' : 'volunteer', 'password' : 'volunteer'}) + self.driver.find_element_by_link_text('Report').send_keys("\n") + self.driver.find_element_by_xpath( + '//input[@name = "start_date"]').send_keys('2015-06-11') + self.driver.find_element_by_xpath( + '//input[@name = "end_date"]').send_keys('2015-07-30') + self.driver.find_element_by_xpath('//form').submit() + + total_no_of_shifts = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[10].strip('\nTotal') + + total_no_of_hours = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[-1].strip('\n') + + self.assertEqual(total_no_of_shifts, '1') + self.assertEqual(total_no_of_hours, '3.0') + + #incorrect date + self.driver.find_element_by_xpath( + '//input[@name = "start_date"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "end_date"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "start_date"]').send_keys('2015-05-10') + self.driver.find_element_by_xpath( + '//input[@name = "end_date"]').send_keys('2015-06-01') + self.driver.find_element_by_xpath('//form').submit() + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-danger').text, 'Your criteria did not return any results.') + + def test_event_field(self): + self.register_event_utility() + self.register_job_utility() + self.register_shift_utility() + self.log_hours_utility() + + self.login({ 'username' : 'volunteer', 'password' : 'volunteer'}) + self.driver.find_element_by_link_text('Report').send_keys("\n") + select = Select(self.driver.find_element_by_xpath('//select[@name = "event_name"]')) + select.select_by_visible_text('event') + + self.driver.find_element_by_xpath('//form').submit() + + total_no_of_shifts = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[10].strip('\nTotal') + + total_no_of_hours = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[-1].strip('\n') + + self.assertEqual(total_no_of_shifts, '1') + self.assertEqual(total_no_of_hours, '3.0') + + def test_job_field(self): + self.register_event_utility() + self.register_job_utility() + self.register_shift_utility() + self.log_hours_utility() + + self.login({ 'username' : 'volunteer', 'password' : 'volunteer'}) + self.driver.find_element_by_link_text('Report').send_keys("\n") + select = Select(self.driver.find_element_by_xpath('//select[@name = "job_name"]')) + select.select_by_visible_text('job') + self.driver.find_element_by_xpath('//form').submit() + + total_no_of_shifts = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[10].strip('\nTotal') + + total_no_of_hours = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[-1].strip('\n') + + self.assertEqual(total_no_of_shifts, '1') + self.assertEqual(total_no_of_hours, '3.0') + + def test_intersection_of_fields(self): + self.register_event_utility() + self.register_job_utility() + self.register_shift_utility() + self.log_hours_utility() + + self.login({ 'username' : 'volunteer', 'password' : 'volunteer'}) + self.driver.find_element_by_link_text('Report').send_keys("\n") + select1 = Select(self.driver.find_element_by_xpath('//select[@name = "event_name"]')) + select1.select_by_visible_text('event') + select2 = Select(self.driver.find_element_by_xpath('//select[@name = "job_name"]')) + select2.select_by_visible_text('job') + self.driver.find_element_by_xpath( + '//input[@name = "start_date"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "end_date"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "start_date"]').send_keys('2015-06-11') + self.driver.find_element_by_xpath( + '//input[@name = "end_date"]').send_keys('2015-07-30') + self.driver.find_element_by_xpath('//form').submit() + + total_no_of_shifts = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[10].strip('\nTotal') + + total_no_of_hours = self.driver.find_element_by_xpath( + '//div[2]/div[4]').text.split(' ')[-1].strip('\n') + + self.assertEqual(total_no_of_shifts, '1') + self.assertEqual(total_no_of_hours, '3.0') + + # event, job correct and date incorrect + select1 = Select(self.driver.find_element_by_xpath('//select[@name = "event_name"]')) + select1.select_by_visible_text('event') + select2 = Select(self.driver.find_element_by_xpath('//select[@name = "job_name"]')) + select2.select_by_visible_text('job') + self.driver.find_element_by_xpath( + '//input[@name = "start_date"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "end_date"]').clear() + self.driver.find_element_by_xpath( + '//input[@name = "start_date"]').send_keys('2015-05-10') + self.driver.find_element_by_xpath( + '//input[@name = "end_date"]').send_keys('2015-06-01') + + self.driver.find_element_by_xpath('//form').submit() + self.assertEqual(self.driver.find_element_by_class_name( + 'alert-danger').text, 'Your criteria did not return any results.')