From 1bf459c19356e82f40f624835fc67adcbe660a69 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 26 Sep 2016 19:21:18 +0200 Subject: [PATCH 1/7] Upgrade Django to 1.10 --- src/requirements/production.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/requirements/production.txt b/src/requirements/production.txt index 150a654841..1fcba40090 100644 --- a/src/requirements/production.txt +++ b/src/requirements/production.txt @@ -1,5 +1,5 @@ # Functional requirements -Django>=1.9,<1.10 +Django>=1.10,<1.11 python-dateutil pytz django-bootstrap3>=6.2,<6.3 From 965428e42232aef1a0de93d82d31fc9357c17306 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 27 Sep 2016 10:00:03 +0200 Subject: [PATCH 2/7] Django 1.10: New-style middlewares --- src/pretix/base/middleware.py | 5 +++-- src/pretix/control/middleware.py | 3 ++- src/pretix/helpers/debug.py | 6 ++++++ src/pretix/multidomain/middlewares.py | 3 ++- src/pretix/presale/middleware.py | 3 ++- src/pretix/settings.py | 4 ++-- src/requirements/dev.txt | 2 +- src/requirements/production.txt | 2 +- 8 files changed, 19 insertions(+), 9 deletions(-) create mode 100644 src/pretix/helpers/debug.py diff --git a/src/pretix/base/middleware.py b/src/pretix/base/middleware.py index 5188d27006..3769f71602 100644 --- a/src/pretix/base/middleware.py +++ b/src/pretix/base/middleware.py @@ -6,6 +6,7 @@ from django.core.urlresolvers import get_script_prefix from django.http import HttpRequest, HttpResponse from django.utils import timezone, translation from django.utils.cache import patch_vary_headers +from django.utils.deprecation import MiddlewareMixin from django.utils.translation import LANGUAGE_SESSION_KEY from django.utils.translation.trans_real import ( check_for_language, get_supported_language_variant, language_code_re, @@ -15,7 +16,7 @@ from django.utils.translation.trans_real import ( _supported = None -class LocaleMiddleware: +class LocaleMiddleware(MiddlewareMixin): """ This middleware sets the correct locale and timezone @@ -134,7 +135,7 @@ def get_language_from_request(request: HttpRequest) -> str: ) -class SecurityMiddleware: +class SecurityMiddleware(MiddlewareMixin): def _parse_csp(self, header): h = {} diff --git a/src/pretix/control/middleware.py b/src/pretix/control/middleware.py index d9f53a7478..041f584b17 100644 --- a/src/pretix/control/middleware.py +++ b/src/pretix/control/middleware.py @@ -5,13 +5,14 @@ from django.contrib.auth import REDIRECT_FIELD_NAME from django.core.urlresolvers import get_script_prefix, resolve from django.http import Http404 from django.shortcuts import redirect, resolve_url +from django.utils.deprecation import MiddlewareMixin from django.utils.encoding import force_str from django.utils.translation import ugettext as _ from pretix.base.models import Event, EventPermission, Organizer -class PermissionMiddleware: +class PermissionMiddleware(MiddlewareMixin): """ This middleware enforces all requests to the control app to require login. Additionally, it enforces all requests to "control:event." URLs diff --git a/src/pretix/helpers/debug.py b/src/pretix/helpers/debug.py new file mode 100644 index 0000000000..cf2dc22cc4 --- /dev/null +++ b/src/pretix/helpers/debug.py @@ -0,0 +1,6 @@ +from debug_toolbar.middleware import DebugToolbarMiddleware +from django.utils.deprecation import MiddlewareMixin + + +class DebugMiddlewareCompatibilityShim(MiddlewareMixin, DebugToolbarMiddleware): + pass diff --git a/src/pretix/multidomain/middlewares.py b/src/pretix/multidomain/middlewares.py index 65728aa821..154fba225c 100644 --- a/src/pretix/multidomain/middlewares.py +++ b/src/pretix/multidomain/middlewares.py @@ -9,6 +9,7 @@ from django.core.urlresolvers import set_urlconf from django.http.request import split_domain_port from django.middleware.csrf import CsrfViewMiddleware as BaseCsrfMiddleware from django.utils.cache import patch_vary_headers +from django.utils.deprecation import MiddlewareMixin from django.utils.http import cookie_date from pretix.multidomain.models import KnownDomain @@ -16,7 +17,7 @@ from pretix.multidomain.models import KnownDomain LOCAL_HOST_NAMES = ('testserver', 'localhost') -class MultiDomainMiddleware: +class MultiDomainMiddleware(MiddlewareMixin): def process_request(self, request): # We try three options, in order of decreasing preference. if settings.USE_X_FORWARDED_HOST and ('HTTP_X_FORWARDED_HOST' in request.META): diff --git a/src/pretix/presale/middleware.py b/src/pretix/presale/middleware.py index 5c454e9f9e..757d85c8e6 100644 --- a/src/pretix/presale/middleware.py +++ b/src/pretix/presale/middleware.py @@ -1,11 +1,12 @@ from django.core.urlresolvers import resolve +from django.utils.deprecation import MiddlewareMixin from pretix.presale.signals import process_response from .utils import _detect_event -class EventMiddleware: +class EventMiddleware(MiddlewareMixin): def process_request(self, request): url = resolve(request.path_info) request._namespace = url.namespace diff --git a/src/pretix/settings.py b/src/pretix/settings.py index b561ccff43..245edc8cca 100644 --- a/src/pretix/settings.py +++ b/src/pretix/settings.py @@ -193,7 +193,7 @@ CORE_MODULES = { ("pretix", "control") } -MIDDLEWARE_CLASSES = [ +MIDDLEWARE = [ 'pretix.multidomain.middlewares.MultiDomainMiddleware', 'pretix.multidomain.middlewares.SessionMiddleware', 'django.middleware.common.CommonMiddleware', @@ -212,7 +212,7 @@ try: import debug_toolbar # noqa if DEBUG: INSTALLED_APPS.append('debug_toolbar.apps.DebugToolbarConfig') - MIDDLEWARE_CLASSES.append('debug_toolbar.middleware.DebugToolbarMiddleware') + MIDDLEWARE.append('pretix.helpers.debug.DebugMiddlewareCompatibilityShim') except ImportError: pass diff --git a/src/requirements/dev.txt b/src/requirements/dev.txt index bc512b7562..82b9bf5449 100644 --- a/src/requirements/dev.txt +++ b/src/requirements/dev.txt @@ -1,4 +1,4 @@ -django-debug-toolbar==1.4 +django-debug-toolbar==1.5 sqlparse==0.1.19 # not yet supported by django-debug-toolbar 1.4 # Testing requirements pep8==1.5.7 # exact requirement by flake8 2.4.0 diff --git a/src/requirements/production.txt b/src/requirements/production.txt index 1fcba40090..d61b93a0d1 100644 --- a/src/requirements/production.txt +++ b/src/requirements/production.txt @@ -4,7 +4,7 @@ python-dateutil pytz django-bootstrap3>=6.2,<6.3 git+https://github.com/pretix/django-formset-js.git@master#egg=django-formset-js -django-compressor==2.0 +django-compressor==2.1 reportlab>=3.2,<3.3 git+https://github.com/pretix/PyPDF2.git@pretix#egg=PyPDF2 easy-thumbnails>=2.2,<3 From fbd1c0d367175fd89df8ece1b9d48163e844af0e Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 27 Sep 2016 10:21:54 +0200 Subject: [PATCH 3/7] Django 1.10: URL configuration deprecations --- src/pretix/multidomain/maindomain_urlconf.py | 10 +++++----- src/pretix/multidomain/subdomain_urlconf.py | 10 +++++----- src/pretix/urls.py | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/pretix/multidomain/maindomain_urlconf.py b/src/pretix/multidomain/maindomain_urlconf.py index 24a73a898d..e37ca299bb 100644 --- a/src/pretix/multidomain/maindomain_urlconf.py +++ b/src/pretix/multidomain/maindomain_urlconf.py @@ -11,11 +11,11 @@ from pretix.presale.urls import ( from pretix.urls import common_patterns presale_patterns_main = [ - url(r'', include(locale_patterns + [ + url(r'', include((locale_patterns + [ url(r'^(?P[^/]+)/(?P[^/]+)/', include(event_patterns)), url(r'^(?P[^/]+)/', include(organizer_patterns)), url(r'^$', TemplateView.as_view(template_name='pretixpresale/index.html')) - ], namespace='presale')) + ], 'presale'))) ] raw_plugin_patterns = [] @@ -30,7 +30,7 @@ for app in apps.get_app_configs(): single_plugin_patterns.append(url(r'^(?P[^/]+)/(?P[^/]+)/', include(urlmod.event_patterns))) raw_plugin_patterns.append( - url(r'', include(single_plugin_patterns, namespace=app.label)) + url(r'', include((single_plugin_patterns, app.label))) ) elif importlib.util.find_spec(app.name + '.maindomain_urls'): # noqa warnings.warn('Please put your config in an \'urls\' module using the urlpatterns and event_patterns ' @@ -38,11 +38,11 @@ for app in apps.get_app_configs(): DeprecationWarning) urlmod = importlib.import_module(app.name + '.maindomain_urls') raw_plugin_patterns.append( - url(r'', include(urlmod, namespace=app.label)) + url(r'', include((urlmod, app.label))) ) plugin_patterns = [ - url(r'', include(raw_plugin_patterns, namespace='plugins')) + url(r'', include((raw_plugin_patterns, 'plugins'))) ] # The presale namespace comes last, because it contains a wildcard catch diff --git a/src/pretix/multidomain/subdomain_urlconf.py b/src/pretix/multidomain/subdomain_urlconf.py index 52e082a35e..6810ac0d81 100644 --- a/src/pretix/multidomain/subdomain_urlconf.py +++ b/src/pretix/multidomain/subdomain_urlconf.py @@ -10,10 +10,10 @@ from pretix.presale.urls import ( from pretix.urls import common_patterns presale_patterns = [ - url(r'', include(locale_patterns + [ + url(r'', include((locale_patterns + [ url(r'^(?P[^/]+)/', include(event_patterns)), url(r'', include(organizer_patterns)) - ], namespace='presale')) + ], 'presale'))) ] raw_plugin_patterns = [] @@ -23,7 +23,7 @@ for app in apps.get_app_configs(): urlmod = importlib.import_module(app.name + '.urls') if hasattr(urlmod, 'event_patterns'): raw_plugin_patterns.append( - url(r'^(?P[^/]+)/', include(urlmod.event_patterns, namespace=app.label)) + url(r'^(?P[^/]+)/', include((urlmod.event_patterns, app.label))) ) elif importlib.util.find_spec(app.name + '.subdomain_urls'): # noqa warnings.warn('Please put your config in an \'urls\' module using the event_patterns ' @@ -31,11 +31,11 @@ for app in apps.get_app_configs(): DeprecationWarning) urlmod = importlib.import_module(app.name + '.subdomain_urls') raw_plugin_patterns.append( - url(r'', include(urlmod, namespace=app.label)) + url(r'', include((urlmod, app.label))) ) plugin_patterns = [ - url(r'', include(raw_plugin_patterns, namespace='plugins')) + url(r'', include((raw_plugin_patterns, 'plugins'))) ] # The presale namespace comes last, because it contains a wildcard catch diff --git a/src/pretix/urls.py b/src/pretix/urls.py index c72f3fd1fb..1a7416c704 100644 --- a/src/pretix/urls.py +++ b/src/pretix/urls.py @@ -16,7 +16,7 @@ base_patterns = [ ] control_patterns = [ - url(r'^control/', include(pretix.control.urls, namespace='control')), + url(r'^control/', include((pretix.control.urls, 'control'))), ] debug_patterns = [] From 3e318d0dcfcf7de07e3dabb1c17dd4dc78a72495 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 27 Sep 2016 10:25:20 +0200 Subject: [PATCH 4/7] Django 1.10: User.is_authenticated is now a property --- src/pretix/base/middleware.py | 4 ++-- src/pretix/control/middleware.py | 2 +- src/pretix/control/permissions.py | 4 ++-- src/pretix/control/views/auth.py | 8 ++++---- src/pretix/presale/utils.py | 2 +- src/pretix/presale/views/locale.py | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/pretix/base/middleware.py b/src/pretix/base/middleware.py index 3769f71602..654a256058 100644 --- a/src/pretix/base/middleware.py +++ b/src/pretix/base/middleware.py @@ -43,7 +43,7 @@ class LocaleMiddleware(MiddlewareMixin): request.LANGUAGE_CODE = translation.get_language() tzname = None - if request.user.is_authenticated(): + if request.user.is_authenticated: tzname = request.user.timezone if hasattr(request, 'event'): tzname = request.event.settings.timezone @@ -65,7 +65,7 @@ class LocaleMiddleware(MiddlewareMixin): def get_language_from_user_settings(request: HttpRequest) -> str: - if request.user.is_authenticated(): + if request.user.is_authenticated: lang_code = request.user.locale if lang_code in _supported and lang_code is not None and check_for_language(lang_code): return lang_code diff --git a/src/pretix/control/middleware.py b/src/pretix/control/middleware.py index 041f584b17..b8906de7e9 100644 --- a/src/pretix/control/middleware.py +++ b/src/pretix/control/middleware.py @@ -37,7 +37,7 @@ class PermissionMiddleware(MiddlewareMixin): return redirect(urljoin(settings.SITE_URL, request.get_full_path())) if url_name in self.EXCEPTIONS: return - if not request.user.is_authenticated(): + if not request.user.is_authenticated: # Taken from django/contrib/auth/decorators.py path = request.build_absolute_uri() # urlparse chokes on lazy objects in Python 3, force to str diff --git a/src/pretix/control/permissions.py b/src/pretix/control/permissions.py index a38d3ffa94..ef5708063e 100644 --- a/src/pretix/control/permissions.py +++ b/src/pretix/control/permissions.py @@ -11,7 +11,7 @@ def event_permission_required(permission): """ def decorator(function): def wrapper(request, *args, **kw): - if not request.user.is_authenticated(): # NOQA + if not request.user.is_authenticated: # NOQA # just a double check, should not ever happen raise PermissionDenied() try: @@ -55,7 +55,7 @@ def organizer_permission_required(permission): """ def decorator(function): def wrapper(request, *args, **kw): - if not request.user.is_authenticated(): # NOQA + if not request.user.is_authenticated: # NOQA # just a double check, should not ever happen raise PermissionDenied() try: diff --git a/src/pretix/control/views/auth.py b/src/pretix/control/views/auth.py index ceecc3ef9f..78da5d53a3 100644 --- a/src/pretix/control/views/auth.py +++ b/src/pretix/control/views/auth.py @@ -24,7 +24,7 @@ def login(request): parameter "next" for redirection after successful login """ ctx = {} - if request.user.is_authenticated(): + if request.user.is_authenticated: return redirect(request.GET.get("next", 'control:index')) if request.method == 'POST': form = LoginForm(data=request.POST) @@ -56,7 +56,7 @@ def register(request): if not settings.PRETIX_REGISTRATION: raise PermissionDenied('Registration is disabled') ctx = {} - if request.user.is_authenticated(): + if request.user.is_authenticated: return redirect(request.GET.get("next", 'control:index')) if request.method == 'POST': form = RegistrationForm(data=request.POST) @@ -85,7 +85,7 @@ class Forgot(TemplateView): return super().dispatch(request, *args, **kwargs) def get(self, request, *args, **kwargs): - if request.user.is_authenticated(): + if request.user.is_authenticated: return redirect(request.GET.get("next", 'control:index')) return super().get(request, *args, **kwargs) @@ -149,7 +149,7 @@ class Recover(TemplateView): return super().dispatch(request, *args, **kwargs) def get(self, request, *args, **kwargs): - if request.user.is_authenticated(): + if request.user.is_authenticated: return redirect(request.GET.get("next", 'control:index')) try: user = User.objects.get(id=self.request.GET.get('id')) diff --git a/src/pretix/presale/utils.py b/src/pretix/presale/utils.py index 8834d17566..8fb5e16e08 100644 --- a/src/pretix/presale/utils.py +++ b/src/pretix/presale/utils.py @@ -60,7 +60,7 @@ def _detect_event(request): LocaleMiddleware().process_request(request) if not request.event.live: - if not request.user.is_authenticated() or not EventPermission.objects.filter( + if not request.user.is_authenticated or not EventPermission.objects.filter( event=request.event, user=request.user).exists(): raise PermissionDenied(_('The selected ticket shop is currently not available.')) diff --git a/src/pretix/presale/views/locale.py b/src/pretix/presale/views/locale.py index cbdde65efd..7a605837ce 100644 --- a/src/pretix/presale/views/locale.py +++ b/src/pretix/presale/views/locale.py @@ -15,7 +15,7 @@ class LocaleSet(View): locale = request.GET.get('locale') if locale in [lc for lc, ll in settings.LANGUAGES]: - if request.user.is_authenticated(): + if request.user.is_authenticated: request.user.locale = locale request.user.save() From efc6b6e480e55478fa309adf84d5ccb26b336107 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 27 Sep 2016 10:49:39 +0200 Subject: [PATCH 5/7] Resolved various warnings, upgrade bootstrap3 --- src/pretix/control/views/item.py | 3 +- src/pretix/control/views/orders.py | 2 +- src/requirements/production.txt | 2 +- src/tests/base/__init__.py | 4 +- src/tests/base/test_cache.py | 4 +- src/tests/plugins/banktransfer/test_import.py | 2 +- src/tests/presale/test_cart.py | 60 ++++++++--------- src/tests/presale/test_checkout.py | 66 +++++++++---------- src/tests/presale/test_orders.py | 14 ++-- 9 files changed, 79 insertions(+), 78 deletions(-) diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index 10b1637c62..7a29bf09d6 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -394,7 +394,8 @@ class QuestionView(EventPermissionRequiredMixin, QuestionMixin, ChartContainingV if self.request.GET.get("status", "") != "": s = self.request.GET.get("status", "") if s == 'o': - qs = qs.filter(orderposition__order__status=Order.STATUS_PENDING, expires__lt=now().date()) + qs = qs.filter(orderposition__order__status=Order.STATUS_PENDING, + expires__lt=now().replace(hour=0, minute=0, second=0)) elif s == 'ne': qs = qs.filter(orderposition__order__status__in=[Order.STATUS_PENDING, Order.STATUS_EXPIRED]) else: diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 78191140f8..065766e255 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -59,7 +59,7 @@ class OrderList(EventPermissionRequiredMixin, ListView): if self.request.GET.get("status", "") != "": s = self.request.GET.get("status", "") if s == 'o': - qs = qs.filter(status=Order.STATUS_PENDING, expires__lt=now().date()) + qs = qs.filter(status=Order.STATUS_PENDING, expires__lt=now().replace(hour=0, minute=0, second=0)) elif s == 'ne': qs = qs.filter(status__in=[Order.STATUS_PENDING, Order.STATUS_EXPIRED]) else: diff --git a/src/requirements/production.txt b/src/requirements/production.txt index d61b93a0d1..57fcd5f3dd 100644 --- a/src/requirements/production.txt +++ b/src/requirements/production.txt @@ -2,7 +2,7 @@ Django>=1.10,<1.11 python-dateutil pytz -django-bootstrap3>=6.2,<6.3 +django-bootstrap3>=7.1,<7.2 git+https://github.com/pretix/django-formset-js.git@master#egg=django-formset-js django-compressor==2.1 reportlab>=3.2,<3.3 diff --git a/src/tests/base/__init__.py b/src/tests/base/__init__.py index a66cacd94c..cf9882c504 100644 --- a/src/tests/base/__init__.py +++ b/src/tests/base/__init__.py @@ -6,12 +6,12 @@ class SoupTest(TestCase): def get_doc(self, *args, **kwargs): response = self.client.get(*args, **kwargs) - return BeautifulSoup(response.rendered_content) + return BeautifulSoup(response.rendered_content, "lxml") def post_doc(self, *args, **kwargs): kwargs['follow'] = True response = self.client.post(*args, **kwargs) - return BeautifulSoup(response.rendered_content) + return BeautifulSoup(response.rendered_content, "lxml") def extract_form_fields(soup): diff --git a/src/tests/base/test_cache.py b/src/tests/base/test_cache.py index 77b2217acc..41d2311695 100644 --- a/src/tests/base/test_cache.py +++ b/src/tests/base/test_cache.py @@ -33,7 +33,7 @@ class CacheTest(TestCase): def test_longkey(self): self.cache.set(self.testkey * 100, "foo") - self.assertEquals(self.cache.get(self.testkey * 100), "foo") + self.assertEqual(self.cache.get(self.testkey * 100), "foo") def test_invalidation(self): self.cache.set(self.testkey, "foo") @@ -46,4 +46,4 @@ class CacheTest(TestCase): 'b': 'bar', } self.cache.set_many(inp) - self.assertEquals(inp, self.cache.get_many(inp.keys())) + self.assertEqual(inp, self.cache.get_many(inp.keys())) diff --git a/src/tests/plugins/banktransfer/test_import.py b/src/tests/plugins/banktransfer/test_import.py index ec39d9b429..64c821a3c0 100644 --- a/src/tests/plugins/banktransfer/test_import.py +++ b/src/tests/plugins/banktransfer/test_import.py @@ -67,7 +67,7 @@ Buchungstag;Valuta;Buchungstext;Auftraggeber / Empfänger;Verwendungszweck;Betra r = client.post('/control/event/dummy/dummy/banktransfer/import/', { 'file': file }) - doc = BeautifulSoup(r.content) + doc = BeautifulSoup(r.content, "lxml") assert r.status_code == 200 assert len(doc.select("input[name=date]")) > 0 data = { diff --git a/src/tests/presale/test_cart.py b/src/tests/presale/test_cart.py index 34424c1e4a..de8f2bb660 100644 --- a/src/tests/presale/test_cart.py +++ b/src/tests/presale/test_cart.py @@ -46,7 +46,7 @@ class CartTest(CartTestMixin, TestCase): }, follow=True) self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), target_status_code=200) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('Early-bird', doc.select('.cart .cart-row')[0].select('strong')[0].text) self.assertIn('1', doc.select('.cart .cart-row')[0].select('.count')[0].text) self.assertIn('23', doc.select('.cart .cart-row')[0].select('.price')[0].text) @@ -66,7 +66,7 @@ class CartTest(CartTestMixin, TestCase): }, follow=True) self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), target_status_code=200) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('Early-bird', doc.select('.cart .cart-row')[0].select('strong')[0].text) self.assertIn('1', doc.select('.cart .cart-row')[0].select('.count')[0].text) self.assertIn('24', doc.select('.cart .cart-row')[0].select('.price')[0].text) @@ -86,7 +86,7 @@ class CartTest(CartTestMixin, TestCase): }, follow=True) self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), target_status_code=200) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('Early-bird', doc.select('.cart .cart-row')[0].select('strong')[0].text) self.assertIn('1', doc.select('.cart .cart-row')[0].select('.count')[0].text) self.assertIn('23', doc.select('.cart .cart-row')[0].select('.price')[0].text) @@ -106,7 +106,7 @@ class CartTest(CartTestMixin, TestCase): }, follow=True) self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), target_status_code=200) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('Early-bird', doc.select('.cart .cart-row')[0].select('strong')[0].text) self.assertIn('1', doc.select('.cart .cart-row')[0].select('.count')[0].text) self.assertIn('23', doc.select('.cart .cart-row')[0].select('.price')[0].text) @@ -134,7 +134,7 @@ class CartTest(CartTestMixin, TestCase): }, follow=True) self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), target_status_code=200) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('Shirt', doc.select('.cart .cart-row')[0].select('strong')[0].text) self.assertIn('Red', doc.select('.cart .cart-row')[0].text) self.assertIn('1', doc.select('.cart .cart-row')[0].select('.count')[0].text) @@ -155,7 +155,7 @@ class CartTest(CartTestMixin, TestCase): }, follow=True) self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), target_status_code=200) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('Shirt', doc.select('.cart .cart-row')[0].select('strong')[0].text) self.assertIn('Red', doc.select('.cart .cart-row')[0].text) self.assertIn('1', doc.select('.cart .cart-row')[0].select('.count')[0].text) @@ -173,7 +173,7 @@ class CartTest(CartTestMixin, TestCase): }, follow=True) self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), target_status_code=200) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('Early-bird', doc.select('.cart .cart-row')[0].select('strong')[0].text) self.assertIn('2', doc.select('.cart .cart-row')[0].select('.count')[0].text) self.assertIn('23', doc.select('.cart .cart-row')[0].select('.price')[0].text) @@ -192,7 +192,7 @@ class CartTest(CartTestMixin, TestCase): }, follow=True) self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), target_status_code=200) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('Early-bird', doc.select('.cart')[0].text) self.assertIn('Shirt', doc.select('.cart')[0].text) objs = list(CartPosition.objects.filter(cart_id=self.session_key, event=self.event)) @@ -207,7 +207,7 @@ class CartTest(CartTestMixin, TestCase): }, follow=True) self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), target_status_code=200) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('numbers only', doc.select('.alert-danger')[0].text) self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists()) @@ -216,7 +216,7 @@ class CartTest(CartTestMixin, TestCase): }, follow=True) self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), target_status_code=200) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('numbers only', doc.select('.alert-danger')[0].text) self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists()) response = self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), { @@ -224,7 +224,7 @@ class CartTest(CartTestMixin, TestCase): }, follow=True) self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), target_status_code=200) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('numbers only', doc.select('.alert-danger')[0].text) self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists()) @@ -233,7 +233,7 @@ class CartTest(CartTestMixin, TestCase): }, follow=True) self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), target_status_code=200) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('numbers only', doc.select('.alert-danger')[0].text) self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists()) @@ -241,7 +241,7 @@ class CartTest(CartTestMixin, TestCase): }, follow=True) self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), target_status_code=200) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('did not select any products', doc.select('.alert-warning')[0].text) self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists()) @@ -256,7 +256,7 @@ class CartTest(CartTestMixin, TestCase): }, follow=True) self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), target_status_code=200) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('not available', doc.select('.alert-danger')[0].text) self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists()) @@ -267,7 +267,7 @@ class CartTest(CartTestMixin, TestCase): }, follow=True) self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), target_status_code=200) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('no longer available', doc.select('.alert-danger')[0].text) self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists()) @@ -307,7 +307,7 @@ class CartTest(CartTestMixin, TestCase): }, follow=True) self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), target_status_code=200) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('more than', doc.select('.alert-danger')[0].text) self.assertEqual(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).count(), 1) @@ -319,7 +319,7 @@ class CartTest(CartTestMixin, TestCase): }, follow=True) self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), target_status_code=200) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('no longer available', doc.select('.alert-danger')[0].text) self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists()) @@ -331,7 +331,7 @@ class CartTest(CartTestMixin, TestCase): }, follow=True) self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), target_status_code=200) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('no longer available', doc.select('.alert-danger')[0].text) self.assertIn('Early-bird', doc.select('.cart .cart-row')[0].select('strong')[0].text) self.assertIn('1', doc.select('.cart .cart-row')[0].select('.count')[0].text) @@ -396,7 +396,7 @@ class CartTest(CartTestMixin, TestCase): response = self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), { 'item_%d' % self.ticket.id: '1', }, follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('no longer available', doc.select('.alert-danger')[0].text) self.assertFalse(CartPosition.objects.filter(id=cp1.id).exists()) @@ -408,7 +408,7 @@ class CartTest(CartTestMixin, TestCase): response = self.client.post('/%s/%s/cart/remove' % (self.orga.slug, self.event.slug), { 'item_%d' % self.ticket.id: '1', }, follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('updated', doc.select('.alert-success')[0].text) self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists()) @@ -420,7 +420,7 @@ class CartTest(CartTestMixin, TestCase): response = self.client.post('/%s/%s/cart/remove' % (self.orga.slug, self.event.slug), { 'variation_%d_%d' % (self.shirt.id, self.shirt_red.id): '1', }, follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('updated', doc.select('.alert-success')[0].text) self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists()) @@ -436,7 +436,7 @@ class CartTest(CartTestMixin, TestCase): response = self.client.post('/%s/%s/cart/remove' % (self.orga.slug, self.event.slug), { 'item_%d' % self.ticket.id: '1', }, follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('updated', doc.select('.alert-success')[0].text) self.assertEqual(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).count(), 1) @@ -452,7 +452,7 @@ class CartTest(CartTestMixin, TestCase): response = self.client.post('/%s/%s/cart/remove' % (self.orga.slug, self.event.slug), { 'item_%d' % self.ticket.id: '2', }, follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('updated', doc.select('.alert-success')[0].text) self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists()) @@ -468,7 +468,7 @@ class CartTest(CartTestMixin, TestCase): response = self.client.post('/%s/%s/cart/remove' % (self.orga.slug, self.event.slug), { 'item_%d' % self.ticket.id: '1', }, follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('updated', doc.select('.alert-success')[0].text) objs = list(CartPosition.objects.filter(cart_id=self.session_key, event=self.event)) self.assertEqual(len(objs), 1) @@ -559,7 +559,7 @@ class CartTest(CartTestMixin, TestCase): response = self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), { 'item_%d_voucher' % self.ticket.id: v.code, }, follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('already been used', doc.select('.alert-danger')[0].text) self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists()) @@ -569,7 +569,7 @@ class CartTest(CartTestMixin, TestCase): response = self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), { 'item_%d_voucher' % self.ticket.id: v.code, }, follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('expired', doc.select('.alert-danger')[0].text) self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists()) @@ -577,7 +577,7 @@ class CartTest(CartTestMixin, TestCase): response = self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), { 'item_%d_voucher' % self.ticket.id: 'ABC', }, follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('not known', doc.select('.alert-danger')[0].text) self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists()) @@ -588,7 +588,7 @@ class CartTest(CartTestMixin, TestCase): response = self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), { 'item_%d_voucher' % self.ticket.id: v.code, }, follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('no longer available', doc.select('.alert-danger')[0].text) self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists()) @@ -614,7 +614,7 @@ class CartTest(CartTestMixin, TestCase): response = self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), { 'item_%d' % self.ticket.id: '1', }, follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('no longer available', doc.select('.alert-danger')[0].text) self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists()) response = self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), { @@ -640,7 +640,7 @@ class CartTest(CartTestMixin, TestCase): response = self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), { 'item_%d_voucher' % self.ticket.id: v.code, }, follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn('already used', doc.select('.alert-danger')[0].text) self.assertEqual(1, CartPosition.objects.filter(cart_id=self.session_key, event=self.event).count()) diff --git a/src/tests/presale/test_checkout.py b/src/tests/presale/test_checkout.py index 1dddeb9bee..8cae4fc703 100644 --- a/src/tests/presale/test_checkout.py +++ b/src/tests/presale/test_checkout.py @@ -60,7 +60,7 @@ class CheckoutTestCase(TestCase): price=20, expires=now() + timedelta(minutes=10) ) response = self.client.get('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select('input[name=%s-question_%s]' % (cr1.id, q1.id))), 1) self.assertEqual(len(doc.select('input[name=%s-question_%s]' % (cr2.id, q1.id))), 1) @@ -75,7 +75,7 @@ class CheckoutTestCase(TestCase): '%s-question_%s' % (cr2.id, q2.id): '', 'email': 'admin@localhost' }, follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertGreaterEqual(len(doc.select('.has-error')), 1) # Corrected request @@ -104,7 +104,7 @@ class CheckoutTestCase(TestCase): price=23, expires=now() + timedelta(minutes=10) ) response = self.client.get('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select('input[name=%s-attendee_name]' % cr1.id)), 1) # Not all required fields filled out, expect failure @@ -112,7 +112,7 @@ class CheckoutTestCase(TestCase): '%s-attendee_name' % cr1.id: '', 'email': 'admin@localhost' }, follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertGreaterEqual(len(doc.select('.has-error')), 1) # Corrected request @@ -134,7 +134,7 @@ class CheckoutTestCase(TestCase): price=23, expires=now() + timedelta(minutes=10) ) response = self.client.get('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select('input[name=%s-attendee_name]' % cr1.id)), 1) # Not all fields filled out, expect success @@ -157,7 +157,7 @@ class CheckoutTestCase(TestCase): price=23, expires=now() + timedelta(minutes=10) ) response = self.client.get('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select('input[name=payment]')), 2) response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), { 'payment': 'banktransfer' @@ -227,7 +227,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select(".thank-you")), 1) self.assertFalse(CartPosition.objects.filter(id=cr1.id).exists()) self.assertEqual(Order.objects.count(), 1) @@ -242,7 +242,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select(".thank-you")), 1) self.assertFalse(CartPosition.objects.filter(id=cr1.id).exists()) self.assertEqual(Order.objects.count(), 1) @@ -256,7 +256,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select(".thank-you")), 1) self.assertFalse(CartPosition.objects.filter(id=cr1.id).exists()) self.assertEqual(Order.objects.count(), 1) @@ -272,7 +272,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select(".alert-danger")), 1) cr1 = CartPosition.objects.get(id=cr1.id) self.assertEqual(cr1.price, 24) @@ -288,7 +288,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select(".alert-danger")), 1) cr1 = CartPosition.objects.get(id=cr1.id) self.assertEqual(cr1.price, 24) @@ -303,7 +303,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select(".thank-you")), 1) self.assertFalse(CartPosition.objects.filter(id=cr1.id).exists()) self.assertEqual(Order.objects.count(), 1) @@ -323,7 +323,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select(".thank-you")), 1) self.assertTrue(Voucher.objects.get(pk=v.pk).redeemed) @@ -337,7 +337,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select(".alert-danger")), 1) cr1 = CartPosition.objects.get(id=cr1.id) self.assertEqual(cr1.price, Decimal('12.00')) @@ -351,7 +351,7 @@ class CheckoutTestCase(TestCase): ) self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn("expired", doc.select(".alert-danger")[0].text) def test_voucher_redeemed(self): @@ -363,7 +363,7 @@ class CheckoutTestCase(TestCase): ) self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertIn("has already been", doc.select(".alert-danger")[0].text) def test_voucher_ignore_quota(self): @@ -378,7 +378,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select(".thank-you")), 1) self.assertFalse(CartPosition.objects.filter(id=cr1.id).exists()) self.assertEqual(Order.objects.count(), 1) @@ -396,14 +396,14 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select(".alert-danger")), 1) self.assertEqual(CartPosition.objects.filter(cart_id=self.session_key).count(), 1) cr1.voucher = v cr1.save() response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select(".thank-you")), 1) self.assertFalse(CartPosition.objects.filter(id=cr1.id).exists()) self.assertEqual(Order.objects.count(), 1) @@ -423,7 +423,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select(".alert-danger")), 1) self.assertFalse(Order.objects.exists()) @@ -443,13 +443,13 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(CartPosition.objects.filter(cart_id=self.session_key, voucher=v).count(), 1) self.assertEqual(len(doc.select(".alert-danger")), 1) self.assertFalse(Order.objects.exists()) response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, voucher=v).exists()) self.assertEqual(len(doc.select(".thank-you")), 1) self.assertEqual(Order.objects.count(), 1) @@ -469,7 +469,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select(".alert-danger")), 1) self.assertEqual(CartPosition.objects.filter(cart_id=self.session_key).count(), 1) @@ -483,7 +483,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertGreaterEqual(len(doc.select(".alert-danger")), 1) def test_confirm_require_voucher(self): @@ -496,7 +496,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertGreaterEqual(len(doc.select(".alert-danger")), 1) self.assertFalse(CartPosition.objects.filter(id=cr1.id).exists()) @@ -510,7 +510,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertGreaterEqual(len(doc.select(".alert-danger")), 1) self.assertFalse(CartPosition.objects.filter(id=cr1.id).exists()) @@ -524,7 +524,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertGreaterEqual(len(doc.select(".alert-danger")), 1) self.assertFalse(CartPosition.objects.filter(id=cr1.id).exists()) @@ -538,7 +538,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertGreaterEqual(len(doc.select(".alert-danger")), 1) self.assertFalse(CartPosition.objects.filter(id=cr1.id).exists()) @@ -551,7 +551,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertGreaterEqual(len(doc.select(".alert-danger")), 1) self.assertFalse(CartPosition.objects.filter(id=cr1.id).exists()) @@ -566,7 +566,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select(".thank-you")), 1) def test_confirm_expired_with_non_blocking_voucher_unavailable(self): @@ -580,7 +580,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertGreaterEqual(len(doc.select(".alert-danger")), 1) self.assertFalse(CartPosition.objects.filter(id=cr1.id).exists()) @@ -595,7 +595,7 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select(".thank-you")), 1) def test_confirm_not_expired_with_non_blocking_voucher_unavailable(self): @@ -609,5 +609,5 @@ class CheckoutTestCase(TestCase): self._set_session('payment', 'banktransfer') response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select(".thank-you")), 1) diff --git a/src/tests/presale/test_orders.py b/src/tests/presale/test_orders.py index d96ebecf0b..205b08ddb4 100644 --- a/src/tests/presale/test_orders.py +++ b/src/tests/presale/test_orders.py @@ -124,7 +124,7 @@ class OrdersTest(TestCase): '/%s/%s/order/%s/%s/' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret) ) assert response.status_code == 200 - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") assert len(doc.select(".cart-row")) > 0 assert "pending" in doc.select(".label-warning")[0].text.lower() @@ -143,7 +143,7 @@ class OrdersTest(TestCase): response = self.client.get( '/%s/%s/order/%s/%s/modify' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret)) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select('input[name=%s-attendee_name]' % self.ticket_pos.id)), 1) # Not all fields filled out, expect success @@ -164,7 +164,7 @@ class OrdersTest(TestCase): response = self.client.get( '/%s/%s/order/%s/%s/modify' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret)) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select('input[name=%s-attendee_name]' % self.ticket_pos.id)), 1) # Not all required fields filled out, expect failure @@ -172,7 +172,7 @@ class OrdersTest(TestCase): '/%s/%s/order/%s/%s/modify' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), { '%s-attendee_name' % self.ticket_pos.id: '', }, follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertGreaterEqual(len(doc.select('.has-error')), 1) response = self.client.post( @@ -191,7 +191,7 @@ class OrdersTest(TestCase): response = self.client.get( '/%s/%s/order/%s/%s/modify' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret)) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select('input[name=%s-question_%s]' % ( self.ticket_pos.id, self.question.id))), 1) @@ -214,7 +214,7 @@ class OrdersTest(TestCase): response = self.client.get('/%s/%s/order/%s/%s/modify' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret)) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertEqual(len(doc.select('input[name=%s-question_%s]' % ( self.ticket_pos.id, self.question.id))), 1) @@ -223,7 +223,7 @@ class OrdersTest(TestCase): '/%s/%s/order/%s/%s/modify' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), { '%s-question_%s' % (self.ticket_pos.id, self.question.id): '', }, follow=True) - doc = BeautifulSoup(response.rendered_content) + doc = BeautifulSoup(response.rendered_content, "lxml") self.assertGreaterEqual(len(doc.select('.has-error')), 1) response = self.client.post( From 3bc2ddf79d9d83f5ec6ce0918c61ac2f6fb42b57 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 27 Sep 2016 11:06:43 +0200 Subject: [PATCH 6/7] Fixed a test that should have never worked --- src/tests/control/test_orders.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/tests/control/test_orders.py b/src/tests/control/test_orders.py index 9825ef135e..f23fedffec 100644 --- a/src/tests/control/test_orders.py +++ b/src/tests/control/test_orders.py @@ -3,6 +3,7 @@ from decimal import Decimal import pytest from django.core import mail +from django.core.files.uploadedfile import SimpleUploadedFile from django.utils.timezone import now from tests.base import SoupTest @@ -311,13 +312,16 @@ def test_order_download_success(client, env, mocker): tickets.generate.apply_async.assert_any_call(args=(o.id, 'testdummy')) assert 'download' in response['Location'] dl = response['Location'] - assert CachedTicket.objects.filter(order=o, provider='testdummy').exists() # test caching - tickets.generate.apply_async.reset_mock() + mocker.resetall() + ct = CachedTicket.objects.get(order=o, provider='testdummy') + ct.cachedfile.file.save('foo.jpg', SimpleUploadedFile("sample_invalid_image.jpg", b"file_content", + content_type="image/jpeg")) + ct.cachedfile.save() response = client.get('/control/event/dummy/dummy/orders/FOO/download/testdummy') assert response.status_code == 302 - assert tickets.generate.apply_async.assert_not_called() + tickets.generate.apply_async.assert_not_called() assert dl == response['Location'] From b6a34975a91ec32f7d97b34e622e5af8bf588214 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 27 Sep 2016 11:06:58 +0200 Subject: [PATCH 7/7] py.test: rerun and print warnings by default --- doc/development/setup.rst | 3 --- src/pytest.ini | 1 + src/requirements/dev.txt | 1 + 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/doc/development/setup.rst b/doc/development/setup.rst index 83aeb70988..486f486fe9 100644 --- a/doc/development/setup.rst +++ b/doc/development/setup.rst @@ -96,9 +96,6 @@ Before you check in your code into git, always run the static checkers and unit package ``pytest-xdist`` using ``pip install pytest-xdist`` and then run ``py.test -n NUM`` with ``NUM`` being the number of threads you want to use. -.. note:: We currently have some flaky tests that we haven't yet been able to debug. If you just run - ``py.test --rerun 5`` they'll be rerun and only reported as failures if they fail repeatedly. - It is a good idea to put this command into your git hook ``.git/hooks/pre-commit``, for example:: diff --git a/src/pytest.ini b/src/pytest.ini index 929815d975..7a7ce31252 100644 --- a/src/pytest.ini +++ b/src/pytest.ini @@ -1,2 +1,3 @@ [pytest] DJANGO_SETTINGS_MODULE=tests.settings +addopts =--rerun 3 -rw diff --git a/src/requirements/dev.txt b/src/requirements/dev.txt index 82b9bf5449..6567a61d38 100644 --- a/src/requirements/dev.txt +++ b/src/requirements/dev.txt @@ -12,3 +12,4 @@ pytest-django isort pytest-mock pytest-rerunfailures +pytest-warnings