class CountConditionTest(OfferTest): def setUp(self): super(CountConditionTest, self).setUp() self.cond = CountCondition(range=self.range, type="Count", value=2) def test_empty_basket_fails_condition(self): self.assertFalse(self.cond.is_satisfied(self.basket)) def test_matching_quantity_basket_passes_condition(self): self.basket.add_product(create_product(), 2) self.assertTrue(self.cond.is_satisfied(self.basket)) def test_greater_quantity_basket_passes_condition(self): self.basket.add_product(create_product(), 3) self.assertTrue(self.cond.is_satisfied(self.basket)) def test_consumption(self): self.basket.add_product(create_product(), 3) self.cond.consume_items(self.basket) self.assertEquals(1, self.basket.all_lines()[0].quantity_without_discount) def test_is_satisfied_accounts_for_consumed_items(self): self.basket.add_product(create_product(), 3) self.cond.consume_items(self.basket) self.assertFalse(self.cond.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_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_count_condition_is_applied_multpile_times(self): benefit = AbsoluteDiscountBenefit(range=self.range, type="Absolute", value=Decimal('10.00')) for i in range(10): self.basket.add_product( create_product(price=Decimal('5.00'), upc='upc_%i' % i), 1) product_range = Range.objects.create(name="All products", includes_all_products=True) condition = CountCondition(range=product_range, type="Count", value=2) first_discount = benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('10.00'), first_discount) second_discount = benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('10.00'), second_discount)
class CountConditionTest(OfferTest): def setUp(self): super(CountConditionTest, self).setUp() self.cond = CountCondition(range=self.range, type="Count", value=2) def test_empty_basket_fails_condition(self): self.assertFalse(self.cond.is_satisfied(self.basket)) def test_matching_quantity_basket_passes_condition(self): self.basket.add_product(create_product(), 2) self.assertTrue(self.cond.is_satisfied(self.basket)) def test_greater_quantity_basket_passes_condition(self): self.basket.add_product(create_product(), 3) self.assertTrue(self.cond.is_satisfied(self.basket)) def test_consumption(self): self.basket.add_product(create_product(), 3) self.cond.consume_items(self.basket) self.assertEquals(1, self.basket.all_lines()[0].quantity_without_discount) def test_is_satisfied_accounts_for_consumed_items(self): self.basket.add_product(create_product(), 3) self.cond.consume_items(self.basket) self.assertFalse(self.cond.is_satisfied(self.basket)) def test_count_condition_is_applied_multpile_times(self): benefit = AbsoluteDiscountBenefit(range=self.range, type="Absolute", value=Decimal('10.00')) for i in range(10): self.basket.add_product( create_product(price=Decimal('5.00'), upc='upc_%i' % i), 1) product_range = Range.objects.create(name="All products", includes_all_products=True) condition = CountCondition(range=product_range, type="Count", value=2) first_discount = benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('10.00'), first_discount) second_discount = benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('10.00'), second_discount)
class CountConditionTest(OfferTest): def setUp(self): super(CountConditionTest, self).setUp() self.cond = CountCondition(range=self.range, type="Count", value=2) def test_empty_basket_fails_condition(self): self.assertFalse(self.cond.is_satisfied(self.basket)) def test_matching_quantity_basket_passes_condition(self): self.basket.add_product(create_product(), 2) self.assertTrue(self.cond.is_satisfied(self.basket)) def test_greater_quantity_basket_passes_condition(self): self.basket.add_product(create_product(), 3) self.assertTrue(self.cond.is_satisfied(self.basket)) def test_consumption(self): self.basket.add_product(create_product(), 3) self.cond.consume_items(self.basket) self.assertEquals(1, self.basket.all_lines()[0].quantity_without_discount) def test_is_satisfied_accounts_for_consumed_items(self): self.basket.add_product(create_product(), 3) self.cond.consume_items(self.basket) self.assertFalse(self.cond.is_satisfied(self.basket)) def test_count_condition_is_applied_multpile_times(self): benefit = AbsoluteDiscountBenefit(range=self.range, type="Absolute", value=Decimal('10.00')) for i in range(10): self.basket.add_product(create_product(price=Decimal('5.00'), upc='upc_%i' % i), 1) product_range = Range.objects.create(name="All products", includes_all_products=True) condition = CountCondition(range=product_range, type="Count", value=2) first_discount = benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('10.00'), first_discount) second_discount = benefit.apply(self.basket, condition=condition) self.assertEquals(Decimal('10.00'), second_discount)
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_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_correct_discount_for_count_condition(self): products = [ create_product(Decimal('7.00')), create_product(Decimal('8.00')), create_product(Decimal('12.00')) ] # Create range that includes the products range = Range.objects.create(name="Dummy range") for product in products: range.included_products.add(product) condition = CountCondition(range=range, type="Count", value=3) # Create basket that satisfies condition but with one extra product basket = Basket.objects.create() [basket.add_product(p, 2) for p in products] benefit = FixedPriceBenefit(range=range, type="FixedPrice", value=Decimal('20.00')) self.assertEquals(Decimal('2.00'), benefit.apply(basket, condition)) self.assertEquals(Decimal('12.00'), benefit.apply(basket, condition)) self.assertEquals(Decimal('0.00'), benefit.apply(basket, condition))
def setUp(self): super(CountConditionTest, self).setUp() self.cond = CountCondition(range=self.range, type="Count", value=2)
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)