def get_form_parts(request, view, object): with override_provides("service_behavior_component_form", DEFAULT_BEHAVIOR_FORMS): with override_provides("service_behavior_component_form_part", DEFAULT_BEHAVIOR_FORM_PARTS): initialized_view = view(request=request, kwargs={"pk": object.pk}) return initialized_view.get_form_parts(object)
def test_campaign_edit_save(rf, admin_user): """ To make things little bit more simple let's use only english as a language. """ with override_settings(LANGUAGES=[("en", "en")]): shop = get_default_shop() object = BasketCampaign.objects.create(name="test campaign", active=True, shop=shop) object.save() view = BasketCampaignEditView.as_view() new_name = "Test Campaign" assert object.name != new_name data = { "base-name": new_name, "base-public_name__en": "Test Campaign", "base-shop": get_default_shop().id, "base-active": True, "base-basket_line_text": "Test campaign activated!" } methods_before = BasketCampaign.objects.count() # Conditions and effects is tested separately with override_provides("campaign_basket_condition", []): with override_provides("campaign_basket_discount_effect_form", []): with override_provides("campaign_basket_line_effect_form", []): request = apply_request_middleware(rf.post("/", data=data), user=admin_user) response = view(request, pk=object.pk) assert response.status_code in [200, 302] assert BasketCampaign.objects.count() == methods_before assert BasketCampaign.objects.get(pk=object.pk).name == new_name
def test_rules_and_effects(rf, admin_user): """ To make things little bit more simple let's use only english as a language. """ get_default_shop() with override_settings(LANGUAGES=[("en", "en")]): shop = get_default_shop() object = BasketCampaign.objects.create(name="test campaign", active=True, shop=shop) assert object.conditions.count() == 0 assert object.discount_effects.count() == 0 view = BasketCampaignEditView.as_view() data = { "base-name": "test campaign", "base-public_name__en": "Test Campaign", "base-shop": get_default_shop().id, "base-active": True, "base-basket_line_text": "Test campaign activated!" } with override_provides( "campaign_basket_condition", ["wshop.campaigns.admin_module.forms:BasketTotalProductAmountConditionForm"]): with override_provides( "campaign_basket_discount_effect_form", ["wshop.campaigns.admin_module.forms:BasketDiscountAmountForm"]): with override_provides("campaign_basket_line_effect_form", []): data.update(get_products_in_basket_data()) data.update(get_free_product_data(object)) request = apply_request_middleware(rf.post("/", data=data), user=admin_user) view(request, pk=object.pk) object.refresh_from_db() assert object.conditions.count() == 1 assert object.discount_effects.count() == 1
def test_method_edit_save(rf, admin_user, view, model, get_object, service_provider_attr): """ To make things little bit more simple let's use only english as an language. """ with override_settings(LANGUAGES=[("en", "en")]): object = get_object() object.choice_identifier = "" object.save() assert object.choice_identifier == "" view = view.as_view() service_provider_attr_field = "base-%s" % service_provider_attr data = { "base-name__en": object.name, "base-shop": object.shop.id, "base-tax_class": object.tax_class.id, "base-enabled": True, service_provider_attr_field: getattr(object, service_provider_attr).pk, "base-choice_identifier": "manual" } methods_before = model.objects.count() # Behavior components is tested at wshop.tests.admin.test_service_behavior_components with override_provides("service_behavior_component_form", []): with override_provides("service_behavior_component_form_part", []): request = apply_request_middleware(rf.post("/", data=data), user=admin_user) response = view(request, pk=object.pk) if hasattr(response, "render"): response.render() assert response.status_code in [200, 302] assert model.objects.count() == methods_before assert model.objects.get(pk=object.pk).choice_identifier == "manual"
def get_form_parts(request, view, object): with override_provides("campaign_context_condition", DEFAULT_CONDITION_FORMS): with override_provides("campaign_catalog_filter", DEFAULT_FILTER_FORMS): with override_provides("campaign_product_discount_effect_form", DEFAULT_EFFECT_FORMS): initialized_view = view(request=request, kwargs={"pk": object.pk}) return initialized_view.get_form_parts(object)
def test_contact_detail_has_mocked_toolbar_action_items(rf, admin_user): get_default_shop() contact = create_random_person(locale="en_US", minimum_name_comp_len=5) request = apply_request_middleware(rf.get("/"), user=admin_user) view_func = ContactDetailView.as_view() with override_provides("admin_contact_toolbar_action_item", [ "wshop.testing.admin_module.toolbar:MockContactToolbarActionItem" ]): assert _check_if_mock_action_item_exists(view_func, request, contact) with override_provides("admin_contact_toolbar_action_item", []): assert not _check_if_mock_action_item_exists(view_func, request, contact)
def test_dummy_script_template_manual(rf): with override_provides( "notify_script_template", ["wshop.testing.notify_script_templates:DummyScriptTemplate"]): shop = get_default_shop() Script.objects.all().delete() script_template = DummyScriptTemplate() form = script_template.get_form() assert form is None script = script_template.create_script(shop) assert script is not None db_script = Script.objects.first() assert script.pk == db_script.pk serialized_steps = db_script.get_serialized_steps() assert len(serialized_steps) == 1 assert len(serialized_steps[0]["actions"]) == 0 assert len(serialized_steps[0]["conditions"]) == 1 assert serialized_steps[0]["conditions"][0]["v1"]["constant"] assert not serialized_steps[0]["conditions"][0]["v2"]["constant"]
def test_multishops_middleware(rf, host): with override_provides("xtheme", [ "wshop_tests.xtheme.utils:FauxTheme", "wshop_tests.xtheme.utils:FauxTheme2" ]): shop1 = Shop.objects.create(identifier="shop1", domain="shop-1") shop2 = Shop.objects.create(identifier="shop2", domain="shop-test-2") theme_settings_shop1 = ThemeSettings.objects.create( theme_identifier=FauxTheme.identifier, shop=shop1) theme_settings_shop2 = ThemeSettings.objects.create( theme_identifier=FauxTheme2.identifier, shop=shop2) request = rf.get("/") request.META["HTTP_HOST"] = host # should apply the correct shop and the template apply_request_middleware(request) if host == "shop-1.somedomain.com": assert request.shop.id == shop1.id assert get_middleware_current_theme( ).identifier == FauxTheme.identifier assert get_middleware_current_theme( ).settings_obj.id == theme_settings_shop1.id else: assert request.shop.id == shop2.id assert get_middleware_current_theme( ).identifier == FauxTheme2.identifier assert get_middleware_current_theme( ).settings_obj.id == theme_settings_shop2.id
def test_extending_shipment_clean_hook(rf, admin_user): shop = get_default_shop() supplier = get_default_supplier() product = create_product(sku="test-sku", shop=shop, supplier=supplier, default_price=3.33) quantity = 1 order = create_order_with_product(product, supplier, quantity=quantity, taxless_base_unit_price=1, shop=shop) extend_form_class = "wshop_tests.admin.test_shipment_creator.ShipmentFormModifierTest" with override_provides(ShipmentForm.form_modifier_provide_key, [extend_form_class]): data = { "q_%s" % product.pk: 1, "supplier": supplier.pk, "phone": "911" } request = apply_request_middleware(rf.post("/", data=data), user=admin_user) view = OrderCreateShipmentView.as_view() response = view(request, pk=order.pk).render() assert response.status_code == 200 soup = BeautifulSoup(response.content) assert soup.body.findAll( text=re.compile("Phone number should start with country code!"))
def test_extending_shipment_with_extra_fields(rf, admin_user): shop = get_default_shop() supplier = get_default_supplier() product = create_product(sku="test-sku", shop=shop, supplier=supplier, default_price=3.33) quantity = 1 order = create_order_with_product(product, supplier, quantity=quantity, taxless_base_unit_price=1, shop=shop) extend_form_class = "wshop_tests.admin.test_shipment_creator.ShipmentFormModifierTest" with override_provides(ShipmentForm.form_modifier_provide_key, [extend_form_class]): request = apply_request_middleware(rf.get("/"), user=admin_user) view = OrderCreateShipmentView.as_view() response = view(request, pk=order.pk).render() assert response.status_code == 200 # Should contain supplier input, input for product and input for phone soup = BeautifulSoup(response.content) assert soup.find("input", {"id": "id_q_%s" % product.pk}) assert soup.find("select", {"id": "id_supplier"}) assert soup.find("input", {"id": "id_phone"})
def test_stacked_tax_taxful_price(): shop = get_shop(prices_include_tax=True, currency='EUR') source = OrderSource(shop) assert source.prices_include_tax source.add_line(type=OrderLineType.OTHER, quantity=1, base_unit_price=source.create_price(20)) with override_provides("tax_module", TAX_MODULE_SPEC): with override_settings(WSHOP_TAX_MODULE="irvine"): source.shipping_address = MutableAddress( street="16215 Alton Pkwy", postal_code="92602", ) line = source.get_final_lines(with_taxes=True)[0] assert isinstance(line, SourceLine) assert line.taxes assert line.taxful_price == TaxfulPrice(20, 'EUR') assert_almost_equal(line.taxless_price, TaxlessPrice("18.52", 'EUR')) source.uncache() # Let's move out to a taxless location. source.shipping_address.postal_code = "11111" line = source.get_final_lines(with_taxes=True)[0] assert isinstance(line, SourceLine) assert not line.taxes assert line.taxful_price == TaxfulPrice(20, source.currency) assert line.taxless_price.value == Decimal("20")
def test_extender_renders_main_menu(rf): get_default_shop() with override_provides("front_menu_extender", ["wshop_tests.xtheme.test_extenders:TestExtender"]): c = SmartClient() soup = c.soup(reverse("wshop:index")) link_texts = [a.text for a in soup.findAll("a")] assert "Test Link to Front" in link_texts
def test_report_writer_populator_provide(): with override_provides("report_writer_populator", [ "wshop.reports.writer.populate_default_writers" ]): populator = ReportWriterPopulator() populator.populate() for k, v in REPORT_WRITERS_MAP.items(): assert populator.populated_map[k] == v
def test_campaign_edit_save(rf, admin_user): """ To make things little bit more simple let's use only english as a language. """ with override_settings(LANGUAGES=[("en", "en")]): shop = get_default_shop() object = CatalogCampaign.objects.create(name="test campaign", active=True, shop=shop) object.save() view = CatalogCampaignEditView.as_view() new_name = "Test Campaign" new_end_datetime = datetime.datetime(year=2016, month=6, day=20) assert object.name != new_name assert object.end_datetime is None data = { "base-name": new_name, "base-public_name__en": "Test Campaign", "base-shop": get_default_shop().id, "base-active": True, "base-basket_line_text": "Test campaign activated!", "base-start_datetime": datetime.datetime(year=2016, month=6, day=19), "base-end_datetime": new_end_datetime } methods_before = CatalogCampaign.objects.count() # Conditions, effects and effects is tested separately with override_provides("campaign_context_condition", []): with override_provides("campaign_catalog_filter", []): with override_provides("campaign_product_discount_effect_form", []): request = apply_request_middleware(rf.post("/", data=data), user=admin_user) response = view(request, pk=object.pk) assert response.status_code in [200, 302] assert CatalogCampaign.objects.count() == methods_before updated_object = CatalogCampaign.objects.get(pk=object.pk) assert updated_object.name == new_name assert updated_object.end_datetime == new_end_datetime.replace( tzinfo=pytz.UTC)
def test_order_detail_info_row_extend(rf, admin_user): shop = get_default_shop() supplier = get_default_supplier() order = _get_order(shop, supplier, True) request = apply_request_middleware(rf.get("/"), user=admin_user) view_func = OrderDetailView.as_view() # Test that context["provided_information"] is empty by default with override_provides("admin_order_information", []): response = view_func(request, pk=order.pk) assert response.context_data['provided_information'] == [] # Test that we can insert extra information rows into Order detail page with override_provides("admin_order_information", [ "wshop_tests.admin.test_order_detail_extensibility:PaymentMethodName", ]): response = view_func(request, pk=order.pk) soup = BeautifulSoup(response.render().content) assert soup.find_all(text="This is row data")
def test_order_detail_has_default_toolbar_action_items(rf, admin_user, has_price): shop = get_default_shop() supplier = get_default_supplier() order = _get_order(shop, supplier, has_price) request = apply_request_middleware(rf.get("/"), user=admin_user) view_func = OrderDetailView.as_view() create_payment_url = reverse("wshop_admin:order.create-payment", kwargs={"pk": order.pk}) set_paid_url = reverse("wshop_admin:order.set-paid", kwargs={"pk": order.pk}) with override_provides("admin_order_toolbar_action_item", [ "wshop.admin.modules.orders.toolbar:CreatePaymentAction", "wshop.admin.modules.orders.toolbar:SetPaidAction", ]): if has_price: assert _check_if_link_exists(view_func, request, order, create_payment_url) else: assert _check_if_button_exists(view_func, request, order, set_paid_url) with override_provides("admin_order_toolbar_action_item", []): assert not _check_if_link_exists(view_func, request, order, create_payment_url)
def test_provide_columns(): with override_provides( "provided_columns_ShopProduct", ["wshop_tests.admin.test_picotable:CustomProductDataColumn"]): view_settings = ViewSettings(ShopProduct, ProductListView.default_columns, ProductListView) column_ids = [col.id for col in view_settings.inactive_columns ] # provided column is not set active yet assert "custom_product_info" in column_ids
def test_provides(): shop = get_default_shop() product = create_product("test", shop, default_price=20) shop_product = product.get_shop_instance(shop) with override_provides("campaign_catalog_filter", [__name__ + ":UltraFilter"]): uf = UltraFilter.objects.create() uf.products.add(product) assert get_matching_for_product(shop_product, provide_category="campaign_catalog_filter") assert not get_matching_for_product(shop_product, provide_category="test_test_test")
def test_product_view_extra_context(rf, admin_user): product = get_default_product() request = apply_request_middleware(rf.get("/"), user=admin_user) view_func = ProductDetailView.as_view() # Test that we can insert extra information into ProductDetailView context with override_provides("product_context_extra", [ "wshop_tests.front.test_product:ExtraContextTest", ]): response = view_func(request, pk=product.pk) assert response.context_data['product_sku'] == product.sku
def test_simple_addon_injection(): request = get_request(edit=False) request.shop = get_default_shop() jeng = get_jinja2_engine() template = jeng.get_template("resinject.jinja") with override_current_theme_class(): with override_provides("xtheme_resource_injection", [ "wshop_tests.xtheme.test_addon_injections:add_test_injection", ]): # TestInjector should add alert to end of the body for every request output = template.render(request=request) head, body = output.split("</head>", 1) assert "window.injectedFromAddon=true;" in body
def test_get_by_identifier_theme(rf): with override_provides("xtheme", [ "wshop_tests.xtheme.utils:FauxTheme", "wshop_tests.xtheme.utils:FauxTheme2" ]): shop1 = Shop.objects.create(identifier="shop1", domain="shop-1") shop2 = Shop.objects.create(identifier="shop2", domain="shop-test-2") theme = get_theme_by_identifier(FauxTheme2.identifier, shop1) assert theme.settings_obj.theme_identifier == FauxTheme2.identifier assert theme.settings_obj.shop.id == shop1.id theme = get_theme_by_identifier(FauxTheme.identifier, shop2) assert theme.settings_obj.theme_identifier == FauxTheme.identifier assert theme.settings_obj.shop.id == shop2.id
def test_theme_settings_api(): shop = get_default_shop() with override_provides("xtheme", [ "wshop_tests.xtheme.utils:FauxTheme", "wshop_tests.xtheme.utils:FauxTheme2" ]): ThemeSettings.objects.all().delete() theme = get_theme_by_identifier(FauxTheme2.identifier, shop) theme.set_setting("foo", "bar") theme.set_settings(quux=[4, 8, 15, 16, 23, 42]) theme = get_theme_by_identifier(FauxTheme2.identifier, shop) assert theme.get_setting("foo") == "bar" assert theme.get_settings() == { "foo": "bar", "quux": [4, 8, 15, 16, 23, 42] }
def test_set_get_theme(rf): with override_provides("xtheme", [ "wshop_tests.xtheme.utils:FauxTheme", "wshop_tests.xtheme.utils:FauxTheme2" ]): shop1 = Shop.objects.create(identifier="shop1", domain="shop-1") shop2 = Shop.objects.create(identifier="shop2", domain="shop-test-2") assert get_current_theme(shop1) is None assert get_current_theme(shop2) is None set_current_theme(FauxTheme2.identifier, shop1) assert get_current_theme(shop1).identifier == FauxTheme2.identifier assert get_current_theme(shop1).settings_obj is not None set_current_theme(FauxTheme.identifier, shop2) assert get_current_theme(shop2).identifier == FauxTheme.identifier
def initialize_editor_view(view_name, placeholder_name, request=None): if request is None: request = RequestFactory().get("/") request.shop = get_default_shop() request.user = SuperUser() if hasattr(request.GET, "_mutable"): request.GET._mutable = True # Ahem request.GET.update({ "theme": FauxTheme.identifier, "view": view_name, "ph": placeholder_name }) with plugin_override(): with override_provides("xtheme", ["wshop_tests.xtheme.utils:FauxTheme"]): with override_current_theme_class(FauxTheme): yield EditorView(request=request, args=(), kwargs={})
def test_theme_activation(): shop = get_default_shop() with override_current_theme_class(): with override_provides("xtheme", [ "wshop_tests.xtheme.utils:FauxTheme", "wshop_tests.xtheme.utils:FauxTheme2" ]): ThemeSettings.objects.all().delete() # ThemeSettings will be created on the fly theme = get_current_theme(shop) assert theme assert theme.settings_obj set_current_theme(FauxTheme.identifier, shop) assert isinstance(get_current_theme(shop), FauxTheme) set_current_theme(FauxTheme2.identifier, shop) assert isinstance(get_current_theme(shop), FauxTheme2) with pytest.raises(ValueError): set_current_theme(printable_gibberish(), shop)
def test_sorts_and_filter_in_shop_edit(rf, admin_user): cache.clear() activate("en") with override_settings(WSHOP_ENABLE_MULTIPLE_SHOPS=False): with override_provides("front_extend_product_list_form", DEFAULT_FORM_MODIFIERS): shop = get_default_shop() view = ShopEditView.as_view() assert get_configuration( shop=shop) == settings.WSHOP_FRONT_DEFAULT_SORT_CONFIGURATION data = { "base-name__en": shop.name, "base-public_name__en": shop.public_name, "base-status": shop.status.value, "base-currency": shop.currency, "base-prices_include_tax": shop.prices_include_tax, "base-languages": "en", "order_configuration-order_min_total": 0, "order_configuration-order_reference_number_length": 18, "product_list_facets-sort_products_by_name": True, "product_list_facets-sort_products_by_name_ordering": 11, "product_list_facets-sort_products_by_price": False, "product_list_facets-sort_products_by_price_ordering": 32, "product_list_facets-filter_products_by_manufacturer": False, "product_list_facets-filter_products_by_manufacturer_ordering": 1, } request = apply_request_middleware(rf.post("/", data=data), user=admin_user) response = view(request, pk=shop.pk) if hasattr(response, "render"): response.render() assert response.status_code in [200, 302] expected_configurations = { "sort_products_by_name": True, "sort_products_by_name_ordering": 11, "sort_products_by_price": False, "sort_products_by_price_ordering": 32, "filter_products_by_manufacturer": False, "filter_products_by_manufacturer_ordering": 1 } assert get_configuration(shop=shop) == expected_configurations
def get_bs_object_for_view(request, view, user, object=None): """ Help function to get BeautifulSoup object from the html rendered by the edit view. Also override ``service_provider_admin_form`` here to enable ``PseudoPaymentProcessor`` """ with override_provides("service_provider_admin_form", [ "wshop.testing.service_forms.PseudoPaymentProcessorForm", "wshop.admin.modules.service_providers.forms:CustomCarrierForm", "wshop.admin.modules.service_providers.forms:CustomPaymentProcessorForm" ]): request = apply_all_middleware(request, user=user) response = view(request, pk=object.pk if object else None) if hasattr(response, "render"): response.render() assert response.status_code in [200, 302] return BeautifulSoup(response.content)
def test_adding_extra_fields_to_the_delivery(rf): try: import weasyprint except ImportError: pytest.skip() shop = get_default_shop() supplier = get_default_supplier() product = create_product("simple-test-product", shop) order = create_order_with_product(product, supplier, 6, 6, shop=shop) shipment = order.create_shipment_of_all_products(supplier) request = rf.get("/") with override_provides("order_printouts_delivery_extra_fields", [ "wshop_tests.order_printouts.test_printouts:PrintoutTestDeliveryExtraFields", ]): response = get_delivery_html(request, shipment.id) assert response.status_code == 200 assert "123456789" in response.content.decode() assert "Random" in response.content.decode()
def test_sorts_and_filter_in_category_edit(rf, admin_user): get_default_shop() cache.clear() activate("en") with override_settings(WSHOP_ENABLE_MULTIPLE_SHOPS=False): with override_provides("front_extend_product_list_form", DEFAULT_FORM_MODIFIERS): category = get_default_category() view = CategoryEditView.as_view() assert get_configuration( category=category ) == settings.WSHOP_FRONT_DEFAULT_SORT_CONFIGURATION data = { "base-name__en": category.name, "base-status": category.status.value, "base-visibility": category.visibility.value, "base-ordering": category.ordering, "product_list_facets-sort_products_by_name": True, "product_list_facets-sort_products_by_name_ordering": 6, "product_list_facets-sort_products_by_price": False, "product_list_facets-sort_products_by_price_ordering": 32, "product_list_facets-filter_products_by_manufacturer": True, "product_list_facets-filter_products_by_manufacturer_ordering": 1 } request = apply_request_middleware(rf.post("/", data=data), user=admin_user) response = view(request, pk=category.pk) if hasattr(response, "render"): response.render() assert response.status_code in [200, 302] expected_configurations = { "sort_products_by_name": True, "sort_products_by_name_ordering": 6, "sort_products_by_price": False, "sort_products_by_price_ordering": 32, "filter_products_by_manufacturer": True, "filter_products_by_manufacturer_ordering": 1 } assert get_configuration( category=category) == expected_configurations
def test_product_page(client): get_default_shop() product = get_default_product() response = client.get( reverse('wshop:product', kwargs={ 'pk': product.pk, 'slug': product.slug } ) ) assert b'no such element' not in response.content, 'All items are not rendered correctly' # TODO test purchase_multiple and sales_unit.allow_fractions product_mode_forms = [ "wshop.front.forms.order_forms:VariableVariationProductOrderForm", "wshop.front.forms.order_forms:SimpleVariationProductOrderForm", "wshop.front.forms.order_forms:SimpleProductOrderForm", "wshop.testing.extend_classes:DifferentProductOrderForm" ] with override_provides("front_product_order_form", product_mode_forms): get_default_shop() product = get_default_product() product_modes = [ProductMode.NORMAL, ProductMode.PACKAGE_PARENT, ProductMode.VARIABLE_VARIATION_PARENT, ProductMode.SIMPLE_VARIATION_PARENT, ProductMode.SUBSCRIPTION] for product_mode in product_modes: product.mode = product_mode product.save() response = client.get( reverse('wshop:product', kwargs={ 'pk': product.pk, 'slug': product.slug } ) ) assert b'no such element' not in response.content, 'All items are not rendered correctly' if product_mode == ProductMode.SUBSCRIPTION: assert b'This is different' in response.content, 'DifferentProductOrderForm not rendered properly'