mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-01-17 05:22:16 +00:00
Merge branch 'master' into feature/online-auth
# Conflicts: # RIGS/test_functional.py
This commit is contained in:
15
.travis.yml
15
.travis.yml
@@ -1,20 +1,27 @@
|
|||||||
|
sudo: false
|
||||||
|
dist: trusty
|
||||||
|
|
||||||
language: python
|
language: python
|
||||||
python:
|
python:
|
||||||
"2.7"
|
"2.7"
|
||||||
|
cache: pip
|
||||||
|
|
||||||
before_install:
|
addons:
|
||||||
- "export DISPLAY=:99.0"
|
sauce_connect:
|
||||||
- "/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1280x1024x16"
|
username: davidtaylorhq
|
||||||
|
access_key:
|
||||||
|
secure: "ibpjQ19LfjwfQruiJmX0j6NzyNwsS3PvRFdfXUYcfCEa9Eh20QQ/S8pOdFhRh70KIEuwN5oGuPqDkJPPTjkdY3/NCjuA7/NMTp14jAIX4XjpeNcsPFupp31vEy7KBuX4iAGpenrHJssFCwurpvrlWfwSOrk7bVZKaGUowVOXmyth1FSNQvr5c3YnlxmGvNzNBMMBDcJ3ixSlS9pBRLnHIJ1w3/f9Lx2uONkVMeGM6rVyuHholWvanIyNVYtO9JkXkoie6n1R3gNbXCyJdxSRn2OLppdryUaA0wUPJSu3hqEM3R5EsRDiFJszkJLTwSBG8x4k/dbqim7stjsu1qpUhCIG5mT6e+UI9auPi/5nlwlVmPhSq58qBP53vH3hs++02wjDlgvTGB1p4PqFblHhVaslaQ166bo9skGMZb0fXLlM1aCmmwFTpC5ofiPTSRTdJcljHG/d3JabKX03ME+nX2LFPIMnSLXgrjrfh2ppI6LFESiX3Z8jYUdsgTFeN3nQZ8U0kyb5X9Ay9YFnAaYD9OuxaqweTmqAJQj093GK38+79WMN2jnvEUzM1ZjI8Y4L/f3rHvhNIwYvZjQ+gJRhUqJh2Qruk7ke7uQ1oecxIqRHj8hIFEkuBcM3e86MkRiYQXXI9jOX3JrhI/jivAjFuw0flU2tjLNgM7tUYzjMyqk="
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- pip install -r requirements.txt
|
- pip install -r requirements.txt
|
||||||
- pip install coveralls codeclimate-test-reporter
|
- pip install coveralls codeclimate-test-reporter
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
|
- export PATH=$PATH:/usr/lib/chromium-browser/
|
||||||
- python manage.py collectstatic --noinput
|
- python manage.py collectstatic --noinput
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- coverage run manage.py test RIGS
|
- coverage run manage.py test --verbosity=2
|
||||||
|
|
||||||
after_success:
|
after_success:
|
||||||
- coveralls
|
- coveralls
|
||||||
|
|||||||
13
README.md
13
README.md
@@ -95,5 +95,18 @@ python manage.py generateSampleData
|
|||||||
|keyholder|keyholder|
|
|keyholder|keyholder|
|
||||||
|basic |basic |
|
|basic |basic |
|
||||||
|
|
||||||
|
### Testing ###
|
||||||
|
Tests are contained in 3 files. `RIGS/test_models.py` contains tests for logic within the data models. `RIGS/test_unit.py` contains "Live server" tests, using raw web requests. `RIGS/test_integration.py` contains user interface tests which take control of a web browser. For automated Travis tests, we use [Sauce Labs](https://saucelabs.com). When debugging locally, ensure that you have the latest version of Google Chrome installed, then install [chromedriver](https://sites.google.com/a/chromium.org/chromedriver/) and ensure it is on the `PATH`.
|
||||||
|
|
||||||
|
You can run the entire test suite, or you can run specific sections individually. For example, in order of specificity:
|
||||||
|
|
||||||
|
```
|
||||||
|
python manage.py test
|
||||||
|
python manage.py test RIGS.test_models
|
||||||
|
python manage.py test RIGS.test_models.EventTestCase
|
||||||
|
python manage.py test RIGS.test_models.EventTestCase.test_current_events
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
### Committing, pushing and testing ###
|
### Committing, pushing and testing ###
|
||||||
Feel free to commit as you wish, on your own branch. On my branch (master for development) do not commit code that you either know doesn't work or don't know works. If you must commit this code, please make sure you say in the commit message that it isn't working, and if you can why it isn't working. If and only if you absolutely must push, then please don't leave it as the HEAD for too long, it's not much to ask but when you are done just make sure you haven't broken the HEAD for the next person.
|
Feel free to commit as you wish, on your own branch. On my branch (master for development) do not commit code that you either know doesn't work or don't know works. If you must commit this code, please make sure you say in the commit message that it isn't working, and if you can why it isn't working. If and only if you absolutely must push, then please don't leave it as the HEAD for too long, it's not much to ask but when you are done just make sure you haven't broken the HEAD for the next person.
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ from RIGS import models
|
|||||||
|
|
||||||
# Override the django form defaults to use the HTML date/time/datetime UI elements
|
# Override the django form defaults to use the HTML date/time/datetime UI elements
|
||||||
forms.DateField.widget = forms.DateInput(attrs={'type': 'date'})
|
forms.DateField.widget = forms.DateInput(attrs={'type': 'date'})
|
||||||
forms.TimeField.widget = forms.DateInput(attrs={'type': 'time'})
|
forms.TimeField.widget = forms.TextInput(attrs={'type': 'time'})
|
||||||
forms.DateTimeField.widget = forms.DateInput(attrs={'type': 'datetime-local'})
|
forms.DateTimeField.widget = forms.DateTimeInput(attrs={'type': 'datetime-local'})
|
||||||
|
|
||||||
# Registration
|
# Registration
|
||||||
class ProfileRegistrationFormUniqueEmail(RegistrationFormUniqueEmail):
|
class ProfileRegistrationFormUniqueEmail(RegistrationFormUniqueEmail):
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
from datetime import date, timedelta
|
import pytz
|
||||||
|
from datetime import date, time, datetime, timedelta
|
||||||
|
|
||||||
import reversion
|
|
||||||
from django.conf import settings
|
from django.core import mail
|
||||||
from django.core import mail, signing
|
|
||||||
from django.core.urlresolvers import reverse
|
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from django.http import HttpResponseBadRequest
|
from django.http import HttpResponseBadRequest
|
||||||
from django.test import LiveServerTestCase, TestCase
|
from django.test import LiveServerTestCase, TestCase
|
||||||
@@ -18,18 +17,60 @@ from selenium.webdriver.support.ui import WebDriverWait
|
|||||||
|
|
||||||
from RIGS import models
|
from RIGS import models
|
||||||
|
|
||||||
import re
|
|
||||||
import os
|
|
||||||
from datetime import date, timedelta
|
|
||||||
from django.db import transaction
|
|
||||||
from reversion import revisions as reversion
|
from reversion import revisions as reversion
|
||||||
import json
|
from django.core.urlresolvers import reverse
|
||||||
|
from django.core import mail, signing
|
||||||
|
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
browsers = [{"platform": "macOS 10.12",
|
||||||
|
"browserName": "chrome",
|
||||||
|
"version": "latest"},
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def on_platforms(platforms):
|
||||||
|
if not os.environ.get("TRAVIS"):
|
||||||
|
platforms = {'local'}
|
||||||
|
|
||||||
|
def decorator(base_class):
|
||||||
|
module = sys.modules[base_class.__module__].__dict__
|
||||||
|
for i, platform in enumerate(platforms):
|
||||||
|
d = dict(base_class.__dict__)
|
||||||
|
d['desired_capabilities'] = platform
|
||||||
|
name = "%s_%s" % (base_class.__name__, i + 1)
|
||||||
|
module[name] = type(name, (base_class,), d)
|
||||||
|
|
||||||
|
return decorator
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def create_browser(test_name, desired_capabilities):
|
||||||
|
# return webdriver.Chrome()
|
||||||
|
if os.environ.get("TRAVIS"):
|
||||||
|
username = os.environ["SAUCE_USERNAME"]
|
||||||
|
access_key = os.environ["SAUCE_ACCESS_KEY"]
|
||||||
|
caps = {'browserName': desired_capabilities['browserName']}
|
||||||
|
caps['platform'] = desired_capabilities['platform']
|
||||||
|
caps['version'] = desired_capabilities['version']
|
||||||
|
caps["tunnel-identifier"] = os.environ["TRAVIS_JOB_NUMBER"]
|
||||||
|
caps["name"] = '#' + os.environ["TRAVIS_JOB_NUMBER"] + ": " + test_name
|
||||||
|
hub_url = "%s:%s@localhost:4445" % (username, access_key)
|
||||||
|
driver = webdriver.Remote(desired_capabilities=caps, command_executor="http://%s/wd/hub" % hub_url)
|
||||||
|
return driver
|
||||||
|
else:
|
||||||
|
return webdriver.Chrome()
|
||||||
|
|
||||||
|
|
||||||
|
@on_platforms(browsers)
|
||||||
class UserRegistrationTest(LiveServerTestCase):
|
class UserRegistrationTest(LiveServerTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.browser = webdriver.Firefox()
|
self.browser = create_browser(self.id(), self.desired_capabilities)
|
||||||
|
|
||||||
self.browser.implicitly_wait(3) # Set implicit wait session wide
|
self.browser.implicitly_wait(3) # Set implicit wait session wide
|
||||||
os.environ['RECAPTCHA_TESTING'] = 'True'
|
os.environ['RECAPTCHA_TESTING'] = 'True'
|
||||||
|
|
||||||
@@ -157,7 +198,7 @@ class UserRegistrationTest(LiveServerTestCase):
|
|||||||
|
|
||||||
# All is well
|
# All is well
|
||||||
|
|
||||||
|
@on_platforms(browsers)
|
||||||
class EventTest(LiveServerTestCase):
|
class EventTest(LiveServerTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.profile = models.Profile(
|
self.profile = models.Profile(
|
||||||
@@ -165,11 +206,13 @@ class EventTest(LiveServerTestCase):
|
|||||||
self.profile.set_password("EventTestPassword")
|
self.profile.set_password("EventTestPassword")
|
||||||
self.profile.save()
|
self.profile.save()
|
||||||
|
|
||||||
self.vatrate = models.VatRate.objects.create(start_at='2014-03-05', rate=0.20, comment='test1')
|
|
||||||
|
|
||||||
self.browser = webdriver.Firefox()
|
self.vatrate = models.VatRate.objects.create(start_at='2014-03-05',rate=0.20,comment='test1')
|
||||||
self.browser.implicitly_wait(3) # Set implicit wait session wide
|
|
||||||
self.browser.maximize_window()
|
self.browser = create_browser(self.id(), self.desired_capabilities)
|
||||||
|
self.browser.implicitly_wait(10) # Set implicit wait session wide
|
||||||
|
# self.browser.maximize_window()
|
||||||
|
|
||||||
os.environ['RECAPTCHA_TESTING'] = 'True'
|
os.environ['RECAPTCHA_TESTING'] = 'True'
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
@@ -212,7 +255,7 @@ class EventTest(LiveServerTestCase):
|
|||||||
# Gets redirected to login and back
|
# Gets redirected to login and back
|
||||||
self.authenticate('/event/create/')
|
self.authenticate('/event/create/')
|
||||||
|
|
||||||
wait = WebDriverWait(self.browser, 10) # setup WebDriverWait to use later (to wait for animations)
|
wait = WebDriverWait(self.browser, 3) #setup WebDriverWait to use later (to wait for animations)
|
||||||
|
|
||||||
wait.until(animation_is_finished())
|
wait.until(animation_is_finished())
|
||||||
|
|
||||||
@@ -367,11 +410,11 @@ class EventTest(LiveServerTestCase):
|
|||||||
self.assertEqual(obj.pk, int(option.get_attribute("value")))
|
self.assertEqual(obj.pk, int(option.get_attribute("value")))
|
||||||
|
|
||||||
# Set start date/time
|
# Set start date/time
|
||||||
form.find_element_by_id('id_start_date').send_keys('3015-05-25')
|
form.find_element_by_id('id_start_date').send_keys('25/05/3015')
|
||||||
form.find_element_by_id('id_start_time').send_keys('06:59')
|
form.find_element_by_id('id_start_time').send_keys('06:59')
|
||||||
|
|
||||||
# Set end date/time
|
# Set end date/time
|
||||||
form.find_element_by_id('id_end_date').send_keys('4000-06-27')
|
form.find_element_by_id('id_end_date').send_keys('27/06/4000')
|
||||||
form.find_element_by_id('id_end_time').send_keys('07:00')
|
form.find_element_by_id('id_end_time').send_keys('07:00')
|
||||||
|
|
||||||
# Add item
|
# Add item
|
||||||
@@ -473,7 +516,8 @@ class EventTest(LiveServerTestCase):
|
|||||||
self.browser.get(self.live_server_url + '/event/' + str(testEvent.pk) + '/duplicate/')
|
self.browser.get(self.live_server_url + '/event/' + str(testEvent.pk) + '/duplicate/')
|
||||||
self.authenticate('/event/' + str(testEvent.pk) + '/duplicate/')
|
self.authenticate('/event/' + str(testEvent.pk) + '/duplicate/')
|
||||||
|
|
||||||
wait = WebDriverWait(self.browser, 10) # setup WebDriverWait to use later (to wait for animations)
|
|
||||||
|
wait = WebDriverWait(self.browser, 3) #setup WebDriverWait to use later (to wait for animations)
|
||||||
|
|
||||||
save = self.browser.find_element_by_xpath(
|
save = self.browser.find_element_by_xpath(
|
||||||
'(//button[@type="submit"])[3]')
|
'(//button[@type="submit"])[3]')
|
||||||
@@ -538,7 +582,8 @@ class EventTest(LiveServerTestCase):
|
|||||||
# Gets redirected to login and back
|
# Gets redirected to login and back
|
||||||
self.authenticate('/event/create/')
|
self.authenticate('/event/create/')
|
||||||
|
|
||||||
wait = WebDriverWait(self.browser, 10) # setup WebDriverWait to use later (to wait for animations)
|
|
||||||
|
wait = WebDriverWait(self.browser, 3) #setup WebDriverWait to use later (to wait for animations)
|
||||||
|
|
||||||
wait.until(animation_is_finished())
|
wait.until(animation_is_finished())
|
||||||
|
|
||||||
@@ -553,14 +598,13 @@ class EventTest(LiveServerTestCase):
|
|||||||
e.send_keys('Test Event Name')
|
e.send_keys('Test Event Name')
|
||||||
|
|
||||||
# Both dates, no times, end before start
|
# Both dates, no times, end before start
|
||||||
form.find_element_by_id('id_start_date').clear()
|
self.browser.execute_script("document.getElementById('id_start_date').value='3015-04-24'")
|
||||||
form.find_element_by_id('id_start_date').send_keys('3015-04-24')
|
|
||||||
|
|
||||||
form.find_element_by_id('id_end_date').clear()
|
self.browser.execute_script("document.getElementById('id_end_date').value='3015-04-23'")
|
||||||
form.find_element_by_id('id_end_date').send_keys('3015-04-23')
|
|
||||||
|
|
||||||
# Attempt to save - should fail
|
# Attempt to save - should fail
|
||||||
save.click()
|
save.click()
|
||||||
|
|
||||||
error = self.browser.find_element_by_xpath('//div[contains(@class, "alert-danger")]')
|
error = self.browser.find_element_by_xpath('//div[contains(@class, "alert-danger")]')
|
||||||
self.assertTrue(error.is_displayed())
|
self.assertTrue(error.is_displayed())
|
||||||
self.assertIn("can't finish before it has started", error.find_element_by_xpath('//dd[1]/ul/li').text)
|
self.assertIn("can't finish before it has started", error.find_element_by_xpath('//dd[1]/ul/li').text)
|
||||||
@@ -568,16 +612,14 @@ class EventTest(LiveServerTestCase):
|
|||||||
# Same date, end time before start time
|
# Same date, end time before start time
|
||||||
form = self.browser.find_element_by_tag_name('form')
|
form = self.browser.find_element_by_tag_name('form')
|
||||||
save = self.browser.find_element_by_xpath('(//button[@type="submit"])[3]')
|
save = self.browser.find_element_by_xpath('(//button[@type="submit"])[3]')
|
||||||
form.find_element_by_id('id_start_date').clear()
|
|
||||||
form.find_element_by_id('id_start_date').send_keys('3015-04-24')
|
|
||||||
|
|
||||||
form.find_element_by_id('id_end_date').clear()
|
self.browser.execute_script("document.getElementById('id_start_date').value='3015-04-24'")
|
||||||
form.find_element_by_id('id_end_date').send_keys('3015-04-23')
|
self.browser.execute_script("document.getElementById('id_end_date').value='3015-04-23'")
|
||||||
|
|
||||||
form.find_element_by_id('id_start_time').clear()
|
form.find_element_by_id('id_start_time').send_keys(Keys.DELETE)
|
||||||
form.find_element_by_id('id_start_time').send_keys('06:59')
|
form.find_element_by_id('id_start_time').send_keys('06:59')
|
||||||
|
|
||||||
form.find_element_by_id('id_end_time').clear()
|
form.find_element_by_id('id_end_time').send_keys(Keys.DELETE)
|
||||||
form.find_element_by_id('id_end_time').send_keys('06:00')
|
form.find_element_by_id('id_end_time').send_keys('06:00')
|
||||||
|
|
||||||
# Attempt to save - should fail
|
# Attempt to save - should fail
|
||||||
@@ -589,30 +631,27 @@ class EventTest(LiveServerTestCase):
|
|||||||
# Same date, end time before start time
|
# Same date, end time before start time
|
||||||
form = self.browser.find_element_by_tag_name('form')
|
form = self.browser.find_element_by_tag_name('form')
|
||||||
save = self.browser.find_element_by_xpath('(//button[@type="submit"])[3]')
|
save = self.browser.find_element_by_xpath('(//button[@type="submit"])[3]')
|
||||||
form.find_element_by_id('id_start_date').clear()
|
|
||||||
form.find_element_by_id('id_start_date').send_keys('3015-04-24')
|
|
||||||
|
|
||||||
form.find_element_by_id('id_end_date').clear()
|
self.browser.execute_script("document.getElementById('id_start_date').value='3015-04-24'")
|
||||||
form.find_element_by_id('id_end_date').send_keys('3015-04-23')
|
self.browser.execute_script("document.getElementById('id_end_date').value='3015-04-24'")
|
||||||
|
|
||||||
form.find_element_by_id('id_start_time').clear()
|
form.find_element_by_id('id_start_time').send_keys(Keys.DELETE)
|
||||||
form.find_element_by_id('id_start_time').send_keys('06:59')
|
form.find_element_by_id('id_start_time').send_keys('06:59')
|
||||||
|
|
||||||
form.find_element_by_id('id_end_time').clear()
|
form.find_element_by_id('id_end_time').send_keys(Keys.DELETE)
|
||||||
form.find_element_by_id('id_end_time').send_keys('06:00')
|
form.find_element_by_id('id_end_time').send_keys('06:00')
|
||||||
|
|
||||||
# No end date, end time before start time
|
# No end date, end time before start time
|
||||||
form = self.browser.find_element_by_tag_name('form')
|
form = self.browser.find_element_by_tag_name('form')
|
||||||
save = self.browser.find_element_by_xpath('(//button[@type="submit"])[3]')
|
save = self.browser.find_element_by_xpath('(//button[@type="submit"])[3]')
|
||||||
form.find_element_by_id('id_start_date').clear()
|
|
||||||
form.find_element_by_id('id_start_date').send_keys('3015-04-24')
|
|
||||||
|
|
||||||
form.find_element_by_id('id_end_date').clear()
|
self.browser.execute_script("document.getElementById('id_start_date').value='3015-04-24'")
|
||||||
|
self.browser.execute_script("document.getElementById('id_end_date').value=''")
|
||||||
|
|
||||||
form.find_element_by_id('id_start_time').clear()
|
form.find_element_by_id('id_start_time').send_keys(Keys.DELETE)
|
||||||
form.find_element_by_id('id_start_time').send_keys('06:59')
|
form.find_element_by_id('id_start_time').send_keys('06:59')
|
||||||
|
|
||||||
form.find_element_by_id('id_end_time').clear()
|
form.find_element_by_id('id_end_time').send_keys(Keys.DELETE)
|
||||||
form.find_element_by_id('id_end_time').send_keys('06:00')
|
form.find_element_by_id('id_end_time').send_keys('06:00')
|
||||||
|
|
||||||
# Attempt to save - should fail
|
# Attempt to save - should fail
|
||||||
@@ -624,15 +663,12 @@ class EventTest(LiveServerTestCase):
|
|||||||
# 2 dates, end after start
|
# 2 dates, end after start
|
||||||
form = self.browser.find_element_by_tag_name('form')
|
form = self.browser.find_element_by_tag_name('form')
|
||||||
save = self.browser.find_element_by_xpath('(//button[@type="submit"])[3]')
|
save = self.browser.find_element_by_xpath('(//button[@type="submit"])[3]')
|
||||||
form.find_element_by_id('id_start_date').clear()
|
self.browser.execute_script("document.getElementById('id_start_date').value='3015-04-24'")
|
||||||
form.find_element_by_id('id_start_date').send_keys('3015-04-24')
|
self.browser.execute_script("document.getElementById('id_end_date').value='3015-04-26'")
|
||||||
|
|
||||||
form.find_element_by_id('id_end_date').clear()
|
|
||||||
form.find_element_by_id('id_end_date').send_keys('3015-04-26')
|
|
||||||
|
|
||||||
form.find_element_by_id('id_start_time').clear()
|
self.browser.execute_script("document.getElementById('id_start_time').value=''")
|
||||||
|
self.browser.execute_script("document.getElementById('id_end_time').value=''")
|
||||||
form.find_element_by_id('id_end_time').clear()
|
|
||||||
|
|
||||||
# Attempt to save - should succeed
|
# Attempt to save - should succeed
|
||||||
save.click()
|
save.click()
|
||||||
@@ -648,8 +684,9 @@ class EventTest(LiveServerTestCase):
|
|||||||
# Gets redirected to login and back
|
# Gets redirected to login and back
|
||||||
self.authenticate('/event/create/')
|
self.authenticate('/event/create/')
|
||||||
|
|
||||||
wait = WebDriverWait(self.browser, 10) # setup WebDriverWait to use later (to wait for animations)
|
|
||||||
self.browser.implicitly_wait(3) # Set session-long wait (only works for non-existant DOM objects)
|
wait = WebDriverWait(self.browser, 3) #setup WebDriverWait to use later (to wait for animations)
|
||||||
|
self.browser.implicitly_wait(3) #Set session-long wait (only works for non-existant DOM objects)
|
||||||
|
|
||||||
wait.until(animation_is_finished())
|
wait.until(animation_is_finished())
|
||||||
|
|
||||||
@@ -667,8 +704,7 @@ class EventTest(LiveServerTestCase):
|
|||||||
e.send_keys('Test Event Name')
|
e.send_keys('Test Event Name')
|
||||||
|
|
||||||
# Set an arbitrary date
|
# Set an arbitrary date
|
||||||
form.find_element_by_id('id_start_date').clear()
|
self.browser.execute_script("document.getElementById('id_start_date').value='3015-04-24'")
|
||||||
form.find_element_by_id('id_start_date').send_keys('3015-04-24')
|
|
||||||
|
|
||||||
# Save the rig
|
# Save the rig
|
||||||
save.click()
|
save.click()
|
||||||
@@ -727,6 +763,66 @@ class EventTest(LiveServerTestCase):
|
|||||||
organisationPanel = self.browser.find_element_by_xpath('//div[contains(text(), "Contact Details")]/..')
|
organisationPanel = self.browser.find_element_by_xpath('//div[contains(text(), "Contact Details")]/..')
|
||||||
|
|
||||||
|
|
||||||
|
def testEventEdit(self):
|
||||||
|
person = models.Person(name="Event Edit Person", email="eventdetail@person.tests.rigs", phone="123 123").save()
|
||||||
|
organisation = models.Organisation(name="Event Edit Organisation", email="eventdetail@organisation.tests.rigs", phone="123 456").save()
|
||||||
|
venue = models.Venue(name="Event Detail Venue").save()
|
||||||
|
|
||||||
|
eventData = {
|
||||||
|
'name': "Detail Test",
|
||||||
|
'description': "This is an event to test the detail view",
|
||||||
|
'notes': "It is going to be awful",
|
||||||
|
'person': person,
|
||||||
|
'organisation': organisation,
|
||||||
|
'venue': venue,
|
||||||
|
'mic': self.profile,
|
||||||
|
'start_date': date(2015, 06, 04),
|
||||||
|
'end_date': date(2015, 06, 05),
|
||||||
|
'start_time': time(10, 00),
|
||||||
|
'end_time': time(15, 00),
|
||||||
|
'meet_at': self.create_datetime(2015, 06, 04, 10, 00),
|
||||||
|
'access_at': self.create_datetime(2015, 06, 04, 10, 00),
|
||||||
|
'collector': 'A Person'
|
||||||
|
}
|
||||||
|
|
||||||
|
event = models.Event(**eventData)
|
||||||
|
event.save()
|
||||||
|
|
||||||
|
item1Data = {
|
||||||
|
'event': event,
|
||||||
|
'name': "Detail Item 1",
|
||||||
|
'cost': "10.00",
|
||||||
|
'quantity': "1",
|
||||||
|
'order': 1
|
||||||
|
}
|
||||||
|
|
||||||
|
models.EventItem(**item1Data).save()
|
||||||
|
|
||||||
|
self.browser.get(self.live_server_url + '/event/%d/edit/' % event.pk)
|
||||||
|
self.authenticate('/event/%d/edit/' % event.pk)
|
||||||
|
|
||||||
|
save = self.browser.find_element_by_xpath('(//button[@type="submit"])[1]')
|
||||||
|
save.click()
|
||||||
|
|
||||||
|
successTitle = self.browser.find_element_by_xpath('//h1').text
|
||||||
|
self.assertIn("N%05d | Detail Test" % event.pk, successTitle)
|
||||||
|
|
||||||
|
reloadedEvent = models.Event.objects.get(name='Detail Test')
|
||||||
|
reloadedItem = models.EventItem.objects.get(name='Detail Item 1')
|
||||||
|
|
||||||
|
# Check the event
|
||||||
|
for key, value in eventData.iteritems():
|
||||||
|
self.assertEqual(str(getattr(reloadedEvent, key)), str(value))
|
||||||
|
|
||||||
|
# Check the item
|
||||||
|
for key, value in item1Data.iteritems():
|
||||||
|
self.assertEqual(str(getattr(reloadedItem, key)), str(value))
|
||||||
|
|
||||||
|
def create_datetime(self, year, month, day, hour, min):
|
||||||
|
tz = pytz.timezone(settings.TIME_ZONE)
|
||||||
|
return tz.localize(datetime(year, month, day, hour, min)).astimezone(pytz.utc)
|
||||||
|
|
||||||
|
@on_platforms(browsers)
|
||||||
class IcalTest(LiveServerTestCase):
|
class IcalTest(LiveServerTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.all_events = set(range(1, 18))
|
self.all_events = set(range(1, 18))
|
||||||
@@ -788,8 +884,9 @@ class IcalTest(LiveServerTestCase):
|
|||||||
models.Event.objects.create(name="TE E18", start_date=date.today(), is_rig=False, status=models.Event.CANCELLED,
|
models.Event.objects.create(name="TE E18", start_date=date.today(), is_rig=False, status=models.Event.CANCELLED,
|
||||||
description="non rig today cancelled")
|
description="non rig today cancelled")
|
||||||
|
|
||||||
self.browser = webdriver.Firefox()
|
|
||||||
self.browser.implicitly_wait(3) # Set implicit wait session wide
|
self.browser = create_browser(self.id(), self.desired_capabilities)
|
||||||
|
self.browser.implicitly_wait(3) # Set implicit wait session wide
|
||||||
os.environ['RECAPTCHA_TESTING'] = 'True'
|
os.environ['RECAPTCHA_TESTING'] = 'True'
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from django.test import TestCase
|
|||||||
from django.test.utils import override_settings
|
from django.test.utils import override_settings
|
||||||
|
|
||||||
from RIGS import models
|
from RIGS import models
|
||||||
|
from reversion import revisions as reversion
|
||||||
|
|
||||||
class TestAdminMergeObjects(TestCase):
|
class TestAdminMergeObjects(TestCase):
|
||||||
@classmethod
|
@classmethod
|
||||||
@@ -249,6 +249,52 @@ class TestPrintPaperwork(TestCase):
|
|||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
|
|
||||||
|
class TestVersioningViews(TestCase):
|
||||||
|
@classmethod
|
||||||
|
def setUpTestData(cls):
|
||||||
|
cls.profile = models.Profile.objects.create(username="testuser1", email="1@test.com", is_superuser=True, is_active=True, is_staff=True)
|
||||||
|
|
||||||
|
cls.vatrate = models.VatRate.objects.create(start_at='2014-03-05', rate=0.20, comment='test1')
|
||||||
|
|
||||||
|
cls.events = {}
|
||||||
|
|
||||||
|
with reversion.create_revision():
|
||||||
|
reversion.set_user(cls.profile)
|
||||||
|
cls.events[1] = models.Event.objects.create(name="TE E1", start_date=date.today())
|
||||||
|
|
||||||
|
with reversion.create_revision():
|
||||||
|
reversion.set_user(cls.profile)
|
||||||
|
cls.events[2] = models.Event.objects.create(name="TE E2", start_date='2014-03-05')
|
||||||
|
|
||||||
|
with reversion.create_revision():
|
||||||
|
reversion.set_user(cls.profile)
|
||||||
|
cls.events[1].description = "A test description"
|
||||||
|
cls.events[1].save()
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.profile.set_password('testuser')
|
||||||
|
self.profile.save()
|
||||||
|
self.assertTrue(self.client.login(username=self.profile.username, password='testuser'))
|
||||||
|
|
||||||
|
def test_event_history_loads_successfully(self):
|
||||||
|
request_url = reverse('event_history', kwargs={'pk': self.events[1].pk})
|
||||||
|
|
||||||
|
response = self.client.get(request_url, follow=True)
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
|
def test_activity_feed_loads_successfully(self):
|
||||||
|
request_url = reverse('activity_feed')
|
||||||
|
|
||||||
|
response = self.client.get(request_url, follow=True)
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
|
def test_activity_table_loads_successfully(self):
|
||||||
|
request_url = reverse('activity_table')
|
||||||
|
|
||||||
|
response = self.client.get(request_url, follow=True)
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
|
|
||||||
class TestEmbeddedViews(TestCase):
|
class TestEmbeddedViews(TestCase):
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpTestData(cls):
|
def setUpTestData(cls):
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ python-dateutil==2.6.0
|
|||||||
pytz==2017.2
|
pytz==2017.2
|
||||||
raven==6.0.0
|
raven==6.0.0
|
||||||
reportlab==3.4.0
|
reportlab==3.4.0
|
||||||
selenium==2.53.1
|
selenium==3.4.1
|
||||||
simplejson==3.10.0
|
simplejson==3.10.0
|
||||||
six==1.10.0
|
six==1.10.0
|
||||||
sqlparse==0.2.3
|
sqlparse==0.2.3
|
||||||
|
|||||||
Reference in New Issue
Block a user