diff --git a/src/requirements/dev.txt b/src/requirements/dev.txt index 0a64c2bdd..42cd1aecb 100644 --- a/src/requirements/dev.txt +++ b/src/requirements/dev.txt @@ -7,7 +7,6 @@ pep8-naming flake8 coveralls coverage -selenium pytest pytest-django isort diff --git a/src/setup.py b/src/setup.py index fe3dd6421..debb15436 100644 --- a/src/setup.py +++ b/src/setup.py @@ -66,7 +66,7 @@ setup( extras_require={ 'dev': ['django-debug-toolbar>=1.3.0,<2.0'], 'test': ['pep8==1.5.7', 'pyflakes', 'pep8-naming', 'flake8', 'coverage', - 'selenium', 'pytest', 'pytest-django'], + 'pytest', 'pytest-django'], 'memcached': ['pylibmc'], 'mysql': ['mysqlclient'], 'paypal': ['paypalrestsdk>=1.9,<1.10,<2.0'], diff --git a/src/tests/base/__init__.py b/src/tests/base/__init__.py index e7d30fec0..8099b4ca0 100644 --- a/src/tests/base/__init__.py +++ b/src/tests/base/__init__.py @@ -1,46 +1,5 @@ -import os -import sys -import time - from bs4 import BeautifulSoup -from django.conf import settings -from django.contrib.staticfiles.testing import StaticLiveServerTestCase from django.test import TestCase -from selenium import webdriver - -# could use Chrome, Firefox, etc... here -BROWSER = os.environ.get('TEST_BROWSER', 'PhantomJS') - - -class BrowserTest(StaticLiveServerTestCase): - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - settings.DEBUG = ('--debug' in sys.argv) - - def setUp(self): - if hasattr(webdriver, BROWSER): - self.driver = getattr(webdriver, BROWSER)() - else: - self.driver = webdriver.Remote( - desired_capabilities=webdriver.DesiredCapabilities.CHROME, - command_executor=BROWSER - ) - self.driver.set_window_size(1920, 1080) - self.driver.implicitly_wait(10) - - def tearDown(self): - self.driver.quit() - - def scroll_into_view(self, element): - """Scroll element into view""" - y = element.location['y'] - self.driver.execute_script('window.scrollTo(0, {0})'.format(y)) - - def scroll_and_click(self, element): - self.scroll_into_view(element) - time.sleep(0.5) - element.click() class SoupTest(TestCase): @@ -69,7 +28,6 @@ def extract_form_fields(soup): if field['type'] in ('checkbox', 'radio'): if field.has_attr('checked'): data[field['name']] = field.get('value', 'on') - continue else: # single element name/value fields diff --git a/src/tests/control/test_items.py b/src/tests/control/test_items.py index 1f0613aea..9e4d56748 100644 --- a/src/tests/control/test_items.py +++ b/src/tests/control/test_items.py @@ -1,10 +1,6 @@ import datetime -import os -import time -import unittest -from selenium.webdriver.support.select import Select -from tests.base import BrowserTest +from tests.base import SoupTest, extract_form_fields from pretix.base.models import ( Event, EventPermission, Item, ItemCategory, ItemVariation, Organizer, @@ -12,7 +8,7 @@ from pretix.base.models import ( ) -class ItemFormTest(BrowserTest): +class ItemFormTest(SoupTest): def setUp(self): super().setUp() self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy') @@ -25,134 +21,103 @@ class ItemFormTest(BrowserTest): OrganizerPermission.objects.create(organizer=self.orga1, user=self.user) EventPermission.objects.create(event=self.event1, user=self.user, can_change_items=True, can_change_settings=True) - self.driver.implicitly_wait(10) - self.driver.get('%s%s' % (self.live_server_url, '/control/login')) - username_input = self.driver.find_element_by_name("email") - username_input.send_keys('dummy@dummy.dummy') - password_input = self.driver.find_element_by_name("password") - password_input.send_keys('dummy') - self.driver.find_element_by_css_selector('button[type="submit"]').click() - self.driver.find_element_by_class_name("navbar-right") + self.client.login(email='dummy@dummy.dummy', password='dummy') class CategoriesTest(ItemFormTest): def test_create(self): - self.driver.get('%s/control/event/%s/%s/categories/add' % ( - self.live_server_url, self.orga1.slug, self.event1.slug - )) - self.driver.find_element_by_name("name_0").send_keys('Entry tickets') - self.driver.find_element_by_class_name("btn-save").click() - self.driver.find_element_by_class_name("alert-success") - self.assertIn("Entry tickets", self.driver.find_element_by_css_selector("#page-wrapper table").text) + doc = self.get_doc('/control/event/%s/%s/categories/add' % (self.orga1.slug, self.event1.slug)) + form_data = extract_form_fields(doc.select('.container-fluid form')[0]) + form_data['name_0'] = 'Entry tickets' + doc = self.post_doc('/control/event/%s/%s/categories/add' % (self.orga1.slug, self.event1.slug), form_data) + assert doc.select(".alert-success") + self.assertIn("Entry tickets", doc.select("#page-wrapper table")[0].text) def test_update(self): c = ItemCategory.objects.create(event=self.event1, name="Entry tickets") - self.driver.get('%s/control/event/%s/%s/categories/%s/' % ( - self.live_server_url, self.orga1.slug, self.event1.slug, c.id - )) - self.driver.find_element_by_name("name_0").clear() - self.driver.find_element_by_name("name_0").send_keys('T-Shirts') - self.scroll_and_click(self.driver.find_element_by_class_name("btn-save")) - self.driver.find_element_by_class_name("alert-success") - self.assertIn("T-Shirts", self.driver.find_element_by_css_selector("#page-wrapper table").text) - self.assertNotIn("Entry tickets", self.driver.find_element_by_css_selector("#page-wrapper table").text) + doc = self.get_doc('/control/event/%s/%s/categories/%s/' % (self.orga1.slug, self.event1.slug, c.id)) + form_data = extract_form_fields(doc.select('.container-fluid form')[0]) + form_data['name_0'] = 'T-Shirts' + doc = self.post_doc('/control/event/%s/%s/categories/%s/' % (self.orga1.slug, self.event1.slug, c.id), + form_data) + assert doc.select(".alert-success") + self.assertIn("T-Shirts", doc.select("#page-wrapper table")[0].text) + self.assertNotIn("Entry tickets", doc.select("#page-wrapper table")[0].text) assert str(ItemCategory.objects.get(id=c.id).name) == 'T-Shirts' - @unittest.skipIf('TRAVIS' in os.environ, 'See docstring for details.') def test_sort(self): - """ - For unknown reasons, the first scoll_and_click() call sometimes results in the following exception - - selenium.common.exceptions.ElementNotVisibleException: - Message: {"errorMessage":"Element is not currently visible and may not be manipulated", …} - - This exception does not occur on either of my machines, but only when being run in Travis CI. - - – Raphael Michel, 2015-02-08 - """ - ItemCategory.objects.create(event=self.event1, name="Entry tickets", position=0) + c1 = ItemCategory.objects.create(event=self.event1, name="Entry tickets", position=0) ItemCategory.objects.create(event=self.event1, name="T-Shirts", position=1) - self.driver.get('%s/control/event/%s/%s/categories/' % ( - self.live_server_url, self.orga1.slug, self.event1.slug - )) - self.assertIn("Entry tickets", - self.driver.find_element_by_css_selector("table > tbody > tr:nth-child(1)").text) - self.assertIn("T-Shirts", - self.driver.find_element_by_css_selector("table > tbody > tr:nth-child(2)").text) - self.scroll_and_click(self.driver.find_element_by_css_selector("table > tbody > tr:nth-child(1) a[href*='down']")) - time.sleep(1) - self.assertIn("Entry tickets", - self.driver.find_element_by_css_selector("table > tbody > tr:nth-child(2)").text) - self.assertIn("T-Shirts", - self.driver.find_element_by_css_selector("table > tbody > tr:nth-child(1)").text) - self.scroll_and_click(self.driver.find_element_by_css_selector("table > tbody > tr:nth-child(2) a[href*='up']")) - time.sleep(1) - self.assertIn("Entry tickets", - self.driver.find_element_by_css_selector("table > tbody > tr:nth-child(1)").text) - self.assertIn("T-Shirts", - self.driver.find_element_by_css_selector("table > tbody > tr:nth-child(2)").text) + doc = self.get_doc('/control/event/%s/%s/categories/' % (self.orga1.slug, self.event1.slug)) + self.assertIn("Entry tickets", doc.select("table > tbody > tr")[0].text) + self.assertIn("T-Shirts", doc.select("table > tbody > tr")[1].text) + + self.client.get('/control/event/%s/%s/categories/%s/down' % (self.orga1.slug, self.event1.slug, c1.id)) + doc = self.get_doc('/control/event/%s/%s/categories/' % (self.orga1.slug, self.event1.slug)) + self.assertIn("Entry tickets", doc.select("table > tbody > tr")[1].text) + self.assertIn("T-Shirts", doc.select("table > tbody > tr")[0].text) + + self.client.get('/control/event/%s/%s/categories/%s/up' % (self.orga1.slug, self.event1.slug, c1.id)) + doc = self.get_doc('/control/event/%s/%s/categories/' % (self.orga1.slug, self.event1.slug)) + self.assertIn("Entry tickets", doc.select("table > tbody > tr")[0].text) + self.assertIn("T-Shirts", doc.select("table > tbody > tr")[1].text) def test_delete(self): c = ItemCategory.objects.create(event=self.event1, name="Entry tickets") - self.driver.get('%s/control/event/%s/%s/categories/%s/delete' % ( - self.live_server_url, self.orga1.slug, self.event1.slug, c.id - )) - self.driver.find_element_by_class_name("btn-danger").click() - self.driver.find_element_by_class_name("alert-success") - self.assertNotIn("Entry tickets", self.driver.find_element_by_css_selector("#page-wrapper").text) + doc = self.get_doc('/control/event/%s/%s/categories/%s/delete' % (self.orga1.slug, self.event1.slug, c.id)) + form_data = extract_form_fields(doc.select('.container-fluid form')[0]) + doc = self.post_doc('/control/event/%s/%s/categories/%s/delete' % (self.orga1.slug, self.event1.slug, c.id), + form_data) + assert doc.select(".alert-success") + self.assertNotIn("Entry tickets", doc.select("#page-wrapper")[0].text) assert not ItemCategory.objects.filter(id=c.id).exists() class QuestionsTest(ItemFormTest): def test_create(self): - self.driver.get('%s/control/event/%s/%s/questions/add' % ( - self.live_server_url, self.orga1.slug, self.event1.slug - )) - self.driver.find_element_by_name("question_0").send_keys('What is your shoe size?') - Select(self.driver.find_element_by_name("type")).select_by_value('N') - self.driver.find_element_by_class_name("btn-save").click() - self.driver.find_element_by_class_name("alert-success") - self.assertIn("shoe size", self.driver.find_element_by_css_selector("#page-wrapper table").text) + doc = self.get_doc('/control/event/%s/%s/questions/add' % (self.orga1.slug, self.event1.slug)) + form_data = extract_form_fields(doc.select('.container-fluid form')[0]) + form_data['question_0'] = 'What is your shoe size?' + form_data['type'] = 'N' + doc = self.post_doc('/control/event/%s/%s/questions/add' % (self.orga1.slug, self.event1.slug), form_data) + assert doc.select(".alert-success") + self.assertIn("shoe size", doc.select("#page-wrapper table")[0].text) def test_update(self): c = Question.objects.create(event=self.event1, question="What is your shoe size?", type="N", required=True) - self.driver.get('%s/control/event/%s/%s/questions/%s/' % ( - self.live_server_url, self.orga1.slug, self.event1.slug, c.id - )) - self.driver.find_element_by_name("question_0").clear() - self.driver.find_element_by_name("question_0").send_keys('How old are you?') - self.scroll_and_click(self.driver.find_element_by_class_name("btn-save")) - self.driver.find_element_by_class_name("alert-success") - self.assertIn("How old", self.driver.find_element_by_css_selector("#page-wrapper table").text) - self.assertNotIn("shoe size", self.driver.find_element_by_css_selector("#page-wrapper table").text) + doc = self.get_doc('/control/event/%s/%s/questions/%s/' % (self.orga1.slug, self.event1.slug, c.id)) + form_data = extract_form_fields(doc.select('.container-fluid form')[0]) + form_data['question_0'] = 'How old are you?' + doc = self.post_doc('/control/event/%s/%s/questions/%s/' % (self.orga1.slug, self.event1.slug, c.id), form_data) + self.assertIn("How old", doc.select("#page-wrapper table")[0].text) + self.assertNotIn("shoe size", doc.select("#page-wrapper table")[0].text) c = Question.objects.get(id=c.id) self.assertTrue(c.required) assert str(Question.objects.get(id=c.id).question) == 'How old are you?' def test_delete(self): c = Question.objects.create(event=self.event1, question="What is your shoe size?", type="N", required=True) - self.driver.get('%s/control/event/%s/%s/questions/%s/delete' % ( - self.live_server_url, self.orga1.slug, self.event1.slug, c.id - )) - self.driver.find_element_by_class_name("btn-danger").click() - self.driver.find_element_by_class_name("alert-success") - self.assertNotIn("shoe size", self.driver.find_element_by_css_selector("#page-wrapper").text) + doc = self.get_doc('/control/event/%s/%s/questions/%s/delete' % (self.orga1.slug, self.event1.slug, c.id)) + form_data = extract_form_fields(doc.select('.container-fluid form')[0]) + doc = self.post_doc('/control/event/%s/%s/questions/%s/delete' % (self.orga1.slug, self.event1.slug, c.id), + form_data) + assert doc.select(".alert-success") + self.assertNotIn("shoe size", doc.select("#page-wrapper")[0].text) assert not Question.objects.filter(id=c.id).exists() class QuotaTest(ItemFormTest): def test_create(self): - self.driver.get('%s/control/event/%s/%s/quotas/add' % ( - self.live_server_url, self.orga1.slug, self.event1.slug - )) - self.driver.find_element_by_name("name").send_keys('Full house') - self.driver.find_element_by_name("size").send_keys('500') - self.driver.find_element_by_class_name("btn-save").click() - self.driver.find_element_by_class_name("alert-success") - self.assertIn("Full house", self.driver.find_element_by_css_selector("#page-wrapper table").text) + doc = self.get_doc('/control/event/%s/%s/quotas/add' % (self.orga1.slug, self.event1.slug)) + form_data = extract_form_fields(doc.select('.container-fluid form')[0]) + form_data['name'] = 'Full house' + form_data['size'] = '500' + doc = self.post_doc('/control/event/%s/%s/quotas/add' % (self.orga1.slug, self.event1.slug), form_data) + assert doc.select(".alert-success") + self.assertIn("Full house", doc.select("#page-wrapper table")[0].text) def test_update(self): c = Quota.objects.create(event=self.event1, name="Full house", size=500) @@ -160,31 +125,22 @@ class QuotaTest(ItemFormTest): item2 = Item.objects.create(event=self.event1, name="Business", default_price=0) ItemVariation.objects.create(item=item2, value="Silver") ItemVariation.objects.create(item=item2, value="Gold") - self.driver.get('%s/control/event/%s/%s/quotas/%s/' % ( - self.live_server_url, self.orga1.slug, self.event1.slug, c.id - )) - self.driver.find_element_by_name("size").clear() - self.driver.find_element_by_name("size").send_keys('350') - # self.scroll_and_click(self.driver.find_element_by_css_selector('.panel-group .panel:nth-child(1) - # .panel-title a')) - # time.sleep(1) - self.scroll_and_click(self.driver.find_element_by_name("item_%s" % item1.id)) - # self.driver.find_element_by_css_selector('.panel-group .panel:nth-child(2) .panel-title a').click() - # time.sleep(1) - self.scroll_and_click(self.driver.find_elements_by_css_selector("input[name=item_%s]" % item2.id)[1]) - self.scroll_and_click(self.driver.find_element_by_class_name("btn-save")) - self.driver.find_element_by_class_name("alert-success") - self.assertIn("350", self.driver.find_element_by_css_selector("#page-wrapper table").text) - self.assertNotIn("500", self.driver.find_element_by_css_selector("#page-wrapper table").text) + doc = self.get_doc('/control/event/%s/%s/quotas/%s/' % (self.orga1.slug, self.event1.slug, c.id)) + doc.select('[name=item_%s]' % item1.id)[0]['checked'] = 'checked' + form_data = extract_form_fields(doc.select('.container-fluid form')[0]) + form_data['size'] = '350' + doc = self.post_doc('/control/event/%s/%s/quotas/%s/' % (self.orga1.slug, self.event1.slug, c.id), form_data) + self.assertIn("350", doc.select("#page-wrapper table")[0].text) + self.assertNotIn("500", doc.select("#page-wrapper table")[0].text) assert Quota.objects.get(id=c.id).size == 350 assert item1 in Quota.objects.get(id=c.id).items.all() def test_delete(self): c = Quota.objects.create(event=self.event1, name="Full house", size=500) - self.driver.get('%s/control/event/%s/%s/quotas/%s/delete' % ( - self.live_server_url, self.orga1.slug, self.event1.slug, c.id - )) - self.driver.find_element_by_class_name("btn-danger").click() - self.driver.find_element_by_class_name("alert-success") - self.assertNotIn("Full house", self.driver.find_element_by_css_selector("#page-wrapper").text) + doc = self.get_doc('/control/event/%s/%s/quotas/%s/delete' % (self.orga1.slug, self.event1.slug, c.id)) + form_data = extract_form_fields(doc.select('.container-fluid form')[0]) + doc = self.post_doc('/control/event/%s/%s/quotas/%s/delete' % (self.orga1.slug, self.event1.slug, c.id), + form_data) + assert doc.select(".alert-success") + self.assertNotIn("Full house", doc.select("#page-wrapper")[0].text) assert not Quota.objects.filter(id=c.id).exists() diff --git a/src/tests/control/test_user.py b/src/tests/control/test_user.py index b990df31d..09f89ba3b 100644 --- a/src/tests/control/test_user.py +++ b/src/tests/control/test_user.py @@ -1,106 +1,108 @@ -from tests.base import BrowserTest +from tests.base import SoupTest, extract_form_fields from pretix.base.models import User -class UserSettingsTest(BrowserTest): +class UserSettingsTest(SoupTest): def setUp(self): super().setUp() self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy') - self.driver.implicitly_wait(10) - self.driver.get('%s%s' % (self.live_server_url, '/control/login')) - username_input = self.driver.find_element_by_name("email") - username_input.send_keys('dummy@dummy.dummy') - password_input = self.driver.find_element_by_name("password") - password_input.send_keys('dummy') - self.driver.find_element_by_css_selector('button[type="submit"]').click() - self.driver.find_element_by_class_name("navbar-right") - self.driver.get('%s%s' % (self.live_server_url, '/control/settings')) + self.client.login(email='dummy@dummy.dummy', password='dummy') + doc = self.get_doc('/control/settings') + self.form_data = extract_form_fields(doc.select('.container-fluid form')[0]) + + def save(self, data): + form_data = self.form_data.copy() + form_data.update(data) + print(form_data) + return self.post_doc('/control/settings', form_data) def test_set_name(self): - self.driver.find_element_by_name("givenname").clear() - self.driver.find_element_by_name("familyname").clear() - self.driver.find_element_by_name("givenname").send_keys("Peter") - self.driver.find_element_by_name("familyname").send_keys("Miller") - self.scroll_and_click(self.driver.find_element_by_class_name('btn-save')) - self.driver.find_element_by_class_name("alert-success") + doc = self.save({ + 'givenname': 'Peter', + 'familyname': 'Miller' + }) + assert doc.select(".alert-success") self.user = User.objects.get(pk=self.user.pk) assert self.user.givenname == 'Peter' assert self.user.familyname == 'Miller' def test_change_email_require_password(self): - self.driver.find_element_by_name("email").clear() - self.driver.find_element_by_name("email").send_keys("foo@example.com") - self.scroll_and_click(self.driver.find_element_by_class_name('btn-save')) - self.driver.find_element_by_class_name("alert-danger") + doc = self.save({ + 'email': 'foo@example.com', + }) + assert doc.select(".alert-danger") self.user = User.objects.get(pk=self.user.pk) assert self.user.email == 'dummy@dummy.dummy' def test_change_email_success(self): - self.driver.find_element_by_name("email").clear() - self.driver.find_element_by_name("email").send_keys("foo@example.com") - self.driver.find_element_by_name("old_pw").clear() - self.driver.find_element_by_name("old_pw").send_keys("dummy") - self.scroll_and_click(self.driver.find_element_by_class_name('btn-save')) - self.driver.find_element_by_class_name("alert-success") + doc = self.save({ + 'email': 'foo@example.com', + 'old_pw': 'dummy' + }) + assert doc.select(".alert-success") self.user = User.objects.get(pk=self.user.pk) assert self.user.email == 'foo@example.com' def test_change_email_no_duplicates(self): User.objects.create_user('foo@example.com', 'foo') - self.driver.find_element_by_name("email").clear() - self.driver.find_element_by_name("email").send_keys("foo@example.com") - self.driver.find_element_by_name("old_pw").clear() - self.driver.find_element_by_name("old_pw").send_keys("dummy") - self.scroll_and_click(self.driver.find_element_by_class_name('btn-save')) - self.driver.find_element_by_class_name("alert-danger") + doc = self.save({ + 'email': 'foo@example.com', + 'old_pw': 'dummy' + }) + assert doc.select(".alert-danger") self.user = User.objects.get(pk=self.user.pk) assert self.user.email == 'dummy@dummy.dummy' def test_change_password_require_password(self): - self.driver.find_element_by_name("new_pw").send_keys("foo") - self.driver.find_element_by_name("new_pw_repeat").send_keys("foo") - self.scroll_and_click(self.driver.find_element_by_class_name('btn-save')) - self.driver.find_element_by_class_name("alert-danger") + doc = self.save({ + 'new_pw': 'foo', + 'new_pw_repeat': 'foo', + }) + assert doc.select(".alert-danger") pw = self.user.password self.user = User.objects.get(pk=self.user.pk) assert self.user.password == pw def test_change_password_success(self): - self.driver.find_element_by_name("new_pw").send_keys("foobarbar") - self.driver.find_element_by_name("new_pw_repeat").send_keys("foobarbar") - self.driver.find_element_by_name("old_pw").send_keys("dummy") - self.scroll_and_click(self.driver.find_element_by_class_name('btn-save')) - self.driver.find_element_by_class_name("alert-success") + doc = self.save({ + 'new_pw': 'foobarbar', + 'new_pw_repeat': 'foobarbar', + 'old_pw': 'dummy', + }) + assert doc.select(".alert-success") self.user = User.objects.get(pk=self.user.pk) assert self.user.check_password("foobarbar") def test_change_password_short(self): - self.driver.find_element_by_name("new_pw").send_keys("foobar") - self.driver.find_element_by_name("new_pw_repeat").send_keys("foobar") - self.driver.find_element_by_name("old_pw").send_keys("dummy") - self.scroll_and_click(self.driver.find_element_by_class_name('btn-save')) - self.driver.find_element_by_class_name("alert-danger") + doc = self.save({ + 'new_pw': 'foo', + 'new_pw_repeat': 'foo', + 'old_pw': 'dummy', + }) + assert doc.select(".alert-danger") pw = self.user.password self.user = User.objects.get(pk=self.user.pk) assert self.user.password == pw def test_change_password_user_attribute_similarity(self): - self.driver.find_element_by_name("new_pw").send_keys("dummy123") - self.driver.find_element_by_name("new_pw_repeat").send_keys("dummy123") - self.driver.find_element_by_name("old_pw").send_keys("dummy") - self.scroll_and_click(self.driver.find_element_by_class_name('btn-save')) - self.driver.find_element_by_class_name("alert-danger") + doc = self.save({ + 'new_pw': 'dummy123', + 'new_pw_repeat': 'dummy123', + 'old_pw': 'dummy', + }) + assert doc.select(".alert-danger") pw = self.user.password self.user = User.objects.get(pk=self.user.pk) assert self.user.password == pw def test_change_password_require_repeat(self): - self.driver.find_element_by_name("new_pw").send_keys("foo") - self.driver.find_element_by_name("new_pw_repeat").send_keys("bar") - self.driver.find_element_by_name("old_pw").send_keys("dummy") - self.scroll_and_click(self.driver.find_element_by_class_name('btn-save')) - self.driver.find_element_by_class_name("alert-danger") + doc = self.save({ + 'new_pw': 'foooooooooooooo', + 'new_pw_repeat': 'baaaaaaaaaaaar', + 'old_pw': 'dummy', + }) + assert doc.select(".alert-danger") pw = self.user.password self.user = User.objects.get(pk=self.user.pk) assert self.user.password == pw diff --git a/src/tests/presale/test_event.py b/src/tests/presale/test_event.py index 6066776e7..c26f78829 100644 --- a/src/tests/presale/test_event.py +++ b/src/tests/presale/test_event.py @@ -3,7 +3,7 @@ import time from django.test import TestCase from django.utils.timezone import now -from tests.base import BrowserTest, SoupTest +from tests.base import SoupTest from pretix.base.models import ( Event, EventPermission, Item, ItemCategory, ItemVariation, Organizer, @@ -25,9 +25,6 @@ class EventTestMixin: class EventMiddlewareTest(EventTestMixin, SoupTest): - def setUp(self): - super().setUp() - def test_event_header(self): doc = self.get_doc('/%s/%s/' % (self.orga.slug, self.event.slug)) self.assertIn(str(self.event.name), doc.find("h1").text) @@ -51,24 +48,20 @@ class EventMiddlewareTest(EventTestMixin, SoupTest): self.assertEqual(resp.status_code, 200) -class ItemDisplayTest(EventTestMixin, BrowserTest): - def setUp(self): - super().setUp() - self.driver.implicitly_wait(10) - +class ItemDisplayTest(EventTestMixin, SoupTest): def test_not_active(self): q = Quota.objects.create(event=self.event, name='Quota', size=2) item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=0, active=False) q.items.add(item) - self.driver.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug)) - self.assertNotIn("Early-bird", self.driver.find_element_by_css_selector("body").text) + html = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug)) + self.assertNotIn("Early-bird", html) def test_without_category(self): q = Quota.objects.create(event=self.event, name='Quota', size=2) item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=0, active=True) q.items.add(item) - self.driver.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug)) - self.assertIn("Early-bird", self.driver.find_element_by_css_selector("section .product-row:first-child").text) + doc = self.get_doc('/%s/%s/' % (self.orga.slug, self.event.slug)) + self.assertIn("Early-bird", doc.select("section .product-row")[0].text) def test_timely_available(self): q = Quota.objects.create(event=self.event, name='Quota', size=2) @@ -76,47 +69,46 @@ class ItemDisplayTest(EventTestMixin, BrowserTest): available_until=now() + datetime.timedelta(days=2), available_from=now() - datetime.timedelta(days=2)) q.items.add(item) - self.driver.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug)) - self.assertIn("Early-bird", self.driver.find_element_by_css_selector("body").text) + doc = self.get_doc('/%s/%s/' % (self.orga.slug, self.event.slug)) + self.assertIn("Early-bird", doc.select("body")[0].text) def test_no_longer_available(self): q = Quota.objects.create(event=self.event, name='Quota', size=2) item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=0, active=True, available_until=now() - datetime.timedelta(days=2)) q.items.add(item) - self.driver.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug)) - self.assertNotIn("Early-bird", self.driver.find_element_by_css_selector("body").text) + html = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug)) + self.assertNotIn("Early-bird", html) def test_not_yet_available(self): q = Quota.objects.create(event=self.event, name='Quota', size=2) item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=0, active=True, available_from=now() + datetime.timedelta(days=2)) q.items.add(item) - self.driver.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug)) - self.assertNotIn("Early-bird", self.driver.find_element_by_css_selector("body").text) + html = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug)) + self.assertNotIn("Early-bird", html) def test_hidden_without_voucher(self): q = Quota.objects.create(event=self.event, name='Quota', size=2) item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=0, active=True, hide_without_voucher=True) q.items.add(item) - self.driver.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug)) - self.assertNotIn("Early-bird", self.driver.find_element_by_css_selector("body").text) + html = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug)) + self.assertNotIn("Early-bird", html) def test_simple_with_category(self): c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0) q = Quota.objects.create(event=self.event, name='Quota', size=2) item = Item.objects.create(event=self.event, name='Early-bird ticket', category=c, default_price=0) q.items.add(item) - self.driver.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug)) - self.assertIn("Entry tickets", self.driver.find_element_by_css_selector("section:nth-of-type(1) h3").text) - self.assertIn("Early-bird", - self.driver.find_element_by_css_selector("section:nth-of-type(1) div:nth-of-type(1)").text) + doc = self.get_doc('/%s/%s/' % (self.orga.slug, self.event.slug)) + self.assertIn("Entry tickets", doc.select("section:nth-of-type(1) h3")[0].text) + self.assertIn("Early-bird", doc.select("section:nth-of-type(1) div:nth-of-type(1)")[0].text) def test_simple_without_quota(self): c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0) Item.objects.create(event=self.event, name='Early-bird ticket', category=c, default_price=0) - resp = self.client.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug)) + resp = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug)) self.assertNotIn("Early-bird", resp.rendered_content) def test_no_variations_in_quota(self): @@ -125,8 +117,7 @@ class ItemDisplayTest(EventTestMixin, BrowserTest): item = Item.objects.create(event=self.event, name='Early-bird ticket', category=c, default_price=0) ItemVariation.objects.create(item=item, value='Blue') q.items.add(item) - self.driver.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug)) - resp = self.client.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug)) + resp = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug)) self.assertNotIn("Early-bird", resp.rendered_content) def test_one_variation_in_quota(self): @@ -150,16 +141,10 @@ class ItemDisplayTest(EventTestMixin, BrowserTest): self._assert_variation_found() def _assert_variation_found(self): - self.driver.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug)) - self.assertIn("Early-bird", - self.driver.find_element_by_css_selector("section:nth-of-type(1) div:nth-of-type(1)").text) - for el in self.driver.find_elements_by_link_text('Show variants'): - self.scroll_and_click(el) - time.sleep(2) - self.assertIn("Red", - self.driver.find_element_by_css_selector("section:nth-of-type(1)").text) - self.assertNotIn("Black", - self.driver.find_element_by_css_selector("section:nth-of-type(1)").text) + doc = self.get_doc('/%s/%s/' % (self.orga.slug, self.event.slug)) + self.assertIn("Early-bird", doc.select("section:nth-of-type(1) div:nth-of-type(1)")[0].text) + self.assertIn("Red", doc.select("section:nth-of-type(1)")[0].text) + self.assertNotIn("Black", doc.select("section:nth-of-type(1)")[0].text) def test_variation_prices_in_quota(self): c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0) @@ -170,20 +155,12 @@ class ItemDisplayTest(EventTestMixin, BrowserTest): q.variations.add(var1) q.variations.add(var2) q.items.add(item) - self.driver.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug)) - self.assertIn("Early-bird", - self.driver.find_element_by_css_selector("section:nth-of-type(1) div:nth-of-type(1)").text) - for el in self.driver.find_elements_by_link_text('Show variants'): - self.scroll_and_click(el) - time.sleep(2) - self.assertIn("Red", - self.driver.find_elements_by_css_selector("section:nth-of-type(1) div.variation")[0].text) - self.assertIn("14.00", - self.driver.find_elements_by_css_selector("section:nth-of-type(1) div.variation")[0].text) - self.assertIn("Black", - self.driver.find_elements_by_css_selector("section:nth-of-type(1) div.variation")[1].text) - self.assertIn("12.00", - self.driver.find_elements_by_css_selector("section:nth-of-type(1) div.variation")[1].text) + doc = self.get_doc('/%s/%s/' % (self.orga.slug, self.event.slug)) + self.assertIn("Early-bird", doc.select("section:nth-of-type(1) div:nth-of-type(1)")[0].text) + self.assertIn("Red", doc.select("section:nth-of-type(1) div.variation")[0].text) + self.assertIn("14.00", doc.select("section:nth-of-type(1) div.variation")[0].text) + self.assertIn("Black", doc.select("section:nth-of-type(1) div.variation")[1].text) + self.assertIn("12.00", doc.select("section:nth-of-type(1) div.variation")[1].text) class DeadlineTest(EventTestMixin, TestCase):