Exemple #1
0
    def test_inventory_system(self):
        p = models.Product(id=1, stock=10)
        self.api.update_product(p)

        p = self.api.get_product(id=1)
        self.assertEqual(p.stock, 10)
        self.assertTrue(p.countable)

        for i in range(1, 6):
            pur = models.Purchase(consumer_id=1,
                                  product_id=1,
                                  amount=2,
                                  comment='testing inventory')
            self.api.insert_purchase(pur)

        p = self.api.get_product(id=1)
        self.assertEqual(p.stock, 0)

        for i in range(1, 3):
            pur = models.Purchase(id=i,
                                  revoked=True,
                                  comment='revoking purchase')
            self.api.update_purchase(pur)

        p = self.api.get_product(id=1)
        self.assertEqual(p.stock, 4)

        # check non countable products
        p = models.Product(name='Water',
                           countable=False,
                           price=20,
                           department_id=2,
                           revocable=True)

        self.api.insert_product(p)
        p = self.api.get_product(id=4)
        self.assertFalse(p.countable)
        self.assertEqual(p.stock, None)

        pur = models.Purchase(consumer_id=1,
                              product_id=4,
                              amount=5,
                              comment='testing inventory')

        p = self.api.get_product(id=4)
        self.assertEqual(p.stock, None)
Exemple #2
0
    def test_limit_list_purchases(self):
        # check, if the objects are correct
        consumer = self.api.get_consumer(id=1)
        product = self.api.get_product(id=1)
        self.assertEqual(consumer.credit, 0)
        self.assertEqual(product.price, 25)

        pur = models.Purchase(consumer_id=1,
                              product_id=1,
                              amount=1,
                              comment="purchase done by unittest")
        self.api.insert_purchase(pur)
        pur = models.Purchase(consumer_id=1,
                              product_id=1,
                              amount=2,
                              comment="purchase done by unittest")
        self.api.insert_purchase(pur)
        pur = models.Purchase(consumer_id=1,
                              product_id=1,
                              amount=3,
                              comment="purchase done by unittest")
        self.api.insert_purchase(pur)
        pur = models.Purchase(consumer_id=1,
                              product_id=1,
                              amount=4,
                              comment="purchase done by unittest")
        self.api.insert_purchase(pur)

        # get all purchases
        purchases = self.api.list_purchases()
        self.assertEqual(len(purchases), 4)
        self.assertEqual(purchases[0].amount, 1)
        self.assertEqual(purchases[1].amount, 2)
        self.assertEqual(purchases[2].amount, 3)
        self.assertEqual(purchases[3].amount, 4)

        # get purchases with limit
        purchases = self.api.list_purchases(limit=2)
        self.assertEqual(len(purchases), 2)
        self.assertEqual(purchases[0].amount, 4)
        self.assertEqual(purchases[1].amount, 3)
Exemple #3
0
    def test_get_top_products(self):
        # buy 3x Coffee and 2x Twix
        for i in range(0, 3):
            pur = models.Purchase(consumer_id=1,
                                  product_id=1,
                                  amount=1,
                                  comment="bought with karma")
            self.api.insert_purchase(pur)
        for i in range(0, 2):
            pur = models.Purchase(consumer_id=1,
                                  product_id=2,
                                  amount=1,
                                  comment="bought with karma")
            self.api.insert_purchase(pur)

        top = self.api.get_top_products(department_id=2, num_products=2)
        self.assertEqual(len(top), 2)
        self.assertEqual(top[0][0], 1)
        self.assertEqual(top[0][1], 3)
        self.assertEqual(top[1][0], 2)
        self.assertEqual(top[1][1], 2)
Exemple #4
0
def updatePurchase(id):
    p = models.Purchase(**json_body())
    p.id = id
    api.update_purchase(p)
    return jsonify(result='updated'), 200
Exemple #5
0
def insertPurchase():
    api.insert_purchase(models.Purchase(**json_body()))
    return jsonify(result='created'), 201
Exemple #6
0
    def test_update_purchase(self):
        # check, if the objects are correct
        consumer = self.api.get_consumer(id=1)
        product = self.api.get_product(id=1)
        self.assertEqual(consumer.credit, 0)
        self.assertEqual(product.price, 25)

        pur = models.Purchase(consumer_id=1,
                              product_id=1,
                              amount=5,
                              comment="purchase done by unittest")
        self.api.insert_purchase(pur)

        # check if the consumers credit has decreased
        pur = self.api.get_purchase(id=1)
        self.assertEqual(pur.comment, "purchase done by unittest")
        consumer = self.api.get_consumer(id=1)
        self.assertEqual(
            consumer.credit, 0 - pur.amount * pur.paid_base_price_per_product -
            pur.amount * pur.paid_karma_per_product)

        # revoke purchase and update comment
        pur = models.Purchase(id=1,
                              revoked=True,
                              comment="purchases updated with unittest")
        self.api.update_purchase(pur)

        # check if the purchase has been updated
        pur2 = self.api.get_purchase(id=1)
        self.assertEqual(pur2.comment, "purchases updated with unittest")
        self.assertTrue(pur2.revoked)

        # do it twice to check whether it's indeponent
        with self.assertRaises(exc.CanOnlyBeRevokedOnce):
            self.api.update_purchase(pur)

        # check if the consumers credit has increased
        consumer = self.api.get_consumer(id=1)
        self.assertEqual(consumer.credit, 0)

        # this should do nothing
        pur = models.Purchase(id=1)
        with self.assertRaises(exc.NothingHasChanged):
            self.api.update_purchase(pur)

        # check if the consumers credit is the same
        consumer = self.api.get_consumer(id=1)
        self.assertEqual(consumer.credit, 0)

        # check non revocable products
        p = models.Product(name='Water',
                           countable=False,
                           price=1,
                           department_id=1,
                           revocable=False)

        self.api.insert_product(p)

        pur = models.Purchase(consumer_id=1,
                              product_id=4,
                              amount=5,
                              comment="purchase done by unittest")
        self.api.insert_purchase(pur)

        consumer = self.api.get_consumer(id=1)
        self.assertEqual(consumer.credit, -5)

        # revoke purchase and update comment
        pur = models.Purchase(id=2, revoked=True, comment="this should fail")
        with self.assertRaises(exc.NotRevocable):
            self.api.update_purchase(pur)

        consumer = self.api.get_consumer(id=1)
        self.assertEqual(consumer.credit, -5)
Exemple #7
0
    def test_insert_purchase(self):
        department = self.api.get_department(id=1)
        self.assertEqual(department.id, 1)
        self.assertEqual(department.name, "Drinks")
        self.assertEqual(department.income_base, 0)
        self.assertEqual(department.income_karma, 0)
        self.assertEqual(department.expenses, 0)
        self.assertEqual(department.budget, 20000)

        # insert consumer and product
        c2 = models.Consumer(id=2, karma=10)
        c3 = models.Consumer(id=3, karma=-10)

        self.api.update_consumer(c2)
        self.api.update_consumer(c3)

        # check consumers
        consumers = self.api.list_consumers()
        self.assertEqual(len(consumers), 4)
        self.assertEqual(consumers[0].credit, 0)
        self.assertEqual(consumers[1].credit, 0)
        self.assertEqual(consumers[2].credit, 0)
        self.assertEqual(consumers[3].credit, 0)

        self.assertEqual(consumers[0].karma, 0)
        self.assertEqual(consumers[1].karma, 10)
        self.assertEqual(consumers[2].karma, -10)
        self.assertEqual(consumers[3].karma, 0)

        # check, if the objects are correct
        product = self.api.get_product(id=1)
        self.assertEqual(product.price, 25)

        # Turn on use karma
        self.api.configuration['USE_KARMA'] = True

        pur1 = models.Purchase(consumer_id=1,
                               product_id=1,
                               amount=1,
                               comment="good dude buys something")

        pur2 = models.Purchase(consumer_id=2,
                               product_id=1,
                               amount=1,
                               comment="awesome dude buys something")

        pur3 = models.Purchase(consumer_id=3,
                               product_id=1,
                               amount=1,
                               comment="bad dude buys something")

        self.api.insert_purchase(pur1)
        self.api.insert_purchase(pur2)
        self.api.insert_purchase(pur3)

        # get purchases
        purchases = self.api.list_purchases()
        self.assertEqual(len(purchases), 3)

        self.assertEqual(purchases[0].paid_base_price_per_product, 25)
        self.assertEqual(purchases[0].paid_karma_per_product, 5)
        self.assertEqual(purchases[0].amount, 1)
        self.assertEqual(purchases[0].comment, "good dude buys something")
        self.assertIsNotNone(purchases[0].timestamp)

        self.assertEqual(purchases[1].paid_base_price_per_product, 25)
        self.assertEqual(purchases[1].paid_karma_per_product, 0)
        self.assertEqual(purchases[1].amount, 1)
        self.assertEqual(purchases[1].comment, "awesome dude buys something")
        self.assertIsNotNone(purchases[1].timestamp)

        self.assertEqual(purchases[2].paid_base_price_per_product, 25)
        self.assertEqual(purchases[2].paid_karma_per_product, 10)
        self.assertEqual(purchases[2].amount, 1)
        self.assertEqual(purchases[2].comment, "bad dude buys something")
        self.assertIsNotNone(purchases[2].timestamp)

        # check consumers
        consumers = self.api.list_consumers()
        self.assertEqual(len(consumers), 4)
        self.assertEqual(consumers[0].credit, -30)
        self.assertEqual(consumers[1].credit, -25)
        self.assertEqual(consumers[2].credit, -35)
        self.assertEqual(consumers[3].credit, 0)

        department = self.api.get_department(id=1)
        self.assertEqual(department.id, 1)
        self.assertEqual(department.name, "Drinks")
        self.assertEqual(department.income_base, 75)
        self.assertEqual(department.income_karma, 15)
        self.assertEqual(department.expenses, 0)
        self.assertEqual(department.budget, 20000)

        # now we revoke the purchases
        pur = models.Purchase(id=1, revoked=True)
        self.api.update_purchase(pur)
        department = self.api.get_department(id=1)
        self.assertEqual(department.income_base, 50)
        self.assertEqual(department.income_karma, 10)

        pur = models.Purchase(id=2, revoked=True)
        self.api.update_purchase(pur)
        department = self.api.get_department(id=1)
        self.assertEqual(department.income_base, 25)
        self.assertEqual(department.income_karma, 10)

        pur = models.Purchase(id=3, revoked=True)
        self.api.update_purchase(pur)
        department = self.api.get_department(id=1)
        self.assertEqual(department.income_base, 0)
        self.assertEqual(department.income_karma, 0)

        # test with wrong foreign key consumer_id
        pur4 = models.Purchase(consumer_id=5,
                               product_id=1,
                               amount=1,
                               comment="purchase done by unittest")
        with self.assertRaises(exc.ForeignKeyNotExisting):
            self.api.insert_purchase(pur4)

        # no new purchase should have been created
        self.assertEqual(len(self.api.list_purchases()), 3)

        # test with wrong foreign key product_id
        pur5 = models.Purchase(consumer_id=1,
                               product_id=4,
                               amount=1,
                               comment="purchase done by unittest")
        with self.assertRaises(exc.ForeignKeyNotExisting):
            self.api.insert_purchase(pur5)

        # no new purchase should have been created
        self.assertEqual(len(self.api.list_purchases()), 3)

        # the credit of the consumer must not have to be changed
        consumer = self.api.get_consumer(id=1)
        self.assertEqual(consumer.credit, 0)

        # purchase.id should be forbidden
        pur6 = models.Purchase(consumer_id=1,
                               product_id=1,
                               id=1337,
                               amount=1,
                               comment="purchase done by unittest")
        with self.assertRaises(exc.ForbiddenField):
            self.api.insert_purchase(pur6)

        # purchase.paid_base_price_per_product and paid_karma_per_product
        # should be forbidden
        pur7 = models.Purchase(consumer_id=1,
                               product_id=1,
                               paid_base_price_per_product=200,
                               paid_karma_per_product=200,
                               amount=1,
                               comment="purchase done by unittest")
        with self.assertRaises(exc.ForbiddenField):
            self.api.insert_purchase(pur7)

        # purchase.revoked should be forbidden
        pur8 = models.Purchase(consumer_id=1,
                               product_id=1,
                               revoked=True,
                               amount=1,
                               comment="purchase done by unittest")
        with self.assertRaises(exc.ForbiddenField):
            self.api.insert_purchase(pur8)

        # purchase.revoked should be forbidden
        pur9 = models.Purchase(consumer_id=1,
                               product_id=1,
                               amount=1,
                               timestamp=datetime.datetime.now(),
                               comment="purchase done by unittest")
        with self.assertRaises(exc.ForbiddenField):
            self.api.insert_purchase(pur9)