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.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( set(( StockTransaction.PURCHASE, StockTransaction.SALE, StockTransaction.PAYMENT_PROCESS_RESERVATION, )), set(StockTransaction.objects.values_list('type', flat=True)))
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.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) with warnings.catch_warnings(record=True) as w: self.assertTrue(order.is_paid()) self.assertEqual(len(w), 1) self.assertTrue( 'Order.is_paid() has been deprecated' in str(w[-1])) self.assertEqual( set(( StockTransaction.PURCHASE, StockTransaction.SALE, StockTransaction.PAYMENT_PROCESS_RESERVATION, )), set(StockTransaction.objects.values_list('type', flat=True)))
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_06_postfinance_ipn(self): """Test Postfinance server-to-server request handling""" shop = plata.shop_instance() request = get_request() product = self.create_product() Period.objects.create(name='Test period') product.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.get().status, Order.CONFIRMED) self.assertEqual(OrderPayment.objects.count(), 1) self.client.get('/order/payment_failure/') # payment process reservation should have been removed now, # this does not change anything else though self.assertEqual(StockTransaction.objects.count(), 1) self.assertEqual(Order.objects.get().status, Order.CHECKOUT) 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) with warnings.catch_warnings(record=True) as w: self.assertTrue(order.is_paid()) self.assertEqual(len(w), 1) self.assertTrue( 'Order.is_paid() has been deprecated' in str(w[-1])) 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_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', 'last_name': u'H\xe5konsen', } from plata.payment.modules import paypal import cgi def mock_urlopen(*args, **kwargs): qs = cgi.parse_qs(args[1].encode('ascii')) self.assertEqual(qs['cmd'][0], '_notify-validate') for k, v in paypal_ipn_data.iteritems(): self.assertEqual(unicode(qs[k][0], 'utf-8'), v) import StringIO s = StringIO.StringIO('VERIFIED') return s paypal.urllib2.urlopen = mock_urlopen shop = plata.shop_instance() request = get_request() product = self.create_product() product.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' ) # test windows-1252 encoded IPN also: self.assertContains( self.client.post( '/payment/paypal/ipn/', dict( map( lambda (k,v): (k, v.encode('windows-1252')), dict(paypal_ipn_data, charset='windows-1252').items() ) ), ), 'Ok' ) order = Order.objects.get(pk=1) assert order.is_paid() self.assertEqual( set(( StockTransaction.PURCHASE, StockTransaction.SALE, StockTransaction.PAYMENT_PROCESS_RESERVATION, )), set(StockTransaction.objects.values_list('type', flat=True)))
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.get("/order/success/"), "<h1>Order has been confirmed.</h1>") 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/") self.assertContains(self.client.get("/order/success/"), "<h1>Order has been fully paid.</h1>")
def test_06_postfinance_ipn(self): """Test Postfinance server-to-server request handling""" shop = plata.shop_instance() request = get_request() product = self.create_product() Period.objects.create(name='Test period') product.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.get().status, Order.CONFIRMED) self.assertEqual(OrderPayment.objects.count(), 1) self.client.get('/order/payment_failure/') # payment process reservation should have been removed now, # this does not change anything else though self.assertEqual(StockTransaction.objects.count(), 1) self.assertEqual(Order.objects.get().status, Order.CHECKOUT) 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/')