Beispiel #1
0
 def test_means_another_currency_product_cannot_be_added(self):
     product = factories.create_product()
     factories.create_stockrecord(currency='USD',
                                  product=product,
                                  price_excl_tax=D('20.00'))
     with self.assertRaises(ValueError):
         self.basket.add(product)
Beispiel #2
0
    def test_total_excludes_unavailable_products_with_unknown_price(self):
        new_product = factories.create_product()
        factories.create_stockrecord(new_product, price_excl_tax=D('5.00'))
        self.basket.add(new_product, 1)

        class UnavailableProductStrategy(strategy.Default):
            """ A test strategy that makes a specific product unavailable """
            def availability_policy(self, product, stockrecord):
                if product == new_product:
                    return availability.Unavailable()
                return super(UnavailableProductStrategy,
                             self).availability_policy(product, stockrecord)

            def pricing_policy(self, product, stockrecord):
                if product == new_product:
                    return prices.Unavailable()
                return super(UnavailableProductStrategy,
                             self).pricing_policy(product, stockrecord)

        try:
            self.basket.strategy = UnavailableProductStrategy()
            self.assertEqual(
                self.basket.all_lines()[1].get_warning(),
                u"'D\xf9\uff4d\u03fb\u03d2 title' is no longer available")
            self.assertEqual(self.basket.total_excl_tax, 100)
        finally:
            self.basket.strategy = strategy.Default()
Beispiel #3
0
    def test_basket_prices_calculation_for_unavailable_pricing(self):
        new_product = factories.create_product()
        factories.create_stockrecord(new_product, price_excl_tax=D('5.00'))
        self.basket.add(new_product, 1)

        class UnavailableProductStrategy(strategy.Default):
            """ A test strategy that makes a specific product unavailable """
            def availability_policy(self, product, stockrecord):
                if product == new_product:
                    return availability.Unavailable()
                return super(UnavailableProductStrategy,
                             self).availability_policy(product, stockrecord)

            def pricing_policy(self, product, stockrecord):
                if product == new_product:
                    return prices.Unavailable()
                return super(UnavailableProductStrategy,
                             self).pricing_policy(product, stockrecord)

        self.basket.strategy = UnavailableProductStrategy()
        line = self.basket.all_lines()[1]
        self.assertEqual(
            line.get_warning(),
            u"'D\xf9\uff4d\u03fb\u03d2 title' is no longer available")
        self.assertIsNone(line.line_price_excl_tax)
        self.assertIsNone(line.line_price_incl_tax)
        self.assertIsNone(line.line_price_excl_tax_incl_discounts)
        self.assertIsNone(line.line_price_incl_tax_incl_discounts)
        self.assertIsNone(line.line_tax)
        self.assertEqual(self.basket.total_excl_tax, 100)
        self.assertEqual(self.basket.total_incl_tax, 100)
        self.assertEqual(self.basket.total_excl_tax_excl_discounts, 100)
        self.assertEqual(self.basket.total_incl_tax_excl_discounts, 100)
    def test_basket_prices_calculation_for_unavailable_pricing(self):
        new_product = factories.create_product()
        factories.create_stockrecord(
            new_product, price_excl_tax=D('5.00'))
        self.basket.add(new_product, 1)

        class UnavailableProductStrategy(strategy.Default):
            """ A test strategy that makes a specific product unavailable """

            def availability_policy(self, product, stockrecord):
                if product == new_product:
                    return availability.Unavailable()
                return super().availability_policy(product, stockrecord)

            def pricing_policy(self, product, stockrecord):
                if product == new_product:
                    return prices.Unavailable()
                return super().pricing_policy(product, stockrecord)

        self.basket.strategy = UnavailableProductStrategy()
        line = self.basket.all_lines()[1]
        self.assertEqual(line.get_warning(), "'D\xf9\uff4d\u03fb\u03d2 title' is no longer available")
        self.assertIsNone(line.line_price_excl_tax)
        self.assertIsNone(line.line_price_incl_tax)
        self.assertIsNone(line.line_price_excl_tax_incl_discounts)
        self.assertIsNone(line.line_price_incl_tax_incl_discounts)
        self.assertIsNone(line.line_tax)
        self.assertEqual(self.basket.total_excl_tax, 100)
        self.assertEqual(self.basket.total_incl_tax, 100)
        self.assertEqual(self.basket.total_excl_tax_excl_discounts, 100)
        self.assertEqual(self.basket.total_incl_tax_excl_discounts, 100)
    def test_total_excludes_unavailable_products_with_unknown_price(self):
        new_product = factories.create_product()
        factories.create_stockrecord(
            new_product, price_excl_tax=D('5.00'))
        self.basket.add(new_product, 1)

        class UnavailableProductStrategy(strategy.Default):
            """ A test strategy that makes a specific product unavailable """

            def availability_policy(self, product, stockrecord):
                if product == new_product:
                    return availability.Unavailable()
                return super(UnavailableProductStrategy, self).availability_policy(product, stockrecord)

            def pricing_policy(self, product, stockrecord):
                if product == new_product:
                    return prices.Unavailable()
                return super(UnavailableProductStrategy, self).pricing_policy(product, stockrecord)


        try:
            self.basket.strategy = UnavailableProductStrategy()
            self.assertEqual(self.basket.all_lines()[1].get_warning(), u"'D\xf9\uff4d\u03fb\u03d2 title' is no longer available")
            self.assertEqual(self.basket.total_excl_tax, 100)
        finally:
            self.basket.strategy = strategy.Default()
    def test_handle_shipping_event_email_opt_in(self, expected_opt_in):
        """
        Verify that the shipping sends email opt in if specified.
        """
        basket = create_basket()
        product = factories.create_product()
        factories.create_stockrecord(product, num_in_stock=2)
        basket.add_product(product)

        order = create_order(basket=basket)
        lines = order.lines.all()

        with mock.patch(
                'ecommerce.extensions.order.processing.fulfillment_api.fulfill_order'
        ) as mock_fulfill:
            EventHandler().handle_shipping_event(
                order,
                self.shipping_event_type,
                lines,
                [1, 1],
                email_opt_in=expected_opt_in,
            )
            mock_fulfill.assert_called_once_with(order,
                                                 lines,
                                                 email_opt_in=expected_opt_in)
    def setUp(self):
        # Create a product
        self.product_main = create_product(product_class='Stuff')
        create_stockrecord(self.product_main, D('5000.00'), num_in_stock=100)

        # Create a range
        self.range_main = Range.objects.create(name='Stuff')
        self.range_main.add_product(self.product_main)

        # Create an offer which gives $500 off a product
        cond = Condition()
        cond.proxy_class = 'oscarbluelight.offer.conditions.BluelightCountCondition'
        cond.value = 1
        cond.range = self.range_main
        cond.save()

        benefit = Benefit()
        benefit.proxy_class = 'oscarbluelight.offer.benefits.BluelightAbsoluteDiscountBenefit'
        benefit.value = 500
        benefit.range = self.range_main
        benefit.save()

        offer = ConditionalOffer()
        offer.condition = cond
        offer.benefit = benefit
        offer.save()

        self.basket = create_basket(empty=True)
Beispiel #8
0
    def test_contains_coupon(self):
        self.assertFalse(self.order.contains_coupon)

        product = factories.create_product(product_class=COUPON_PRODUCT_CLASS_NAME)
        basket = create_basket(empty=True)
        factories.create_stockrecord(product, num_in_stock=1)
        basket.add_product(product)
        order = create_order(basket=basket)
        self.assertTrue(order.contains_coupon)
    def test_is_partially_satisfied_or(self):
        offer = self._build_offer(CompoundCondition.OR)

        product = create_product()
        create_stockrecord(product, D('1.00'), num_in_stock=10)
        basket = create_basket(empty=True)
        self.assertFalse( offer.condition.is_partially_satisfied(offer, basket) )
        basket.add_product(product, quantity=1)
        self.assertTrue( offer.condition.is_partially_satisfied(offer, basket) )
    def test_get_upsell_message_or(self):
        offer = self._build_offer(CompoundCondition.OR)

        product = create_product()
        create_stockrecord(product, D('1.00'), num_in_stock=10)

        basket = create_basket(empty=True)
        basket.add_product(product, quantity=1)
        self.assertEqual(offer.condition.proxy().get_upsell_message(offer, basket), 'Spend $9.00 more from site or Buy 1 more product from site')
    def test_hurry_mode_not_set_when_stock_high(self):
        # One alert, 5 items in stock. No need to hurry.
        create_stockrecord(self.product, num_in_stock=5)
        ProductAlert.objects.create(user=self.user, product=self.product)

        self.dispatcher.send_product_alert_email_for_user(self.product)

        assert len(mail.outbox) == 1
        assert 'Beware that the amount of items in stock is limited' not in mail.outbox[
            0].body
    def test_hurry_mode_not_set_multiple_stockrecords(self):
        # Two stockrecords, 5 items in stock for one. No need to hurry.
        create_stockrecord(self.product, num_in_stock=1)
        create_stockrecord(self.product, num_in_stock=5)
        ProductAlert.objects.create(user=self.user, product=self.product)

        self.dispatcher.send_product_alert_email_for_user(self.product)

        assert 'Beware that the amount of items in stock is limited' not in mail.outbox[
            0].body
Beispiel #13
0
    def test_contains_coupon(self):
        self.assertFalse(self.order.contains_coupon)

        product_class = u'Coupon'
        product = factories.create_product(product_class=product_class)
        basket = factories.create_basket(empty=True)
        factories.create_stockrecord(product, num_in_stock=1)
        basket.add_product(product)
        order = factories.create_order(basket=basket)
        self.assertTrue(order.contains_coupon)
Beispiel #14
0
    def test_hurry_mode_not_set_when_stock_high(self):
        # One alert, 5 items in stock. No need to hurry.
        create_stockrecord(self.product, num_in_stock=5)
        ProductAlert.objects.create(user=self.user, product=self.product)

        send_product_alerts(self.product)

        self.assertEqual(1, len(mail.outbox))
        self.assertNotIn('Beware that the amount of items in stock is limited',
                         mail.outbox[0].body)
Beispiel #15
0
 def create_basket(self, owner, site, status=Basket.OPEN, empty=False):
     owner = owner or factories.UserFactory()
     site = site or self.site
     basket = Basket.objects.create(owner=owner, site=site, status=status)
     basket.strategy = Default()
     if not empty:
         product = factories.create_product()
         factories.create_stockrecord(product, num_in_stock=2)
         basket.add_product(product)
     return basket
Beispiel #16
0
    def test_hurry_mode_not_set_multiple_stockrecords(self):
        # Two stockrecords, 5 items in stock for one. No need to hurry.
        create_stockrecord(self.product, num_in_stock=1)
        create_stockrecord(self.product, num_in_stock=5)
        ProductAlert.objects.create(user=self.user, product=self.product)

        send_product_alerts(self.product)

        self.assertNotIn('Beware that the amount of items in stock is limited',
            mail.outbox[0].body)
Beispiel #17
0
    def test_hurry_mode_not_set_when_stock_high(self):
        # One alert, 5 items in stock. No need to hurry.
        create_stockrecord(self.product, num_in_stock=5)
        ProductAlert.objects.create(user=self.user, product=self.product)

        send_product_alerts(self.product)

        self.assertEqual(1, len(mail.outbox))
        self.assertNotIn('Beware that the amount of items in stock is limited',
            mail.outbox[0].body)
    def test_line_tax_for_zero_tax_strategies(self):
        basket = Basket()
        basket.strategy = strategy.Default()
        product = factories.create_product()
        # Tax for the default strategy will be 0
        factories.create_stockrecord(
            product, price_excl_tax=D('75.00'), num_in_stock=10)
        basket.add(product, 1)

        self.assertEqual(basket.lines.first().line_tax, D('0'))
    def test_hurry_mode_set_multiple_stockrecords(self):
        # Two stockrecords, low stock on both. Hurry mode should be set.
        create_stockrecord(self.product, num_in_stock=1)
        create_stockrecord(self.product, num_in_stock=1)
        ProductAlert.objects.create(user=self.user, product=self.product)
        ProductAlert.objects.create(user=UserFactory(), product=self.product)

        self.dispatcher.send_product_alert_email_for_user(self.product)

        assert 'Beware that the amount of items in stock is limited' in mail.outbox[
            0].body
    def test_hurry_mode_set_when_stock_low(self):
        # Two alerts, 1 item in stock. Hurry mode should be set.
        create_stockrecord(self.product, num_in_stock=1)
        ProductAlert.objects.create(user=self.user, product=self.product)
        ProductAlert.objects.create(user=UserFactory(), product=self.product)

        self.dispatcher.send_product_alert_email_for_user(self.product)

        assert len(mail.outbox) == 2
        assert 'Beware that the amount of items in stock is limited' in mail.outbox[
            0].body
Beispiel #21
0
    def test_hurry_mode_set_multiple_stockrecords(self):
        # Two stockrecords, low stock on both. Hurry mode should be set.
        create_stockrecord(self.product, num_in_stock=1)
        create_stockrecord(self.product, num_in_stock=1)
        ProductAlert.objects.create(user=self.user, product=self.product)
        ProductAlert.objects.create(user=UserFactory(), product=self.product)

        send_product_alerts(self.product)

        self.assertIn('Beware that the amount of items in stock is limited',
            mail.outbox[0].body)
Beispiel #22
0
    def test_hurry_mode_set_when_stock_low(self):
        # Two alerts, 1 item in stock. Hurry mode should be set.
        create_stockrecord(self.product, num_in_stock=1)
        ProductAlert.objects.create(user=self.user, product=self.product)
        ProductAlert.objects.create(user=UserFactory(), product=self.product)

        send_product_alerts(self.product)

        self.assertEqual(2, len(mail.outbox))
        self.assertIn('Beware that the amount of items in stock is limited',
            mail.outbox[0].body)
Beispiel #23
0
    def test_hurry_mode_set_when_stock_low(self):
        # Two alerts, 1 item in stock. Hurry mode should be set.
        create_stockrecord(self.product, num_in_stock=1)
        ProductAlert.objects.create(user=self.user, product=self.product)
        ProductAlert.objects.create(user=UserFactory(), product=self.product)

        send_product_alerts(self.product)

        self.assertEqual(2, len(mail.outbox))
        self.assertIn('Beware that the amount of items in stock is limited',
                      mail.outbox[0].body)
    def test_totals_for_free_products(self):
        basket = Basket()
        basket.strategy = strategy.Default()
        # Add a zero-priced product to the basket
        product = factories.create_product()
        factories.create_stockrecord(product, price=D('0.00'), num_in_stock=10)
        basket.add(product, 1)

        self.assertEqual(basket.lines.count(), 1)
        self.assertEqual(basket.total_excl_tax, 0)
        self.assertEqual(basket.total_incl_tax, 0)
    def test_totals_for_free_products(self):
        basket = Basket()
        basket.strategy = strategy.Default()
        # Add a zero-priced product to the basket
        product = factories.create_product()
        factories.create_stockrecord(
            product, price_excl_tax=D('0.00'), num_in_stock=10)
        basket.add(product, 1)

        self.assertEqual(basket.lines.count(), 1)
        self.assertEqual(basket.total_excl_tax, 0)
        self.assertEqual(basket.total_incl_tax, 0)
    def test_line_tax_for_unknown_tax_strategies(self):
        class UnknownTaxStrategy(strategy.Default):
            """ A test strategy where the tax is not known """
            def pricing_policy(self, product, stockrecord):
                return prices.FixedPrice('GBP', stockrecord.price, tax=None)

        basket = Basket()
        basket.strategy = UnknownTaxStrategy()
        product = factories.create_product()
        factories.create_stockrecord(product, num_in_stock=10)
        basket.add(product, 1)

        self.assertEqual(basket.lines.first().line_tax, None)
Beispiel #27
0
    def test_execution_for_bulk_purchase(self):
        """
        Verify redirection to LMS receipt page after attempted payment
        execution if the Otto receipt page is disabled for bulk purchase and
        also that the order is linked to the provided business client..
        """
        toggle_switch(ENROLLMENT_CODE_SWITCH, True)
        self.mock_oauth2_response()

        course = CourseFactory(partner=self.partner)
        course.create_or_update_seat('verified',
                                     True,
                                     50,
                                     create_enrollment_code=True)
        self.basket = create_basket(owner=UserFactory(), site=self.site)
        enrollment_code = Product.objects.get(
            product_class__name=ENROLLMENT_CODE_PRODUCT_CLASS_NAME)
        factories.create_stockrecord(enrollment_code,
                                     num_in_stock=2,
                                     price_excl_tax='10.00')
        self.basket.add_product(enrollment_code, quantity=1)

        # Create a payment record the view can use to retrieve a basket
        self.mock_payment_creation_response(self.basket)
        self.processor.get_transaction_parameters(self.basket,
                                                  request=self.request)
        self.mock_payment_execution_response(self.basket)
        self.mock_payment_creation_response(self.basket, find=True)

        # Manually add organization attribute on the basket for testing
        self.RETURN_DATA.update({'organization': 'Dummy Business Client'})
        self.RETURN_DATA.update({PURCHASER_BEHALF_ATTRIBUTE: 'False'})
        basket_add_organization_attribute(self.basket, self.RETURN_DATA)

        response = self.client.get(reverse('paypal:execute'), self.RETURN_DATA)
        self.assertRedirects(
            response,
            get_receipt_page_url(
                order_number=self.basket.order_number,
                site_configuration=self.basket.site.siteconfiguration,
                disable_back_button=True,
            ),
            fetch_redirect_response=False)

        # Now verify that a new business client has been created and current
        # order is now linked with that client through Invoice model.
        order = Order.objects.filter(basket=self.basket).first()
        business_client = BusinessClient.objects.get(
            name=self.RETURN_DATA['organization'])
        assert Invoice.objects.get(
            order=order).business_client == business_client
Beispiel #28
0
 def setUp(self):
     super(DonationsFromCheckoutTestFulfillmentModuleTest, self).setUp()
     donation_class = ProductClass.objects.get(
         name=DONATIONS_FROM_CHECKOUT_TESTS_PRODUCT_TYPE_NAME,
         track_stock=False)
     donation = factories.create_product(product_class=donation_class,
                                         title='Test product')
     user = factories.UserFactory()
     basket = factories.BasketFactory(owner=user, site=self.site)
     factories.create_stockrecord(donation,
                                  num_in_stock=2,
                                  price_excl_tax=10)
     basket.add_product(donation, 1)
     self.order = create_order(number=1, basket=basket, user=user)
    def test_consume_items_when_benefit_consumes_other_items(self):
        # Create two products, each in a different product class
        product_main = create_product(product_class='Expensive Stuff')
        create_stockrecord(product_main, D('5000.00'), num_in_stock=100)

        product_accessory = create_product(product_class='Less Expensive Stuff')
        create_stockrecord(product_accessory, D('100.00'), num_in_stock=100)

        # Create two ranges, one for each product we just made
        range_main = Range.objects.create(name='Expensive Stuff')
        range_main.add_product(product_main)

        range_accessories = Range.objects.create(name='Less Expensive Stuff')
        range_accessories.add_product(product_accessory)

        # Create an offer which gives $5 off an accessory product when the basket contains a main product.
        # This offer, when applied, should consume the main and the accessory products. Not just the accessory.
        cond_has_main = Condition()
        cond_has_main.proxy_class = 'oscarbluelight.offer.conditions.BluelightCountCondition'
        cond_has_main.value = 1
        cond_has_main.range = range_main
        cond_has_main.save()

        benefit_5off_accessory = Benefit()
        benefit_5off_accessory.proxy_class = 'oscarbluelight.offer.benefits.BluelightAbsoluteDiscountBenefit'
        benefit_5off_accessory.value = 5
        benefit_5off_accessory.range = range_accessories
        benefit_5off_accessory.save()

        offer = ConditionalOffer()
        offer.condition = cond_has_main
        offer.benefit = benefit_5off_accessory
        offer.save()

        basket = create_basket(empty=True)
        basket.add_product(product_main, quantity=1)
        basket.add_product(product_accessory, quantity=1)

        self.assertEqual(basket.total_excl_tax_excl_discounts, D('5100.00'))
        self.assertEqual(basket.total_excl_tax, D('5100.00'))
        self.assertEqual(basket.num_items_without_discount, 2)
        self.assertEqual(basket.num_items_with_discount, 0)

        Applicator().apply_offers(basket, [offer])

        self.assertEqual(basket.total_excl_tax_excl_discounts, D('5100.00'))
        self.assertEqual(basket.total_excl_tax, D('5095.00'))
        self.assertEqual(basket.num_items_without_discount, 0)
        self.assertEqual(basket.num_items_with_discount, 2)
    def test_line_tax_for_unknown_tax_strategies(self):

        class UnknownTaxStrategy(strategy.Default):
            """ A test strategy where the tax is not known """

            def pricing_policy(self, product, stockrecord):
                return prices.FixedPrice('GBP', stockrecord.price_excl_tax, tax=None)

        basket = Basket()
        basket.strategy = UnknownTaxStrategy()
        product = factories.create_product()
        factories.create_stockrecord(product, num_in_stock=10)
        basket.add(product, 1)

        self.assertEqual(basket.lines.first().line_tax, None)
 def setUp(self):
     self.product = factories.create_product()
     self.stockrecord = factories.create_stockrecord(self.product,
                                                     D('12.00'),
                                                     num_in_stock=5)
     self.basket = factories.create_basket(empty=True)
     add_product(self.basket, product=self.product)
    def setUp(self):
        self.product = factories.create_product()
        self.stockrecord = factories.create_stockrecord(self.product)
        self.assertTrue(self.product.get_product_class().track_stock)

        self.availability = availability.DelegateToStockRecord(
            self.product, self.stockrecord)
Beispiel #33
0
    def test_basket_below_threshold(self):
        record = factories.create_stockrecord(price=D('5.00'))
        self.basket.add_product(record.product)

        charge = self.method.calculate(self.basket)

        self.assertEqual(D('10.00'), charge.incl_tax)
    def setUp(self):
        self.product = factories.create_product()
        self.stockrecord = factories.create_stockrecord(self.product)
        self.assertTrue(self.product.get_product_class().track_stock)

        self.availability = availability.DelegateToStockRecord(
            self.product, self.stockrecord)
    def test_basket_above_threshold(self):
        record = factories.create_stockrecord(price_excl_tax=D('5.00'))
        self.basket.add_product(record.product, quantity=8)

        charge = self.method.calculate(self.basket)

        self.assertEqual(D('0.00'), charge.incl_tax)
    def test_can_delete_an_individual_product(self):
        product = create_product()
        stockrecord = create_stockrecord(product)

        category = Category.add_root(name='Test Category')
        product_category = ProductCategory.objects.create(category=category,
                                                          product=product)

        page = self.get(
            reverse('dashboard:catalogue-product-delete',
                    args=(product.id, ))).form.submit()

        self.assertRedirects(page, reverse('dashboard:catalogue-product-list'))

        self.assertEquals(Product.objects.count(), 0)
        self.assertEquals(StockRecord.objects.count(), 0)
        self.assertEquals(ProductCategory.objects.count(), 0)

        self.assertRaises(Product.DoesNotExist,
                          Product.objects.get,
                          id=product.id)
        self.assertRaises(StockRecord.DoesNotExist,
                          StockRecord.objects.get,
                          id=stockrecord.id)
        self.assertRaises(ProductCategory.DoesNotExist,
                          ProductCategory.objects.get,
                          id=product_category.id)
Beispiel #37
0
 def setUp(self):
     self.basket = Basket()
     self.basket.strategy = strategy.Default()
     self.product = factories.create_product()
     self.record = factories.create_stockrecord(self.product, price_excl_tax=D("10.00"))
     self.purchase_info = factories.create_purchase_info(self.record)
     self.basket.add(self.product, 10)
Beispiel #38
0
    def test_can_delete_a_canonical_product(self):
        canonical_product = create_product(title="Canonical Product",
                                           partner_users=[self.user,])

        product = create_product(title="Variant 1", parent=canonical_product)
        stockrecord = create_stockrecord(product)

        category = Category.add_root(name='Test Category')
        product_category = ProductCategory.objects.create(
            category=category, product=product)

        page = self.get(reverse('dashboard:catalogue-product-delete',
                                args=(canonical_product.id,))).form.submit()

        self.assertRedirects(page, reverse('dashboard:catalogue-product-list'))

        self.assertEqual(Product.objects.count(), 0)
        self.assertEqual(StockRecord.objects.count(), 0)
        self.assertEqual(ProductCategory.objects.count(), 0)

        self.assertRaises(Product.DoesNotExist,
                          Product.objects.get, id=canonical_product.id)

        self.assertRaises(Product.DoesNotExist,
                          Product.objects.get, id=product.id)
        self.assertRaises(StockRecord.DoesNotExist,
                          StockRecord.objects.get, id=stockrecord.id)
        self.assertRaises(ProductCategory.DoesNotExist,
                          ProductCategory.objects.get, id=product_category.id)
    def test_signals(self):
        product = factories.create_product()
        record = factories.create_stockrecord(
            currency='USD',
            product=product,
            price_excl_tax=D('10.00'))
        factories.create_purchase_info(record)

        basket = Basket()
        basket.strategy = USStrategy()
        basket.add(product)
        basket.save()

        uat1 = cache.get_basket_uat(basket)

        # Add another product
        basket.add(product)

        # Timestamp should have gotten bumped by the BasketLine postsave signal
        uat2 = cache.get_basket_uat(basket)
        self.assertTrue(uat2 > uat1)

        # Save the basket
        basket.save()

        # Timestamp should have gotten bumped by the Basket postsave signal
        uat3 = cache.get_basket_uat(basket)
        self.assertTrue(uat3 > uat2)
    def test_basket_above_threshold(self):
        record = factories.create_stockrecord(price_excl_tax=D('5.00'))
        self.basket.add_product(record.product, quantity=8)

        charge = self.method.calculate(self.basket)

        self.assertEqual(D('0.00'), charge.incl_tax)
    def test_multi_item_basket(self):
        basket = factories.create_basket(empty=True)
        record = factories.create_stockrecord()
        basket.add_product(record.product, 7)

        charge = self.method.calculate(basket)

        self.assertEqual(D('5.00') + 7*D('1.00'), charge.incl_tax)
    def test_multi_item_basket(self):
        basket = factories.create_basket(empty=True)
        record = factories.create_stockrecord()
        basket.add_product(record.product, 7)

        charge = self.method.calculate(basket)

        self.assertEqual(D('5.00') + 7 * D('1.00'), charge.incl_tax)
    def test_allocate_does_nothing(self):
        product = factories.ProductFactory(product_class=self.product_class)
        stockrecord = factories.create_stockrecord(
            product, price_excl_tax=D('10.00'), num_in_stock=10)

        self.assertFalse(stockrecord.can_track_allocations)
        stockrecord.allocate(5)
        self.assertEqual(stockrecord.num_allocated, None)
Beispiel #44
0
 def setUp(self):
     self.basket = Basket()
     self.basket.strategy = strategy.Default()
     self.product = factories.create_product()
     self.record = factories.create_stockrecord(self.product,
                                                price_excl_tax=D('10.00'))
     self.purchase_info = factories.create_purchase_info(self.record)
     self.basket.add(self.product, 10)
 def setUp(self):
     self.user = UserFactory()
     self.product = create_product()
     self.stockrecord = create_stockrecord(self.product, num_in_stock=0)
     product_page = self.app.get(self.product.get_absolute_url(),
                                 user=self.user)
     form = product_page.forms['alert_form']
     form.submit()
Beispiel #46
0
 def setUp(self):
     self.user = G(User)
     self.product = create_product()
     self.stockrecord = create_stockrecord(self.product, num_in_stock=0)
     product_page = self.app.get(self.product.get_absolute_url(),
                                 user=self.user)
     form = product_page.forms['alert_form']
     form.submit()
    def test_single_item_basket_that_doesnt_require_shipping(self):
        # Create a product that doesn't require shipping
        record = factories.create_stockrecord()
        product = record.product
        product.product_class.requires_shipping = False
        product.product_class.save()

        self.basket.add_product(record.product)
        self.assertEqual(D('5.00'), self.method.charge_incl_tax)
Beispiel #48
0
    def test_returns_correct_quantity_for_existing_product_and_stockrecord_and_options(self):
        product = factories.create_product()
        record = factories.create_stockrecord(product, price_excl_tax=D("5.00"))
        option = Option.objects.create(name="Message")
        options = [{"option": option, "value": "2"}]

        self.basket.add(product, options=options)
        self.assertEqual(0, self.basket.line_quantity(product, record))
        self.assertEqual(1, self.basket.line_quantity(product, record, options))
 def setUp(self):
     self.basket = Basket()
     self.basket.strategy = strategy.Default()
     self.product = factories.create_product()
     self.record = factories.create_stockrecord(
         currency='GBP',
         product=self.product, price_excl_tax=D('10.00'))
     self.stockinfo = factories.create_stockinfo(self.record)
     self.basket.add(self.product)
    def test_allocate_does_nothing(self):
        product = factories.ProductFactory(product_class=self.product_class)
        stockrecord = factories.create_stockrecord(product,
                                                   price=D('10.00'),
                                                   num_in_stock=10)

        self.assertFalse(stockrecord.can_track_allocations)
        stockrecord.allocate(5)
        self.assertEqual(stockrecord.num_allocated, None)
 def _create_product(self):
     product = factories.create_product(title='My Product',
                                        product_class='My Product Class')
     record = factories.create_stockrecord(currency='USD',
                                           product=product,
                                           num_in_stock=10,
                                           price_excl_tax=Decimal('10.00'))
     factories.create_purchase_info(record)
     return product
 def setUp(self):
     self.basket = Basket()
     self.basket.strategy = strategy.Default()
     self.product = factories.create_product()
     self.record = factories.create_stockrecord(currency='GBP',
                                                product=self.product,
                                                price=D('10.00'))
     self.purchase_info = factories.create_purchase_info(self.record)
     self.basket.add(self.product)
    def test_single_item_basket_that_doesnt_require_shipping(self):
        # Create a product that doesn't require shipping
        record = factories.create_stockrecord()
        product = record.product
        product.product_class.requires_shipping = False
        product.product_class.save()

        self.basket.add_product(record.product)
        self.assertEquals(D('5.00'), self.method.charge_incl_tax)
 def _create_product(self, price=D('10.00')):
     product = factories.create_product(
         title='My Product',
         product_class='My Product Class')
     record = factories.create_stockrecord(
         currency='USD',
         product=product,
         num_in_stock=10,
         price_excl_tax=price)
     factories.create_purchase_info(record)
     return product
    def test_allocate_does_nothing_for_child_product(self):
        parent_product = factories.ProductFactory(
            structure='parent', product_class=self.product_class)
        child_product = factories.ProductFactory(
            parent=parent_product, product_class=None, structure='child')
        stockrecord = factories.create_stockrecord(
            child_product, price_excl_tax=D('10.00'), num_in_stock=10)

        self.assertFalse(stockrecord.can_track_allocations)
        stockrecord.allocate(5)
        self.assertEqual(stockrecord.num_allocated, None)
    def test_consume_items(self):
        basket = create_basket(empty=True)
        for i in range(5):
            product = create_product()
            create_stockrecord(product, D('10.00'), num_in_stock=10)
            basket.add_product(product, quantity=5)

        offer = self._build_offer('oscarbluelight.offer.conditions.BluelightCoverageCondition', 2)

        affected_lines = offer.condition.proxy().consume_items(offer, basket, [])
        self.assertEqual(len(affected_lines), 2, 'Consumed 2 lines')
        self.assertEqual(affected_lines[0][2], 1, 'Consumed quantity of 1')
        self.assertEqual(affected_lines[1][2], 1, 'Consumed quantity of 1')
        self.assertEqual(basket.all_lines()[0].quantity_with_discount, 1)
        self.assertEqual(basket.all_lines()[0].quantity_without_discount, 4)
        self.assertEqual(basket.all_lines()[1].quantity_with_discount, 1)
        self.assertEqual(basket.all_lines()[1].quantity_without_discount, 4)
        self.assertEqual(basket.all_lines()[2].quantity_with_discount, 0)
        self.assertEqual(basket.all_lines()[2].quantity_without_discount, 5)

        affected_lines = offer.condition.proxy().consume_items(offer, basket, affected_lines)
        self.assertEqual(len(affected_lines), 2, 'Consumed 2 lines')
        self.assertEqual(affected_lines[0][2], 1, 'Consumed quantity of 1')
        self.assertEqual(affected_lines[1][2], 1, 'Consumed quantity of 1')
        self.assertEqual(basket.all_lines()[0].quantity_with_discount, 1)
        self.assertEqual(basket.all_lines()[0].quantity_without_discount, 4)
        self.assertEqual(basket.all_lines()[1].quantity_with_discount, 1)
        self.assertEqual(basket.all_lines()[1].quantity_without_discount, 4)
        self.assertEqual(basket.all_lines()[2].quantity_with_discount, 0)
        self.assertEqual(basket.all_lines()[2].quantity_without_discount, 5)

        affected_lines = offer.condition.proxy().consume_items(offer, basket, [])
        self.assertEqual(len(affected_lines), 2, 'Consumed 2 lines')
        self.assertEqual(affected_lines[0][2], 1, 'Consumed quantity of 1')
        self.assertEqual(affected_lines[1][2], 1, 'Consumed quantity of 1')
        self.assertEqual(basket.all_lines()[0].quantity_with_discount, 2)
        self.assertEqual(basket.all_lines()[0].quantity_without_discount, 3)
        self.assertEqual(basket.all_lines()[1].quantity_with_discount, 2)
        self.assertEqual(basket.all_lines()[1].quantity_without_discount, 3)
        self.assertEqual(basket.all_lines()[2].quantity_with_discount, 0)
        self.assertEqual(basket.all_lines()[2].quantity_without_discount, 5)
Beispiel #57
0
    def setUp(self):
        super(RangeTests, self).setUp()

        self.range = factories.RangeFactory()
        self.range_with_catalog = factories.RangeFactory()

        self.catalog = Catalog.objects.create(partner=self.partner)
        self.product = factories.create_product()

        self.range.add_product(self.product)
        self.range_with_catalog.catalog = self.catalog
        self.stock_record = factories.create_stockrecord(self.product, num_in_stock=2)
        self.catalog.stock_records.add(self.stock_record)
Beispiel #58
0
    def setUp(self):
        super(UtilTests, self).setUp()

        self.catalog = Catalog.objects.create(partner=self.partner)

        self.coupon_product_class, _ = ProductClass.objects.get_or_create(name='coupon')
        self.coupon = factories.create_product(
            product_class=self.coupon_product_class,
            title='Test product'
        )

        self.stock_record = factories.create_stockrecord(self.coupon, num_in_stock=2)
        self.catalog.stock_records.add(self.stock_record)