def setUp(self): self.request = mock.MagicMock() self.request.site.hostname = 'localhost:8000' self.limit = 10 self.sublanding_page = SublandingPage(title='title') helpers.publish_page(child=self.sublanding_page) self.post1 = BrowseFilterablePage(title='post 1') self.post2 = BrowseFilterablePage(title='post 2') # the content of this post has both a full_width_text # and a filter_controls self.post1.content = StreamValue(self.post1.content.stream_block, [atomic.full_width_text, atomic.filter_controls], True) # this one only has a filter_controls self.post2.content = StreamValue(self.post1.content.stream_block, [atomic.filter_controls], True) helpers.save_new_page(self.post1, self.sublanding_page) helpers.save_new_page(self.post2, self.sublanding_page) # manually set the publication date of the posts to ensure consistent # order of retrieval in test situations, otherwise the `date_published` # can vary due to commit order self.child1_of_post1 = AbstractFilterPage(title='child 1 of post 1', date_published=dt.date(2016, 9, 1)) self.child2_of_post1 = AbstractFilterPage(title='child 2 of post 1', date_published=dt.date(2016, 9, 2)) self.child1_of_post2 = AbstractFilterPage(title='child 1 of post 2', date_published=dt.date(2016, 9, 3)) helpers.save_new_page(self.child1_of_post1, self.post1) helpers.save_new_page(self.child2_of_post1, self.post1) helpers.save_new_page(self.child1_of_post2, self.post2)
def test_reg_comment(self): """RegComment correctly displays on a Sublanding Page""" sublanding_page = SublandingPage( title='Sublanding Page', slug='sublanding', ) sublanding_page.content = StreamValue( sublanding_page.content.stream_block, [atomic.reg_comment], True) publish_page(child=sublanding_page) response = django_client.get('/sublanding/') self.assertContains(response, 'Enter your comments')
def test_get_context_sets_meta_description_to_blank_if_no_other_data_to_set( self): # noqa expected = '' self.page = SublandingPage(title='test', content=json.dumps([{ "type": "notification", "value": { "body": 'Incorrect Meta Description' } }])) test_context = self.page.get_context(self.request) result = test_context['meta_description'] self.assertEqual(expected, result)
def test_page_renders_block_safely(self): """ Test to make sure that a page with a jobs list block renders it in a safe way, meaning as raw HTML vs. as a quoted string. """ page = SublandingPage(title='title', slug='slug') save_new_page(page) set_stream_data(page, 'sidebar_breakout', [job_listing_list]) request = RequestFactory().get('/') rendered_html = force_str(page.serve(request).render().content) self.assertInHTML( ('<aside class="m-jobs-list" data-qa-hook="openings-section">' '<h3 class="short-desc">There are no current openings at this ' 'time.</h3></aside>'), rendered_html)
def run(): default_site = Site.objects.get(is_default_site=True) root_page = default_site.root_page try: about_us = Page.objects.get(slug='about-us') except Page.DoesNotExist: logger.info('Creating page: About Us') about_us = LandingPage(title='About Us', slug='about-us', live=False) save_new_page(about_us, root=root_page) try: careers = Page.objects.get(slug='careers') except Page.DoesNotExist: logger.info('Creating page: Careers') careers = SublandingPage(title='Careers', slug='careers', live=False) save_new_page(careers, root=about_us) child_pages = [ ('Working at the CFPB', 'working-at-cfpb'), ('Job Application Process', 'application-process'), ('Students and Graduates', 'students-and-graduates'), ('Current Openings', 'current-openings'), ] for title, slug in child_pages: try: child_page = Page.objects.get(slug=slug) except Page.DoesNotExist: logger.info('Creating page: {}'.format(title)) child_page = BrowsePage(title=title, slug=slug, live=False) save_new_page(child_page, careers)
def test_get_context_sets_meta_description_from_header_text_introduction_intro( self): # noqa expected = 'Correct Meta Description' self.page = LandingPage(title='test', header=json.dumps([ { "type": "text_introduction", "value": { "intro": expected }, }, { "type": "text_introduction", "value": { "intro": 'Incorrect Meta Description' }, }, ]), content=json.dumps([{ "type": "text_introduction", "value": { "intro": 'Incorrect Meta Description' } }])) test_context = self.page.get_context(self.request) result = test_context['meta_description'] self.assertEqual(expected, result)
def test_page_renders_block_safely(self): """ Test to make sure that a page with a jobs list block renders it in a safe way, meaning as raw HTML vs. as a quoted string. """ page = SublandingPage(title='title', slug='slug') save_new_page(page) set_stream_data(page, 'sidebar_breakout', [job_listing_list]) request = RequestFactory().get('/') request.user = Mock() rendered_html = force_text(page.serve(request).render().content) self.assertInHTML( ('<aside class="m-jobs-list" data-qa-hook="openings-section">' '<h3 class="short-desc">There are no current openings at this ' 'time.</h3></aside>'), rendered_html )
def test_main_contact_info(self): """Main contact info correctly displays on a Sublanding Page""" sublanding_page = SublandingPage( title='Sublanding Page', slug='sublanding', ) contact = self.get_contact() sublanding_page.content = StreamValue( sublanding_page.content.stream_block, [atomic.main_contact_info(contact.id)], True) publish_page(child=sublanding_page) response = django_client.get('/sublanding/') self.assertContains(response, '*****@*****.**') self.assertContains(response, '(515) 123-4567') self.assertContains(response, 'Ext. 1234') self.assertContains(response, '123 abc street') self.assertContains(response, 'this is a heading') self.assertContains(response, 'this is a body') self.assertNotContains(response, 'Contact Information') # Only shown on sidebar
def setUp(self): self.limit = 10 self.sublanding_page = SublandingPage(title='title') helpers.publish_page(child=self.sublanding_page) # This post has both a FullWidthText and a FilterableList. self.post1 = BrowseFilterablePage(title='post 1', content=json.dumps([ atomic.full_width_text, atomic.filter_controls ])) helpers.save_new_page(self.post1, self.sublanding_page) # This one only has a FilterableList. self.post2 = BrowseFilterablePage(title='post 2', content=json.dumps( [atomic.filter_controls])) helpers.save_new_page(self.post2, self.sublanding_page) # manually set the publication date of the posts to ensure consistent # order of retrieval in test situations, otherwise the `date_published` # can vary due to commit order self.child1_of_post1 = AbstractFilterPage(title='child 1 of post 1', date_published=dt.date( 2016, 9, 1)) self.child2_of_post1 = AbstractFilterPage(title='child 2 of post 1', date_published=dt.date( 2016, 9, 2)) self.child1_of_post2 = AbstractFilterPage(title='child 1 of post 2', date_published=dt.date( 2016, 9, 3)) helpers.save_new_page(self.child1_of_post1, self.post1) helpers.save_new_page(self.child2_of_post1, self.post1) helpers.save_new_page(self.child1_of_post2, self.post2) self.rebuild_elasticsearch_index('v1', stdout=StringIO())
def test_get_context_sets_meta_description_from_search_description(self): result = 'Correct Meta Description' self.page = LandingPage( title='test', search_description=result, header=json.dumps([{ "type": "hero", "value": { "body": 'Incorrect Meta Description' }, }]), ) test_context = self.page.get_context(self.request) self.assertEqual(test_context['meta_description'], result)
def test_page_renders_block_safely(self): """ Test to make sure that a page with a jobs list block renders it in a safe way, meaning as raw HTML vs. as a quoted string. """ page = SublandingPage(title='title', slug='slug') save_new_page(page) set_stream_data(page, 'sidebar_breakout', [job_listing_list]) self.assertPageIncludesHtml( page, ('><aside class="m-jobs-list" data-qa-hook="openings-section">' '.*' '</aside><'))
def test_get_context_sets_meta_description_from_header_item_introduction_paragraph( self): # noqa expected = 'Correct Meta Description' self.page = AbstractFilterPage(title='test', header=json.dumps([ { "type": "item_introduction", "value": { "paragraph": expected } }, ])) test_context = self.page.get_context(self.request) result = test_context['meta_description'] self.assertEqual(expected, result)
def test_get_context_sets_meta_description_from_preview_description(self): expected = 'Correct Meta Description' self.page = AbstractFilterPage(title='test', preview_description="<p>" + expected + "</p>", header=json.dumps([ { "type": "text_introduction", "value": { "intro": 'Incorrect Meta Description' }, }, ])) test_context = self.page.get_context(self.request) result = test_context['meta_description'] self.assertEqual(" " + expected + " ", result)
def setUp(self): self.test_user = User.objects.get(pk=1) self.factory = RequestFactory() ROOT_PAGE = HomePage.objects.get(slug='cfgov') self.category = mommy.make( Category, name='stub_cat', name_es='que', slug='stub-cat') self.category.save() self.test_image = mommy.make(CFGOVImage) self.test_image2 = mommy.make(CFGOVImage) self.next_step = mommy.make(NextStep, title='stub_step') self.portal_topic = mommy.make( PortalTopic, heading='test topic', heading_es='prueba tema') page_clean = mock.patch('ask_cfpb.models.pages.CFGOVPage.clean') page_clean.start() self.addCleanup(page_clean.stop) self.portal_page = SublandingPage( title='test portal page', slug='test-portal-page', portal_topic=self.portal_topic, language='en' ) ROOT_PAGE.add_child(instance=self.portal_page) self.portal_page.save() self.portal_page.save_revision().publish() self.portal_page_es = SublandingPage( title='test portal page', slug='test-portal-page-es', portal_topic=self.portal_topic, language='es' ) ROOT_PAGE.add_child(instance=self.portal_page_es) self.portal_page_es.save() self.portal_page_es.save_revision().publish() self.english_parent_page = get_or_create_page( apps, 'ask_cfpb', 'AnswerLandingPage', 'Ask CFPB', ENGLISH_PARENT_SLUG, ROOT_PAGE, language='en', live=True) self.spanish_parent_page = get_or_create_page( apps, 'ask_cfpb', 'AnswerLandingPage', 'Obtener respuestas', SPANISH_PARENT_SLUG, ROOT_PAGE, language='es', live=True) self.tag_results_page_en = get_or_create_page( apps, 'ask_cfpb', 'TagResultsPage', 'Tag results page', 'search-by-tag', ROOT_PAGE, language='en', live=True) self.tag_results_page_es = get_or_create_page( apps, 'ask_cfpb', 'TagResultsPage', 'Tag results page', 'buscar-por-etiqueta', ROOT_PAGE, language='es', live=True) self.answer1234 = Answer(id=1234) self.answer1234.save() self.page1 = AnswerPage( language='en', answer_base=self.answer1234, slug='mock-question-en-1234', title='Mock question1', answer_content='Mock answer 1', question='Mock question1', search_tags='hippodrome') self.english_parent_page.add_child(instance=self.page1) self.page1.save_revision().publish() self.page1_es = AnswerPage( language='es', slug='mock-spanish-question1-es-1234', title='Mock Spanish question1', answer_base=self.answer1234, answer_content='Mock Spanish answer', question='Mock Spanish question1', search_tags='hipotecas') self.spanish_parent_page.add_child(instance=self.page1_es) self.page1_es.save_revision().publish() self.answer5678 = Answer(id=5678) self.answer5678.save() self.page2 = AnswerPage( language='en', slug='mock-question2-en-5678', title='Mock question2', answer_base=self.answer5678, answer_content='Mock answer 2', question='Mock question2', search_tags='hippodrome') self.english_parent_page.add_child(instance=self.page2) self.page2.save_revision().publish()
def setUp(self): self.page = CFGOVPage(title='Test', slug='test') self.factory = RequestFactory() self.request = self.factory.get('/')
class TestCFGOVPageContext(TestCase): def setUp(self): self.page = CFGOVPage(title='Test', slug='test') self.factory = RequestFactory() self.request = self.factory.get('/') def test_post_preview_cache_key_contains_page_id(self): save_new_page(self.page) key = self.page.post_preview_cache_key self.assertIn(str(self.page.id), key) @mock.patch('v1.models.base.hooks.get_hooks') def test_get_context_calls_get_hooks(self, mock_get_hooks): self.page.get_context(self.request) mock_get_hooks.assert_called_with('cfgovpage_context_handlers') def test_get_context_no_banners(self): test_context = self.page.get_context(self.request) self.assertFalse(test_context['banners']) def test_get_context_one_banner_not_matching(self): Banner.objects.create(title='Banner', url_pattern='foo', enabled=True) test_context = self.page.get_context(self.request) self.assertFalse(test_context['banners']) def test_get_context_one_banner_matching(self): Banner.objects.create(title='Banner', url_pattern='/', enabled=True) test_context = self.page.get_context(self.request) self.assertTrue(test_context['banners']) def test_get_context_one_banner_matching_disabled(self): Banner.objects.create(title='Banner', url_pattern='/', enabled=False) test_context = self.page.get_context(self.request) self.assertFalse(test_context['banners']) def test_get_context_multiple_banners_matching(self): Banner.objects.create(title='Banner', url_pattern='/', enabled=True) Banner.objects.create(title='Banner2', url_pattern='/', enabled=True) Banner.objects.create(title='Banner3', url_pattern='/', enabled=False) Banner.objects.create(title='Banner4', url_pattern='foo', enabled=True) test_context = self.page.get_context(self.request) self.assertEqual(test_context['banners'].count(), 2) def test_get_context_no_schema_json(self): test_context = self.page.get_context(self.request) self.assertNotIn('schema_json', test_context) def test_get_context_with_schema_json(self): self.page.schema_json = { "@type": "SpecialAnnouncement", "@context": "http://schema.org", "category": "https://www.wikidata.org/wiki/Q81068910", "name": "Special announcement headline", "text": "Special announcement details", "datePosted": "2020-03-17", "expires": "2020-03-24" } test_context = self.page.get_context(self.request) self.assertIn('schema_json', test_context) def test_get_context_sets_meta_description_from_search_description(self): result = 'Correct Meta Description' self.page = LandingPage( title='test', search_description=result, header=json.dumps([{ "type": "hero", "value": { "body": 'Incorrect Meta Description' }, }]), ) test_context = self.page.get_context(self.request) self.assertEqual(test_context['meta_description'], result) def test_get_context_sets_meta_description_from_hero(self): expected = 'Correct Meta Description' self.page = LandingPage(title='test', header=json.dumps([{ "type": "text_introduction", "value": { "intro": 'Incorrect Meta Description' }, }, { "type": "hero", "value": { "body": expected }, }]), content=json.dumps([{ "type": "text_introduction", "value": { "intro": 'Incorrect Meta Description' } }])) test_context = self.page.get_context(self.request) result = test_context['meta_description'] self.assertEqual(expected, result) def test_get_context_sets_meta_description_from_preview_description(self): expected = 'Correct Meta Description' self.page = AbstractFilterPage(title='test', preview_description="<p>" + expected + "</p>", header=json.dumps([ { "type": "text_introduction", "value": { "intro": 'Incorrect Meta Description' }, }, ])) test_context = self.page.get_context(self.request) result = test_context['meta_description'] self.assertEqual(" " + expected + " ", result) def test_get_context_sets_meta_description_from_header_text_introduction_intro( self): # noqa expected = 'Correct Meta Description' self.page = LandingPage(title='test', header=json.dumps([ { "type": "text_introduction", "value": { "intro": expected }, }, { "type": "text_introduction", "value": { "intro": 'Incorrect Meta Description' }, }, ]), content=json.dumps([{ "type": "text_introduction", "value": { "intro": 'Incorrect Meta Description' } }])) test_context = self.page.get_context(self.request) result = test_context['meta_description'] self.assertEqual(expected, result) def test_get_context_sets_meta_description_from_content_text_introduction_intro( self): # noqa expected = 'Correct Meta Description' self.page = SublandingPage(title='test', header=json.dumps([ { "type": "text_introduction", "value": { "body": 'Incorrect Meta Description' } }, ]), content=json.dumps([{ "type": "text_introduction", "value": { "intro": expected } }])) test_context = self.page.get_context(self.request) result = test_context['meta_description'] self.assertEqual(expected, result) def test_get_context_sets_meta_description_from_header_item_introduction_paragraph( self): # noqa expected = 'Correct Meta Description' self.page = AbstractFilterPage(title='test', header=json.dumps([ { "type": "item_introduction", "value": { "paragraph": expected } }, ])) test_context = self.page.get_context(self.request) result = test_context['meta_description'] self.assertEqual(expected, result) def test_get_context_sets_meta_description_to_blank_if_no_other_data_to_set( self): # noqa expected = '' self.page = SublandingPage(title='test', content=json.dumps([{ "type": "notification", "value": { "body": 'Incorrect Meta Description' } }])) test_context = self.page.get_context(self.request) result = test_context['meta_description'] self.assertEqual(expected, result) def test_get_context_sets_meta_description_strips_html_tags(self): expected = 'Correct Meta Description' self.page = SublandingPage(title='test', header=json.dumps([{ "type": "hero", "value": { "body": '<p></li>' + expected + '</li></p>' } }])) test_context = self.page.get_context(self.request) result = test_context['meta_description'] expectedWithSpaces = ' ' + expected + ' ' self.assertEqual(expectedWithSpaces, result)
class SublandingPageTestCase(TestCase): """ This test case checks that the browse-filterable posts of a sublanding page are properly retrieved. """ def setUp(self): self.request = mock.MagicMock() self.limit = 10 self.sublanding_page = SublandingPage(title='title') helpers.publish_page(child=self.sublanding_page) self.post1 = BrowseFilterablePage(title='post 1') self.post2 = BrowseFilterablePage(title='post 2') # the content of this post has both a full_width_text # and a filter_controls self.post1.content = StreamValue( self.post1.content.stream_block, [atomic.full_width_text, atomic.filter_controls], True) # this one only has a filter_controls self.post2.content = StreamValue(self.post1.content.stream_block, [atomic.filter_controls], True) helpers.save_new_page(self.post1, self.sublanding_page) helpers.save_new_page(self.post2, self.sublanding_page) # manually set the publication date of the posts to ensure consistent # order of retrieval in test situations, otherwise the `date_published` # can vary due to commit order self.child1_of_post1 = AbstractFilterPage(title='child 1 of post 1', date_published=dt.date( 2016, 9, 1)) self.child2_of_post1 = AbstractFilterPage(title='child 2 of post 1', date_published=dt.date( 2016, 9, 2)) self.child1_of_post2 = AbstractFilterPage(title='child 1 of post 2', date_published=dt.date( 2016, 9, 3)) helpers.save_new_page(self.child1_of_post1, self.post1) helpers.save_new_page(self.child2_of_post1, self.post1) helpers.save_new_page(self.child1_of_post2, self.post2) def tearDown(self): pass def test_get_appropriate_descendants(self): """ Check to make sure the descendants of the sublanding page are the correct children that we saved during setup. The order of the retrieval should be consistent with the order in which they were saved. """ descendants = self.sublanding_page.get_appropriate_descendants() self.assertEqual(descendants[0].title, self.sublanding_page.title) self.assertEqual(descendants[1].title, self.post1.title) self.assertEqual(descendants[2].title, self.child1_of_post1.title) self.assertEqual(descendants[3].title, self.child2_of_post1.title) self.assertEqual(descendants[4].title, self.post2.title) def test_get_browsefilterable_posts(self): """ Test to make sure the browsefilterable posts are retrieved correctly. The posts should be retrieved in reverse chronological order, and if the limit exceeds the total number of posts, all should be retrieved. """ browsefilterable_posts = self.sublanding_page.get_browsefilterable_posts( self.limit) self.assertEqual(len(browsefilterable_posts), 3) self.assertEqual(self.child1_of_post1, browsefilterable_posts[2]) self.assertEqual(self.child2_of_post1, browsefilterable_posts[1]) self.assertEqual(self.child1_of_post2, browsefilterable_posts[0]) def test_get_browsefilterable_posts_with_limit(self): """ Same as the above test but imposes a limit that is smaller than the total number of posts. Check to make sure we only retrieve the specified number of posts, and that the most recent post comes first. """ self.limit = 1 browsefilterable_posts = self.sublanding_page.get_browsefilterable_posts( self.limit) self.assertEqual(1, len(browsefilterable_posts)) self.assertEqual(self.child1_of_post2, browsefilterable_posts[0])
def setUp(self): self.test_user = User.objects.get(pk=1) self.factory = RequestFactory() ROOT_PAGE = HomePage.objects.get(slug='cfgov') self.audience = mommy.make(Audience, name='stub_audience') self.category = mommy.make(Category, name='stub_cat', name_es='que', slug='stub-cat') self.subcategories = mommy.make(SubCategory, name='stub_subcat', parent=self.category, _quantity=3) self.category.subcategories.add(self.subcategories[0]) self.category.save() self.test_image = mommy.make(CFGOVImage) self.test_image2 = mommy.make(CFGOVImage) self.next_step = mommy.make(NextStep, title='stub_step') self.portal_topic = mommy.make(PortalTopic, heading='test topic', heading_es='prueba tema') page_clean = mock.patch('ask_cfpb.models.pages.CFGOVPage.clean') page_clean.start() self.addCleanup(page_clean.stop) self.portal_page = SublandingPage(title='test portal page', slug='test-portal-page', portal_topic=self.portal_topic, language='en') ROOT_PAGE.add_child(instance=self.portal_page) self.portal_page.save() self.portal_page.save_revision().publish() self.portal_page_es = SublandingPage(title='test portal page', slug='test-portal-page-es', portal_topic=self.portal_topic, language='es') ROOT_PAGE.add_child(instance=self.portal_page_es) self.portal_page_es.save() self.portal_page_es.save_revision().publish() self.english_parent_page = get_or_create_page(apps, 'ask_cfpb', 'AnswerLandingPage', 'Ask CFPB', ENGLISH_PARENT_SLUG, ROOT_PAGE, language='en', live=True) self.spanish_parent_page = get_or_create_page(apps, 'ask_cfpb', 'AnswerLandingPage', 'Obtener respuestas', SPANISH_PARENT_SLUG, ROOT_PAGE, language='es', live=True) self.tag_results_page_en = get_or_create_page(apps, 'ask_cfpb', 'TagResultsPage', 'Tag results page', 'search-by-tag', ROOT_PAGE, language='en', live=True) self.tag_results_page_es = get_or_create_page(apps, 'ask_cfpb', 'TagResultsPage', 'Tag results page', 'buscar-por-etiqueta', ROOT_PAGE, language='es', live=True) self.answer1234 = self.prepare_answer( id=1234, answer='Mock answer 1', answer_es='Mock Spanish answer', slug='mock-answer-en-1234', slug_es='mock-spanish-answer-es-1234', question='Mock question1', question_es='Mock Spanish question1', search_tags='hippodrome', search_tags_es='hipotecas', update_english_page=True, update_spanish_page=True) self.answer1234.save() self.page1 = AnswerPage(language='en', answer_base=self.answer1234, slug='mock-question-en-1234', title='Mock question1', answer='Mock answer 1', question='Mock question1', search_tags='hippodrome') self.english_parent_page.add_child(instance=self.page1) self.page1.save_revision().publish() self.page1_es = AnswerPage(language='es', slug='mock-spanish-question1-es-1234', title='Mock Spanish question1', answer_base=self.answer1234, answer='Mock Spanish answer', question='Mock Spanish question1', search_tags='hipotecas') self.spanish_parent_page.add_child(instance=self.page1_es) self.page1_es.save_revision().publish() self.answer5678 = self.prepare_answer(id=5678, answer='Mock answer 2', question='Mock question2', search_tags='hippodrome', search_tags_es='hipotecas') self.answer5678.save() self.page2 = AnswerPage(language='en', slug='mock-question2-en-5678', title='Mock question2', answer_base=self.answer5678, answer='Mock answer 2', question='Mock question2', search_tags='hippodrome') self.english_parent_page.add_child(instance=self.page2) self.page2.save_revision().publish()
class AnswerPageTestCase(TestCase): fixtures = ['ask_tests', 'portal_topics'] def prepare_answer(self, **kwargs): kwargs.setdefault('answer', 'Mock answer') kwargs.setdefault('slug', 'mock-answer') return mommy.prepare(Answer, **kwargs) def create_answer_page(self, **kwargs): kwargs.setdefault('path', get_free_path(apps, self.english_parent_page)) kwargs.setdefault('depth', self.english_parent_page.depth + 1) kwargs.setdefault('slug', 'mock-answer-page-en-1234') kwargs.setdefault('title', 'Mock answer page title') page = mommy.prepare(AnswerPage, **kwargs) page.save() return page def setUp(self): self.test_user = User.objects.get(pk=1) self.factory = RequestFactory() ROOT_PAGE = HomePage.objects.get(slug='cfgov') self.audience = mommy.make(Audience, name='stub_audience') self.category = mommy.make(Category, name='stub_cat', name_es='que', slug='stub-cat') self.subcategories = mommy.make(SubCategory, name='stub_subcat', parent=self.category, _quantity=3) self.category.subcategories.add(self.subcategories[0]) self.category.save() self.test_image = mommy.make(CFGOVImage) self.test_image2 = mommy.make(CFGOVImage) self.next_step = mommy.make(NextStep, title='stub_step') self.portal_topic = mommy.make(PortalTopic, heading='test topic', heading_es='prueba tema') page_clean = mock.patch('ask_cfpb.models.pages.CFGOVPage.clean') page_clean.start() self.addCleanup(page_clean.stop) self.portal_page = SublandingPage(title='test portal page', slug='test-portal-page', portal_topic=self.portal_topic, language='en') ROOT_PAGE.add_child(instance=self.portal_page) self.portal_page.save() self.portal_page.save_revision().publish() self.portal_page_es = SublandingPage(title='test portal page', slug='test-portal-page-es', portal_topic=self.portal_topic, language='es') ROOT_PAGE.add_child(instance=self.portal_page_es) self.portal_page_es.save() self.portal_page_es.save_revision().publish() self.english_parent_page = get_or_create_page(apps, 'ask_cfpb', 'AnswerLandingPage', 'Ask CFPB', ENGLISH_PARENT_SLUG, ROOT_PAGE, language='en', live=True) self.spanish_parent_page = get_or_create_page(apps, 'ask_cfpb', 'AnswerLandingPage', 'Obtener respuestas', SPANISH_PARENT_SLUG, ROOT_PAGE, language='es', live=True) self.tag_results_page_en = get_or_create_page(apps, 'ask_cfpb', 'TagResultsPage', 'Tag results page', 'search-by-tag', ROOT_PAGE, language='en', live=True) self.tag_results_page_es = get_or_create_page(apps, 'ask_cfpb', 'TagResultsPage', 'Tag results page', 'buscar-por-etiqueta', ROOT_PAGE, language='es', live=True) self.answer1234 = self.prepare_answer( id=1234, answer='Mock answer 1', answer_es='Mock Spanish answer', slug='mock-answer-en-1234', slug_es='mock-spanish-answer-es-1234', question='Mock question1', question_es='Mock Spanish question1', search_tags='hippodrome', search_tags_es='hipotecas', update_english_page=True, update_spanish_page=True) self.answer1234.save() self.page1 = AnswerPage(language='en', answer_base=self.answer1234, slug='mock-question-en-1234', title='Mock question1', answer='Mock answer 1', question='Mock question1', search_tags='hippodrome') self.english_parent_page.add_child(instance=self.page1) self.page1.save_revision().publish() self.page1_es = AnswerPage(language='es', slug='mock-spanish-question1-es-1234', title='Mock Spanish question1', answer_base=self.answer1234, answer='Mock Spanish answer', question='Mock Spanish question1', search_tags='hipotecas') self.spanish_parent_page.add_child(instance=self.page1_es) self.page1_es.save_revision().publish() self.answer5678 = self.prepare_answer(id=5678, answer='Mock answer 2', question='Mock question2', search_tags='hippodrome', search_tags_es='hipotecas') self.answer5678.save() self.page2 = AnswerPage(language='en', slug='mock-question2-en-5678', title='Mock question2', answer_base=self.answer5678, answer='Mock answer 2', question='Mock question2', search_tags='hippodrome') self.english_parent_page.add_child(instance=self.page2) self.page2.save_revision().publish() def test_tag_results_page_templates(self): self.assertEqual(self.tag_results_page_es.get_template(HttpRequest()), self.tag_results_page_en.get_template(HttpRequest())) def test_tag_results_page_context_language(self): context = self.tag_results_page_es.get_context(HttpRequest()) self.assertEqual( context.get('breadcrumb_items')[0]['title'], 'Obtener respuestas') def test_english_page_context(self): from v1.models.snippets import ReusableText from ask_cfpb.models.pages import get_reusable_text_snippet rt = ReusableText(title='About us (For consumers)') rt.save() page = self.page1 page.language = 'en' page.save() test_context = page.get_context(HttpRequest()) self.assertEqual(test_context['about_us'], get_reusable_text_snippet('About us (For consumers)')) def test_routable_tag_page_base_returns_404(self): page = self.tag_results_page_en response = self.client.get(page.url + page.reverse_subpage('tag_base')) self.assertEqual(response.status_code, 404) def test_routable_tag_page_handles_bad_tag(self): page = self.tag_results_page_en response = self.client.get( page.url + page.reverse_subpage('tag_search', kwargs={'tag': 'hippopotamus'})) self.assertEqual(response.status_code, 200) def test_routable_tag_page_handles_bad_pagination(self): page = self.tag_results_page_en response = self.client.get( page.url + page.reverse_subpage('tag_search', kwargs={'tag': 'hippodrome'}), {'page': '100'}) self.assertEqual(response.status_code, 200) def test_routable_tag_page_valid_tag_returns_200(self): page = self.tag_results_page_en response = self.client.get( page.url + page.reverse_subpage('tag_search', kwargs={'tag': 'hippodrome'})) self.assertEqual(response.status_code, 200) def test_routable_tag_page_returns_url_suffix(self): page = self.tag_results_page_en response = page.reverse_subpage('tag_search', kwargs={'tag': 'hippodrome'}) self.assertEqual(response, 'hippodrome/') def test_view_answer_exact_slug(self): page = self.page1 page.slug = 'mock-answer-en-1234' page.save() revision = page.save_revision() revision.publish() response = self.client.get( reverse('ask-english-answer', args=['mock-answer', 'en', 1234])) self.assertEqual(response.status_code, 200) def test_view_answer_301_for_healed_slug(self): page = self.page1 revision = page.save_revision() revision.publish() response = self.client.get( reverse('ask-english-answer', args=['mock-slug', 'en', 1234])) self.assertEqual(response.status_code, 301) def test_view_answer_redirected(self): page = self.page1 page.redirect_to = self.page2.answer_base page.save() revision = page.save_revision() revision.publish() response_302 = self.client.get( reverse('ask-english-answer', args=['mocking-answer-page', 'en', 1234])) self.assertTrue(isinstance(response_302, HttpResponse)) self.assertEqual(response_302.status_code, 301) def test_spanish_answer_page_handles_referrer_with_unicode_accents(self): referrer_unicode = ( 'https://www.consumerfinance.gov/es/obtener-respuestas/' 'buscar-por-etiqueta/empresas_de_informes_de_cr\xe9dito/') spanish_page = self.page1_es request = HttpRequest() request.POST['referrer'] = referrer_unicode response = spanish_page.serve(request) self.assertEqual(response.status_code, 200) def test_page_string_no_base(self): test_page = self.create_answer_page() result = test_page.__str__() self.assertEqual(result, test_page.title) def test_page_string_with_base(self): page = self.page1 self.assertTrue(page.answer_base) result = page.__str__() self.assertEqual(result, "{}: {}".format(page.answer_base.pk, page.title)) def test_search_tags(self): """Test the list produced by page.clean_search_tags()""" page = self.page1 page.search_tags = 'Chutes, Ladders' page.save_revision().publish() taglist = page.clean_search_tags for name in ['Chutes', 'Ladders']: self.assertIn(name, taglist) def test_category_text(self): answer = self.prepare_answer() answer.save() answer.category.add(self.category) answer.save() self.assertEqual(answer.category_text(), [self.category.name]) self.assertEqual(answer.category_text_es(), [self.category.name_es]) def test_category_text_no_category(self): answer = self.prepare_answer() answer.save() self.assertEqual(answer.category_text(), '') self.assertEqual(answer.category_text_es(), '') def test_answer_text(self): raw_snippet = "<strong>Snippet</strong>." raw_answer = "<span>Clean answer test </span>" combo = "{} {}".format(raw_snippet, raw_answer) clean = html.strip_tags(html_parser.unescape(combo)).strip() answer = self.prepare_answer(snippet=raw_snippet, answer=raw_answer, snippet_es=raw_snippet, answer_es=raw_answer) answer.save() self.assertEqual(answer.answer_text, clean) self.assertEqual(answer.answer_text_es, clean) def test_cleaned_questions(self): answer = self.prepare_answer( question="<span>Clean question test </span>", question_es="<span>Clean question test </span>") raw = "<span>Clean question test </span>" clean = html.strip_tags(html_parser.unescape(raw)).strip() answer.save() self.assertEqual(answer.cleaned_questions(), [clean]) self.assertEqual(answer.cleaned_questions_es(), [clean]) def test_answer_str(self): answer = self.prepare_answer(question="Let's test an English slug") answer.save() self.assertEqual(answer.__str__(), answer.question) def test_answer_str_no_english_question(self): answer = self.prepare_answer(question='', question_es="Let's test with no English") answer.save() self.assertEqual(answer.__str__(), answer.question_es) def test_english_header_and_footer(self): english_answer_page_response = self.client.get( reverse('ask-english-answer', args=['mock-question', 'en', 1234])) self.assertContains( english_answer_page_response, 'An official website of the United States government') self.assertNotContains( english_answer_page_response, 'Un sitio web oficial del gobierno federal de los Estados Unidos') self.assertContains(english_answer_page_response, 'https://usa.gov/') self.assertNotContains(english_answer_page_response, 'https://gobiernousa.gov/') def test_spanish_header_and_footer(self): spanish_answer_page_response = self.client.get( reverse('ask-spanish-answer', args=['mock-spanish-question1', 'es', 1234])) self.assertContains( spanish_answer_page_response, 'Un sitio web oficial del gobierno federal de los Estados Unidos') self.assertNotContains( spanish_answer_page_response, 'An official website of the United States government') self.assertContains(spanish_answer_page_response, 'https://gobiernousa.gov/') self.assertNotContains(spanish_answer_page_response, 'https://usa.gov/') def test_category_str(self): category = self.category self.assertEqual(category.__str__(), category.name) def test_portal_topic_featured_answers(self): page = self.page1 page.portal_topic.add(self.portal_topic) page.featured = True page.save_revision().publish() self.assertIn(page, self.portal_topic.featured_answers('en')) def test_subcategory_str(self): subcategory = self.subcategories[0] self.assertEqual(subcategory.__str__(), "{}: {}".format(self.category.name, subcategory.name)) def test_nextstep_str(self): next_step = self.next_step self.assertEqual(next_step.__str__(), next_step.title) def test_audience_str(self): audience = self.audience self.assertEqual(audience.__str__(), audience.name) def test_status_string(self): with translation.override('en'): page1 = self.page1 self.assertEqual((page1.status_string), 'live + draft') def test_status_string_redirected(self): with translation.override('en'): page1 = self.page1 page1.redirect_to_page = self.page2 page1.save() page1.get_latest_revision().publish() self.assertEqual((page1.status_string), "redirected") page1.unpublish() self.assertEqual(page1.status_string, ("redirected but not live")) def test_get_ask_breadcrumbs(self): from ask_cfpb.models import get_ask_breadcrumbs breadcrumbs = get_ask_breadcrumbs() self.assertEqual(len(breadcrumbs), 1) self.assertEqual(breadcrumbs[0]['title'], 'Ask CFPB') def test_landing_page_context_no_featured_answer(self): page = self.page1 page.portal_topic.add(self.portal_topic) page.featured = False page.save_revision().publish() mock_site = mock.Mock() mock_site.hostname = 'localhost' mock_request = HttpRequest() mock_request.site = mock_site landing_page = self.english_parent_page test_context = landing_page.get_context(mock_request) self.assertEqual(len(test_context['portal_cards']), 0) def test_landing_page_context(self): page = self.page1 page.portal_topic.add(self.portal_topic) page.featured = True page.save_revision().publish() mock_site = mock.Mock() mock_site.hostname = 'localhost' mock_request = HttpRequest() mock_request.site = mock_site landing_page = self.english_parent_page test_context = landing_page.get_context(mock_request) self.assertEqual(len(test_context['portal_cards']), 1) self.assertEqual(test_context['portal_cards'][0]['title'], 'test topic') def test_spanish_landing_page_context(self): page = self.page1_es page.portal_topic.add(self.portal_topic) page.featured = True page.save_revision().publish() mock_site = mock.Mock() mock_site.hostname = 'localhost' mock_request = HttpRequest() mock_request.site = mock_site landing_page = self.spanish_parent_page test_context = landing_page.get_context(mock_request) self.assertEqual(len(test_context['portal_cards']), 1) self.assertEqual(test_context['portal_cards'][0]['title'], 'prueba tema') def test_landing_page_context_draft_portal_page(self): page = self.page1 page.portal_topic.add(self.portal_topic) page.featured = True page.save_revision().publish() self.portal_page.unpublish() mock_site = mock.Mock() mock_site.hostname = 'localhost' mock_request = HttpRequest() mock_request.site = mock_site landing_page = self.english_parent_page test_context = landing_page.get_context(mock_request) self.assertEqual(len(test_context['portal_cards']), 0) def test_answer_language_page_exists(self): self.assertEqual(self.answer5678.english_page, self.page2) def test_answer_language_page_nonexistent(self): self.assertEqual(self.answer5678.spanish_page, None) def test_get_reusable_text_snippet(self): from ask_cfpb.models import get_reusable_text_snippet from v1.models.snippets import ReusableText test_snippet = ReusableText.objects.create(title='Test Snippet') self.assertEqual(get_reusable_text_snippet('Test Snippet'), test_snippet) def test_get_nonexistent_reusable_text_snippet(self): from ask_cfpb.models import get_reusable_text_snippet self.assertEqual(get_reusable_text_snippet('Nonexistent Snippet'), None) def test_get_about_us_english_standard_text(self): from ask_cfpb.models import get_standard_text from v1.models.snippets import ReusableText snippet_title = REUSABLE_TEXT_TITLES['about_us']['en'] test_snippet = ReusableText.objects.create(title=snippet_title) self.assertEqual(get_standard_text('en', 'about_us'), test_snippet) def test_social_sharing_image_used(self): from v1.models.images import CFGOVImage image = CFGOVImage.objects.last() page = self.page1 page.social_sharing_image = image page.save_revision(user=self.test_user).publish() self.assertEqual(page.meta_image, image) def test_answer_meta_image_undefined(self): """ Answer page's meta image is undefined if social image is not provided """ answer = self.prepare_answer() answer.save() page = self.create_answer_page(answer_base=answer) self.assertIsNone(page.meta_image) def test_answer_meta_image_uses_category_image_if_no_social_image(self): """ Answer page's meta image is its category's image """ category = mommy.make(Category, category_image=self.test_image) page = self.page1 page.category.add(category) page.save_revision() self.assertEqual(page.meta_image, self.test_image) def test_answer_split_testing_id(self): """Confirm AnswerPage's split_testing_id is set to its answer_base.id, which is checked by the core.feature_flags.in_split_testing_cluster flag condition when doing split testing on Ask CFPB answer pages.""" answer = self.answer1234 page = answer.english_page self.assertEqual(page.split_test_id, answer.id) def test_validate_pagination_number(self): paginator = Paginator([{'fake': 'results'}] * 30, 25) request = HttpRequest() self.assertEqual(validate_page_number(request, paginator), 1) request.GET.update({'page': '2'}) self.assertEqual(validate_page_number(request, paginator), 2) request = HttpRequest() request.GET.update({'page': '1000'}) self.assertEqual(validate_page_number(request, paginator), 1) request = HttpRequest() request.GET.update({'page': '<script>Boo</script>'}) self.assertEqual(validate_page_number(request, paginator), 1) def test_schema_html_does_not_appear_when_flag_is_off(self): with override_settings(FLAGS={'HOW_TO_SCHEMA': [('boolean', False)]}): response = self.client.get(self.page1.url) self.assertNotContains(response, 'itemtype="http://schema.org/HowTo"') def test_schema_html_appears_when_flag_is_on(self): with override_settings(FLAGS={'HOW_TO_SCHEMA': [('boolean', True)]}): response = self.client.get(self.page1.url) self.assertContains(response, 'itemtype="http://schema.org/HowTo"')
def setUp(self): self.site = Site.objects.get(is_default_site=True) self.root_page = self.site.root_page self.portal_topic = baker.make(PortalTopic, heading="test topic", heading_es="prueba tema") self.en_portal_category = baker.make(PortalCategory, heading="test_english_heading") self.es_portal_category = baker.make(PortalCategory, heading="test_spanish_heading") self.en_portal_page = SublandingPage( title="test English portal page", slug="test-en-portal-page", portal_topic=self.portal_topic, language="en", ) self.es_portal_page = SublandingPage( title="test Spanish portal page", slug="test-es-portal-page", portal_topic=self.portal_topic, language="es", ) self.root_page.add_child(instance=self.en_portal_page) self.en_portal_page.save() self.en_portal_page.save_revision().publish() self.en_parent_page = get_or_create_page( apps, "ask_cfpb", "AnswerLandingPage", "Ask CFPB", ENGLISH_PARENT_SLUG, self.root_page, language="en", live=True, ) self.es_parent_page = get_or_create_page( apps, "ask_cfpb", "AnswerLandingPage", "Obtener respuestas", SPANISH_PARENT_SLUG, self.root_page, language="es", live=True, ) self.answer = Answer(id=1234) self.answer.save() self.en_page = AnswerPage( language="en", slug="test-english-question-en-1234", title="Test English question", answer_base=self.answer, answer_content="Test English answer", question="Test English question", search_tags="English", ) self.es_page = AnswerPage( language="es", slug="test-spanish-question-es-1234", title="Test Spanish question", answer_base=self.answer, answer_content="Test Spanish answer", question="Test Spanish question", search_tags="Spanish", ) self.doc = AnswerPageDocument()
class SublandingPageTestCase(TestCase): """ This test case checks that the browse-filterable posts of a sublanding page are properly retrieved. """ def setUp(self): self.request = mock.MagicMock() self.request.site.hostname = 'localhost:8000' self.limit = 10 self.sublanding_page = SublandingPage(title='title') helpers.publish_page(child=self.sublanding_page) self.post1 = BrowseFilterablePage(title='post 1') self.post2 = BrowseFilterablePage(title='post 2') # the content of this post has both a full_width_text # and a filter_controls self.post1.content = StreamValue(self.post1.content.stream_block, [atomic.full_width_text, atomic.filter_controls], True) # this one only has a filter_controls self.post2.content = StreamValue(self.post1.content.stream_block, [atomic.filter_controls], True) helpers.save_new_page(self.post1, self.sublanding_page) helpers.save_new_page(self.post2, self.sublanding_page) # manually set the publication date of the posts to ensure consistent # order of retrieval in test situations, otherwise the `date_published` # can vary due to commit order self.child1_of_post1 = AbstractFilterPage(title='child 1 of post 1', date_published=dt.date(2016, 9, 1)) self.child2_of_post1 = AbstractFilterPage(title='child 2 of post 1', date_published=dt.date(2016, 9, 2)) self.child1_of_post2 = AbstractFilterPage(title='child 1 of post 2', date_published=dt.date(2016, 9, 3)) helpers.save_new_page(self.child1_of_post1, self.post1) helpers.save_new_page(self.child2_of_post1, self.post1) helpers.save_new_page(self.child1_of_post2, self.post2) def tearDown(self): pass def test_get_appropriate_descendants(self): """ Check to make sure the descendants of the sublanding page are the correct children that we saved during setup. The order of the retrieval should be consistent with the order in which they were saved. """ descendants = self.sublanding_page.get_appropriate_descendants(self.request.site.hostname) self.assertEqual(descendants[0].title, self.sublanding_page.title) self.assertEqual(descendants[1].title, self.post1.title) self.assertEqual(descendants[2].title, self.child1_of_post1.title) self.assertEqual(descendants[3].title, self.child2_of_post1.title) self.assertEqual(descendants[4].title, self.post2.title) def test_get_browsefilterable_posts(self): """ Test to make sure the browsefilterable posts are retrieved correctly. The posts should be retrieved in reverse chronological order, and if the limit exceeds the total number of posts, all should be retrieved. """ browsefilterable_posts = self.sublanding_page.get_browsefilterable_posts(self.request, self.limit) self.assertEqual(len(browsefilterable_posts), 3) # the first number in the tuple represents the order of the # filter_controls form in the post's content field, so we test # situations in which that order varies self.assertEqual(('1', self.child1_of_post1), browsefilterable_posts[2]) self.assertEqual(('1', self.child2_of_post1), browsefilterable_posts[1]) self.assertEqual(('0', self.child1_of_post2), browsefilterable_posts[0]) def test_get_browsefilterable_posts_with_limit(self): """ Same as the above test but imposes a limit that is smaller than the total number of posts. Check to make sure we only retrieve the specified number of posts, and that the most recent post comes first. """ self.limit = 1 browsefilterable_posts = self.sublanding_page.get_browsefilterable_posts(self.request, self.limit) self.assertEqual(1, len(browsefilterable_posts)) self.assertEqual(('0', self.child1_of_post2), browsefilterable_posts[0])
def setUp(self): self.test_user = User.objects.get(pk=1) self.ROOT_PAGE = HomePage.objects.get(slug="cfgov") self.category = baker.make( Category, name="stub_cat", name_es="que", slug="stub-cat" ) self.category.save() self.test_image = baker.make(CFGOVImage) self.test_image2 = baker.make(CFGOVImage) self.next_step = baker.make(NextStep, title="stub_step") self.portal_topic = baker.make( PortalTopic, heading="test topic", heading_es="prueba tema" ) page_clean = mock.patch("ask_cfpb.models.pages.CFGOVPage.clean") page_clean.start() self.addCleanup(page_clean.stop) self.portal_page = SublandingPage( title="test portal page", slug="test-portal-page", portal_topic=self.portal_topic, language="en", ) self.ROOT_PAGE.add_child(instance=self.portal_page) self.portal_page.save() self.portal_page.save_revision().publish() self.portal_page_es = SublandingPage( title="test portal page", slug="test-portal-page-es", portal_topic=self.portal_topic, language="es", ) self.ROOT_PAGE.add_child(instance=self.portal_page_es) self.portal_page_es.save() self.portal_page_es.save_revision().publish() self.english_parent_page = get_or_create_page( apps, "ask_cfpb", "AnswerLandingPage", "Ask CFPB", ENGLISH_PARENT_SLUG, self.ROOT_PAGE, language="en", live=True, ) self.spanish_parent_page = get_or_create_page( apps, "ask_cfpb", "AnswerLandingPage", "Obtener respuestas", SPANISH_PARENT_SLUG, self.ROOT_PAGE, language="es", live=True, ) self.tag_results_page_en = get_or_create_page( apps, "ask_cfpb", "TagResultsPage", "Tag results page", "search-by-tag", self.ROOT_PAGE, language="en", live=True, ) self.tag_results_page_es = get_or_create_page( apps, "ask_cfpb", "TagResultsPage", "Tag results page", "buscar-por-etiqueta", self.ROOT_PAGE, language="es", live=True, ) self.answer1234 = Answer(id=1234) self.answer1234.save() self.page1 = AnswerPage( language="en", answer_base=self.answer1234, slug="mock-question-en-1234", title="Mock question1", answer_content="Mock answer 1", question="Mock question1", search_tags="hippodrome", ) self.english_parent_page.add_child(instance=self.page1) self.page1.save_revision().publish() self.page1_es = AnswerPage( language="es", slug="mock-spanish-question1-es-1234", title="Mock Spanish question1", answer_base=self.answer1234, answer_content="Mock Spanish answer", question="Mock Spanish question1", search_tags="hipotecas", ) self.spanish_parent_page.add_child(instance=self.page1_es) self.page1_es.save_revision().publish() self.answer5678 = Answer(id=5678) self.answer5678.save() self.page2 = AnswerPage( language="en", slug="mock-question2-en-5678", title="Mock question2", answer_base=self.answer5678, answer_content="Mock answer 2", question="Mock question2", search_tags="hippodrome", ) self.english_parent_page.add_child(instance=self.page2) self.page2.save_revision().publish()
class AnswerPageTest(TestCase): fixtures = ["ask_tests", "portal_topics"] def create_answer_page(self, **kwargs): kwargs.setdefault( "path", get_free_path(apps, self.english_parent_page) ) kwargs.setdefault("depth", self.english_parent_page.depth + 1) kwargs.setdefault("slug", "mock-answer-page-en-1234") kwargs.setdefault("title", "Mock answer page title") page = baker.prepare(AnswerPage, **kwargs) page.save() return page def setUp(self): self.test_user = User.objects.get(pk=1) self.ROOT_PAGE = HomePage.objects.get(slug="cfgov") self.category = baker.make( Category, name="stub_cat", name_es="que", slug="stub-cat" ) self.category.save() self.test_image = baker.make(CFGOVImage) self.test_image2 = baker.make(CFGOVImage) self.next_step = baker.make(NextStep, title="stub_step") self.portal_topic = baker.make( PortalTopic, heading="test topic", heading_es="prueba tema" ) page_clean = mock.patch("ask_cfpb.models.pages.CFGOVPage.clean") page_clean.start() self.addCleanup(page_clean.stop) self.portal_page = SublandingPage( title="test portal page", slug="test-portal-page", portal_topic=self.portal_topic, language="en", ) self.ROOT_PAGE.add_child(instance=self.portal_page) self.portal_page.save() self.portal_page.save_revision().publish() self.portal_page_es = SublandingPage( title="test portal page", slug="test-portal-page-es", portal_topic=self.portal_topic, language="es", ) self.ROOT_PAGE.add_child(instance=self.portal_page_es) self.portal_page_es.save() self.portal_page_es.save_revision().publish() self.english_parent_page = get_or_create_page( apps, "ask_cfpb", "AnswerLandingPage", "Ask CFPB", ENGLISH_PARENT_SLUG, self.ROOT_PAGE, language="en", live=True, ) self.spanish_parent_page = get_or_create_page( apps, "ask_cfpb", "AnswerLandingPage", "Obtener respuestas", SPANISH_PARENT_SLUG, self.ROOT_PAGE, language="es", live=True, ) self.tag_results_page_en = get_or_create_page( apps, "ask_cfpb", "TagResultsPage", "Tag results page", "search-by-tag", self.ROOT_PAGE, language="en", live=True, ) self.tag_results_page_es = get_or_create_page( apps, "ask_cfpb", "TagResultsPage", "Tag results page", "buscar-por-etiqueta", self.ROOT_PAGE, language="es", live=True, ) self.answer1234 = Answer(id=1234) self.answer1234.save() self.page1 = AnswerPage( language="en", answer_base=self.answer1234, slug="mock-question-en-1234", title="Mock question1", answer_content="Mock answer 1", question="Mock question1", search_tags="hippodrome", ) self.english_parent_page.add_child(instance=self.page1) self.page1.save_revision().publish() self.page1_es = AnswerPage( language="es", slug="mock-spanish-question1-es-1234", title="Mock Spanish question1", answer_base=self.answer1234, answer_content="Mock Spanish answer", question="Mock Spanish question1", search_tags="hipotecas", ) self.spanish_parent_page.add_child(instance=self.page1_es) self.page1_es.save_revision().publish() self.answer5678 = Answer(id=5678) self.answer5678.save() self.page2 = AnswerPage( language="en", slug="mock-question2-en-5678", title="Mock question2", answer_base=self.answer5678, answer_content="Mock answer 2", question="Mock question2", search_tags="hippodrome", ) self.english_parent_page.add_child(instance=self.page2) self.page2.save_revision().publish() def test_tag_results_page_templates(self): self.assertEqual( self.tag_results_page_es.get_template(HttpRequest()), self.tag_results_page_en.get_template(HttpRequest()), ) def test_tag_results_page_context_language(self): context = self.tag_results_page_es.get_context(HttpRequest()) self.assertEqual( context.get("breadcrumb_items")[0]["title"], "Obtener respuestas" ) def test_answer_content_preview_word(self): """answer_content_preview returns truncated text by word count And without HTML tags. """ page = self.page1 stream_data = [ { "type": "video_player", "id": "402b933b", "value": { "video_url": "https://www.youtube.com/embed/wcQ1a_Gg8tI" }, }, { "type": "text", "id": "402b933c", "value": { "content": ( "<p><span>" "This is more than forty words: " "word word word word word word word word word word " "word word word word word word word word word word " "word word word word word word word word word word " "word word word word word word too-many." "</span></p>" ) }, }, ] set_stream_data(page, "answer_content", stream_data) self.assertTrue( page.answer_content_preview().endswith("word word ...") ) def test_answer_content_preview_char(self): """answer_content_preview returns truncated text by character count And without HTML tags. """ page = self.page1 stream_data = [ { "type": "video_player", "id": "402b933b", "value": { "video_url": "https://www.youtube.com/embed/wcQ1a_Gg8tI" }, }, { "type": "text", "id": "402b933c", "value": { "content": ( "<p><span>" "This a word with more than 255 characters: " "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" "char char char char char char char char char char " "char char char char char char char char char char " "char char char char char char char char char char " "char char char char char char too-many." "</span></p>" ) }, }, ] set_stream_data(page, "answer_content", stream_data) self.assertTrue(page.answer_content_preview().endswith(" ...")) def test_english_page_context(self): from ask_cfpb.models.pages import get_reusable_text_snippet from v1.models.snippets import ReusableText rt = ReusableText(title="About us (For consumers)") rt.save() page = self.page1 page.language = "en" page.save() test_context = page.get_context(HttpRequest()) self.assertEqual( test_context["about_us"], get_reusable_text_snippet("About us (For consumers)"), ) def test_get_meta_description(self): page = self.page1 # Defaults to empty string self.assertEqual( page.get_meta_description(), "" ) # Second fallback is truncated answer_content text block stream_data = [ { "type": "video_player", "id": "402b933b", "value": { "video_url": "https://www.youtube.com/embed/wcQ1a_Gg8tI" }, }, { "type": "text", "id": "402b933c", "value": { "content": ( "<p><span>" "This is more than forty words: " "word word word word word word word word word word " "word word word word word word word word word word " "word word word word word word word word word word " "word word word word word word too-many." "</span></p>" ) }, }, ] set_stream_data(page, "answer_content", stream_data) self.assertTrue(page.get_meta_description().endswith("word word ...")) # First fallback is the short_answer page.short_answer = "Test short answer" self.assertEqual(page.get_meta_description(), page.short_answer) # First choice is the search_description page.search_description = "Test search description" self.assertEqual(page.get_meta_description(), page.search_description) def test_english_page_sibling_url(self): self.assertEqual(self.page1.get_sibling_url(), self.page1_es.url) def test_spanish_page_sibling_url(self): self.assertEqual(self.page1_es.get_sibling_url(), self.page1.url) def test_no_sibling_url_returned_for_redirected_page(self): self.page1_es.redirect_to_page = self.page2 self.page1_es.save() self.page1_es.save_revision(user=self.test_user).publish() self.assertEqual(self.page1.get_sibling_url(), None) def test_no_sibling_url_returned_for_draft_page(self): self.page1.unpublish() self.assertEqual(self.page1_es.get_sibling_url(), None) def test_routable_tag_page_base_returns_404(self): page = self.tag_results_page_en response = self.client.get(page.url + page.reverse_subpage("tag_base")) self.assertEqual(response.status_code, 404) def test_routable_tag_page_handles_bad_tag(self): page = self.tag_results_page_en response = self.client.get( page.url + page.reverse_subpage( "tag_search", kwargs={"tag": "hippopotamus"} ) ) self.assertEqual(response.status_code, 200) def test_routable_tag_page_handles_bad_pagination(self): page = self.tag_results_page_en response = self.client.get( page.url + page.reverse_subpage("tag_search", kwargs={"tag": "hippodrome"}), {"page": "100"}, ) self.assertEqual(response.status_code, 200) def test_routable_tag_page_valid_tag_returns_200(self): page = self.tag_results_page_en response = self.client.get( page.url + page.reverse_subpage("tag_search", kwargs={"tag": "hippodrome"}) ) self.assertEqual(response.status_code, 200) def test_routable_tag_page_returns_url_suffix(self): page = self.tag_results_page_en response = page.reverse_subpage( "tag_search", kwargs={"tag": "hippodrome"} ) self.assertEqual(response, "hippodrome/") def test_view_answer_exact_slug(self): page = self.page1 page.slug = "mock-answer-en-1234" page.save() revision = page.save_revision() revision.publish() response = self.client.get( reverse("ask-english-answer", args=["mock-answer", "en", 1234]) ) self.assertEqual(response.status_code, 200) def test_view_answer_301_for_healed_slug(self): page = self.page1 revision = page.save_revision() revision.publish() response = self.client.get( reverse("ask-english-answer", args=["mock-slug", "en", 1234]) ) self.assertEqual(response.status_code, 301) def test_view_answer_redirected(self): page = self.page1 page.redirect_to = self.page2.answer_base page.save() revision = page.save_revision() revision.publish() response_302 = self.client.get( reverse( "ask-english-answer", args=["mocking-answer-page", "en", 1234] ) ) self.assertTrue(isinstance(response_302, HttpResponse)) self.assertEqual(response_302.status_code, 301) def test_spanish_answer_page_handles_referrer_with_unicode_accents(self): referrer_unicode = ( "https://www.consumerfinance.gov/es/obtener-respuestas/" "buscar-por-etiqueta/empresas_de_informes_de_cr\xe9dito/" ) spanish_page = self.page1_es request = HttpRequest() request.POST["referrer"] = referrer_unicode response = spanish_page.serve(request) self.assertEqual(response.status_code, 200) def test_page_string_no_base(self): test_page = self.create_answer_page() result = test_page.__str__() self.assertEqual(result, test_page.title) def test_page_string_with_base(self): page = self.page1 self.assertTrue(page.answer_base) result = page.__str__() self.assertEqual( result, "{}: {}".format(page.answer_base.pk, page.title) ) def test_search_tags(self): """Test the list produced by page.clean_search_tags().""" page = self.page1 page.search_tags = "Chutes, Ladders" page.save_revision().publish() taglist = page.clean_search_tags for name in ["Chutes", "Ladders"]: self.assertIn(name, taglist) def test_english_header_and_footer(self): english_answer_page_response = self.client.get( reverse("ask-english-answer", args=["mock-question", "en", 1234]) ) self.assertContains( english_answer_page_response, "An official website of the United States government", ) self.assertNotContains( english_answer_page_response, "Un sitio web oficial del gobierno federal de los Estados Unidos", ) self.assertContains(english_answer_page_response, "https://usa.gov/") self.assertNotContains( english_answer_page_response, "https://gobiernousa.gov/" ) def test_spanish_header_and_footer(self): spanish_answer_page_response = self.client.get( reverse( "ask-spanish-answer", args=["mock-spanish-question1", "es", 1234], ) ) self.assertContains( spanish_answer_page_response, "Un sitio web oficial del gobierno federal de los Estados Unidos", ) self.assertNotContains( spanish_answer_page_response, "An official website of the United States government", ) self.assertContains( spanish_answer_page_response, "https://gobiernousa.gov/" ) self.assertNotContains( spanish_answer_page_response, "https://usa.gov/" ) def test_category_str(self): category = self.category self.assertEqual(category.__str__(), category.name) def test_portal_topic_featured_answers(self): page = self.page1 page.portal_topic.add(self.portal_topic) page.featured = True page.save_revision().publish() self.assertIn(page, self.portal_topic.featured_answers("en")) def test_nextstep_str(self): next_step = self.next_step self.assertEqual(next_step.__str__(), next_step.title) def test_status_string(self): with translation.override("en"): page1 = self.page1 self.assertEqual(page1.status_string, "live + draft") def test_status_string_redirected(self): with translation.override("en"): page1 = self.page1 page1.redirect_to_page = self.page2 page1.save() page1.get_latest_revision().publish() self.assertEqual(page1.status_string, "redirected") page1.unpublish() self.assertEqual(page1.status_string, "redirected but not live") def test_get_ask_breadcrumbs(self): from ask_cfpb.models import get_ask_breadcrumbs breadcrumbs = get_ask_breadcrumbs() self.assertEqual(len(breadcrumbs), 1) self.assertEqual(breadcrumbs[0]["title"], "Ask CFPB") def test_landing_page_context_no_featured_answer(self): page = self.page1 page.portal_topic.add(self.portal_topic) page.featured = False page.save_revision().publish() mock_site = mock.Mock() mock_site.hostname = "localhost" mock_request = HttpRequest() landing_page = self.english_parent_page test_context = landing_page.get_context(mock_request) self.assertEqual(len(test_context["portal_cards"]), 0) def test_landing_page_context(self): page = self.page1 page.portal_topic.add(self.portal_topic) page.featured = True page.save_revision().publish() mock_site = mock.Mock() mock_site.hostname = "localhost" mock_request = HttpRequest() landing_page = self.english_parent_page test_context = landing_page.get_context(mock_request) self.assertEqual(len(test_context["portal_cards"]), 1) self.assertEqual( test_context["portal_cards"][0]["title"], "test topic" ) def test_spanish_landing_page_context(self): page = self.page1_es page.portal_topic.add(self.portal_topic) page.featured = True page.save_revision().publish() mock_site = mock.Mock() mock_site.hostname = "localhost" mock_request = HttpRequest() landing_page = self.spanish_parent_page test_context = landing_page.get_context(mock_request) self.assertEqual(len(test_context["portal_cards"]), 1) self.assertEqual( test_context["portal_cards"][0]["title"], "prueba tema" ) def test_landing_page_context_draft_portal_page(self): page = self.page1 page.portal_topic.add(self.portal_topic) page.featured = True page.save_revision().publish() self.portal_page.unpublish() mock_site = mock.Mock() mock_site.hostname = "localhost" mock_request = HttpRequest() landing_page = self.english_parent_page test_context = landing_page.get_context(mock_request) self.assertEqual(len(test_context["portal_cards"]), 0) def test_answer_language_page_exists(self): self.assertEqual(self.answer5678.english_page, self.page2) def test_answer_language_page_nonexistent(self): self.assertEqual(self.answer5678.spanish_page, None) def test_get_reusable_text_snippet(self): from ask_cfpb.models import get_reusable_text_snippet from v1.models.snippets import ReusableText test_snippet = ReusableText.objects.create(title="Test Snippet") self.assertEqual( get_reusable_text_snippet("Test Snippet"), test_snippet ) def test_get_nonexistent_reusable_text_snippet(self): from ask_cfpb.models import get_reusable_text_snippet self.assertEqual( get_reusable_text_snippet("Nonexistent Snippet"), None ) def test_get_about_us_english_standard_text(self): from ask_cfpb.models import get_standard_text from v1.models.snippets import ReusableText snippet_title = REUSABLE_TEXT_TITLES["about_us"]["en"] test_snippet = ReusableText.objects.create(title=snippet_title) self.assertEqual(get_standard_text("en", "about_us"), test_snippet) def test_social_sharing_image_used(self): from v1.models.images import CFGOVImage image = CFGOVImage.objects.last() page = self.page1 page.social_sharing_image = image page.save_revision(user=self.test_user).publish() self.assertEqual(page.meta_image, image) def test_answer_meta_image_undefined(self): """ Answer page's meta image is undefined if social image is not provided """ answer = Answer() answer.save() page = self.create_answer_page(answer_base=answer) self.assertIsNone(page.meta_image) def test_answer_meta_image_uses_category_image_if_no_social_image(self): """ Answer page's meta image is its category's image """ category = baker.make(Category, category_image=self.test_image) page = self.page1 page.category.add(category) page.save_revision() self.assertEqual(page.meta_image, self.test_image) def test_answer_split_testing_id(self): """Confirm AnswerPage's split_testing_id is set to its answer_base.id, which is checked by the core.feature_flags.in_split_testing_cluster flag condition when doing split testing on Ask CFPB answer pages.""" answer = self.answer1234 page = answer.english_page self.assertEqual(page.split_test_id, answer.id) def test_validate_pagination_number(self): paginator = Paginator([{"fake": "results"}] * 30, 25) request = HttpRequest() self.assertEqual(validate_page_number(request, paginator), 1) request.GET.update({"page": "2"}) self.assertEqual(validate_page_number(request, paginator), 2) request = HttpRequest() request.GET.update({"page": "1000"}) self.assertEqual(validate_page_number(request, paginator), 1) request = HttpRequest() request.GET.update({"page": "<script>Boo</script>"}) self.assertEqual(validate_page_number(request, paginator), 1)
class AnswerPageTestCase(TestCase): fixtures = ['ask_tests', 'portal_topics'] def create_answer_page(self, **kwargs): kwargs.setdefault( 'path', get_free_path(apps, self.english_parent_page)) kwargs.setdefault('depth', self.english_parent_page.depth + 1) kwargs.setdefault('slug', 'mock-answer-page-en-1234') kwargs.setdefault('title', 'Mock answer page title') page = mommy.prepare(AnswerPage, **kwargs) page.save() return page def setUp(self): self.test_user = User.objects.get(pk=1) self.factory = RequestFactory() ROOT_PAGE = HomePage.objects.get(slug='cfgov') self.category = mommy.make( Category, name='stub_cat', name_es='que', slug='stub-cat') self.category.save() self.test_image = mommy.make(CFGOVImage) self.test_image2 = mommy.make(CFGOVImage) self.next_step = mommy.make(NextStep, title='stub_step') self.portal_topic = mommy.make( PortalTopic, heading='test topic', heading_es='prueba tema') page_clean = mock.patch('ask_cfpb.models.pages.CFGOVPage.clean') page_clean.start() self.addCleanup(page_clean.stop) self.portal_page = SublandingPage( title='test portal page', slug='test-portal-page', portal_topic=self.portal_topic, language='en' ) ROOT_PAGE.add_child(instance=self.portal_page) self.portal_page.save() self.portal_page.save_revision().publish() self.portal_page_es = SublandingPage( title='test portal page', slug='test-portal-page-es', portal_topic=self.portal_topic, language='es' ) ROOT_PAGE.add_child(instance=self.portal_page_es) self.portal_page_es.save() self.portal_page_es.save_revision().publish() self.english_parent_page = get_or_create_page( apps, 'ask_cfpb', 'AnswerLandingPage', 'Ask CFPB', ENGLISH_PARENT_SLUG, ROOT_PAGE, language='en', live=True) self.spanish_parent_page = get_or_create_page( apps, 'ask_cfpb', 'AnswerLandingPage', 'Obtener respuestas', SPANISH_PARENT_SLUG, ROOT_PAGE, language='es', live=True) self.tag_results_page_en = get_or_create_page( apps, 'ask_cfpb', 'TagResultsPage', 'Tag results page', 'search-by-tag', ROOT_PAGE, language='en', live=True) self.tag_results_page_es = get_or_create_page( apps, 'ask_cfpb', 'TagResultsPage', 'Tag results page', 'buscar-por-etiqueta', ROOT_PAGE, language='es', live=True) self.answer1234 = Answer(id=1234) self.answer1234.save() self.page1 = AnswerPage( language='en', answer_base=self.answer1234, slug='mock-question-en-1234', title='Mock question1', answer_content='Mock answer 1', question='Mock question1', search_tags='hippodrome') self.english_parent_page.add_child(instance=self.page1) self.page1.save_revision().publish() self.page1_es = AnswerPage( language='es', slug='mock-spanish-question1-es-1234', title='Mock Spanish question1', answer_base=self.answer1234, answer_content='Mock Spanish answer', question='Mock Spanish question1', search_tags='hipotecas') self.spanish_parent_page.add_child(instance=self.page1_es) self.page1_es.save_revision().publish() self.answer5678 = Answer(id=5678) self.answer5678.save() self.page2 = AnswerPage( language='en', slug='mock-question2-en-5678', title='Mock question2', answer_base=self.answer5678, answer_content='Mock answer 2', question='Mock question2', search_tags='hippodrome') self.english_parent_page.add_child(instance=self.page2) self.page2.save_revision().publish() def test_tag_results_page_templates(self): self.assertEqual( self.tag_results_page_es.get_template(HttpRequest()), self.tag_results_page_en.get_template(HttpRequest())) def test_tag_results_page_context_language(self): context = self.tag_results_page_es.get_context(HttpRequest()) self.assertEqual( context.get('breadcrumb_items')[0]['title'], 'Obtener respuestas') def test_english_page_context(self): from v1.models.snippets import ReusableText from ask_cfpb.models.pages import get_reusable_text_snippet rt = ReusableText(title='About us (For consumers)') rt.save() page = self.page1 page.language = 'en' page.save() test_context = page.get_context(HttpRequest()) self.assertEqual( test_context['about_us'], get_reusable_text_snippet('About us (For consumers)')) def test_routable_tag_page_base_returns_404(self): page = self.tag_results_page_en response = self.client.get( page.url + page.reverse_subpage( 'tag_base')) self.assertEqual(response.status_code, 404) def test_routable_tag_page_handles_bad_tag(self): page = self.tag_results_page_en response = self.client.get( page.url + page.reverse_subpage( 'tag_search', kwargs={'tag': 'hippopotamus'})) self.assertEqual(response.status_code, 200) def test_routable_tag_page_handles_bad_pagination(self): page = self.tag_results_page_en response = self.client.get( page.url + page.reverse_subpage( 'tag_search', kwargs={'tag': 'hippodrome'}), {'page': '100'}) self.assertEqual(response.status_code, 200) def test_routable_tag_page_valid_tag_returns_200(self): page = self.tag_results_page_en response = self.client.get( page.url + page.reverse_subpage( 'tag_search', kwargs={'tag': 'hippodrome'})) self.assertEqual(response.status_code, 200) def test_routable_tag_page_returns_url_suffix(self): page = self.tag_results_page_en response = page.reverse_subpage( 'tag_search', kwargs={'tag': 'hippodrome'}) self.assertEqual(response, 'hippodrome/') def test_view_answer_exact_slug(self): page = self.page1 page.slug = 'mock-answer-en-1234' page.save() revision = page.save_revision() revision.publish() response = self.client.get(reverse( 'ask-english-answer', args=['mock-answer', 'en', 1234])) self.assertEqual(response.status_code, 200) def test_view_answer_301_for_healed_slug(self): page = self.page1 revision = page.save_revision() revision.publish() response = self.client.get(reverse( 'ask-english-answer', args=['mock-slug', 'en', 1234])) self.assertEqual(response.status_code, 301) def test_view_answer_redirected(self): page = self.page1 page.redirect_to = self.page2.answer_base page.save() revision = page.save_revision() revision.publish() response_302 = self.client.get(reverse( 'ask-english-answer', args=['mocking-answer-page', 'en', 1234])) self.assertTrue(isinstance(response_302, HttpResponse)) self.assertEqual(response_302.status_code, 301) def test_spanish_answer_page_handles_referrer_with_unicode_accents(self): referrer_unicode = ( 'https://www.consumerfinance.gov/es/obtener-respuestas/' 'buscar-por-etiqueta/empresas_de_informes_de_cr\xe9dito/') spanish_page = self.page1_es request = HttpRequest() request.POST['referrer'] = referrer_unicode response = spanish_page.serve(request) self.assertEqual(response.status_code, 200) def test_page_string_no_base(self): test_page = self.create_answer_page() result = test_page.__str__() self.assertEqual(result, test_page.title) def test_page_string_with_base(self): page = self.page1 self.assertTrue(page.answer_base) result = page.__str__() self.assertEqual(result, "{}: {}".format( page.answer_base.pk, page.title)) def test_search_tags(self): """Test the list produced by page.clean_search_tags()""" page = self.page1 page.search_tags = 'Chutes, Ladders' page.save_revision().publish() taglist = page.clean_search_tags for name in ['Chutes', 'Ladders']: self.assertIn(name, taglist) def test_english_header_and_footer(self): english_answer_page_response = self.client.get(reverse( 'ask-english-answer', args=['mock-question', 'en', 1234])) self.assertContains( english_answer_page_response, 'An official website of the United States government') self.assertNotContains( english_answer_page_response, 'Un sitio web oficial del gobierno federal de los Estados Unidos') self.assertContains( english_answer_page_response, 'https://usa.gov/') self.assertNotContains( english_answer_page_response, 'https://gobiernousa.gov/') def test_spanish_header_and_footer(self): spanish_answer_page_response = self.client.get(reverse( 'ask-spanish-answer', args=['mock-spanish-question1', 'es', 1234])) self.assertContains( spanish_answer_page_response, 'Un sitio web oficial del gobierno federal de los Estados Unidos' ) self.assertNotContains( spanish_answer_page_response, 'An official website of the United States government' ) self.assertContains( spanish_answer_page_response, 'https://gobiernousa.gov/') self.assertNotContains( spanish_answer_page_response, 'https://usa.gov/') def test_category_str(self): category = self.category self.assertEqual(category.__str__(), category.name) def test_portal_topic_featured_answers(self): page = self.page1 page.portal_topic.add(self.portal_topic) page.featured = True page.save_revision().publish() self.assertIn(page, self.portal_topic.featured_answers('en')) def test_nextstep_str(self): next_step = self.next_step self.assertEqual(next_step.__str__(), next_step.title) def test_status_string(self): with translation.override('en'): page1 = self.page1 self.assertEqual( (page1.status_string), 'live + draft') def test_status_string_redirected(self): with translation.override('en'): page1 = self.page1 page1.redirect_to_page = self.page2 page1.save() page1.get_latest_revision().publish() self.assertEqual( (page1.status_string), "redirected") page1.unpublish() self.assertEqual( page1.status_string, ("redirected but not live")) def test_get_ask_breadcrumbs(self): from ask_cfpb.models import get_ask_breadcrumbs breadcrumbs = get_ask_breadcrumbs() self.assertEqual(len(breadcrumbs), 1) self.assertEqual(breadcrumbs[0]['title'], 'Ask CFPB') def test_landing_page_context_no_featured_answer(self): page = self.page1 page.portal_topic.add(self.portal_topic) page.featured = False page.save_revision().publish() mock_site = mock.Mock() mock_site.hostname = 'localhost' mock_request = HttpRequest() mock_request.site = mock_site landing_page = self.english_parent_page test_context = landing_page.get_context(mock_request) self.assertEqual(len(test_context['portal_cards']), 0) def test_landing_page_context(self): page = self.page1 page.portal_topic.add(self.portal_topic) page.featured = True page.save_revision().publish() mock_site = mock.Mock() mock_site.hostname = 'localhost' mock_request = HttpRequest() mock_request.site = mock_site landing_page = self.english_parent_page test_context = landing_page.get_context(mock_request) self.assertEqual(len(test_context['portal_cards']), 1) self.assertEqual( test_context['portal_cards'][0]['title'], 'test topic') def test_spanish_landing_page_context(self): page = self.page1_es page.portal_topic.add(self.portal_topic) page.featured = True page.save_revision().publish() mock_site = mock.Mock() mock_site.hostname = 'localhost' mock_request = HttpRequest() mock_request.site = mock_site landing_page = self.spanish_parent_page test_context = landing_page.get_context(mock_request) self.assertEqual(len(test_context['portal_cards']), 1) self.assertEqual( test_context['portal_cards'][0]['title'], 'prueba tema') def test_landing_page_context_draft_portal_page(self): page = self.page1 page.portal_topic.add(self.portal_topic) page.featured = True page.save_revision().publish() self.portal_page.unpublish() mock_site = mock.Mock() mock_site.hostname = 'localhost' mock_request = HttpRequest() mock_request.site = mock_site landing_page = self.english_parent_page test_context = landing_page.get_context(mock_request) self.assertEqual(len(test_context['portal_cards']), 0) def test_answer_language_page_exists(self): self.assertEqual(self.answer5678.english_page, self.page2) def test_answer_language_page_nonexistent(self): self.assertEqual(self.answer5678.spanish_page, None) def test_get_reusable_text_snippet(self): from ask_cfpb.models import get_reusable_text_snippet from v1.models.snippets import ReusableText test_snippet = ReusableText.objects.create(title='Test Snippet') self.assertEqual( get_reusable_text_snippet('Test Snippet'), test_snippet) def test_get_nonexistent_reusable_text_snippet(self): from ask_cfpb.models import get_reusable_text_snippet self.assertEqual( get_reusable_text_snippet('Nonexistent Snippet'), None) def test_get_about_us_english_standard_text(self): from ask_cfpb.models import get_standard_text from v1.models.snippets import ReusableText snippet_title = REUSABLE_TEXT_TITLES['about_us']['en'] test_snippet = ReusableText.objects.create(title=snippet_title) self.assertEqual( get_standard_text('en', 'about_us'), test_snippet) def test_social_sharing_image_used(self): from v1.models.images import CFGOVImage image = CFGOVImage.objects.last() page = self.page1 page.social_sharing_image = image page.save_revision(user=self.test_user).publish() self.assertEqual(page.meta_image, image) def test_answer_meta_image_undefined(self): """ Answer page's meta image is undefined if social image is not provided """ answer = Answer() answer.save() page = self.create_answer_page(answer_base=answer) self.assertIsNone(page.meta_image) def test_answer_meta_image_uses_category_image_if_no_social_image(self): """ Answer page's meta image is its category's image """ category = mommy.make(Category, category_image=self.test_image) page = self.page1 page.category.add(category) page.save_revision() self.assertEqual(page.meta_image, self.test_image) def test_answer_split_testing_id(self): """Confirm AnswerPage's split_testing_id is set to its answer_base.id, which is checked by the core.feature_flags.in_split_testing_cluster flag condition when doing split testing on Ask CFPB answer pages.""" answer = self.answer1234 page = answer.english_page self.assertEqual(page.split_test_id, answer.id) def test_validate_pagination_number(self): paginator = Paginator([{'fake': 'results'}] * 30, 25) request = HttpRequest() self.assertEqual(validate_page_number(request, paginator), 1) request.GET.update({'page': '2'}) self.assertEqual(validate_page_number(request, paginator), 2) request = HttpRequest() request.GET.update({'page': '1000'}) self.assertEqual(validate_page_number(request, paginator), 1) request = HttpRequest() request.GET.update({'page': '<script>Boo</script>'}) self.assertEqual(validate_page_number(request, paginator), 1) def test_schema_html_does_not_appear_when_flag_is_off(self): with override_settings( FLAGS={'HOW_TO_SCHEMA': [('boolean', False)]}): response = self.client.get(self.page1.url) self.assertNotContains( response, 'itemtype="http://schema.org/HowTo"' ) def test_schema_html_appears_when_flag_is_on(self): with override_settings( FLAGS={'HOW_TO_SCHEMA': [('boolean', True)]}): response = self.client.get(self.page1.url) self.assertContains(response, 'itemtype="http://schema.org/HowTo"')
class AnswerPageDocumentTest(TestCase): def setUp(self): self.site = Site.objects.get(is_default_site=True) self.root_page = self.site.root_page self.portal_topic = baker.make(PortalTopic, heading="test topic", heading_es="prueba tema") self.en_portal_category = baker.make(PortalCategory, heading="test_english_heading") self.es_portal_category = baker.make(PortalCategory, heading="test_spanish_heading") self.en_portal_page = SublandingPage( title="test English portal page", slug="test-en-portal-page", portal_topic=self.portal_topic, language="en", ) self.es_portal_page = SublandingPage( title="test Spanish portal page", slug="test-es-portal-page", portal_topic=self.portal_topic, language="es", ) self.root_page.add_child(instance=self.en_portal_page) self.en_portal_page.save() self.en_portal_page.save_revision().publish() self.en_parent_page = get_or_create_page( apps, "ask_cfpb", "AnswerLandingPage", "Ask CFPB", ENGLISH_PARENT_SLUG, self.root_page, language="en", live=True, ) self.es_parent_page = get_or_create_page( apps, "ask_cfpb", "AnswerLandingPage", "Obtener respuestas", SPANISH_PARENT_SLUG, self.root_page, language="es", live=True, ) self.answer = Answer(id=1234) self.answer.save() self.en_page = AnswerPage( language="en", slug="test-english-question-en-1234", title="Test English question", answer_base=self.answer, answer_content="Test English answer", question="Test English question", search_tags="English", ) self.es_page = AnswerPage( language="es", slug="test-spanish-question-es-1234", title="Test Spanish question", answer_base=self.answer, answer_content="Test Spanish answer", question="Test Spanish question", search_tags="Spanish", ) self.doc = AnswerPageDocument() def test_model_class_added(self): self.assertEqual(AnswerPageDocument.django.model, AnswerPage) def test_ignore_signal_default(self): self.assertFalse(AnswerPageDocument.django.ignore_signals) def test_auto_refresh_default(self): self.assertFalse(AnswerPageDocument.django.auto_refresh) def test_fields_populated(self): mapping = AnswerPageDocument._doc_type.mapping self.assertEqual( set(mapping.properties.properties.to_dict().keys()), set([ 'autocomplete', 'portal_categories', 'portal_topics', 'text', 'url', 'preview', 'search_tags', 'language' ])) def test_to_field(self): doc = DocType() for f in ['question', 'statement']: nameField = doc.to_field(f, AnswerPage._meta.get_field(f)) self.assertIsInstance(nameField, fields.TextField) self.assertEqual(nameField._path, [f]) dateField = doc.to_field('last_edited', AnswerPage._meta.get_field('last_edited')) self.assertIsInstance(dateField, fields.DateField) self.assertEqual(dateField._path, ['last_edited']) for f in ['featured', 'share_and_print']: boolField = doc.to_field(f, AnswerPage._meta.get_field(f)) self.assertIsInstance(boolField, fields.BooleanField) self.assertEqual(boolField._path, [f]) intField = doc.to_field('featured_rank', AnswerPage._meta.get_field('featured_rank')) self.assertIsInstance(intField, fields.IntegerField) self.assertEqual(intField._path, ['featured_rank']) def test_to_field_with_unknown_field(self): doc = DocType() with self.assertRaises(ModelFieldNotMappedError): doc.to_field('answer_base', AnswerPage._meta.get_field('answer_base')) def test_mapping(self): self.assertEqual( AnswerPageDocument._doc_type.mapping.to_dict(), { 'properties': { 'autocomplete': { 'analyzer': 'ngram_tokenizer', 'type': 'text' }, 'language': { 'type': 'text' }, 'portal_categories': { 'type': 'text' }, 'portal_topics': { 'type': 'keyword' }, 'preview': { 'type': 'text' }, 'search_tags': { 'type': 'text' }, 'text': { 'analyzer': 'synonym_analyzer', 'type': 'text' }, 'url': { 'type': 'text' } } }) def test_get_queryset(self): qs = AnswerPageDocument().get_queryset() self.assertIsInstance(qs, models.QuerySet) self.assertEqual(qs.model, AnswerPage) def test_prepare_en(self): self.en_parent_page.add_child(instance=self.en_page) self.en_page.save_revision().publish() en_prepared_data = self.doc.prepare(self.en_page) self.assertEqual( en_prepared_data, { 'autocomplete': self.doc.prepare_autocomplete(self.en_page), 'language': 'en', 'portal_categories': self.doc.prepare_portal_categories(self.en_page), 'portal_topics': self.doc.prepare_portal_topics(self.en_page), 'preview': '', 'search_tags': self.doc.prepare_search_tags(self.en_page), 'text': 'Test English question\n\n\n\n', 'url': self.doc.prepare_url(self.en_page), }) def test_prepare_es(self): self.es_parent_page.add_child(instance=self.es_page) self.es_page.save_revision().publish() es_prepared_data = self.doc.prepare(self.es_page) self.assertEqual( es_prepared_data, { 'autocomplete': self.doc.prepare_autocomplete(self.es_page), 'language': 'es', 'portal_categories': self.doc.prepare_portal_categories(self.es_page), 'portal_topics': self.doc.prepare_portal_topics(self.es_page), 'preview': '', 'search_tags': self.doc.prepare_search_tags(self.es_page), 'text': 'Test Spanish question\n\n\n\n', 'url': self.doc.prepare_url(self.es_page), }) def test_model_instance_update_no_refresh(self): self.es_parent_page.add_child(instance=self.es_page) self.es_page.save_revision().publish() self.doc.django.auto_refresh = False with patch('django_elasticsearch_dsl.documents.bulk') as mock: self.doc.update(self.es_page) self.assertNotIn('refresh', mock.call_args_list[0][1])