Ejemplo n.º 1
0
 def test_price(self):
     customer = factory.create_customer(self.app)
     product1 = Product(sku='A')
     product2 = Product(sku='B')
     transaction = Transaction(customer=customer)
     transaction.add_product(product1, 2, 20)
     transaction.add_product(product2, 3, 20)
     self.assertEqual(transaction.total, 5)
Ejemplo n.º 2
0
 def test_add_products(self):
     customer = factory.create_customer(self.app)
     transaction = Transaction(customer=customer)
     product1 = Product(sku='A')
     product2 = Product(sku='B')
     transaction.add_product(product1, 10, 20)
     transaction.add_product(product2, 10, 20)
     self.db.session.add(transaction)
     self.db.session.commit()
     self.assertEqual(transaction.products, [product1, product2])
     self.assertEqual(product1.transactions, [transaction])
     self.assertEqual(product2.transactions, [transaction])
Ejemplo n.º 3
0
 def setUp(self):
     self.customer = factory.create_customer(self.app)
     self.user = self.customer.user
     self.vendor = Vendor(slug='test_vendor',
                          redirect_url='https://google.com')
     self.transaction = Transaction(customer=self.customer,
                                    status=Transaction.Status.OPEN)
     product1 = Product(sku='A', vendor=self.vendor)
     product2 = Product(sku='B', vendor=self.vendor)
     self.transaction.add_product(product1, 50, 100)
     self.transaction.add_product(product2, 80, 200)
     self.db.session.add(self.transaction)
     self.db.session.add(self.vendor)
     self.db.session.commit()
Ejemplo n.º 4
0
    def test_multiple_transactions_per_product(self):
        customer = factory.create_customer(self.app)
        product1 = Product(sku='A')
        product2 = Product(sku='B')

        for _ in range(2):
            transaction = Transaction(customer=customer)
            transaction.add_product(product1, 10, 20)
            transaction.add_product(product2, 10, 20)
            self.db.session.add(transaction)
            self.db.session.commit()

        transactions = Transaction.query.all()
        self.assertEqual(product1.transactions, transactions)
        self.assertEqual(product2.transactions, transactions)
Ejemplo n.º 5
0
def create_transaction(app, customer):
    transaction = Transaction(
            customer=customer,
            status=Transaction.Status.OPEN)
    app.db.session.add(transaction)
    app.db.session.commit()
    return transaction
Ejemplo n.º 6
0
 def test_customer(self):
     customer = factory.create_customer(self.app)
     transaction = Transaction(customer=customer)
     self.db.session.add(transaction)
     self.db.session.commit()
     self.assertEqual(transaction.customer, customer)
     self.assertEqual(customer.transactions, [transaction])
Ejemplo n.º 7
0
    def test_status(self):
        customer = factory.create_customer(self.app)

        for status in Transaction.Status:
            transaction = Transaction(customer=customer, status=status)
            self.db.session.add(transaction)
            self.db.session.commit()

        transaction = Transaction.query.all()
        self.assertEqual(transaction[0].status.name, 'OPEN')
        self.assertEqual(transaction[1].status.name, 'SUCCESS')
        self.assertEqual(transaction[2].status.name, 'FAILURE')
Ejemplo n.º 8
0
class PaymentTests(Base):
    def setUp(self):
        self.customer = factory.create_customer(self.app)
        self.user = self.customer.user
        self.vendor = Vendor(slug='test_vendor',
                             redirect_url='https://google.com')
        self.transaction = Transaction(customer=self.customer,
                                       status=Transaction.Status.OPEN)
        product1 = Product(sku='A', vendor=self.vendor)
        product2 = Product(sku='B', vendor=self.vendor)
        self.transaction.add_product(product1, 50, 100)
        self.transaction.add_product(product2, 80, 200)
        self.db.session.add(self.transaction)
        self.db.session.add(self.vendor)
        self.db.session.commit()

    def test_payment(self):
        self.client.post('/login',
                         data={
                             'email': self.user.email,
                             'password': self.user.password
                         },
                         follow_redirects=True)

        data = {'txid': str(self.transaction.uuid), 'token': 'tok_visa'}
        resp = self.client.post('/checkout/pay', data=data)
        self.assertEqual(resp.status_code, 302)
        self.assertEqual(
            '{}?txid={}&vid={}'.format(self.vendor.redirect_url,
                                       str(self.transaction.uuid),
                                       self.vendor.id), resp.location)
        self.assertEqual(self.transaction.status, Transaction.Status.SUCCESS)

    def test_payment_unauthenticated(self):
        data = {'txid': str(self.transaction.uuid), 'token': 'tok_visa'}
        resp = self.client.post('/checkout/pay', data=data)
        self.assertEqual(resp.status_code, 302)
        self.assertEqual(self.transaction.status, Transaction.Status.OPEN)

    def test_payment_not_owner(self):
        diff_customer = factory.create_customer(self.app)
        diff_user = diff_customer.user
        self.client.post('/login',
                         data={
                             'email': diff_user.email,
                             'password': diff_user.password
                         },
                         follow_redirects=True)

        data = {'txid': str(self.transaction.uuid), 'token': 'tok_visa'}
        resp = self.client.post('/checkout/pay', data=data)
        self.assertEqual(resp.status_code, 401)
        self.assertEqual(self.transaction.status, Transaction.Status.OPEN)

    def test_payment_not_open(self):
        self.client.post('/login',
                         data={
                             'email': self.user.email,
                             'password': self.user.password
                         },
                         follow_redirects=True)

        status = Transaction.Status.FAILURE
        self.transaction.status = status
        self.db.session.add(self.transaction)
        self.db.session.commit()

        data = {'txid': str(self.transaction.uuid), 'token': 'tok_visa'}
        resp = self.client.post('/checkout/pay', data=data)
        self.assertEqual(resp.status_code, 403)
        self.assertEqual(self.transaction.status, status)

    def test_payment_nonexistent_transaction(self):
        self.client.post('/login',
                         data={
                             'email': self.user.email,
                             'password': self.user.password
                         },
                         follow_redirects=True)

        data = {'txid': str(uuid.uuid4()), 'token': 'tok_visa'}
        resp = self.client.post('/checkout/pay', data=data)
        self.assertEqual(resp.status_code, 404)
        self.assertEqual(self.transaction.status, Transaction.Status.OPEN)

    def test_payment_bad_token(self):
        self.client.post('/login',
                         data={
                             'email': self.user.email,
                             'password': self.user.password
                         },
                         follow_redirects=True)

        data = {'txid': str(self.transaction.uuid), 'token': 'foo'}
        resp = self.client.post('/checkout/pay', data=data)
        self.assertEqual(resp.status_code, 400)
        self.assertEqual(self.transaction.status, Transaction.Status.OPEN)

    def test_payment_not_customer(self):
        not_customer = factory.create_vendor(self.app)
        user = not_customer.user
        self.client.post('/login',
                         data={
                             'email': user.email,
                             'password': user.password
                         },
                         follow_redirects=True)

        data = {'txid': str(self.transaction.uuid), 'token': 'foo'}
        resp = self.client.post('/checkout/pay', data=data)
        self.assertEqual(resp.status_code, 302)
        self.assertEqual(self.transaction.status, Transaction.Status.OPEN)

    def test_payment_saves_stripe_id(self):
        self.assertIsNone(self.customer.stripe_id)

        self.client.post('/login',
                         data={
                             'email': self.user.email,
                             'password': self.user.password
                         },
                         follow_redirects=True)

        data = {'txid': str(self.transaction.uuid), 'token': 'tok_visa'}
        self.client.post('/checkout/pay', data=data)
        self.assertIsNotNone(self.customer.stripe_id)