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)
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)
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)
def updatePurchase(id): p = models.Purchase(**json_body()) p.id = id api.update_purchase(p) return jsonify(result='updated'), 200
def insertPurchase(): api.insert_purchase(models.Purchase(**json_body())) return jsonify(result='created'), 201
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)
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)