Basic tests for cart features

This commit is contained in:
Raphael Michel
2015-02-20 01:14:23 +01:00
parent 4da23d33b5
commit 504081cce3
4 changed files with 68 additions and 11 deletions

View File

@@ -3,7 +3,7 @@
{% block content %} {% block content %}
{% if cart.positions %} {% if cart.positions %}
<div class="panel panel-primary"> <div class="panel panel-primary cart">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title">{% trans "Your cart" %}</h3> <h3 class="panel-title">{% trans "Your cart" %}</h3>
</div> </div>

View File

@@ -1,11 +1,10 @@
import datetime import datetime
from django.test import TestCase, Client import time
from pretix.base.models import Item, Organizer, Event, ItemCategory, Quota, Property, PropertyValue, ItemVariation from pretix.base.models import Item, Organizer, Event, ItemCategory, Quota, Property, PropertyValue, ItemVariation, User
from pretix.base.tests import BrowserTest, on_platforms from pretix.base.tests import BrowserTest
@on_platforms()
class EventMiddlewareTest(BrowserTest): class EventMiddlewareTest(BrowserTest):
def setUp(self): def setUp(self):
@@ -26,7 +25,6 @@ class EventMiddlewareTest(BrowserTest):
self.assertEqual(resp.status_code, 404) self.assertEqual(resp.status_code, 404)
@on_platforms()
class ItemDisplayTest(BrowserTest): class ItemDisplayTest(BrowserTest):
def setUp(self): def setUp(self):
@@ -120,3 +118,58 @@ class ItemDisplayTest(BrowserTest):
self.driver.find_elements_by_css_selector("section:nth-of-type(1) div.variation")[1].text) self.driver.find_elements_by_css_selector("section:nth-of-type(1) div.variation")[1].text)
self.assertIn("12.00", self.assertIn("12.00",
self.driver.find_elements_by_css_selector("section:nth-of-type(1) div.variation")[1].text) self.driver.find_elements_by_css_selector("section:nth-of-type(1) div.variation")[1].text)
class CartTest(BrowserTest):
def setUp(self):
super().setUp()
self.orga = Organizer.objects.create(name='CCC', slug='ccc')
self.event = Event.objects.create(
organizer=self.orga, name='30C3', slug='30c3',
date_from=datetime.datetime(2013, 12, 26, tzinfo=datetime.timezone.utc),
)
self.user = User.objects.create_local_user(self.event, 'demo', 'demo')
self.driver.implicitly_wait(10)
self.category = ItemCategory.objects.create(event=self.event, name="Everything", position=0)
self.quota_shirts = Quota.objects.create(event=self.event, name='Shirts', size=2)
self.shirt = Item.objects.create(event=self.event, name='T-Shirt', category=self.category, default_price=12)
prop1 = Property.objects.create(event=self.event, name="Color")
self.shirt.properties.add(prop1)
val1 = PropertyValue.objects.create(prop=prop1, value="Red", position=0)
val2 = PropertyValue.objects.create(prop=prop1, value="Black", position=1)
self.quota_shirts.items.add(self.shirt)
self.shirt_red = ItemVariation.objects.create(item=self.shirt, default_price=14)
self.shirt_red.values.add(val1)
var2 = ItemVariation.objects.create(item=self.shirt)
var2.values.add(val2)
self.quota_shirts.variations.add(self.shirt_red)
self.quota_shirts.variations.add(var2)
self.quota_tickets = Quota.objects.create(event=self.event, name='Tickets', size=1)
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket',
category=self.category, default_price=23)
self.quota_tickets.items.add(self.ticket)
def test_not_logged_in(self):
self.driver.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug))
# add the entry ticket to cart
self.driver.find_element_by_css_selector('input[type=number][name=item_%s]' % self.ticket.identity).send_keys('1')
self.scroll_and_click(self.driver.find_element_by_css_selector('.checkout-button-row button'))
# should redirect to login page
self.driver.find_element_by_name('username')
def test_simple_login(self):
self.driver.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug))
# add the entry ticket to cart
self.driver.find_element_by_css_selector('input[type=number][name=item_%s]' % self.ticket.identity).send_keys('1')
self.scroll_and_click(self.driver.find_element_by_css_selector('.checkout-button-row button'))
# should redirect to login page
# open the login accordion
self.scroll_and_click(self.driver.find_element_by_css_selector('a[href*=loginForm]'))
time.sleep(1)
# enter login details
self.driver.find_element_by_css_selector('#loginForm input[name=username]').send_keys('demo')
self.driver.find_element_by_css_selector('#loginForm input[name=password]').send_keys('demo')
self.scroll_and_click(self.driver.find_element_by_css_selector('#loginForm button.btn-primary'))
# should display our ticket
self.assertIn('Early-bird', self.driver.find_element_by_css_selector('.cart-row:first-child').text)

View File

@@ -100,7 +100,7 @@ class CartAdd(EventViewMixin, CartActionMixin, View):
(request.user.event is None or request.user.event == request.event): (request.user.event is None or request.user.event == request.event):
request.session['cart_tmp'] = json.dumps(items) request.session['cart_tmp'] = json.dumps(items)
return redirect_to_login( return redirect_to_login(
request.path, reverse('presale:event.checkout.login', kwargs={ self.get_success_url(), reverse('presale:event.checkout.login', kwargs={
'organizer': request.event.organizer.slug, 'organizer': request.event.organizer.slug,
'event': request.event.slug, 'event': request.event.slug,
}), 'next' }), 'next'
@@ -239,8 +239,4 @@ class CartAdd(EventViewMixin, CartActionMixin, View):
return redirect(self.get_success_url()) return redirect(self.get_success_url())
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
if 'cart_tmp' in request.session and request.user.is_authenticated():
items = json.loads(request.session['cart_tmp'])
del request.session['cart_tmp']
return self.process(items)
return redirect(self.get_failure_url()) return redirect(self.get_failure_url())

View File

@@ -1,3 +1,4 @@
import json
from django.contrib.auth import authenticate from django.contrib.auth import authenticate
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.core.validators import RegexValidator from django.core.validators import RegexValidator
@@ -13,6 +14,7 @@ from django.conf import settings
from pretix.base.models import User from pretix.base.models import User
from pretix.presale.views import EventViewMixin, CartDisplayMixin from pretix.presale.views import EventViewMixin, CartDisplayMixin
from pretix.presale.views.cart import CartAdd
class EventIndex(EventViewMixin, CartDisplayMixin, TemplateView): class EventIndex(EventViewMixin, CartDisplayMixin, TemplateView):
@@ -205,6 +207,12 @@ class EventLogin(EventViewMixin, TemplateView):
template_name = 'pretixpresale/event/login.html' template_name = 'pretixpresale/event/login.html'
def redirect_to_next(self): def redirect_to_next(self):
if 'cart_tmp' in self.request.session and self.request.user.is_authenticated():
items = json.loads(self.request.session['cart_tmp'])
del self.request.session['cart_tmp']
ca = CartAdd()
ca.request = self.request
return ca.process(items)
if 'next' in self.request.GET: if 'next' in self.request.GET:
return redirect(self.request.GET.get('next')) return redirect(self.request.GET.get('next'))
else: else: