def test_05_creation(self): """Test creation of orders through the shop object""" shop = plata.shop_instance() request = get_request() order = shop.order_from_request(request) self.assertEqual(order, None) order = shop.order_from_request(request, create=True) self.assertEqual(Order.objects.count(), 1) self.assertEqual(order.user, None)
def test_02_authenticated_user_has_contact(self): """Test shop.contact_from_user works correctly""" user = User.objects.create_user('test', '*****@*****.**', 'testing') self.client.login(username='******', password='******') contact = Contact.objects.create(user=user) shop = plata.shop_instance() request = get_request(user=user) self.assertEqual(shop.contact_from_user(request.user), contact)
def test_07_paypal_ipn(self): """Test PayPal Instant Payment Notification handler""" paypal_ipn_data = { 'txn_id': '123456789', 'invoice': 'Order-1-1', 'mc_currency': 'CHF', 'mc_gross': '1234', 'payment_status': 'Completed', } from plata.payment.modules import paypal import cgi def mock_urlopen(*args, **kwargs): qs = cgi.parse_qs(args[1]) assert qs['cmd'][0] == '_notify-validate' for k, v in paypal_ipn_data.iteritems(): assert qs[k][0] == v import StringIO s = StringIO.StringIO('VERIFIED') return s paypal.urllib.urlopen = mock_urlopen shop = plata.shop_instance() request = get_request() product = self.create_product() product.variations.get().stock_transactions.create( type=StockTransaction.PURCHASE, change=10) self.client.post(product.get_absolute_url(), { 'quantity': 5, }) response = self.client.post( '/confirmation/', { 'terms_and_conditions': True, 'payment_method': 'plata.payment.modules.paypal', }) self.assertContains(response, 'sandbox') self.assertEqual(StockTransaction.objects.count(), 2) self.assertEqual(Order.objects.count(), 1) self.assertEqual(OrderPayment.objects.count(), 1) self.assertContains( self.client.post('/payment/paypal/ipn/', paypal_ipn_data), 'Ok') order = Order.objects.get(pk=1) assert order.is_paid() self.assertEqual(StockTransaction.objects.count(), 2)
def test_07_paypal_ipn(self): """Test PayPal Instant Payment Notification handler""" paypal_ipn_data = { 'txn_id': '123456789', 'invoice': 'Order-1-1', 'mc_currency': 'CHF', 'mc_gross': '1234', 'payment_status': 'Completed', } from plata.payment.modules import paypal import cgi def mock_urlopen(*args, **kwargs): qs = cgi.parse_qs(args[1]) assert qs['cmd'][0] == '_notify-validate' for k, v in paypal_ipn_data.iteritems(): assert qs[k][0] == v import StringIO s = StringIO.StringIO('VERIFIED') return s paypal.urllib.urlopen = mock_urlopen shop = plata.shop_instance() request = get_request() product = self.create_product() product.variations.get().stock_transactions.create(type=StockTransaction.PURCHASE, change=10) self.client.post(product.get_absolute_url(), { 'quantity': 5, }) response = self.client.post('/confirmation/', { 'terms_and_conditions': True, 'payment_method': 'plata.payment.modules.paypal', }) self.assertContains(response, 'sandbox') self.assertEqual(StockTransaction.objects.count(), 2) self.assertEqual(Order.objects.count(), 1) self.assertEqual(OrderPayment.objects.count(), 1) self.assertContains(self.client.post('/payment/paypal/ipn/', paypal_ipn_data), 'Ok') order = Order.objects.get(pk=1) assert order.is_paid() self.assertEqual(StockTransaction.objects.count(), 2)
def test_06_postfinance_ipn(self): """Test Postfinance server-to-server request handling""" shop = plata.shop_instance() request = get_request() product = self.create_product() self.client.post(product.get_absolute_url(), { 'quantity': 5, }) Period.objects.create(name='Test period') product.variations.get().stock_transactions.create(type=StockTransaction.PURCHASE, change=10) self.client.post(product.get_absolute_url(), { 'quantity': 5, }) response = self.client.post('/confirmation/', { 'terms_and_conditions': True, 'payment_method': 'plata.payment.modules.postfinance', }) self.assertContains(response, 'SHASign') self.assertContains(response, '721735bc3876094bb7e5ff075de8411d85494a66') self.assertEqual(StockTransaction.objects.count(), 2) self.assertEqual(Order.objects.count(), 1) self.assertEqual(OrderPayment.objects.count(), 1) self.assertContains(self.client.post('/payment/postfinance/ipn/', { }), 'Missing data', status_code=403) order = Order.objects.get(pk=1) ipn_data = { 'orderID': 'Order-1-1', 'currency': order.currency, 'amount': order.balance_remaining, 'PM': 'Postfinance', 'ACCEPTANCE': 'xxx', 'STATUS': '5', # Authorized 'CARDNO': 'xxxxxxxxxxxx1111', 'PAYID': '123456789', 'NCERROR': '', 'BRAND': 'VISA', 'SHASIGN': 'this-value-is-invalid', } self.assertContains(self.client.post('/payment/postfinance/ipn/', ipn_data), 'Hash did not validate', status_code=403) ipn_data['SHASIGN'] = '4b4cf5f9a5f0b54cc119be3696f43f81139232ae' self.assertContains(self.client.post('/payment/postfinance/ipn/', ipn_data), 'OK', status_code=200) order = Order.objects.get(pk=1) assert order.is_paid() self.assertEqual(StockTransaction.objects.count(), 2) # Manipulate paid amount order.paid -= 10 order.save() self.assertRedirects(self.client.get('/cart/'), '/confirmation/?confirmed=1') self.assertContains(self.client.get('/order/success/'), '<h1>Order has been partially paid.</h1>') # Revert manipulation order.paid += 10 order.save() self.assertRedirects(self.client.get('/checkout/'), '/order/success/')
def test_06_postfinance_ipn(self): """Test Postfinance server-to-server request handling""" shop = plata.shop_instance() request = get_request() product = self.create_product() self.client.post(product.get_absolute_url(), { 'quantity': 5, }) Period.objects.create(name='Test period') product.variations.get().stock_transactions.create( type=StockTransaction.PURCHASE, change=10) self.client.post(product.get_absolute_url(), { 'quantity': 5, }) response = self.client.post( '/confirmation/', { 'terms_and_conditions': True, 'payment_method': 'plata.payment.modules.postfinance', }) self.assertContains(response, 'SHASign') self.assertContains(response, '721735bc3876094bb7e5ff075de8411d85494a66') self.assertEqual(StockTransaction.objects.count(), 2) self.assertEqual(Order.objects.count(), 1) self.assertEqual(OrderPayment.objects.count(), 1) self.assertContains(self.client.post('/payment/postfinance/ipn/', {}), 'Missing data', status_code=403) order = Order.objects.get(pk=1) ipn_data = { 'orderID': 'Order-1-1', 'currency': order.currency, 'amount': order.balance_remaining, 'PM': 'Postfinance', 'ACCEPTANCE': 'xxx', 'STATUS': '5', # Authorized 'CARDNO': 'xxxxxxxxxxxx1111', 'PAYID': '123456789', 'NCERROR': '', 'BRAND': 'VISA', 'SHASIGN': 'this-value-is-invalid', } self.assertContains(self.client.post('/payment/postfinance/ipn/', ipn_data), 'Hash did not validate', status_code=403) ipn_data['SHASIGN'] = '4b4cf5f9a5f0b54cc119be3696f43f81139232ae' self.assertContains(self.client.post('/payment/postfinance/ipn/', ipn_data), 'OK', status_code=200) order = Order.objects.get(pk=1) assert order.is_paid() self.assertEqual(StockTransaction.objects.count(), 2) # Manipulate paid amount order.paid -= 10 order.save() self.assertRedirects(self.client.get('/cart/'), '/confirmation/?confirmed=1') self.assertContains(self.client.get('/order/success/'), '<h1>Order has been partially paid.</h1>') # Revert manipulation order.paid += 10 order.save() self.assertRedirects(self.client.get('/checkout/'), '/order/success/')