예제 #1
0
    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')
예제 #3
0
 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)
예제 #4
0
    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)
예제 #5
0
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)
예제 #6
0
 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)
예제 #7
0
    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())
예제 #10
0
 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)
예제 #11
0
    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><'))
예제 #12
0
 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)
예제 #13
0
 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)
예제 #14
0
 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()
예제 #15
0
 def setUp(self):
     self.page = CFGOVPage(title='Test', slug='test')
     self.factory = RequestFactory()
     self.request = self.factory.get('/')
예제 #16
0
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])
예제 #18
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()
예제 #19
0
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&nbsp;</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&nbsp;</span>",
            question_es="<span>Clean question test&nbsp;</span>")
        raw = "<span>Clean question test&nbsp;</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()
예제 #21
0
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])
예제 #22
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()
예제 #23
0
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)
예제 #24
0
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])