def test_copy_order_to_basket_for_anonymous(): with override_settings(**REQUIRED_SETTINGS): set_configuration() shop = factories.get_default_shop() order = _create_order(shop, AnonymousContact()) basket = factories.get_basket(shop) assert basket.customer is None client = APIClient() assert basket.customer is None _fill_new_basket_from_order(client, basket, None, order) # do it again, basket should clear first then read items _fill_new_basket_from_order(client, basket, None, order)
def test_copy_order_to_basket(admin_user): with override_settings(**REQUIRED_SETTINGS): set_configuration() shop = factories.get_default_shop() order = _create_order(shop, get_person_contact(admin_user)) client = get_client(admin_user) basket = factories.get_basket(shop) # No need to assign basket customer separately since the # API will use request customer as default customer _fill_new_basket_from_order(client, basket, order.customer, order) # do it again, basket should clear first then read items _fill_new_basket_from_order(client, basket, order.customer, order)
def test_suppliers_filter_get_fields(rf): cache.clear() shop = factories.get_default_shop() request = apply_request_middleware(rf.get("/")) assert SupplierProductListFilter().get_fields(request, None) is None supplier = Supplier.objects.create(name="Favorite brands dot com") supplier.shops.add(shop) assert Supplier.objects.enabled().exists() assert SupplierProductListFilter().get_fields(request, None) is None category = factories.get_default_category() product = factories.create_product("sku", shop=shop) shop_product = product.get_shop_instance(shop=shop) shop_product.primary_category = category shop_product.save() assert SupplierProductListFilter().get_fields(request, category) is None # Now once we link supplier to product we should get # form field for manufacturer shop_product.suppliers.add(supplier) form_field = SupplierProductListFilter().get_fields(request, category)[0][1] assert form_field is not None assert form_field.label == "Suppliers" with override_settings(E-Commerce_FRONT_OVERRIDE_SORTS_AND_FILTERS_LABELS_LOGIC={"supplier": "Filter by suppliers"}): form_field = SupplierProductListFilter().get_fields(request, category)[0][1] assert form_field is not None assert form_field.label == "Filter by suppliers" assert isinstance(form_field, forms.ModelChoiceField) configuration = get_configuration(shop, category) configuration.update({ SupplierProductListFilter.enable_multiselect_key: True }) set_configuration(shop, category, configuration) form_field = SupplierProductListFilter().get_fields(request, category)[0][1] assert form_field is not None assert form_field.label == "Filter by suppliers" assert isinstance(form_field, CommaSeparatedListField) cache.clear()
def test_category_filter(): shop = factories.get_default_shop() category1 = Category.objects.create(name="Category 1") category1.shops.add(shop) product1 = factories.create_product("p1", shop, factories.get_default_supplier(), "10") shop_product1 = product1.get_shop_instance(shop) shop_product1.categories.add(category1) category2 = Category.objects.create(name="Category 2") category2.shops.add(shop) product2 = factories.create_product("p2", shop, factories.get_default_supplier(), "20") shop_product2 = product2.get_shop_instance(shop) shop_product2.categories.add(category2) client = SmartClient() config = {"filter_products_by_category": True} set_configuration(shop=shop, data=config) url = reverse('E-Commerce:all-categories') # 1) go to all categories view and list products # no filters being applied should list all products response, soup = client.response_and_soup(url) assert response.status_code == 200 assert soup.find(id="product-%d" % product1.id) assert soup.find(id="product-%d" % product2.id) # 2) filter by category2 id only response, soup = client.response_and_soup("{}?categories={}".format(url, category2.pk)) assert response.status_code == 200 assert not soup.find(id="product-%d" % product1.id) assert soup.find(id="product-%d" % product2.id) # 3) filter by category1 and category2 id response, soup = client.response_and_soup("{}?categories={},{}".format(url, category1.pk, category2.pk)) assert response.status_code == 200 assert soup.find(id="product-%d" % product1.id) assert soup.find(id="product-%d" % product2.id) # 4) filter by blank value, it shouldn't break response, soup = client.response_and_soup("{}?categories=".format(url)) assert response.status_code == 200 assert soup.find(id="product-%d" % product1.id) assert soup.find(id="product-%d" % product2.id)
def test_copy_order_to_basket_for_staff(admin_user): with override_settings(**REQUIRED_SETTINGS): set_configuration() shop = factories.get_default_shop() customer = factories.create_random_person() order = _create_order(shop, customer) client = get_client(admin_user) basket = factories.get_basket(shop) uuid = "%s-%s" % (shop.pk, basket.key) response = client.post( '/api/E-Commerce/basket/%s/set_customer/' % uuid, format="json", data={"customer": customer.id} ) assert response.status_code == status.HTTP_200_OK response = client.post('/api/E-Commerce/basket/%s/add_from_order/' % uuid, {"order": order.pk}) assert response.status_code == status.HTTP_404_NOT_FOUND # admin user is not staff shop.staff_members.add(admin_user) _fill_new_basket_from_order(client, basket, customer, order)
def test_product_price_range_filter(): shop = factories.get_default_shop() product = factories.get_default_product() category = factories.get_default_category() shop_product = product.get_shop_instance(shop) shop_product.default_price_value = 10 shop_product.categories.add(category) shop_product.save() client = SmartClient() config = { "filter_products_by_price": True, "filter_products_by_price_range_min": 5, "filter_products_by_price_range_max": 15, "filter_products_by_price_range_size": 5 } set_configuration(category=category, data=config) url = reverse('E-Commerce:category', kwargs={'pk': category.pk, 'slug': category.slug}) response, soup = client.response_and_soup(url) assert response.status_code == 200 assert soup.find(id="product-%d" % product.id) price_range_select = soup.find(id="id_price_range") # as the configuration is not set to override shop default configuration # this field shouldn't be there.. assert price_range_select is None # make the category configuration override the shop's default config config.update({"override_default_configuration": True}) set_configuration(category=category, data=config) url = reverse('E-Commerce:category', kwargs={'pk': category.pk, 'slug': category.slug}) response, soup = client.response_and_soup(url) assert response.status_code == 200 assert soup.find(id="product-%d" % product.id) price_range_select = soup.find(id="id_price_range") price_ranges = price_range_select.find_all("option") assert len(price_ranges) == 4 # filter products with prices above $15 filtered_url = "{}?price_range={}".format(url, price_ranges[-1].attrs["value"]) response, soup = client.response_and_soup(filtered_url) assert response.status_code == 200 assert not soup.find(id="product-%d" % product.id) # explicitly disable the override config.update({"override_default_configuration": False}) set_configuration(category=category, data=config) url = reverse('E-Commerce:category', kwargs={'pk': category.pk, 'slug': category.slug}) response, soup = client.response_and_soup(url) assert response.status_code == 200 assert soup.find(id="product-%d" % product.id) price_range_select = soup.find(id="id_price_range") assert price_range_select is None
def form_valid(self, form): if self.name in form.forms and form[self.name].has_changed(): set_configuration(category=self.object, data=form[self.name].cleaned_data)