diff --git a/src/pretix/base/tests/__init__.py b/src/pretix/base/tests/__init__.py index fd32190b80..dfc720572f 100644 --- a/src/pretix/base/tests/__init__.py +++ b/src/pretix/base/tests/__init__.py @@ -20,7 +20,7 @@ class BrowserTest(StaticLiveServerTestCase): def setUp(self): self.driver = getattr(webdriver, BROWSER)() self.driver.set_window_size(1920, 1080) - self.driver.implicitly_wait(3) + self.driver.implicitly_wait(10) def tearDown(self): self.driver.quit() diff --git a/src/pretix/presale/tests/test_cart.py b/src/pretix/presale/tests/test_cart.py new file mode 100644 index 0000000000..e798ccfa6e --- /dev/null +++ b/src/pretix/presale/tests/test_cart.py @@ -0,0 +1,108 @@ +import datetime +import time +from bs4 import BeautifulSoup +from django.test import TestCase + +from pretix.base.models import Item, Organizer, Event, ItemCategory, Quota, Property, PropertyValue, ItemVariation, User +from pretix.base.tests import BrowserTest + + +class CartTestMixin: + + 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.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=5) + 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) + + +class CartBrowserTest(CartTestMixin, BrowserTest): + + 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) + + +class CartTest(CartTestMixin, TestCase): + + def setUp(self): + super().setUp() + self.assertTrue(self.client.login(username='demo@%s.event.pretix' % self.event.identity, password='demo')) + + def test_simple(self): + response = self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), { + 'item_' + self.ticket.identity: '1' + }, follow=True) + self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), + target_status_code=200) + doc = BeautifulSoup(response.rendered_content) + 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) + self.assertIn('23', doc.select('.cart .cart-row')[0].select('.price')[1].text) + + def test_variation(self): + response = self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), { + 'variation_' + self.shirt.identity + '_' + self.shirt_red.identity: '1' + }, follow=True) + self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), + target_status_code=200) + doc = BeautifulSoup(response.rendered_content) + 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) + self.assertIn('14', doc.select('.cart .cart-row')[0].select('.price')[0].text) + self.assertIn('14', doc.select('.cart .cart-row')[0].select('.price')[1].text) + + def test_count(self): + response = self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), { + 'item_' + self.ticket.identity: '2' + }, follow=True) + self.assertRedirects(response, '/%s/%s/' % (self.orga.slug, self.event.slug), + target_status_code=200) + doc = BeautifulSoup(response.rendered_content) + 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) + self.assertIn('46', doc.select('.cart .cart-row')[0].select('.price')[1].text) diff --git a/src/pretix/presale/tests/test_event.py b/src/pretix/presale/tests/test_event.py index 4de978a73a..f72040181a 100644 --- a/src/pretix/presale/tests/test_event.py +++ b/src/pretix/presale/tests/test_event.py @@ -118,58 +118,3 @@ class ItemDisplayTest(BrowserTest): 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) - - -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) diff --git a/src/pretix/presale/views/cart.py b/src/pretix/presale/views/cart.py index c61c063fa0..b8213a48b0 100644 --- a/src/pretix/presale/views/cart.py +++ b/src/pretix/presale/views/cart.py @@ -97,7 +97,7 @@ class CartAdd(EventViewMixin, CartActionMixin, View): # We do not use EventLoginRequiredMixin here, as we want to store stuff into the # session beforehand if not request.user.is_authenticated() or \ - (request.user.event is None or request.user.event == request.event): + (request.user.event is not None and request.user.event != request.event): request.session['cart_tmp'] = json.dumps(items) return redirect_to_login( self.get_success_url(), reverse('presale:event.checkout.login', kwargs={