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)
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")