def test_without_rc(): request = get_request() (template, layout, gibberish, ctx) = get_test_template_bits(request) assert not add_resource(ctx, "yes", "hello.js") content1 = "<html>" content2 = inject_resources(ctx, content1) assert content1 == content2
def test_rendering(edit, injectable, theme_class, global_type): request = get_request(edit) request.resolver_match = mock.Mock() request.resolver_match.app_name = "shuup" with override_current_theme_class(theme_class): with plugin_override(): jeng = get_jinja2_engine() if global_type: template = jeng.get_template("global_complex.jinja") else: template = jeng.get_template("complex.jinja") view = FauxView() view.xtheme_injection = bool(injectable) output = template.render(context={ "view": view, "request": request }, request=request) # From now on we render placholders in views that # actually can be edited. if injectable and theme_class: assert "wider column" in output assert "less wide column" in output if edit and injectable and theme_class: assert "xt-ph-edit" in output assert "data-xt-placeholder-name" in output assert "data-xt-row" in output assert "data-xt-cell" in output assert "XthemeEditorConfig" in output
def test_injecting_into_weird_places(): request = get_request() (template, layout, gibberish, ctx) = get_test_template_bits(request, **{ RESOURCE_CONTAINER_VAR_NAME: ResourceContainer() }) with pytest.raises(ValueError): add_resource(ctx, "yes", "hello.js")
def test_company_contact_layout(): vc = _get_basic_view_config() company = factories.create_random_company() placeholder_name = "kissa" request = get_request() request.customer = company context = {"request": request} layout = vc.get_placeholder_layout(CompanyContactLayout, placeholder_name, context=context) assert isinstance(layout, CompanyContactLayout) help_text = layout.get_help_text({}) # Same help text with or without the context assert layout.get_help_text(context) == help_text # Invalid contexts for anon and person contact layouts assert vc.get_placeholder_layout(AnonymousContactLayout, placeholder_name, context=context) is None assert vc.get_placeholder_layout(PersonContactLayout, placeholder_name, context=context) is None # Valid contexts for contact layout assert vc.get_placeholder_layout(ContactLayout, placeholder_name, context=context) is not None _add_plugin_and_test_save(vc, layout, placeholder_name, context) # Ok here we want to check that the plugin doesn't end up to the # contact placeholders contact_layout = vc.get_placeholder_layout(ContactLayout, placeholder_name, context=context) _assert_empty_layout(contact_layout, placeholder_name)
def test_layout_rendering_with_global_type(rf): request = get_request(edit=False) with override_current_theme_class(None): with plugin_override(): jeng = get_jinja2_engine() template = jeng.from_string("") (template, layout, gibberish, ctx) = get_test_template_bits(request) global_class = "xt-global-ph" result = six.text_type( render_placeholder(ctx, "test", layout, template.template.name, global_type=True)) assert global_class in result result = six.text_type( render_placeholder(ctx, "test", layout, template.template.name, global_type=False)) assert global_class not in result
def test_get_placeholder_layouts(): vc = _get_basic_view_config() product = factories.create_product("test", name="Test product name") category = factories.get_default_category() placeholder_name = "hermit" context = { "request": get_request(), "product": product, "category": category } provides = [] with override_provides("xtheme_layout", provides): assert len(vc.get_placeholder_layouts( context, placeholder_name)) == 1 # Default layout provides.append("shuup.xtheme.layout.ProductLayout") with override_provides("xtheme_layout", provides): assert len(vc.get_placeholder_layouts(context, placeholder_name)) == 2 provides.append("shuup.xtheme.layout.CategoryLayout") with override_provides("xtheme_layout", provides): assert len(vc.get_placeholder_layouts(context, placeholder_name)) == 3 provides.append("shuup.xtheme.layout.AnonymousContactLayout") with override_provides("xtheme_layout", provides): assert len(vc.get_placeholder_layouts(context, placeholder_name)) == 4
def test_lcfg(): two_thirds = int(LayoutCellGeneralInfoForm.CELL_FULL_WIDTH * 2 / 3) with plugin_override(): with override_current_theme_class(None): request = get_request(edit=False) theme = get_current_theme(request) cell = LayoutCell(theme, "text", sizes={ "md": two_thirds, "sm": two_thirds }) lcfg = LayoutCellFormGroup(layout_cell=cell, theme=theme) assert "general" in lcfg.forms assert "plugin" in lcfg.forms assert not lcfg.is_valid() # Oh, we must've forgotten the text... lcfg = LayoutCellFormGroup(data={ "general-cell_width": "%d" % two_thirds, "general-cell_align": " ", "plugin-text_*": "Hello, world!" }, layout_cell=cell, theme=theme) assert lcfg.is_valid() # Let's see now! lcfg.save() assert cell.sizes["md"] == two_thirds assert cell.config["text"] == { FALLBACK_LANGUAGE_CODE: "Hello, world!" }
def test_company_contact_layout(): vc = _get_basic_view_config() company = factories.create_random_company() placeholder_name = "kissa" request = get_request() request.customer = company context = {"request": request} layout = vc.get_placeholder_layout(CompanyContactLayout, placeholder_name, context=context) assert isinstance(layout, CompanyContactLayout) help_text = layout.get_help_text( {}) # Same help text with or without the context assert layout.get_help_text(context) == help_text # Invalid contexts for anon and person contact layouts assert vc.get_placeholder_layout( AnonymousContactLayout, placeholder_name, context=context) is None assert vc.get_placeholder_layout( PersonContactLayout, placeholder_name, context=context) is None # Valid contexts for contact layout assert vc.get_placeholder_layout(ContactLayout, placeholder_name, context=context) is not None _add_plugin_and_test_save(vc, layout, placeholder_name, context) # Ok here we want to check that the plugin doesn't end up to the # contact placeholders contact_layout = vc.get_placeholder_layout(ContactLayout, placeholder_name, context=context) _assert_empty_layout(contact_layout, placeholder_name)
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", [ "shuup_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 with override_settings( SHUUP_XTHEME_EXCLUDE_TEMPLATES_FROM_RESOUCE_INJECTION=[ "resinject.jinja" ]): output = template.render(request=request) head, body = output.split("</head>", 1) assert "window.injectedFromAddon=true;" not in body
def test_global_snippet_resource_injection(): request = get_request(edit=False) request.shop = get_default_shop() jeng = get_jinja2_engine() template = jeng.get_template("resinject.jinja") request.resolver_match = MagicMock(app_name="shuup") context = dict(view=FauxView, request=request) with override_provides("xtheme_resource_injection", ["shuup.xtheme.resources:inject_global_snippet"]): with override_current_theme_class(): output = template.render(context, request=request) assert "<div>1</div>" not in output Snippet.objects.create( shop=request.shop, location="body_end", snippet_type=SnippetType.InlineJinjaHTMLMarkup, snippet=""" {% set x = 1 %} <div>{{- x -}}</div> """) cache.clear() with override_current_theme_class(): output = template.render(context, request=request) assert "<div>1</div>" in output
def test_render_custom_size_cell(rf): request = get_request(edit=False) with override_current_theme_class(None): with plugin_override(): with layout_override(): layout = Layout(FauxTheme, "test") gibberish = printable_gibberish() layout.begin_column({"md": None, "xs": None, "sm": None}) layout.add_plugin("text", {"text": "<p>%s</p>" % gibberish}) jeng = get_jinja2_engine() template = jeng.from_string("") template.template.name = "test" vars = { "view": FauxView(), "request": request } ctx = template.template.new_context(vars) result = six.text_type(render_placeholder(ctx, "test", layout, "test")) expect = """ <div class="placeholder-edit-wrap"> <div class="xt-ph" id="xt-ph-test"> <div class="row xt-ph-row"> <div class="xt-ph-cell"><p>%s</p></div> </div> </div> </div> """ % gibberish assert close_enough(result, expect)
def test_pluginless_lcfg(): with plugin_override(): with override_current_theme_class(None): request = get_request(edit=False) theme = get_current_theme(request) cell = LayoutCell(theme, None) assert not cell.instantiate_plugin() lcfg = LayoutCellFormGroup(layout_cell=cell, theme=theme) assert "plugin" not in lcfg.forms
def test_layout_edit_render(): request = get_request(edit=True) with override_current_theme_class(None): with plugin_override(): (template, layout, gibberish, ctx) = get_test_template_bits(request) result = six.text_type(render_placeholder(ctx, "test", layout, "test")) # Look for evidence of editing: assert "xt-ph-edit" in result assert "data-xt-placeholder-name" in result assert "data-xt-row" in result assert "data-xt-cell" in result
def test_view_config_caches_into_context(rf): # This is a silly test... request = get_request(edit=False) with override_current_theme_class(None): (template, layout, gibberish, ctx) = get_test_template_bits(request) cfg1 = get_view_config(ctx) cfg2 = get_view_config(ctx) assert cfg1 is cfg2 (template, layout, gibberish, ctx) = get_test_template_bits(request, False) cfg1 = get_view_config(ctx) cfg2 = get_view_config(ctx) assert cfg1 is cfg2
def test_simple_addon_injection(): request = get_request(edit=False) jeng = get_jinja2_engine() template = jeng.get_template("resinject.jinja") with override_current_theme_class(): with override_provides( "xtheme_resource_injection", ["shuup_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_default_layout(): vc = _get_basic_view_config() product = factories.create_product("test", name="Test product name") category = factories.get_default_category() placeholder_name = "wildhorse" context = {"request": get_request(), "product": product, "category": category} layout = vc.get_placeholder_layout(Layout, placeholder_name) assert isinstance(layout, Layout) assert layout.get_help_text({}) == layout.get_help_text(context) _add_plugin_and_test_save(vc, layout, placeholder_name, context)
def test_simple_addon_injection(): request = get_request(edit=False) jeng = get_jinja2_engine() template = jeng.get_template("resinject.jinja") with override_current_theme_class(): with override_provides("xtheme_resource_injection", [ "shuup_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_jinja_resource(): request = get_request() (template, layout, gibberish, context) = get_test_template_bits(request) assert JinjaMarkupResource("1+1={{ 1+1|float }}", context).render() == "1+1=2.0" assert JinjaMarkupResource("{{ 1|thisdoesnwork }}", context) == "(Error while rendering)" assert JinjaMarkupResource("", context) == "" assert str(JinjaMarkupResource("1+1", context)) == "1+1" container = ResourceContainer() container.add_resource("body_end", JinjaMarkupResource("1+1={{ 1+1|float }}", context)) container.add_resource("body_end", JinjaMarkupResource("{{ 1|thisdoesnwork }}", context)) container.add_resource("body_end", JinjaMarkupResource("", context)) assert container.render_resources("body_end") == "1+1=2.0(Error while rendering)"
def test_formless_plugin_in_lcfg(): two_thirds = int(LayoutCellGeneralInfoForm.CELL_FULL_WIDTH * 2 / 3) with plugin_override(): with override_current_theme_class(None): request = get_request(edit=False) theme = get_current_theme(request) cell = LayoutCell(theme, "inject") assert cell.instantiate_plugin() lcfg = LayoutCellFormGroup(data={"general-cell_width": "%d" % two_thirds}, layout_cell=cell, theme=theme) assert "plugin" not in lcfg.forms assert lcfg.is_valid() lcfg.save() assert cell.sizes["md"] == two_thirds # Something got saved even if the plugin doesn't need config
def test_layout_rendering(rf): request = get_request(edit=False) with override_current_theme_class(None): with plugin_override(): (template, layout, gibberish, ctx) = get_test_template_bits(request) result = six.text_type(render_placeholder(ctx, "test", layout, "test")) expect = """ <div class="xt-ph" id="xt-ph-test"> <div class="row xt-ph-row"> <div class="col-md-12 hidden-xs xt-ph-cell"><p>%s</p></div> </div> </div> """ % gibberish assert close_enough(result, expect)
def test_resources(): request = get_request(edit=False) with override_current_theme_class(None): with plugin_override(): jeng = get_jinja2_engine() template = jeng.get_template("resinject.jinja") output = template.render(request=request) head, body = output.split("</head>", 1) assert "alert('xss')" in body # the inline script assert '"bars": [1, 2, 3]' in head # the script vars assert '(unknown resource type:' in body # the png assert 'href="://example.com/css.css"' in head # the css assert 'src="://example.com/js.js"' in body # the js assert head.count(ResourceInjectorPlugin.meta_markup) == 1 # the duplicate meta assert ResourceInjectorPlugin.message in output # the actual message
def test_formless_plugin_in_lcfg(): two_thirds = int(LayoutCellGeneralInfoForm.CELL_FULL_WIDTH * 2 / 3) with plugin_override(): with override_current_theme_class(None): request = get_request(edit=False) theme = get_current_theme(request) cell = LayoutCell(theme, "inject") assert cell.instantiate_plugin() lcfg = LayoutCellFormGroup(data={"general-cell_width": "%d" % two_thirds, "general-cell_align": "pull-right"}, layout_cell=cell, theme=theme) assert "plugin" not in lcfg.forms assert lcfg.is_valid() lcfg.save() assert cell.sizes["md"] == two_thirds # Something got saved even if the plugin doesn't need config
def test_layout_rendering_with_global_type(rf): request = get_request(edit=False) with override_current_theme_class(None): with plugin_override(): jeng = get_jinja2_engine() template = jeng.from_string("") (template, layout, gibberish, ctx) = get_test_template_bits(request) global_class = "xt-global-ph" result = six.text_type(render_placeholder(ctx, "test", layout, template.template.name, global_type=True)) assert global_class in result result = six.text_type(render_placeholder(ctx, "test", layout, template.template.name, global_type=False)) assert global_class not in result
def test_anon_layout(): vc = _get_basic_view_config() placeholder_name = "hip hop" context = {"request": get_request()} # By default user is anonymous layout = vc.get_placeholder_layout(AnonymousContactLayout, placeholder_name, context=context) assert isinstance(layout, AnonymousContactLayout) help_text = layout.get_help_text({}) # Same help text with or without the context assert layout.get_help_text(context) == help_text # Invalid contexts for rest of the contact group layouts assert vc.get_placeholder_layout(ContactLayout, placeholder_name, context=context) is None assert vc.get_placeholder_layout(PersonContactLayout, placeholder_name, context=context) is None assert vc.get_placeholder_layout(CompanyContactLayout, placeholder_name, context=context) is None _add_plugin_and_test_save(vc, layout, placeholder_name, context)
def test_resources(): request = get_request(edit=False) with override_current_theme_class(None): with plugin_override(): jeng = get_jinja2_engine() template = jeng.get_template("resinject.jinja") output = template.render(request=request) head, body = output.split("</head>", 1) assert "alert('xss')" in body # the inline script assert '"bars": [1, 2, 3]' in head # the script vars assert '(unknown resource type:' in body # the png assert 'href="://example.com/css.css"' in head # the css assert 'src="://example.com/js.js"' in body # the js assert head.count( ResourceInjectorPlugin.meta_markup) == 1 # the duplicate meta assert ResourceInjectorPlugin.message in output # the actual message
def test_jinja_resource(): request = get_request() (template, layout, gibberish, context) = get_test_template_bits(request) assert JinjaMarkupResource("1+1={{ 1+1|float }}", context).render() == "1+1=2.0" assert JinjaMarkupResource("{{ 1|thisdoesnwork }}", context) == "(Error while rendering.)" assert JinjaMarkupResource("", context) == "" assert str(JinjaMarkupResource("1+1", context)) == "1+1" container = ResourceContainer() container.add_resource("body_end", JinjaMarkupResource("1+1={{ 1+1|float }}", context)) container.add_resource("body_end", JinjaMarkupResource("{{ 1|thisdoesnwork }}", context)) container.add_resource("body_end", JinjaMarkupResource("", context)) rendered_resource = container._render_resource("://example.com/js.js?random_text") assert "unknown resource type" not in rendered_resource assert rendered_resource == '<script src="://example.com/js.js?random_text"></script>' assert container.render_resources("body_end") == "1+1=2.0(Error while rendering.)"
def test_default_layout(): vc = _get_basic_view_config() product = factories.create_product("test", name="Test product name") category = factories.get_default_category() placeholder_name = "wildhorse" context = { "request": get_request(), "product": product, "category": category } layout = vc.get_placeholder_layout(Layout, placeholder_name) assert isinstance(layout, Layout) assert layout.get_help_text({}) == layout.get_help_text(context) _add_plugin_and_test_save(vc, layout, placeholder_name, context)
def test_lcfg(): two_thirds = int(LayoutCellGeneralInfoForm.CELL_FULL_WIDTH * 2 / 3) with plugin_override(): with override_current_theme_class(None): request = get_request(edit=False) theme = get_current_theme(request) cell = LayoutCell(theme, "text", sizes={"md": two_thirds, "sm": two_thirds}) lcfg = LayoutCellFormGroup(layout_cell=cell, theme=theme) assert "general" in lcfg.forms assert "plugin" in lcfg.forms assert not lcfg.is_valid() # Oh, we must've forgotten the text... lcfg = LayoutCellFormGroup(data={ "general-cell_width": "%d" % two_thirds, "plugin-text": "Hello, world!" }, layout_cell=cell, theme=theme) assert lcfg.is_valid() # Let's see now! lcfg.save() assert cell.sizes["md"] == two_thirds assert cell.config["text"] == {FALLBACK_LANGUAGE_CODE: "Hello, world!"}
def test_rendering(edit, injectable, theme_class, global_type): request = get_request(edit) with override_current_theme_class(theme_class): with plugin_override(): jeng = get_jinja2_engine() if global_type: template = jeng.get_template("global_complex.jinja") else: template = jeng.get_template("complex.jinja") view = FauxView() view.xtheme_injection = bool(injectable) output = template.render(context={ "view": view, }, request=request) assert "wider column" in output assert "less wide column" in output if edit and injectable and theme_class: assert "xt-ph-edit" in output assert "data-xt-placeholder-name" in output assert "data-xt-row" in output assert "data-xt-cell" in output assert "XthemeEditorConfig" in output
def test_anon_layout(): vc = _get_basic_view_config() placeholder_name = "hip hop" context = {"request": get_request()} # By default user is anonymous layout = vc.get_placeholder_layout(AnonymousContactLayout, placeholder_name, context=context) assert isinstance(layout, AnonymousContactLayout) help_text = layout.get_help_text( {}) # Same help text with or without the context assert layout.get_help_text(context) == help_text # Invalid contexts for rest of the contact group layouts assert vc.get_placeholder_layout( ContactLayout, placeholder_name, context=context) is None assert vc.get_placeholder_layout( PersonContactLayout, placeholder_name, context=context) is None assert vc.get_placeholder_layout( CompanyContactLayout, placeholder_name, context=context) is None _add_plugin_and_test_save(vc, layout, placeholder_name, context)
def test_get_placeholder_layouts(): vc = _get_basic_view_config() product = factories.create_product("test", name="Test product name") category = factories.get_default_category() placeholder_name = "hermit" context = {"request": get_request(), "product": product, "category": category} provides = [] with override_provides("xtheme_layout", provides): assert len(vc.get_placeholder_layouts(context, placeholder_name)) == 1 # Default layout provides.append("shuup.xtheme.layout.ProductLayout") with override_provides("xtheme_layout", provides): assert len(vc.get_placeholder_layouts(context, placeholder_name)) == 2 provides.append("shuup.xtheme.layout.CategoryLayout") with override_provides("xtheme_layout", provides): assert len(vc.get_placeholder_layouts(context, placeholder_name)) == 3 provides.append("shuup.xtheme.layout.AnonymousContactLayout") with override_provides("xtheme_layout", provides): assert len(vc.get_placeholder_layouts(context, placeholder_name)) == 4
def test_index_view_with_contact_limitatons(): shop = factories.get_default_shop() password = "******" # Person 1 to test contact and person contact layouts person1 = factories.create_random_person(shop=shop) person1.user = factories.create_random_user() person1.user.set_password(password) person1.user.save() person1.save() # Person 2 to test company layout person2 = factories.create_random_person(shop=shop) person2.user = factories.create_random_user() person2.user.set_password(password) person2.user.save() person2.save() company = factories.create_random_company(shop=shop) company.members.add(person2) placeholder_name = "front_content" request = get_request() context = {"request": request} # Add plugin for anons vc = _get_basic_view_config(view_name="IndexView") anon_plugin_text = "This content is only for guests" layout = vc.get_placeholder_layout(AnonymousContactLayout, placeholder_name, context=context) _add_plugin_and_test_save(vc, layout, placeholder_name, context, anon_plugin_text) # Add plugin for contact vc = _get_basic_view_config(view_name="IndexView") context["request"].customer = person1 contact_plugin_text = "This content is only for users logged in" layout = vc.get_placeholder_layout(ContactLayout, placeholder_name, context=context) _add_plugin_and_test_save(vc, layout, placeholder_name, context, contact_plugin_text) # Add plugin for person contacts vc = _get_basic_view_config(view_name="IndexView") person_contact_plugin_text = "This content is only for person contacts" layout = vc.get_placeholder_layout(PersonContactLayout, placeholder_name, context=context) _add_plugin_and_test_save(vc, layout, placeholder_name, context, person_contact_plugin_text) # Add plugin for companies vc = _get_basic_view_config(view_name="IndexView") context["request"].customer = company company_plugin_text = "This content is only for companies" layout = vc.get_placeholder_layout(CompanyContactLayout, placeholder_name, context=context) _add_plugin_and_test_save(vc, layout, placeholder_name, context, company_plugin_text) c = SmartClient() # By default there is no user logged in soup = c.soup(reverse("shuup:index")) page_content = soup.find("div", {"class": "page-content"}) page_content_text = page_content.text assert anon_plugin_text in page_content_text assert contact_plugin_text not in page_content_text assert person_contact_plugin_text not in page_content_text assert company_plugin_text not in page_content_text # Login as person1 user c = SmartClient() c.login(username=person1.user.username, password=password) soup = c.soup(reverse("shuup:index")) page_content = soup.find("div", {"class": "page-content"}) page_content_text = page_content.text assert anon_plugin_text not in page_content_text assert contact_plugin_text in page_content_text assert person_contact_plugin_text in page_content_text assert company_plugin_text not in page_content_text # Login as person2 user which is linked to company c = SmartClient() c.login(username=person2.user.username, password=password) soup = c.soup(reverse("shuup:index")) page_content = soup.find("div", {"class": "page-content"}) page_content_text = page_content.text assert anon_plugin_text not in page_content_text assert contact_plugin_text in page_content_text assert person_contact_plugin_text not in page_content_text assert company_plugin_text in page_content_text