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)
예제 #2
0
    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
예제 #3
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
예제 #4
0
    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)
예제 #5
0
    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
예제 #6
0
 def setUp(self):
     self.creator = OrderCreator()
     self.basket = factories.create_basket(empty=True)
예제 #7
0
 def setUp(self):
     self.creator = OrderCreator()
     self.basket = factories.create_basket(empty=True)
     self.shipping_method = Free()
     self.shipping_method.set_basket(self.basket)
예제 #8
0
    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))
예제 #9
0
 def setUp(self):
     self.creator = OrderCreator()
     self.basket = factories.create_basket(empty=True)
     self.surcharges = SurchargeApplicator().get_applicable_surcharges(
         self.basket)
예제 #10
0
 def setUp(self):
     self.creator = OrderCreator()
     self.basket = factories.create_basket(empty=True)
     self.site1 = factories.SiteFactory()
     self.site2 = factories.SiteFactory()
예제 #11
0
 def setUp(self):
     self.creator = OrderCreator()
     self.basket = Basket.objects.create()
예제 #12
0
 def setUp(self):
     self.creator = OrderCreator()
     self.basket = Basket()
예제 #13
0
    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))