in order to autogenerate dotted path url pattern names. Updated a number of url reverses to use dotted path, and removed explicit url pattern names as needed. Changed some imports to prevent import of ietf.urls before django initialization was complete. Changed 3 cases of form classes being curried to functions; django 1.10 didn't accept that. Started converting old-style middleware classes to new-style middleware functions (incomplete). Tweaked a nomcom decorator to preserve function names and attributes, like a good decorator should. Replaced the removed django templatetag 'removetags' with our own version which uses bleach, and does sanitizing in addition to removing explicitly mentionied html tags. Rewrote the filename argument handling in a management command which had broken with the upgrade. - Legacy-Id: 12818
175 lines
7 KiB
Python
175 lines
7 KiB
Python
# Copyright The IETF Trust 2016, All Rights Reserved
|
|
|
|
import sys
|
|
import time
|
|
from pyquery import PyQuery
|
|
from unittest import skipIf
|
|
|
|
import django.contrib.auth.views
|
|
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
|
|
from django.core.urlresolvers import reverse as urlreverse
|
|
#from django.test.utils import override_settings
|
|
|
|
import debug # pyflakes:ignore
|
|
|
|
from ietf.doc.factories import DocumentFactory
|
|
from ietf.group import colors
|
|
from ietf.meeting.factories import SessionFactory
|
|
from ietf.meeting.test_data import make_meeting_test_data
|
|
from ietf.meeting.models import SchedTimeSessAssignment
|
|
from ietf.utils.test_runner import set_coverage_checking
|
|
from ietf.utils.pipe import pipe
|
|
from ietf import settings
|
|
|
|
skip_selenium = getattr(settings,'SKIP_SELENIUM',None)
|
|
skip_message = ""
|
|
if skip_selenium:
|
|
skip_message = "settings.SKIP_SELENIUM = %s" % skip_selenium
|
|
else:
|
|
try:
|
|
from selenium import webdriver
|
|
from selenium.webdriver.common.action_chains import ActionChains
|
|
except ImportError as e:
|
|
skip_selenium = True
|
|
skip_message = "Skipping selenium tests: %s" % e
|
|
code, out, err = pipe('phantomjs -v')
|
|
if not code == 0:
|
|
skip_selenium = True
|
|
skip_message = "Skipping selenium tests: 'phantomjs' executable not found."
|
|
if skip_selenium:
|
|
sys.stderr.write(" "+skip_message+'\n')
|
|
|
|
def condition_data():
|
|
make_meeting_test_data()
|
|
colors.fg_group_colors['FARFUT'] = 'blue'
|
|
colors.bg_group_colors['FARFUT'] = 'white'
|
|
|
|
|
|
@skipIf(skip_selenium, skip_message)
|
|
class ScheduleEditTests(StaticLiveServerTestCase):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
set_coverage_checking(False)
|
|
super(ScheduleEditTests, cls).setUpClass()
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
super(ScheduleEditTests, cls).tearDownClass()
|
|
set_coverage_checking(True)
|
|
|
|
def setUp(self):
|
|
self.driver = webdriver.PhantomJS(port=0, service_log_path=settings.TEST_GHOSTDRIVER_LOG_PATH)
|
|
self.driver.set_window_size(1024,768)
|
|
condition_data()
|
|
|
|
def tearDown(self):
|
|
self.driver.close()
|
|
|
|
def debugSnapshot(self,filename='debug_this.png'):
|
|
self.driver.execute_script("document.body.bgColor = 'white';")
|
|
self.driver.save_screenshot(filename)
|
|
|
|
def absreverse(self,*args,**kwargs):
|
|
return '%s%s'%(self.live_server_url,urlreverse(*args,**kwargs))
|
|
|
|
def login(self):
|
|
url = '%s%s'%(self.live_server_url, urlreverse('django.contrib.auth.views.login'))
|
|
self.driver.get(url)
|
|
self.driver.find_element_by_name('username').send_keys('plain')
|
|
self.driver.find_element_by_name('password').send_keys('plain+password')
|
|
self.driver.find_element_by_xpath('//button[@type="submit"]').click()
|
|
|
|
def testUnschedule(self):
|
|
|
|
self.assertEqual(SchedTimeSessAssignment.objects.filter(session__meeting__number=42,session__group__acronym='mars',schedule__name='test-agenda').count(),1)
|
|
|
|
self.login()
|
|
url = self.absreverse('ietf.meeting.views.edit_agenda',kwargs=dict(num='42',name='test-agenda',owner='plain@example.com'))
|
|
self.driver.get(url)
|
|
|
|
q = PyQuery(self.driver.page_source)
|
|
self.assertEqual(len(q('#sortable-list #session_1')),0)
|
|
|
|
element = self.driver.find_element_by_id('session_1')
|
|
target = self.driver.find_element_by_id('sortable-list')
|
|
ActionChains(self.driver).drag_and_drop(element,target).perform()
|
|
|
|
q = PyQuery(self.driver.page_source)
|
|
self.assertTrue(len(q('#sortable-list #session_1'))>0)
|
|
|
|
time.sleep(0.1) # The API that modifies the database runs async
|
|
self.assertEqual(SchedTimeSessAssignment.objects.filter(session__meeting__number=42,session__group__acronym='mars',schedule__name='test-agenda').count(),0)
|
|
|
|
@skipIf(skip_selenium, skip_message)
|
|
class SlideReorderTests(StaticLiveServerTestCase):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
set_coverage_checking(False)
|
|
super(SlideReorderTests, cls).setUpClass()
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
super(SlideReorderTests, cls).tearDownClass()
|
|
set_coverage_checking(True)
|
|
|
|
def setUp(self):
|
|
self.driver = webdriver.PhantomJS(port=0, service_log_path=settings.TEST_GHOSTDRIVER_LOG_PATH)
|
|
self.driver.set_window_size(1024,768)
|
|
self.session = SessionFactory(meeting__type_id='ietf')
|
|
self.session.sessionpresentation_set.create(document=DocumentFactory(type_id='slides',name='one'),order=1)
|
|
self.session.sessionpresentation_set.create(document=DocumentFactory(type_id='slides',name='two'),order=2)
|
|
self.session.sessionpresentation_set.create(document=DocumentFactory(type_id='slides',name='three'),order=3)
|
|
|
|
def tearDown(self):
|
|
self.driver.close()
|
|
|
|
def absreverse(self,*args,**kwargs):
|
|
return '%s%s'%(self.live_server_url,urlreverse(*args,**kwargs))
|
|
|
|
def secr_login(self):
|
|
url = '%s%s'%(self.live_server_url, urlreverse(django.contrib.auth.views.login))
|
|
self.driver.get(url)
|
|
self.driver.find_element_by_name('username').send_keys('secretary')
|
|
self.driver.find_element_by_name('password').send_keys('secretary+password')
|
|
self.driver.find_element_by_xpath('//button[@type="submit"]').click()
|
|
|
|
#@override_settings(DEBUG=True)
|
|
def testReorderSlides(self):
|
|
return
|
|
url = self.absreverse('ietf.meeting.views.session_details',
|
|
kwargs=dict(
|
|
num=self.session.meeting.number,
|
|
acronym = self.session.group.acronym,))
|
|
self.secr_login()
|
|
self.driver.get(url)
|
|
#debug.show('unicode(self.driver.page_source)')
|
|
second = self.driver.find_element_by_css_selector('#slides tr:nth-child(2)')
|
|
third = self.driver.find_element_by_css_selector('#slides tr:nth-child(3)')
|
|
ActionChains(self.driver).drag_and_drop(second,third).perform()
|
|
|
|
time.sleep(0.1) # The API that modifies the database runs async
|
|
names=self.session.sessionpresentation_set.values_list('document__name',flat=True)
|
|
self.assertEqual(list(names),[u'one',u'three',u'two'])
|
|
|
|
# The following are useful debugging tools
|
|
|
|
# If you add this to a LiveServerTestCase and run just this test, you can browse
|
|
# to the test server with the data loaded by setUp() to debug why, for instance,
|
|
# a particular view isn't giving you what you expect
|
|
# def testJustSitThere(self):
|
|
# time.sleep(10000)
|
|
|
|
# The LiveServerTestCase server runs in a mode like production - it hides crashes with the
|
|
# user-friendly message about mail being sent to the maintainers, and eats that mail.
|
|
# Loading the page that crashed with just a TestCase will at least let you see the
|
|
# traceback.
|
|
#
|
|
#from ietf.utils.test_utils import TestCase
|
|
#class LookAtCrashTest(TestCase):
|
|
# def setUp(self):
|
|
# condition_data()
|
|
#
|
|
# def testOpenSchedule(self):
|
|
# url = urlreverse('ietf.meeting.views.edit_agenda', kwargs=dict(num='42',name='test-agenda'))
|
|
# r = self.client.get(url)
|