Beispiel #1
0
    def test_cms_plugins_blogpost_fallback_when_never_published(self):
        """
        The blogpost plugin should render in the fallback language when the blogpost
        page has never been published in the current language.
        """
        # Create a blogpost
        blogpost = BlogPostFactory(
            page_title={
                "en": "public title",
                "fr": "titre public"
            },
            fill_cover={
                "original_filename": "cover.jpg",
                "default_alt_text": "my cover",
            },
        )
        blogpost_page = blogpost.extended_object

        # Create a page to add the plugin to
        page = create_i18n_page({"en": "A page", "fr": "Une page"})
        placeholder = page.placeholders.get(slot="maincontent")
        add_plugin(placeholder, BlogPostPlugin, "en",
                   **{"page": blogpost_page})
        add_plugin(placeholder, BlogPostPlugin, "fr",
                   **{"page": blogpost_page})

        # Publish only the French version of the blog post
        with mock.patch(
                "cms.models.pagemodel.now",
                return_value=datetime(2019, 11, 30, tzinfo=timezone.utc),
        ):
            blogpost_page.publish("fr")

        # Check the page content in English
        page.publish("en")
        url = page.get_absolute_url(language="en")
        response = self.client.get(url)

        # The english blogpost's name should be present as a link to the cms page
        # But the locale in the url should remain "en"
        self.assertIn(
            ('<a href="/en/titre-public/" class="blogpost-glimpse"'),
            re.sub(" +", " ",
                   str(response.content).replace("\\n", "")),
        )

        # The blogpost's title should be wrapped in a p
        blogpost.refresh_from_db()
        self.assertContains(
            response,
            '<p class="blogpost-glimpse__title">titre public</p>',
            html=True,
        )
        self.assertNotContains(response, "public title")

        # Blogpost's cover should be present
        pattern = (
            r'<div class="blogpost-glimpse__media">'
            r'<img src="/media/filer_public_thumbnails/filer_public/.*cover\.jpg__300x170'
            r'.*alt=""')
        self.assertIsNotNone(re.search(pattern, str(response.content)))

        # Publication date should be set by first publication
        self.assertContains(
            response,
            '<p class="blogpost-glimpse__date">Nov. 30, 2019</p>',
            html=True)
Beispiel #2
0
    def test_cms_plugins_blogpost_render_on_public_page(self):
        """
        The blogpost plugin should render as expected on a public page.
        """
        # Create a blogpost
        blogpost = BlogPostFactory(
            page_title={
                "en": "public title",
                "fr": "titre public"
            },
            fill_cover={
                "original_filename": "cover.jpg",
                "default_alt_text": "my cover",
            },
        )
        blogpost_page = blogpost.extended_object

        # Create a page to add the plugin to
        page = create_i18n_page({"en": "A page", "fr": "Une page"})
        placeholder = page.placeholders.get(slot="maincontent")
        add_plugin(placeholder, BlogPostPlugin, "en",
                   **{"page": blogpost_page})
        add_plugin(placeholder, BlogPostPlugin, "fr",
                   **{"page": blogpost_page})

        with mock.patch(
                "cms.models.pagemodel.now",
                return_value=datetime(2019, 11, 30, tzinfo=timezone.utc),
        ):
            blogpost_page.publish("en")

        blogpost_page.publish("fr")

        page.publish("en")
        page.publish("fr")

        # Check the page content in English
        url = page.get_absolute_url(language="en")

        # The blogpost plugin should not be visible on the public page before it is published
        blogpost_page.unpublish("en")
        response = self.client.get(url)
        self.assertNotContains(response, "public title")

        # # Republish the plugin
        blogpost_page.publish("en")

        # Now modify the blogpost to have a draft different from the public version
        title_obj = blogpost_page.get_title_obj(language="en")
        title_obj.title = "draft title"
        title_obj.save()

        # Publishing the page again should make the plugin public
        page.publish("en")

        # Check the page content in English
        response = self.client.get(url)
        # The blogpost's name should be present as a link to the cms page
        # And CMS page title should be in title attribute of the link
        self.assertIn(
            ('<a href="/en/public-title/" '
             'class="blogpost-glimpse"'),
            re.sub(" +", " ",
                   str(response.content).replace("\\n", "")),
        )

        # The blogpost's title should be wrapped in a p
        blogpost.refresh_from_db()
        blogpost_title = blogpost.public_extension.extended_object.get_title()
        self.assertContains(
            response,
            f'<p class="blogpost-glimpse__title">{blogpost_title:s}</p>',
            html=True,
        )
        self.assertNotContains(response, "draft title")

        # Blogpost's cover should be present
        pattern = (
            r'<div class="blogpost-glimpse__media">'
            r'<img src="/media/filer_public_thumbnails/filer_public/.*cover\.jpg__300x170'
            r'.*alt=""')
        self.assertIsNotNone(re.search(pattern, str(response.content)))

        # Publication date should be set by first publication
        self.assertContains(
            response,
            '<p class="blogpost-glimpse__date">Nov. 30, 2019</p>',
            html=True,
        )

        # Same checks in French
        url = page.get_absolute_url(language="fr")
        response = self.client.get(url)
        self.assertIn(
            ('<a href="/fr/titre-public/" '
             'class="blogpost-glimpse"'),
            re.sub(" +", " ",
                   str(response.content).replace("\\n", "")),
        )

        # pylint: disable=no-member
        pattern = (
            r'<div class="blogpost-glimpse__media">'
            r'<img src="/media/filer_public_thumbnails/filer_public/.*cover\.jpg__300x170'
            r'.*alt=""')
        self.assertIsNotNone(re.search(pattern, str(response.content)))

        # Publication date should be set by first publication
        self.assertContains(
            response,
            '<p class="blogpost-glimpse__date">30 novembre 2019</p>',
            html=True,
        )
    def test_cms_plugins_blogpost_render_on_public_page(self):
        """
        The blogpost plugin should render as expected on a public page.
        """
        # Create a blogpost
        blogpost = BlogPostFactory(
            page_title={
                "en": "public title",
                "fr": "titre public"
            },
            fill_cover={
                "original_filename": "cover.jpg",
                "default_alt_text": "my cover",
            },
        )
        blogpost_page = blogpost.extended_object

        # Create a page to add the plugin to
        page = create_i18n_page({"en": "A page", "fr": "Une page"})
        placeholder = page.placeholders.get(slot="maincontent")
        add_plugin(placeholder, BlogPostPlugin, "en",
                   **{"page": blogpost_page})
        add_plugin(placeholder, BlogPostPlugin, "fr",
                   **{"page": blogpost_page})

        with mock.patch(
                "cms.models.pagemodel.now",
                return_value=datetime(2019, 11, 30, tzinfo=timezone.utc),
        ):
            blogpost_page.publish("en")

        blogpost_page.publish("fr")

        page.publish("en")
        page.publish("fr")

        # Check the page content in English
        url = page.get_absolute_url(language="en")

        # The blogpost plugin should not be visible on the public page before it is published
        blogpost_page.unpublish("en")
        response = self.client.get(url)
        self.assertNotContains(response, "public title")

        # # Republish the plugin
        blogpost_page.publish("en")

        # Now modify the blogpost to have a draft different from the public version
        title_obj = blogpost_page.get_title_obj(language="en")
        title_obj.title = "draft title"
        title_obj.save()

        # Publishing the page again should make the plugin public
        page.publish("en")

        # Check the page content in English
        response = self.client.get(url)
        html = lxml.html.fromstring(response.content)

        # The blogpost's name should be present as a link to the cms page, wrapped in a h2
        title = html.cssselect("h2.blogpost-glimpse__title")[0]
        link = title.cssselect(".blogpost-glimpse__link")[0]
        self.assertEqual(link.get("href"), "/en/public-title/")
        blogpost.refresh_from_db()
        blogpost_title = blogpost.public_extension.extended_object.get_title()
        self.assertEqual(link.text_content().strip(), blogpost_title)
        self.assertNotContains(response, "draft title")

        # Blogpost's cover should be present
        pattern = (
            r'<div class="blogpost-glimpse__media" aria-hidden="true">'
            r'<a href="/en/public-title/" tabindex="-1">'
            r'<img src="/media/filer_public_thumbnails/filer_public/.*cover\.jpg__300x170'
            r'.*alt=""')
        self.assertIsNotNone(re.search(pattern, str(response.content)))

        # Publication date should be set by first publication
        date = html.cssselect(".blogpost-glimpse__date")[0]
        # the visible date is actually only here for sighted users, make sure it is
        # hidden from screen readers
        self.assertEqual(date.text_content().strip(), "Nov. 30, 2019")
        self.assertEqual(date.get("aria-hidden"), "true")
        # and make sure there is a screen reader-only date
        screen_reader_date = html.cssselect(
            '[data-testid="offscreen-date"]')[0]
        self.assertEqual(screen_reader_date.text_content().strip(),
                         "Nov. 30, 2019")
        self.assertEqual(screen_reader_date.get("class"), "offscreen")

        # Same checks in French
        url = page.get_absolute_url(language="fr")
        response = self.client.get(url)
        html = lxml.html.fromstring(response.content)

        title = html.cssselect("h2.blogpost-glimpse__title")[0]
        link = title.cssselect(".blogpost-glimpse__link")[0]
        self.assertEqual(link.get("href"), "/fr/titre-public/")

        # pylint: disable=no-member
        pattern = (
            r'<div class="blogpost-glimpse__media" aria-hidden="true">'
            r'<a href="/fr/titre-public/" tabindex="-1">'
            r'<img src="/media/filer_public_thumbnails/filer_public/.*cover\.jpg__300x170'
            r'.*alt=""')
        self.assertIsNotNone(re.search(pattern, str(response.content)))

        # Publication date should be set by first publication
        date = html.cssselect(".blogpost-glimpse__date")[0]
        # the visible date is actually only here for sighted users, make sure it is
        # hidden from screen readers
        self.assertEqual(date.text_content().strip(), "30 novembre 2019")
        self.assertEqual(date.get("aria-hidden"), "true")
        # and make sure there is a screen reader-only date
        screen_reader_date = html.cssselect(
            '[data-testid="offscreen-date"]')[0]
        self.assertEqual(screen_reader_date.text_content().strip(),
                         "30 novembre 2019")
        self.assertEqual(screen_reader_date.get("class"), "offscreen")