def test_editing_sales_ranges_multi_shop(rf, admin_user): get_default_shop() another_shop = get_shop(prices_include_tax=True) another_shop.status = ShopStatus.ENABLED another_shop.save() group = get_default_customer_group() data = {} for shop in Shop.objects.all(): data.update(get_edit_view_data(shop, group, 0, 50)) assert ContactGroupSalesRange.objects.count() == 0 # To make this test work we need to mock members form_part since the extra # forms does not render correctly with patch.object(ContactGroupEditView, "base_form_part_classes", [ContactGroupBaseFormPart]): request = apply_request_middleware(rf.post("/", data=data), user=admin_user) view = ContactGroupEditView.as_view() response = view(request=request, pk=group.pk) if hasattr(response, "render"): response.render() assert response.status_code in [200, 302] assert ContactGroupSalesRange.objects.count() == 2 for shop in Shop.objects.all(): sales_range = ContactGroupSalesRange.objects.filter(group=group, shop=shop).first() assert sales_range.min_value == 0 assert sales_range.max_value == 50
def get_default_behavior_settings(): return { FixedCostBehaviorComponent.__name__.lower(): { "description__en": "Fixed cost test", "price_value": 1, "id": "", }, WaivingCostBehaviorComponent.__name__.lower(): { "description__en": "Waiving cost test", "price_value": 1, "waive_limit_value": 1, "id": "", }, "weight_based_price_ranges": { "description__en": "Weight based pricing test", "price_value": 1, "min_value": 1, "max_value": 2, "id": "", }, WeightLimitsBehaviorComponent.__name__.lower(): { "min_weight": 0, "max_weight": 1, "id": "", }, GroupAvailabilityBehaviorComponent.__name__.lower(): { "groups": [get_default_customer_group().pk] } }
def _get_test_product(): shop = get_default_shop() product = create_product("Just-A-Pricing-Product", shop, default_price=200) CgpPrice.objects.create( product=product, shop=shop, group=get_default_customer_group(), price_value=250) return product
def test_change_shop_price(): product = _get_test_product() shop = get_default_shop() group = get_default_customer_group() form_field = "s_%d_g_%d" % (shop.id, group.id) frm = SimplePricingForm(product=product, empty_permitted=True) form_data = get_form_data(frm, prepared=True) # Price hike time! form_data[form_field] = "4000" frm = SimplePricingForm(product=product, data=form_data, empty_permitted=True) frm.full_clean() frm.save() assert SimpleProductPrice.objects.get(product=product, shop=shop, group=group).price == 4000 # Never mind actually, same price for all shops form_data[form_field] = "" frm = SimplePricingForm(product=product, data=form_data, empty_permitted=True) frm.full_clean() frm.save() assert not SimpleProductPrice.objects.filter( product=product, shop=shop, group=group).exists()
def _get_test_product(): shop = get_default_shop() product = create_product("Just-A-Pricing-Product", shop, default_price=200) SimpleProductPrice.objects.create( product=product, shop=shop, group=get_default_customer_group(), price_value=250) return product
def get_default_behavior_settings(): return { FixedCostBehaviorComponent.__name__.lower(): { "description__en": "Fixed cost test", "price_value": 1, "id": "", }, WaivingCostBehaviorComponent.__name__.lower(): { "description__en": "Waiving cost test", "price_value": 1, "waive_limit_value": 1, "id": "", }, "weight_based_price_ranges": { "description__en": "Weight based pricing test", "price_value": 1, "min_value": 1, "max_value": 2, "id": "", }, WeightLimitsBehaviorComponent.__name__.lower(): { "min_weight": 0, "max_weight": 1, "id": "", }, GroupAvailabilityBehaviorComponent.__name__.lower(): { "groups": [get_default_customer_group().pk] }, RoundingBehaviorComponent.__name__.lower(): { "mode": RoundingMode.ROUND_UP.value, "quant": decimal.Decimal('0.05') } }
def test_contact_group_members_formset(rf): FormSet = formset_factory(ContactGroupMembersForm, ContactGroupMembersFormSet, extra=1, can_delete=True) contact_group = get_default_customer_group() person = create_random_person() # No members formset = FormSet(contact_group=contact_group) assert formset.initial_form_count() == 0 # Add a member data = dict(get_form_data(formset, True), **{"form-0-member": person.pk}) formset = FormSet(contact_group=contact_group, data=data) formset.save() assert contact_group.members.filter(pk=person.pk).exists() # Remove a member formset = FormSet(contact_group=contact_group) assert formset.initial_form_count() == 1 data = dict(get_form_data(formset, True), **{"form-0-DELETE": "1"}) formset = FormSet(contact_group=contact_group, data=data) formset.save() assert not contact_group.members.exists()
def test_category_links_plugin_with_customer(rf, show_all_categories): """ Test plugin for categories that is visible for certain group """ shop = get_default_shop() group = get_default_customer_group() customer = create_random_person() customer.groups.add(group) customer.save() request = rf.get("/") request.shop = get_default_shop() apply_request_middleware(request) request.customer = customer category = get_default_category() category.status = CategoryStatus.VISIBLE category.visibility = CategoryVisibility.VISIBLE_TO_GROUPS category.visibility_groups.add(group) category.shops.add(shop) category.save() vars = {"request": request} context = get_jinja_context(**vars) plugin = CategoryLinksPlugin({"categories": [category.pk], "show_all_categories": show_all_categories}) assert category.is_visible(customer) assert category in plugin.get_context_data(context)["categories"] customer_without_groups = create_random_person() customer_without_groups.groups.clear() assert not category.is_visible(customer_without_groups) request.customer = customer_without_groups context = get_jinja_context(**vars) assert category not in plugin.get_context_data(context)["categories"]
def test_basic_form_sanity(): shop = get_default_shop() group = get_default_customer_group() product = _get_test_product() frm = SimplePricingForm(product=product, empty_permitted=True) assert len(frm.groups) == ContactGroup.objects.count() assert len(frm.shops) == Shop.objects.count() assert "s_%d_g_%d" % (shop.id, group.id) in frm.fields
def test_condition_doesnt_match(rf): activate("en") request, shop, group = initialize_test(rf, False) condition = ContactGroupCondition.objects.create() condition.contact_groups = [get_default_customer_group()] condition.save() request.customer = None assert not condition.matches(request)
def test_form_part_for_random_group(rf, admin_user): get_default_shop() group = get_default_customer_group() request = apply_request_middleware(rf.get("/"), user=admin_user) initialized_view = ContactGroupEditView(request=request, kwargs={"pk": group.pk}) initialized_view.object = initialized_view.get_object() # Just for test form_def_values = initialized_view.get_form().form_defs.values() assert [form_def for form_def in form_def_values if form_def.name == "base"] # contact_group_sales_ranges should be in form defs assert [form_def for form_def in form_def_values if "contact_group_sales_ranges" in form_def.name]
def test_customers(django_user_model): users = [django_user_model.objects.create_user('Joe-%d' % x, '*****@*****.**' % x, 'password') for x in range(10)] group = get_default_customer_group() assert str(group) == DEFAULT_NAME for user in users: contact = get_person_contact(user) group.members.add(contact) for user in users: assert PersonContact.objects.get(user=user).user_id == user.pk, "Customer profile found" assert tuple(user.contact.groups.values_list("identifier", flat=True)) == (DEFAULT_IDENTIFIER,), "Joe is now in the group"
def initialize_test(rf, include_tax=False): shop = get_shop(prices_include_tax=include_tax) group = get_default_customer_group() customer = create_random_person() customer.groups.add(group) customer.save() request = apply_request_middleware(rf.get("/")) request.shop = shop request.customer = customer return request, shop, group
def initialize_test(rf, include_tax=False): shop = get_shop_with_tax(include_tax=include_tax) group = get_default_customer_group() customer = create_random_person() customer.groups.add(group) customer.save() request = rf.get("/") request.shop = shop request.customer = customer return request, shop, group
def test_with_multiple_groups(admin_user): payment_method = get_default_payment_method() group = get_default_customer_group() person = create_random_person() groups = [group, person.get_default_group()] _assign_component_for_service(payment_method, groups) person.user = admin_user person.save() source = _get_source_for_contact(admin_user, payment_method) assert source.customer == person assert len([group for group in person.groups.all() if group in groups]) == 1 _test_service_availability(source, payment_method, True)
def test_contact_group_members_formset(rf): FormSet = formset_factory(ContactGroupMembersForm, ContactGroupMembersFormSet, extra=1, can_delete=True) contact_group = get_default_customer_group() person = create_random_person() # No members formset = FormSet(contact_group=contact_group) assert formset.initial_form_count() == 0 # Add a member data = dict(get_form_data(formset, True), **{"form-0-member": person.pk}) formset = FormSet(contact_group=contact_group, data=data) formset.save() assert contact_group.members.filter(pk=person.pk).exists()
def test_basic_form_sanity(): shop = get_default_shop() group = get_default_customer_group() product = _get_test_product() frm = SimplePricingForm(product=product, empty_permitted=True) assert len(frm.groups) == 1 + ContactGroup.objects.count() assert len(frm.shops) == 1 + Shop.objects.count() for shop_id in (0, shop.id): for group_id in (0, group.id): assert "s_%d_g_%d" % (shop_id, group_id) in frm.fields form_data = get_form_data(frm) assert form_data["s_%d_g_0" % shop.id] == 250 assert form_data["s_0_g_0"] == 200
def initialize_test(rf, include_tax=False): activate("en") shop = get_shop(prices_include_tax=include_tax) get_default_payment_method() # Valid baskets needs some payment methods to be available group = get_default_customer_group() customer = create_random_person() customer.groups.add(group) customer.save() request = rf.get("/") request.shop = shop apply_request_middleware(request) request.customer = customer return request, shop, group
def test_sales_ranges_basic(): shop = get_default_shop() supplier = get_default_supplier() default_group = get_default_customer_group() # Create non active range for default group ContactGroupSalesRange.objects.create(group=default_group, shop=shop, min_value=0, max_value=0) person = create_random_person() default_group.members.add(person) initial_group_count = person.groups.count() sales_ranges = [("silver", 0, 50), ("gold", 50, 100), ("diamond", 100, 1000)] for identifier, min, max in sales_ranges: create_sales_range(identifier, shop, min, max) payment = create_fully_paid_order(shop, person, supplier, "sku1", 10) assert get_total_sales(shop, person) == 10 update_customers_groups(Payment, payment) assert person.groups.count() == (initial_group_count + 1) assert bool([ group for group in person.groups.all() if group.identifier == "silver" ]) # Since group has inactive range person shouldn't be removed from it assert bool( [group for group in person.groups.all() if group == default_group]) payment = create_fully_paid_order(shop, person, supplier, "sku2", 50) assert get_total_sales(shop, person) == 60 update_customers_groups(Payment, payment) assert person.groups.count() == (initial_group_count + 1) assert bool( [group for group in person.groups.all() if group.identifier == "gold"]) # Since group has inactive range person shouldn't be removed from it assert bool( [group for group in person.groups.all() if group == default_group]) payment = create_fully_paid_order(shop, person, supplier, "sku3", 200) assert get_total_sales(shop, person) == 260 update_customers_groups(Payment, payment) assert person.groups.count() == (initial_group_count + 1) assert bool([ group for group in person.groups.all() if group.identifier == "diamond" ]) # Since group has inactive range person shouldn't be removed from it assert bool( [group for group in person.groups.all() if group == default_group])
def test_contact_group_behavior(admin_user): payment_method = get_default_payment_method() group = get_default_customer_group() _assign_component_for_service(payment_method, [group]) person = create_random_person() person.user = admin_user person.save() source = _get_source_for_contact(admin_user, payment_method) assert source.customer == person assert group not in person.groups.all() _test_service_availability(source, payment_method, False) person.groups.add(group) assert group in person.groups.all() _test_service_availability(source, payment_method, True)
def test_form_part_for_random_group(rf, admin_user): get_default_shop() group = get_default_customer_group() request = apply_request_middleware(rf.get("/"), user=admin_user) initialized_view = ContactGroupEditView(request=request, kwargs={"pk": group.pk}) initialized_view.object = initialized_view.get_object() # Just for test form_def_values = initialized_view.get_form().form_defs.values() assert [ form_def for form_def in form_def_values if form_def.name == "base" ] # contact_group_sales_ranges should be in form defs assert [ form_def for form_def in form_def_values if "contact_group_sales_ranges" in form_def.name ]
def test_no_customer(rf): shop = get_default_shop() group = get_default_customer_group() product = create_product("random-1", shop=shop, default_price=100) SimpleProductPrice.objects.create(product=product, group=group, shop=shop, price=50) request = rf.get("/") request.shop = shop spm = SimplePricingModule() pricing_context = spm.get_context_from_request(request) price_info = spm.get_price_info(pricing_context, product) assert price_info.price == TaxfulPrice(100)
def test_context_contact_group_condition(rf): original_price_value, discount_value = 123, 15 request = get_request_for_contact_tests(rf) customer = create_random_person() default_group = get_default_customer_group() customer.groups.add(default_group) request.customer = customer condition = ContactGroupCondition.objects.create() condition.contact_groups.add(default_group) product = create_random_product_and_campaign(request.shop, [condition], original_price_value, discount_value) discounted_value = original_price_value - discount_value assert_product_price_value_with_customer(request, customer, product, discounted_value) request.customer.groups.clear() assert_product_price_value_with_customer(request, customer, product, original_price_value)
def test_basket_contact_group_condition(rf): product_price_value, campaign_discount_value = 123, 15 request = get_request_for_contact_tests(rf) customer = create_random_person() default_group = get_default_customer_group() customer.groups.add(default_group) request.customer = customer condition = ContactGroupBasketCondition.objects.create() condition.contact_groups.add(default_group) basket, original_line_count, original_price = create_basket_and_campaign( request, [condition], product_price_value, campaign_discount_value) assert basket.customer == customer assert_discounted_basket(basket, original_line_count, original_price, campaign_discount_value) customer.groups.remove(default_group) assert_non_discounted_basket(basket, original_line_count, original_price)
def test_editing_sales_ranges(rf, admin_user): shop = get_default_shop() group = get_default_customer_group() data = get_edit_view_data(shop, group, 1, 100) assert ContactGroupSalesRange.objects.count() == 0 # To make this test work we need to mock members form_part since the # extra forms does not render correctly with patch.object(ContactGroupEditView, "base_form_part_classes", [ContactGroupBaseFormPart]): request = apply_request_middleware(rf.post("/", data=data), user=admin_user) view = ContactGroupEditView.as_view() response = view(request=request, pk=group.pk) if hasattr(response, "render"): response.render() assert response.status_code in [200, 302] sales_range = ContactGroupSalesRange.objects.filter(group=group, shop=shop).first() assert sales_range.min_value == 1 assert sales_range.max_value == 100
def test_no_customer(rf): shop = get_default_shop() group = get_default_customer_group() price = shop.create_price product = create_product("random-1", shop=shop, default_price=100) SimpleProductPrice.objects.create(product=product, group=group, shop=shop, price_value=50) request = rf.get("/") request.shop = shop spm = SimplePricingModule() pricing_context = spm.get_context_from_request(request) price_info = spm.get_price_info(pricing_context, product) assert price_info.price == price(100)
def initialize_test(rf, include_tax=False): activate("en") shop = get_shop(prices_include_tax=include_tax) # Valid baskets needs some payment methods to be available get_payment_method(shop) # Since some of the baskets are created for the default shop: get_payment_method(None) group = get_default_customer_group() customer = create_random_person() customer.groups.add(group) customer.save() request = rf.get("/") request.shop = shop apply_request_middleware(request) request.customer = customer return request, shop, group
def test_sales_ranges_basic(): shop = get_default_shop() supplier = get_default_supplier() default_group = get_default_customer_group() # Create non active range for default group ContactGroupSalesRange.objects.create(group=default_group, shop=shop, min_value=0, max_value=0) person = create_random_person() default_group.members.add(person) initial_group_count = person.groups.count() sales_ranges = [ ("silver", 0, 50), ("gold", 50, 100), ("diamond", 100, 1000) ] for identifier, min, max in sales_ranges: create_sales_range(identifier, shop, min, max) payment = create_fully_paid_order(shop, person, supplier, "sku1", 10) assert get_total_sales(shop, person) == 10 update_customers_groups(Payment, payment) assert person.groups.count() == (initial_group_count + 1) assert bool([group for group in person.groups.all() if group.identifier == "silver"]) # Since group has inactive range person shouldn't be removed from it assert bool([group for group in person.groups.all() if group == default_group]) payment = create_fully_paid_order(shop, person, supplier, "sku2", 50) assert get_total_sales(shop, person) == 60 update_customers_groups(Payment, payment) assert person.groups.count() == (initial_group_count + 1) assert bool([group for group in person.groups.all() if group.identifier == "gold"]) # Since group has inactive range person shouldn't be removed from it assert bool([group for group in person.groups.all() if group == default_group]) payment = create_fully_paid_order(shop, person, supplier, "sku3", 200) assert get_total_sales(shop, person) == 260 update_customers_groups(Payment, payment) assert person.groups.count() == (initial_group_count + 1) assert bool([group for group in person.groups.all() if group.identifier == "diamond"]) # Since group has inactive range person shouldn't be removed from it assert bool([group for group in person.groups.all() if group == default_group])
def test_product_visibility(rf, admin_user, regular_user): anon_contact = get_person_contact(AnonymousUser()) shop_product = get_default_shop_product() admin_contact = get_person_contact(admin_user) regular_contact = get_person_contact(regular_user) with modify(shop_product.product, deleted=True): # NB: assigning to `product` here works because `get_shop_instance` populates `_product_cache` assert error_exists(shop_product.get_visibility_errors(customer=anon_contact), "product_deleted") assert error_exists(shop_product.get_visibility_errors(customer=admin_contact), "product_deleted") with pytest.raises(ProductNotVisibleProblem): shop_product.raise_if_not_visible(anon_contact) assert not shop_product.is_list_visible() with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_ALL, visible=False): assert error_exists(shop_product.get_visibility_errors(customer=anon_contact), "product_not_visible") assert error_does_not_exist(shop_product.get_visibility_errors(customer=admin_contact), "product_not_visible") assert not shop_product.is_list_visible() with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_LOGGED_IN, visible=True): assert error_exists(shop_product.get_visibility_errors(customer=anon_contact), "product_not_visible_to_anonymous") assert error_does_not_exist(shop_product.get_visibility_errors(customer=admin_contact), "product_not_visible_to_anonymous") customer_group = get_default_customer_group() grouped_user = get_user_model().objects.create_user(username=printable_gibberish(20)) grouped_contact = get_person_contact(grouped_user) with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_GROUPS, visible=True): shop_product.visibility_groups.add(customer_group) customer_group.members.add(grouped_contact) customer_group.members.remove(get_person_contact(regular_user)) assert error_does_not_exist(shop_product.get_visibility_errors(customer=grouped_contact), "product_not_visible_to_group") assert error_does_not_exist(shop_product.get_visibility_errors(customer=admin_contact), "product_not_visible_to_group") assert error_exists(shop_product.get_visibility_errors(customer=regular_contact), "product_not_visible_to_group") with modify(shop_product, listed=False): assert not shop_product.is_list_visible() with modify(shop_product, listed=True): assert shop_product.is_list_visible()
def test_change_shop_price(): product = _get_test_product() shop = get_default_shop() group = get_default_customer_group() price = shop.create_price form_field = "s_%d_g_%d" % (shop.id, group.id) frm = SimplePricingForm(product=product, empty_permitted=True) form_data = get_form_data(frm, prepared=True) # Price hike time! form_data[form_field] = "4000" frm = SimplePricingForm(product=product, data=form_data, empty_permitted=True) frm.full_clean() frm.save() assert SimpleProductPrice.objects.get(product=product, shop=shop, group=group).price == price(4000) # Never mind actually, same price for all shops form_data[form_field] = "" frm = SimplePricingForm(product=product, data=form_data, empty_permitted=True) frm.full_clean() frm.save() assert not SimpleProductPrice.objects.filter(product=product, shop=shop, group=group).exists()
def test_contact_group_delete_button(rf, admin_user): get_default_shop() request = apply_request_middleware(rf.get("/"), user=admin_user) check_for_delete(request, get_default_customer_group(), True)
def test_contact_group_delete(): default_group = get_default_customer_group() group_count = ContactGroup.objects.count() default_group.delete() assert ContactGroup.objects.count() == (group_count - 1)
def test_product_visibility(rf, admin_user, regular_user): anon_contact = get_person_contact(AnonymousUser()) shop_product = get_default_shop_product() admin_contact = get_person_contact(admin_user) regular_contact = get_person_contact(regular_user) with modify( shop_product.product, deleted=True ): # NB: assigning to `product` here works because `get_shop_instance` populates `_product_cache` assert error_exists( shop_product.get_visibility_errors(customer=anon_contact), "product_deleted") assert error_exists( shop_product.get_visibility_errors(customer=admin_contact), "product_deleted") with pytest.raises(ProductNotVisibleProblem): shop_product.raise_if_not_visible(anon_contact) assert not shop_product.is_list_visible() with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_ALL, visible=False): assert error_exists( shop_product.get_visibility_errors(customer=anon_contact), "product_not_visible") assert error_does_not_exist( shop_product.get_visibility_errors(customer=admin_contact), "product_not_visible") assert not shop_product.is_list_visible() with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_LOGGED_IN, visible=True): assert error_exists( shop_product.get_visibility_errors(customer=anon_contact), "product_not_visible_to_anonymous") assert error_does_not_exist( shop_product.get_visibility_errors(customer=admin_contact), "product_not_visible_to_anonymous") customer_group = get_default_customer_group() grouped_user = get_user_model().objects.create_user( username=printable_gibberish(20)) grouped_contact = get_person_contact(grouped_user) with modify(shop_product, visibility_limit=ProductVisibility.VISIBLE_TO_GROUPS, visible=True): shop_product.visibility_groups.add(customer_group) customer_group.members.add(grouped_contact) customer_group.members.remove(get_person_contact(regular_user)) assert error_does_not_exist( shop_product.get_visibility_errors(customer=grouped_contact), "product_not_visible_to_group") assert error_does_not_exist( shop_product.get_visibility_errors(customer=admin_contact), "product_not_visible_to_group") assert error_exists( shop_product.get_visibility_errors(customer=regular_contact), "product_not_visible_to_group") with modify(shop_product, listed=False): assert not shop_product.is_list_visible() with modify(shop_product, listed=True): assert shop_product.is_list_visible()