class MultibuyDiscountBenefitTest(OfferTest): def setUp(self): super(MultibuyDiscountBenefitTest, self).setUp() self.benefit = MultibuyDiscountBenefit(range=self.range, type="Multibuy", value=1) self.item = create_product(price=Decimal('5.00')) def test_no_discount_for_empty_basket(self): self.assertEquals(Decimal('0.00'), self.benefit.apply(self.basket)) def test_discount_for_single_item_basket(self): self.basket.add_product(self.item, 1) self.assertEquals(Decimal('5.00'), self.benefit.apply(self.basket)) def test_discount_for_multi_item_basket(self): self.basket.add_product(self.item, 3) self.assertEquals(Decimal('5.00'), self.benefit.apply(self.basket)) def test_discount_does_not_consume_item(self): self.basket.add_product(self.item, 1) first_discount = self.benefit.apply(self.basket) self.assertEquals(Decimal('5.00'), first_discount) second_discount = self.benefit.apply(self.basket) self.assertEquals(Decimal('5.00'), second_discount)
class MultibuyDiscountBenefitTest(OfferTest): def setUp(self): super(MultibuyDiscountBenefitTest, self).setUp() self.benefit = MultibuyDiscountBenefit(range=self.range, type="Multibuy", value=1) self.item = create_product(price=Decimal('5.00')) def test_no_discount_for_empty_basket(self): self.assertEquals(Decimal('0.00'), self.benefit.apply(self.basket)) def test_discount_for_single_item_basket(self): self.basket.add_product(self.item, 1) self.assertEquals(Decimal('5.00'), self.benefit.apply(self.basket)) def test_discount_for_multi_item_basket(self): self.basket.add_product(self.item, 3) self.assertEquals(Decimal('5.00'), self.benefit.apply(self.basket)) def test_discount_consumes_item(self): self.basket.add_product(self.item, 1) first_discount = self.benefit.apply(self.basket) self.assertEquals(Decimal('5.00'), first_discount) second_discount = self.benefit.apply(self.basket) self.assertEquals(Decimal('0.00'), second_discount)
class MultibuyDiscountBenefitTest(OfferTest): def setUp(self): super(MultibuyDiscountBenefitTest, self).setUp() self.benefit = MultibuyDiscountBenefit(range=self.range, type="Multibuy", value=1) self.item = create_product(price=Decimal('5.00')) def test_no_discount_for_empty_basket(self): self.assertEquals(Decimal('0.00'), self.benefit.apply(self.basket)) def test_discount_for_single_item_basket(self): self.basket.add_product(self.item, 1) self.assertEquals(Decimal('5.00'), self.benefit.apply(self.basket)) def test_discount_for_multi_item_basket(self): self.basket.add_product(self.item, 3) self.assertEquals(Decimal('5.00'), self.benefit.apply(self.basket)) def test_discount_does_not_consume_item_if_in_condition_range(self): self.basket.add_product(self.item, 1) first_discount = self.benefit.apply(self.basket) self.assertEquals(Decimal('5.00'), first_discount) second_discount = self.benefit.apply(self.basket) self.assertEquals(Decimal('5.00'), second_discount) def test_product_does_consume_item_if_not_in_condition_range(self): # Set up condition using a different range from benefit range = Range.objects.create(name="Small range") other_product = create_product(price=Decimal('15.00')) range.included_products.add(other_product) cond = ValueCondition(range=range, type="Value", value=Decimal('10.00')) self.basket.add_product(self.item, 1) self.benefit.apply(self.basket, cond) line = self.basket.all_lines()[0] self.assertEqual(line.quantity_without_discount, 0)
class MultibuyDiscountBenefitTest(OfferTest): def setUp(self): super(MultibuyDiscountBenefitTest, self).setUp() self.benefit = MultibuyDiscountBenefit(range=self.range, type="Multibuy", value=1) self.item = create_product(price=Decimal('5.00')) def test_no_discount_for_empty_basket(self): self.assertEquals(Decimal('0.00'), self.benefit.apply(self.basket)) def test_discount_for_single_item_basket(self): self.basket.add_product(self.item, 1) self.assertEquals(Decimal('5.00'), self.benefit.apply(self.basket)) def test_discount_for_multi_item_basket(self): self.basket.add_product(self.item, 3) self.assertEquals(Decimal('5.00'), self.benefit.apply(self.basket)) def test_no_discount_for_not_discountable_product(self): self.item.is_discountable = False self.item.save() self.basket.add_product(self.item, 1) self.assertEquals(Decimal('0.00'), self.benefit.apply(self.basket)) def test_discount_does_not_consume_item_if_in_condition_range(self): self.basket.add_product(self.item, 1) first_discount = self.benefit.apply(self.basket) self.assertEquals(Decimal('5.00'), first_discount) second_discount = self.benefit.apply(self.basket) self.assertEquals(Decimal('5.00'), second_discount) def test_product_does_consume_item_if_not_in_condition_range(self): # Set up condition using a different range from benefit range = Range.objects.create(name="Small range") other_product = create_product(price=Decimal('15.00')) range.included_products.add(other_product) cond = ValueCondition(range=range, type="Value", value=Decimal('10.00')) self.basket.add_product(self.item, 1) self.benefit.apply(self.basket, cond) line = self.basket.all_lines()[0] self.assertEqual(line.quantity_without_discount, 0) def test_condition_consumes_most_expensive_lines_first(self): for i in range(10, 0, -1): product = create_product(price=Decimal(i), title='%i'%i, upc='upc_%i' % i) self.basket.add_product(product, 1) condition = CountCondition(range=self.range, type="Count", value=2) self.assertTrue(condition.is_satisfied(self.basket)) # consume 1 and 10 first_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('1.00'), first_discount) self.assertTrue(condition.is_satisfied(self.basket)) # consume 2 and 9 second_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('2.00'), second_discount) self.assertTrue(condition.is_satisfied(self.basket)) # consume 3 and 8 third_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('3.00'), third_discount) self.assertTrue(condition.is_satisfied(self.basket)) # consume 4 and 7 fourth_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('4.00'), fourth_discount) self.assertTrue(condition.is_satisfied(self.basket)) # consume 5 and 6 fifth_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('5.00'), fifth_discount) # end of items (one not discounted item in basket) self.assertFalse(condition.is_satisfied(self.basket)) def test_condition_consumes_most_expensive_lines_first_when_products_are_repeated(self): for i in range(5, 0, -1): product = create_product(price=Decimal(i), title='%i'%i, upc='upc_%i' % i) self.basket.add_product(product, 2) condition = CountCondition(range=self.range, type="Count", value=2) # initial basket: [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)] self.assertTrue(condition.is_satisfied(self.basket)) # consume 1 and 5 first_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('1.00'), first_discount) self.assertTrue(condition.is_satisfied(self.basket)) # consume 1 and 5 second_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('1.00'), second_discount) self.assertTrue(condition.is_satisfied(self.basket)) # consume 2 and 4 third_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('2.00'), third_discount) self.assertTrue(condition.is_satisfied(self.basket)) # consume 2 and 4 third_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('2.00'), third_discount) self.assertTrue(condition.is_satisfied(self.basket)) # consume 3 and 3 third_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('3.00'), third_discount) # end of items (one not discounted item in basket) self.assertFalse(condition.is_satisfied(self.basket)) def test_products_with_no_stockrecord_are_handled_ok(self): self.basket.add_product(self.item, 3) self.basket.add_product(create_product()) condition = CountCondition(range=self.range, type="Count", value=3) self.benefit.apply(self.basket, condition)
class MultibuyDiscountBenefitTest(OfferTest): def setUp(self): super(MultibuyDiscountBenefitTest, self).setUp() self.benefit = MultibuyDiscountBenefit(range=self.range, type="Multibuy", value=1) self.item = create_product(price=Decimal('5.00')) def test_no_discount_for_empty_basket(self): self.assertEquals(Decimal('0.00'), self.benefit.apply(self.basket)) def test_discount_for_single_item_basket(self): self.basket.add_product(self.item, 1) self.assertEquals(Decimal('5.00'), self.benefit.apply(self.basket)) def test_discount_for_multi_item_basket(self): self.basket.add_product(self.item, 3) self.assertEquals(Decimal('5.00'), self.benefit.apply(self.basket)) def test_discount_does_not_consume_item_if_in_condition_range(self): self.basket.add_product(self.item, 1) first_discount = self.benefit.apply(self.basket) self.assertEquals(Decimal('5.00'), first_discount) second_discount = self.benefit.apply(self.basket) self.assertEquals(Decimal('5.00'), second_discount) def test_product_does_consume_item_if_not_in_condition_range(self): # Set up condition using a different range from benefit range = Range.objects.create(name="Small range") other_product = create_product(price=Decimal('15.00')) range.included_products.add(other_product) cond = ValueCondition(range=range, type="Value", value=Decimal('10.00')) self.basket.add_product(self.item, 1) self.benefit.apply(self.basket, cond) line = self.basket.all_lines()[0] self.assertEqual(line.quantity_without_discount, 0) def test_condition_consumes_most_expensive_lines_first(self): for i in range(10, 0, -1): product = create_product(price=Decimal(i), title='%i' % i, upc='upc_%i' % i) self.basket.add_product(product, 1) condition = CountCondition(range=self.range, type="Count", value=2) self.assertTrue(condition.is_satisfied(self.basket)) # consume 1 and 10 first_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('1.00'), first_discount) self.assertTrue(condition.is_satisfied(self.basket)) # consume 2 and 9 second_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('2.00'), second_discount) self.assertTrue(condition.is_satisfied(self.basket)) # consume 3 and 8 third_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('3.00'), third_discount) self.assertTrue(condition.is_satisfied(self.basket)) # consume 4 and 7 fourth_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('4.00'), fourth_discount) self.assertTrue(condition.is_satisfied(self.basket)) # consume 5 and 6 fifth_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('5.00'), fifth_discount) # end of items (one not discounted item in basket) self.assertFalse(condition.is_satisfied(self.basket)) def test_condition_consumes_most_expensive_lines_first_when_products_are_repeated( self): for i in range(5, 0, -1): product = create_product(price=Decimal(i), title='%i' % i, upc='upc_%i' % i) self.basket.add_product(product, 2) condition = CountCondition(range=self.range, type="Count", value=2) # initial basket: [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)] self.assertTrue(condition.is_satisfied(self.basket)) # consume 1 and 5 first_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('1.00'), first_discount) self.assertTrue(condition.is_satisfied(self.basket)) # consume 1 and 5 second_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('1.00'), second_discount) self.assertTrue(condition.is_satisfied(self.basket)) # consume 2 and 4 third_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('2.00'), third_discount) self.assertTrue(condition.is_satisfied(self.basket)) # consume 2 and 4 third_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('2.00'), third_discount) self.assertTrue(condition.is_satisfied(self.basket)) # consume 3 and 3 third_discount = self.benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('3.00'), third_discount) # end of items (one not discounted item in basket) self.assertFalse(condition.is_satisfied(self.basket)) def test_products_with_no_stockrecord_are_handled_ok(self): self.basket.add_product(self.item, 3) self.basket.add_product(create_product()) condition = CountCondition(range=self.range, type="Count", value=3) self.benefit.apply(self.basket, condition)