def test_has_discount_recorded_correctly_when_order_is_placed(self): for product in [create_product(price=D('12.00'))]: self.basket.add_product(product, 1) apply_offers(self.basket) methods = StubRepository().get_shipping_methods(self.basket) method = methods[0] creator = OrderCreator() order = creator.place_order(self.basket, shipping_method=method) discounts = order.discounts.all() self.assertEqual(1, len(discounts)) discount = discounts[0] self.assertTrue(discount.is_shipping_discount) self.assertEqual(D('9.00'), discount.amount)
def test_expired_voucher(self): user = AnonymousUser() basket = factories.create_basket() creator = OrderCreator() voucher = factories.VoucherFactory(usage=Voucher.SINGLE_USE) voucher.offers.add(factories.create_offer(offer_type='Voucher')) basket.vouchers.add(voucher) voucher.end_datetime = timezone.now() - datetime.timedelta(days=100) voucher.save() surcharges = SurchargeApplicator().get_applicable_surcharges(basket) place_order(creator, surcharges=surcharges, basket=basket, order_number='12346', user=user) assert voucher.applications.count() == 0
def test_voucher_single_usage(self): user = AnonymousUser() creator = OrderCreator() product = factories.ProductFactory() voucher = factories.VoucherFactory(usage=Voucher.SINGLE_USE) voucher.offers.add(factories.create_offer(offer_type='Voucher')) # Make the order creator a bit more slow too reliable trigger # concurrency issues org_create_order_model = OrderCreator.create_order_model def new_create_order_model(*args, **kwargs): time.sleep(0.5) return org_create_order_model(creator, *args, **kwargs) creator.create_order_model = new_create_order_model org_record_voucher_usage = OrderCreator.record_voucher_usage def record_voucher_usage(*args, **kwargs): time.sleep(0.5) return org_record_voucher_usage(creator, *args, **kwargs) creator.record_voucher_usage = record_voucher_usage # Start 5 threads to place an order concurrently def worker(): order_number = threading.current_thread().name basket = factories.BasketFactory() basket.add_product(product) basket.vouchers.add(voucher) place_order(creator, basket=basket, order_number=order_number, user=user) exceptions = run_concurrently(worker, num_threads=5) voucher.refresh_from_db() assert all(isinstance(x, ValueError) for x in exceptions), exceptions assert len(exceptions) == 4 assert voucher.applications.count() == 1 assert Order.objects.count() == 1
def test_single_usage(self): user = AnonymousUser() basket = factories.create_basket() creator = OrderCreator() voucher = factories.VoucherFactory(usage=Voucher.SINGLE_USE) voucher.offers.add(factories.create_offer(offer_type='Voucher')) basket.vouchers.add(voucher) place_order(creator, basket=basket, order_number='12346', user=user) assert voucher.applications.count() == 1 # Make sure the voucher usage is rechecked with pytest.raises(ValueError): place_order(creator, basket=basket, order_number='12347', user=user)
def test_single_usage(self): user = AnonymousUser() creator = OrderCreator() product = factories.ProductFactory(stockrecords__num_in_stock=1000) # Make the order creator a bit more slow too reliable trigger # concurrency issues org_create_order_model = OrderCreator.create_order_model def new_create_order_model(*args, **kwargs): time.sleep(0.5) return org_create_order_model(creator, *args, **kwargs) creator.create_order_model = new_create_order_model # Start 5 threads to place an order concurrently def worker(): order_number = threading.current_thread().name basket = factories.BasketFactory() basket.add_product(product) surcharges = SurchargeApplicator().get_applicable_surcharges( basket) place_order(creator, surcharges=surcharges, basket=basket, order_number=order_number, user=user) exceptions = run_concurrently(worker, num_threads=5) assert all(isinstance(x, ValueError) for x in exceptions), exceptions assert len(exceptions) == 0 assert Order.objects.count() == 5 stockrecord = product.stockrecords.first() assert stockrecord.num_allocated == 5
def setUp(self): self.creator = OrderCreator() self.basket = factories.create_basket(empty=True)
def setUp(self): self.creator = OrderCreator() self.basket = factories.create_basket(empty=True) self.shipping_method = Free() self.shipping_method.set_basket(self.basket)
def test_does_not_raise_an_alert_if_threshold_not_broken(self): self.set_threshold(4) OrderCreator().place_order(self.basket) alerts = StockAlert.objects.all() self.assertEqual(0, len(alerts))
def setUp(self): self.creator = OrderCreator() self.basket = factories.create_basket(empty=True) self.surcharges = SurchargeApplicator().get_applicable_surcharges( self.basket)
def setUp(self): self.creator = OrderCreator() self.basket = factories.create_basket(empty=True) self.site1 = factories.SiteFactory() self.site2 = factories.SiteFactory()
def setUp(self): self.creator = OrderCreator() self.basket = Basket.objects.create()
def setUp(self): self.creator = OrderCreator() self.basket = Basket()
def test_no_alert_raised_if_threshold_not_breached(self): self.set_threshold(3) order = OrderCreator().place_order(self.basket) alerts = StockAlert.objects.all() self.assertEqual(0, len(alerts))